Changeset: fff8070f83fd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fff8070f83fd
Modified Files:
        monetdb5/extras/rapi/rapi.c
Branch: Jul2015
Log Message:

Changes inspired by a message on the mailing list from Bogdan Dimitrov.
- Convert \ to / before handing a path over to the R library.
- Don't call fprintf.

In addition, don't call exit from the initialization code, but just
return an error.


diffs (144 lines):

diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -153,7 +153,7 @@ void clearRErrConsole(void) {
        // Do nothing?
 }
 
-int RAPIinstalladdons(void);
+static char *RAPIinstalladdons(void);
 
 /* UNIX-like initialization */
 #ifndef WIN32
@@ -162,8 +162,10 @@ int RAPIinstalladdons(void);
 #define CSTACK_DEFNS 1
 #include <Rinterface.h>
 
-static int RAPIinitialize(void) {
+static char *RAPIinitialize(void) {
 // TODO: check for header/library version mismatch?
+       char *e;
+
        // set R_HOME for packages etc. We know this from our configure script
        setenv("R_HOME", RHOME, TRUE);
 
@@ -186,7 +188,7 @@ static int RAPIinitialize(void) {
                Rp->NoRenviron = TRUE;
                stat = Rf_initialize_R(2, rargv);
                if (stat < 0) {
-                       return 2;
+                       return "Rf_initialize failed";
                }
                R_SetParams(Rp);
        }
@@ -207,8 +209,8 @@ static int RAPIinitialize(void) {
        // big boy here
        setup_Rmainloop();
 
-       if (RAPIinstalladdons() != 0) {
-               return 3;
+       if ((e = RAPIinstalladdons()) != 0) {
+               return e;
        }
        // patch R internals to disallow quit and system. Setting them to NULL 
produces an error.
        SET_INTERNAL(install("quit"), R_NilValue);
@@ -216,7 +218,7 @@ static int RAPIinitialize(void) {
        //SET_INTERNAL(install("system"), R_NilValue);
 
        rapiInitialized++;
-       return 0;
+       return NULL;
 }
 #else
 /* Completely different Windows initialization */
@@ -280,23 +282,20 @@ static void my_onintr(int sig)
 
 //extern Rboolean R_LoadRconsole;
 
-int RAPIinitialize(void) {
+static char *RAPIinitialize(void) {
        structRstart rp;
        Rstart Rp = &rp;
        char Rversion[25], *RHome;
 
        snprintf(Rversion, 25, "%s.%s", R_MAJOR, R_MINOR);
        if(strncmp(getDLLVersion(), Rversion, 25) != 0) {
-               fprintf(stderr, "Error: R.DLL version does not match\n");
-               exit(1);
+               return "Error: R.DLL version does not match";
        }
 
        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(2);
+               return "R_HOME must be set in the environment or Registry";
        }
        Rp->rhome = RHome;
        Rp->home = getRUser();
@@ -333,7 +332,7 @@ void initRinside() {
 #endif
 
 
-int RAPIinstalladdons(void) {
+static char *RAPIinstalladdons(void) {
        int evalErr;
        ParseStatus status;
        char rlibs[BUFSIZ];
@@ -345,7 +344,7 @@ int RAPIinstalladdons(void) {
                         "rapi_packages");
 
        if (mkdir(rlibs, S_IRWXU) != 0 && errno != EEXIST) {
-               return 4;
+               return "cannot create rapi_packages directory";
        }
 #ifdef _RAPI_DEBUG_
        printf("# R libraries installed in %s\n",rlibs);
@@ -359,6 +358,14 @@ int RAPIinstalladdons(void) {
        // run rapi.R environment setup script
        snprintf(rapiinclude, sizeof(rapiinclude), "source(\"%s\")",
                         locate_file("rapi", ".R", 0));
+#if DIR_SEP != '/'
+       {
+               char *p;
+               for (p = rapiinclude; *p; p++)
+                       if (*p == DIR_SEP)
+                               *p = '/';
+       }
+#endif
        R_tryEvalSilent(
                VECTOR_ELT(
                        R_ParseVector(mkString(rapiinclude), 1, &status,
@@ -366,9 +373,9 @@ int RAPIinstalladdons(void) {
 
        // of course the script may contain errors as well
        if (evalErr != FALSE) {
-               return 5;
+               return "failure running R setup script";
        }
-       return 0;
+       return NULL;
 }
 
 rapi_export str RAPIevalStd(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
@@ -737,15 +744,15 @@ str RAPIprelude(void *ret) {
                MT_lock_set(&rapiLock, "rapi.evaluate");
                /* startup internal R environment  */
                if (!rapiInitialized) {
-                       int initstatus;
+                       char *initstatus;
                        initstatus = RAPIinitialize();
                        if (initstatus != 0) {
                                throw(MAL, "rapi.eval",
-                                         "failed to initialise R environment 
(%i)", initstatus);
+                                         "failed to initialise R environment 
(%s)", initstatus);
                        }
                }
                MT_lock_unset(&rapiLock, "rapi.evaluate");
-               fprintf(stdout, "# MonetDB/R   module loaded\n");
+               printf("# MonetDB/R   module loaded\n");
        }
        return MAL_SUCCEED;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to