Hello Since I couldn't see any way for gsc running scripts as a command line argument (it can however -e '(include "thefile.scm")') I wrote the below C program to act as an interpreter. Why not use gsi-script? Because I need the compiler at runtime. This can also be extended to load any arbitrary code before the actual script (see comment below). To be used like: #!/usr/local/bin/gsc-script ... To be installed like: gcc -O -o gsc-script gsc-script.c install -s gsc-script /usr/local/bin/gsc-script Cheers Christian. #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #define CMDPATH "/usr/local/Gambit-C/bin/gsc" #define MAXCMDLEN 100 #define MAXSTRLEN 2000 int main(int argc, char*argv[],char*envp[]) { char*newcmd[MAXCMDLEN+1]; int newcmd_i=0; newcmd[newcmd_i++]= CMDPATH; newcmd[newcmd_i++]="-:tE"; newcmd[newcmd_i++]="-i"; newcmd[newcmd_i++]="-e"; if (argc < 2){ fprintf(stderr,"not enough arguments\n"); exit(1); } { #define STR "(include \"" // for loading some other code into every program, just add it here: // #define STR "(load \"~~/my-load\")(include \"" char includestr[MAXSTRLEN+1]; size_t si=strlen(STR); strcpy(includestr,STR); { // escaping copy: #undef STR #define STR argv[1] int i; int len=strlen(STR); for(i=0;i<len;i++){ int c= STR[i]; if ((c=='\\')||(c=='"')) { includestr[si++]='\\'; if (si>=MAXSTRLEN) { fprintf(stderr,"pathstring too long\n"); exit(1); } } includestr[si++]=c; if (si>=MAXSTRLEN) { fprintf(stderr,"pathstring too long\n"); exit(1); } } { #undef STR #define STR "\")" int len=strlen(STR); if((si+len) >= MAXSTRLEN) { fprintf(stderr,"pathstring too long\n"); exit(1); } strcpy(&(includestr[si]),STR); si+= len; includestr[si++]=0; newcmd[newcmd_i++]=includestr; /* finish parameters and exec: */ newcmd[newcmd_i++]= 0; execve(CMDPATH,newcmd,envp); fprintf(stderr,"could not execute '%s': %s\n",CMDPATH,strerror(errno)); exit(127); } } } }
Afficher les réponses par date
participants (1)
-
Christian