=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/shell.c,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- OpenXM/src/kan96xx/Kan/shell.c 2003/11/24 12:38:17 1.1 +++ OpenXM/src/kan96xx/Kan/shell.c 2003/12/03 09:00:46 1.3 @@ -1,4 +1,4 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/shell.c,v 1.2 2003/12/03 01:21:43 takayama Exp $ */ #include #include #include @@ -16,7 +16,105 @@ #include #include "ox_pathfinder.h" +static struct object KoxShell_test1(struct object ob); +static struct object oxsExecuteBlocked(struct object ob); +static struct object oxsSetenv(struct object ob); +static char *oxsIsURI(char *s); +static char *oxsURIgetVarName(char *s); +static char *oxsURIgetExtension(char *s); +static char *oxsVarToFile(char *v,char *extension,char *comamnd,int tmp); +static int oxsFileToVar(char *v,char *fname); +static char **oxsBuildArgv(struct object ob); +static struct object testmain(struct object ob); +#define mymalloc(n) sGC_malloc(n) +#define nomemory(n) errorKan1("%s\n","No more memory in shell.c"); + +#define MAXFILES 256 +static char *AfterReadFile[MAXFILES]; +static char *AfterSetVar[MAXFILES]; +static int AfterPt=0; +static char *AfterDeleteFile[MAXFILES]; +static int AfterD=0; + +struct object KoxShell(struct object ob) { + return KoxShell_test1(ob); +} + +/* A temporary help system */ +void KoxShellHelp(char *key,FILE *fp) { + char *keys[]={"command","export","which","@@@@gatekeeper"}; + int i; +#define HSIZE 20 + char *s[HSIZE]; + if (key == NULL) { + for (i=0; strcmp(keys[i],"@@@@gatekeeper") != 0; i++) { + fprintf(fp,"%s\n",keys[i]); + KoxShellHelp(keys[i],fp); + fprintf(fp,"\n",keys[i]); + } + return; + } + for (i=0; i> or << which command-name path >>"); + } + return(rob); + }else if (strcmp(cmd,"export")==0) { + rob=oxsSetenv(ob); + }else{ + rob = oxsExecuteBlocked(ob); + } + return(rob); +} + /* Functions for ox_shell */ struct object KoxWhich(struct object cmdo,struct object patho) { struct object rob; @@ -37,4 +135,320 @@ struct object KoxWhich(struct object cmdo,struct objec return(rob); } +/* Example. [(export) (PATH) (=) (/usr/new/bin:$PATH)] */ +static struct object oxsSetenv(struct object ob) { + struct object rob; + int i,n; + char *envp; + char *new; + int r; + rob = NullObject; + if (ob.tag != Sarray) errorKan1("%s\n","oxsSetenv requires an array of srings."); + n = getoaSize(ob); + if ((n != 4) && (n != 3)) errorKan1("%s\n","oxsSetenv requires an array of srings. Length must be 3 or 4."); + for (i=0; i stringIn + s="stringInOut://abc.poly" ==> stringInOut +*/ +char *oxsIsURI(char *s) { + int n,i,j; + char *u; + if (s == NULL) return((char *)NULL); + n = strlen(s); + for (i=0; i abc + s="stringInOut://abc.poly" ==> abc + s="stringInOut://abc" ==> abc +*/ +char *oxsURIgetVarName(char *s) { + int n,i,j; + char *u; + if (s == NULL) return((char *)NULL); + n = strlen(s); + for (i=0; i poly + s="stringInOut://abc.poly" ==> poly + s="stringInOut://abc" ==> NULL +*/ +char *oxsURIgetExtension(char *s) { + int n,i,j,k; + char *u; + if (s == NULL) return((char *)NULL); + n = strlen(s); + for (i=0; i limit - 10) { + sold = s; limit *= 2; + s = (char *)mymalloc(limit); + if (s == NULL) errorKan1("%s\n","No more memory in oxsFileToVar()."); + strcpy(s,sold); + } + i++; + } + fclose(fp); + + KputUserDictionary(v,KpoString(s)); + return(0); +} + +static char **oxsBuildArgv(struct object ob) { + int n,i; + char **argv; + char *s; + char *type; + char *ext, *v; + int usetmp=1; + int win=0; + + /* bug: win variable must be properly set on windows native. */ + + if (ob.tag != Sarray) errorKan1("%s\n","oxsBuildArgv() requires an array as an argument."); + n = getoaSize(ob); + for (i=0; i= MAXFILES) { + AfterPt=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + }else if (strcmp(type,"stringOut") == 0) { + argv[i] = generateTMPfileName2(v,ext,usetmp,win); + AfterDeleteFile[AfterD++] = argv[i]; + AfterReadFile[AfterPt] = argv[i]; + AfterSetVar[AfterPt] = v; + AfterPt++; + if (AfterPt >= MAXFILES) { + AfterPt=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + }else { + errorKan1("%s\n","This URI type has not yet been implemented."); + } + if (AfterD >= MAXFILES) { + AfterD=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + } + } + return(argv); +} + + +static struct object oxsExecuteBlocked(struct object ob) +{ + int r,i,n; + char **argv; + + /* bug: Set stdout, stderr to result variables. */ + argv = oxsBuildArgv(ob); + r=oxForkExecBlocked(argv); /* bug: what happen when NoX? */ + /* + if (1) { + for (i=0; argv[i] != NULL; i++) { + fprintf(stderr,"argv[%d]=%s\n",i,argv[i]); + } + errorKan1("%s\n","ForkExecBlocked failed."); + } + */ + if (AfterPt > 0) { + for (i=0; i< AfterPt; i++) { + oxsFileToVar(AfterSetVar[i],AfterReadFile[i]); + } + } + AfterPt = 0; + + if (AfterD > 0) { + for (i=0; i< AfterD; i++) { + /* oxDeleteFile(AfterDeleteFile[i]); not implemented. */ + } + } + AfterD = 0; + + return(KpoInteger(r)); +}