/*
 *  SYSTEM DEPENDENT CODE
 *
 *  The sys*.c files contain the platform dependent code for
 *  the Unix command-line (reference) port of R.
 *
 *	sys-common.c  has code common to the unix/gnome/gnuwin32 ports
 *	sys-unix.c    has code common to the unix/gnome ports
 *	system.c      has interface-specific code
 *
 *
 *  1) FATAL MESSAGES AT STARTUP
 *
 *    void  R_Suicide(char *msg)
 *
 *  This function displays the given message and the causes R to
 *  die immediately.  It is used for non-recoverable errors such as
 *  not having enough memory to launch etc.  The phrase "dialog box"
 *  springs to mind for non-Unix platforms.
 *
 *
 *  2. CONSOLE I/O
 *
 *  The first group of functions is concerned with reading and
 *  writing to the system console.
 *
 *    int   R_ReadConsole(const char *prompt, unsigned char *buf, 
 *                        int buflen, int hist)
 *
 *  This function prints the given prompt at the console and then
 *  does an fgets(3)-like operation, transferring up to "buflen" bytes
 *  into the buffer "buf".  This should be zero-terminated, and end
 *  with "\n\0" if there is no more input available (but not if the 
 *  input line exceeds "buflen" bytes).  If "hist" is non-zero, then
 *  the line is added to any command history which is being maintained.
 *  Note that this is one natural place from which to run an event loop.
 *
 *    void  R_WriteConsole(const char *buf, int buflen)
 *    void  R_WriteConsoleEx(const char *buf, int buflen, int otype)
 *
 *  Those functions write the given buffer out to the console.  No
 *  special actions are required.  Under Unix the characters are
 *  just appended to stdout. otype determines whether the content is
 *  regular output (0) or error/warning (1) and can be used by GUIs
 *  to distinguish those.
 *
 *    void  R_ResetConsole(void)
 *
 *  This function is called when the system is reset after an error.
 *  It probably isn't really needed.
 *
 *    void  R_FlushConsole(void)
 *
 *  This called to flush any output to the system console.  Under Unix
 *  this is just fflush(stdout).  Other systems may not need this.
 *
 *    void  R_ClearerrConsole(void)
 *
 *  This function clears any errors associated with reading from the
 *  console.  In Unix it is used to clear any EOF condition associated
 *  with stdin.
 *
 *    void R_ShowMessage(const char *s)
 *
 *  Display the (multi-line) message in the string s. This might be
 *  printed on an error stream or displayed in a message dialog box:
 *  it should be brought to the user's attention immediately.
 *
 *
 *  3) ACTIONS DURING (LONG) COMPUTATIONS
 *
 *    void  R_Busy(int which)
 *
 *  This function invokes actions (such as change of cursor) when
 *  R embarks on an extended computation (which=1) and when such a
 *  state terminates (which=0).
 *
 *
 *  4) INITIALIZATION AND TERMINATION ACTIONS
 *
 *    void  R_InitialData(void)
 *    FILE* R_OpenInitFile(void)
 *    FILE* R_OpenLibraryFile(char *file)
 *    FILE* R_OpenSysInitFile(void)
 *    FILE* R_OpenSiteFile()
 *
 *  These functions load the initial system and user data into R.
 *
 *    void  R_RestoreGlobalEnv(void)
 *    void  R_SaveGlobalEnv(void)
 *
 *  These functions save and restore the user's global environment.
 *  The system specific aspect of this is what files are used.
 *
 *    void  R_CleanUp(Rboolean saveact, int status, int RunLast)

 *  This function invokes any actions which occur at system termination.
 *
 *
 *  5) FILESYSTEM INTERACTION
 *
 *    int FileExists(const char *file)
 *
 *  This function returns 1 if the named file exists and 0 otherwise.
 *  On Unix/Windows this is just an interface to "stat".
 *
 *    int R_HiddenFile(const char *file)
 *
 *  This function returns 1 if the named file is "hidden".  In Unix,
 *  this is the case if the file name begins with a '.'.  On the Mac
 *  a file is hidden if the file name ends in '\r'.
 *  More complex tests may be needed on other platforms.
 *
 *    int R_ShowFiles(int nfile, const char **file, const char **headers,
 *                    const char *wtitle, Rboolean del, const char *pager)
 *
 *     nfile   = number of files
 *     file    = array of filenames
 *     headers = the `headers' args of file.show. Printed before each file.
 *     wtitle  = title for window: the `title' arg of file.show
 *     del     = flag for whether files should be deleted after use
 *     pager   = pager to be used.
 *
 *  This function is used to display the contents of files.  On (raw)
 *  Unix this means invoking a pager on the file.  On Gui-based platforms
 *  the file would probably be displayed in a window with the given
 *  title.
 *
 *    int R_ChooseFile(int new, const char *buf, int len)
 *
 *  Choose a file and return its name in buf of length len. On
 *  command-line systems ask the user, on GUI platforms bring up a
 *  dialog box.
 *
 *  Argument new is designed to choose the style of dialog box
 *  presented to the user: at present only new = 0 is used. (In 
 *  file.choose(new), new is logical.)
 *
 *    char* R_ExpandFileName(const char *s)
 *
 *  This is a utility function which can be used to expand special
 *  characters in file names.  In Unix it's sole function is to expand
 *  and "~"s which occur in filenames.  The minimal action is to 
 *  return the argument unaltered.
 *
 *    FILE *R_fopen(const char *filename, const char *mode);
 *
 *  This is a wrapper function for ``fopen''.  It was necessary for
 *  classic MacOS.
 *
 *
 *  6) SYSTEM INFORMATION
 *
 *    char *R_HomeDir(void)
 *
 *  Get the R ``home directory'' as a string.
 *
 *
 *  7) PLATFORM DEPENDENT FUNCTIONS
 *
 *    SEXP do_getenv(SEXP call, SEXP op, SEXP args, SEXP rho)
 *    SEXP do_interactive(SEXP call, SEXP op, SEXP args, SEXP rho)
 *    SEXP do_machine(SEXP call, SEXP op, SEXP args, SEXP rho)
 *    SEXP do_proctime(SEXP call, SEXP op, SEXP args, SEXP rho)
 *    SEXP do_system(SEXP call, SEXP op, SEXP args, SEXP rho)
 *
 */
