Rev 81390 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** R : A Computer Language for Statistical Data Analysis* Copyright (C) 1998--2022 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/*/#define Win32#define WIN32_LEAN_AND_MEAN 1#include <windows.h>#include <stdio.h>#include <Rversion.h>#define LibExtern __declspec(dllimport) extern#include <Rembedded.h>#include <R_ext/RStartup.h>/* for askok and askyesnocancel */#include <graphapp.h>/* for signal-handling code */#include <psignal.h>/* simple input, simple output *//* This version blocks all events: a real one needs to call ProcessEventsfrequently. See rterm.c and ../system.c for one approach usinga separate thread for input.*/int myReadConsole(const char *prompt, unsigned char *buf, int len,int addtohistory){fputs(prompt, stdout);fflush(stdout);if(fgets((char *)buf, len, stdin)) return 1;else return 0;}void myWriteConsoleEx(const char *buf, int len, int otype){/* we could distinguish between ouput (type=0) and errors (otype=1) ... */printf("%s", buf);}void myCallBack(void){/* called during i/o, eval, graphics in ProcessEvents */}void myBusy(int which){/* set a busy cursor ... if which = 1, unset if which = 0 */}static void my_onintr(int sig){UserBreak = 1;}int main (int argc, char **argv){structRstart rp;Rstart Rp = &rp;char Rversion[25], *RHome;snprintf(Rversion, 25, "%s.%s", R_MAJOR, R_MINOR);if(strcmp(getDLLVersion(), Rversion) != 0) {fprintf(stderr, "Error: R.DLL version does not match\n");exit(1);}R_setStartTime();R_DefParams(Rp);if((RHome = get_R_HOME()) == NULL) {fprintf(stderr,"R_HOME must be set in the environment or Registry\n");exit(1);}Rp->rhome = RHome;Rp->home = getRUser();Rp->CharacterMode = LinkDLL;Rp->ReadConsole = myReadConsole;Rp->WriteConsole = NULL; /* for illustration purposes we use more flexible WriteConsoleEx */Rp->WriteConsoleEx = myWriteConsoleEx;Rp->CallBack = myCallBack;Rp->ShowMessage = askok;Rp->YesNoCancel = askyesnocancel;Rp->Busy = myBusy;Rp->R_Quiet = TRUE;Rp->R_Interactive = FALSE;Rp->RestoreAction = SA_RESTORE;Rp->SaveAction = SA_NOSAVE;R_SetParams(Rp);R_set_command_line_arguments(argc, argv);FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));signal(SIGBREAK, my_onintr);GA_initapp(0, 0);readconsolecfg();setup_Rmainloop();#ifdef SIMPLE_CASErun_Rmainloop();#elseR_ReplDLLinit();while(R_ReplDLLdo1() > 0) {/* add user actions here if desired */}/* only get here on EOF (not q()) */#endifRf_endEmbeddedR(0);return 0;}