void R_CleanUp(SA_TYPE saveact, int status, int runLast) { if(saveact == SA_DEFAULT) /* The normal case apart from R_Suicide */ saveact = SaveAction; if(saveact == SA_SAVEASK) { if(R_Interactive) { switch (R_YesNoCancel(G_("Save workspace image?"))) { case YES: saveact = SA_SAVE; break; case NO: saveact = SA_NOSAVE; break; case CANCEL: jump_to_toplevel(); break; } } else saveact = SaveAction; } switch (saveact) { case SA_SAVE: if(runLast) R_dot_Last(); if(R_DirtyImage) R_SaveGlobalEnv(); if (CharacterMode == RGui || (R_Interactive && CharacterMode == RTerm)) { R_setupHistory(); /* re-read the history size and filename */ gl_savehistory(R_HistoryFile, R_HistorySize); } break; case SA_NOSAVE: if(runLast) R_dot_Last(); break; case SA_SUICIDE: default: break; } R_RunExitFinalizers(); editorcleanall(); CleanEd(); CleanTempDir(); closeAllHlpFiles(); KillAllDevices(); AllDevicesKilled = TRUE; if (R_Interactive && CharacterMode == RTerm) SetConsoleTitle(oldtitle); UnLoad_Rbitmap_Dll(); if (R_CollectWarnings && saveact != SA_SUICIDE && CharacterMode == RTerm) PrintWarnings(); app_cleanup(); RConsole = NULL; exit(status); }
/* * R : A Computer Language for Statistical Data Analysis * Copyright (C) 2000-2013 The R Core Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * https://www.R-project.org/Licenses/ */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <Defn.h> /* for checkArity */ #include <Internal.h> #undef _ #ifdef ENABLE_NLS #include <libintl.h> #define _(String) dgettext ("utils", String) #else #define _(String) (String) #endif #ifdef Win32 # include "Startup.h" # include "getline/getline.h" /* for gl_load/savehistory */ # include "getline/wc_history.h" /* for wgl_load/savehistory */ SEXP savehistory(SEXP call, SEXP op, SEXP args, SEXP env) { SEXP sfile; args = CDR(args); sfile = CAR(args); if (!isString(sfile) || LENGTH(sfile) < 1) errorcall(call, _("invalid '%s' argument"), "file"); if (CharacterMode == RGui) { R_setupHistory(); /* re-read the history size */ wgl_savehistoryW(filenameToWchar(STRING_ELT(sfile, 0), 0), R_HistorySize); } else if (R_Interactive && CharacterMode == RTerm) { R_setupHistory(); /* re-read the history size */ gl_savehistory(translateChar(STRING_ELT(sfile, 0)), R_HistorySize); } else errorcall(call, _("'savehistory' can only be used in Rgui and Rterm")); return R_NilValue; }
void R_CleanUp(SA_TYPE saveact, int status, int runLast) { if(saveact == SA_DEFAULT) /* The normal case apart from R_Suicide */ saveact = SaveAction; if(saveact == SA_SAVEASK) { if(R_Interactive) { switch (R_YesNoCancel(G_("Save workspace image?"))) { case YES: saveact = SA_SAVE; break; case NO: saveact = SA_NOSAVE; break; case CANCEL: // There might be residual events with destroyed handles R_ProcessEvents(); jump_to_toplevel(); break; } } else saveact = SaveAction; } switch (saveact) { case SA_SAVE: if(runLast) R_dot_Last(); if(R_DirtyImage) R_SaveGlobalEnv(); if (CharacterMode == RGui) { R_setupHistory(); /* re-read the history size and filename */ wgl_savehistory(R_HistoryFile, R_HistorySize); } else if(R_Interactive && CharacterMode == RTerm) { R_setupHistory(); /* re-read the history size and filename */ gl_savehistory(R_HistoryFile, R_HistorySize); } break; case SA_NOSAVE: if(runLast) R_dot_Last(); break; case SA_SUICIDE: default: break; } R_RunExitFinalizers(); editorcleanall(); CleanEd(); KillAllDevices(); /* Unix does not do this under SA_SUICIDE */ AllDevicesKilled = TRUE; /* used in devWindows.c to inhibit callbacks */ R_CleanTempDir(); /* changes directory */ if (R_Interactive && CharacterMode == RTerm) SetConsoleTitle(oldtitle); if (R_CollectWarnings && saveact != SA_SUICIDE && CharacterMode == RTerm) /* no point in doing this for Rgui as the console is about to close */ PrintWarnings(); /* from device close and (if run) .Last */ app_cleanup(); RConsole = NULL; if(ifp) fclose(ifp); /* input file from -f or --file= */ if(ifile[0]) unlink(ifile); /* input file from -e */ exit(status); }