home *** CD-ROM | disk | FTP | other *** search
- /*
- Main for Tclsh
- (c) C.T.Stretch
- Fri,24 Jun 1994
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include "h.tclInt"
- #include "h.tclRISCOS"
- #undef UCHAR
- #include "h.os"
-
- static Tcl_Interp *ti;
- static char flags[26];
-
- static void getflags(char *q)
- { bool toggle=TRUE;
- for(;*q;q++) if(*q=='~') toggle=!toggle;
- else if(*q>='a'&&*q<='z') {flags[*q-'a']=toggle;toggle=TRUE;}
- }
-
- static int file_eval(char *fname)
- { int code=Tcl_EvalFile(ti,fname);
- char *q;
- if(code)
- { printf("Error %d from Tclsh - %s\n",code,ti->result);
- q=Tcl_GetVar(ti,"errorInfo",0);
- if(q) puts(q);
- if(!flags['e'-'a']) exit(code);
- }
- return code;
- }
-
- static void banner()
- { puts("Tclsh version " TCL_VERSION " Tcl Interpreter");
- puts("Generic functions with RISCOS extensions");
- puts("Compiled " __DATE__ );
- }
-
- static int DoOneCmd()
- { char buf[257];
- Tcl_DString cmd;
- int code;
- Tcl_DStringInit(&cmd);
- fputs(">",stdout);
- for(;;)
- { if(!fgets(buf,sizeof(buf),stdin)) break;
- Tcl_DStringAppend(&cmd,buf,-1);
- if(Tcl_CommandComplete(Tcl_DStringValue(&cmd))) break;
- fputs(">>",stdout);
- }
- code=Tcl_RecordAndEval(ti,Tcl_DStringValue(&cmd),0);
- Tcl_DStringFree(&cmd);
- return 0;
- }
-
- int main(int n,char** args)
- { int i,k,filearg=0;
- char j;
- char *q;
- char buf[32];
- RiscOS_Init();
- ti=Tcl_CreateInterp();
- Tcl_CreateCommand(ti,"history",Tcl_HistoryCmd,NULL,NULL);
- RiscOS_InitVars(ti);
- q=getenv("Tclsh$Options");
- if(q) getflags(q);
- i=1;
- if(n>i&&args[i][0]=='-') getflags(args[i++]);
- if(flags['b'-'a']) banner();
- q=buf;
- for(j='a';j<='z';j++) if(flags[j-'a']) *q++=j;
- *q=0;
- Tcl_SetVar2(ti,"argv","flags",buf,TCL_GLOBAL_ONLY);
- q="";
- if(n>i) { q=args[i];filearg=i++;}
- Tcl_SetVar2(ti,"argv","file",q,TCL_GLOBAL_ONLY);
- sprintf(buf,"%d",n-i);
- Tcl_SetVar2(ti,"argc",0,buf,TCL_GLOBAL_ONLY);
- for(k=0;k<n-i;k++)
- { sprintf(buf,"%d",k);
- Tcl_SetVar2(ti,"argv",buf,args[k+i],TCL_GLOBAL_ONLY);
- }
- if(flags['i'-'a']&&file_eval("<tcl$Dir>.library.init")) goto cmdline;
- if(filearg&&file_eval(args[filearg])) goto cmdline;
- if(!flags['c'-'a']) return 0;
- cmdline:for(;;)
- { int code=DoOneCmd();
- if(code) printf("\nError %d - %s\n",code,ti->result);
- else puts(ti->result);
- }
- }
-