3 * (C) Copyright Dec 31 1995, Edmond J. Breen.
5 * This code may be copied for personal, non-profit use only.
9 /* In accordance with the practice of fair use, I hereby acknowledge
12 static char *PlaugerStr_=
13 "Portions of this work are derived from the Standard C library, (C), 1992 by P.J. Plauger, published by Prentice-Hall and are used with permission.";
16 /* Modified by Intel OpenCV team. The runEiC function has been changed
17 in order to catch exceptions thrown by parser and interpreter. */
42 #define signal sysv_signal
43 void (*sysv_signal(int sig, void (*func)(int a))) (int a);
47 extern void EiC_interpret(environ_t * env);
48 extern char *EiC_prolineString(char *str);
51 #define HERE printf("%s %d\n",__FILE__,__LINE__)
54 "*************************************************************************\n"
55 "EiC V4.3.1 - Copyright (c) 1995 to 2000,"
56 " by Edmond J. Breen\n"
57 "EiC comes `as is' and with ABSOLUTELY NO WARRANTY OF MERCHANTIBILITY AND\n"
58 " FITNESS OF PURPOSE\n"
59 "*************************************************************************\n"
65 size_t EiC_ENV_NextEntryNum()
67 return EiC_stab_NextEntryNum(&EiC_ENV->stab);
70 void EiC_ENV_CleanUp(size_t bot)
72 EiC_stab_CleanUp(&EiC_ENV->stab,bot);
75 /*END STRING TABLE ROUTINES*/
78 void EiC_reset_env_pointers(token_t * e1, int bp)
84 void EiC_markENV(char mark)
86 EiC_stab_Mark(&EiC_ENV->stab,mark);
89 void free_env_code(void)
94 code_t *c = &EiC_ENV->CODE;
96 while(c->prev) /* find start point */
100 /* rem free up other info also */
101 for (i = 0; i < c->nextinst; i++, inst++)
102 if (inst->opcode == jmptab) {
107 } else if (inst->opcode == assigntype) {
108 EiC_freetype(inst->val.p.p);
110 } else if(inst->opcode == halt) {
111 EiC_freetype(inst->val.p.p);
118 void EiC_SaveGlobalString(ptr_t *s)
120 int len = (char*)s->ep - (char*)s->sp;
121 s->sp = s->p = EiC_stab_SaveString(&EiC_ENV->stab,s->p);
122 s->ep = (char*)s->p + len;
125 /* signal handling routines
127 * If a new signal hangling rountines gets added
128 * make sure it gets also added in module/stdClib/src/signal.c
133 static int jmpOn = 0;
137 char * EiC_CurrentFile =NULL;
138 unsigned int EiC_CurrentLine = -1;
140 #define errStr(x) if(EiC_CurrentFile) EiC_error("\n" x ", file %s, line %d\n",EiC_CurrentFile,EiC_CurrentLine)
141 #define eic_disaster() EiC_error("exit EiC\n");exit(1)
145 size_t fopen_NextEntryNum(void);
146 void _ffexit(size_t);
148 void EiC_exit_call(int i)
151 size_t fopen_entry = fopen_NextEntryNum();
152 #if defined(WIN32) || defined(_DJGPP)
153 signal(SIGTERM, EiC_exit_call);
155 signal(SIGUSR1, EiC_exit_call);
157 _ffexit(fopen_entry);
158 if(jmpOn && jmpOn++ <= 1)
167 void EiC_bus_err(int i)
170 #if defined(WIN32) || defined(_DJGPP)
171 signal(SIGABRT,EiC_bus_err);
173 signal(SIGBUS, EiC_bus_err);
175 errStr("EiC bus error trapped");
176 if(jmpOn && jmpOn++ <= 1)
181 void EiC_ill_oper(int i)
183 signal(SIGILL, EiC_ill_oper);
184 errStr("EiC illegal operation attempted\n");
185 if(jmpOn && jmpOn++ <= 1)
190 void EiC_stor_access(int i)
192 signal(SIGSEGV, EiC_stor_access);
193 errStr("EiC illegal storage access");
194 if(jmpOn && jmpOn++ <= 1) {
200 void EiC_float_err(int i)
202 signal(SIGFPE, EiC_float_err);
203 errStr("EiC maths exception");
204 if(jmpOn && jmpOn++ <= 1)
210 void EiC_term_int(int i)
212 signal(SIGINT, EiC_term_int);
213 errStr("EiC interrupted");
214 if(jmpOn && jmpOn++ <= 1)
220 FILE *EiChist = NULL;
221 extern int EiC_verboseON, EiC_SHOWLINE, EiC_traceON, EiC_TIMER,
222 EiC_interActive, EiC_showIncludes;
223 int silent = 0, HistoryFile = 1;
225 int reStart = 0, prompt = 0;
226 int EiC_Interact = 1;
228 static int FREE_G_STRING = 1;
234 " An Extensible Interactive C interpreter\n"
235 " To start eic, type eic.\n"
236 " To exit eic, type :exit.\n"
238 "\teic [-Ipath] [-Dname[=var]] -[hHvVcCrR] [[file] [fileargs]]\n"
240 " C preprocessor directives:\n"
241 "\t-Ipath search for include files in path\n"
242 "\t-Dname define a symbolic name to the value 1\n"
243 "\t-Dname=var define a symbolic name to the value var\n"
244 "\t Note, there is no spaces allowed\n"
246 "\t-h -H causes this usage to be displayed\n"
247 "\t-v -V print EiC's Log information\n"
249 "\t-P show path of include files\n"
250 "\t-t -T turns trace on\n"
251 "\t-c -C turns timer on\n"
252 "\t-e echo HTML mode\n"
253 "\t-r restart EiC. Causes EiC to be re initiated\n"
254 "\t from the contents of EiChist.lst file\n"
255 "\t-R same as `r', but prompts the user to accept\n"
256 "\t or reject each input line first\n"
257 "\t-s -S run silently\n"
258 "\t-f run in script mode\n"
259 "\t-n no history file\n"
260 "\t-N don't use any startup.h files\n"
261 "\t-A Non-interactive-mode\n"
262 "\tfile EiC will execute `file' and then stop; for example:\n"
264 "\tfileargs command line arguments, which get passed onto file\n"
269 int do_sw_commands(char *cp)
273 case 'D': dodefine(cp); return 1;
274 case 'I': EiC_insertpath(cp); return 1;
279 case 'C': EiC_TIMER = 1; break;
282 /* connect stderr to stdout */
284 /* setup stdout to behave like stderr */
285 if(setvbuf(stdout,NULL,_IONBF,0) != 0)
286 EiC_error("failed to setup stdout\n");
287 /* inform the browser */
288 puts("Content-type: text/plain\n\n");
292 case 'V': puts(Version); exit(1);
294 case 'R': prompt = 1;
295 case 'r': reStart = 1; break;
298 case 'S': silent = 1; break;
300 case 'f': ScriptMode = 1; break;
301 case 'p': EiC_SHOWLINE = 1; break;
302 case 'P': EiC_showIncludes = 1; break;
304 case 'T': EiC_traceON = 1; break;
305 case 'n': HistoryFile = 0; break;
306 case 'N': StartUpH = 0; break;
307 case 'A': EiC_Interact = 0; break;
309 while(isspace(*cp)) cp++;
310 if(*cp == '-') /* assume script mode */
311 while(isspace(*++cp));
312 else if(*cp) /* catch for lines ending with whitespace */
321 void EiC_save_history(FILE *fp, int from);
323 extern int EiC_verboseON;
325 int EiC_Include_file(char *, int);
326 void EiC_marksyms(char);
329 extern char *EiC_nextproline();
330 extern int EiC_listcodeON, EiC_interpON,EiC_memdumpON;
331 extern unsigned long EiC_tot_memory;
332 extern size_t EiC_tot_alloc;
337 printf("\ninstr = %d sARsize = %d lsp = %d aARsize = %d\n"
338 "EiC_tot_alloc = %lu EiC_tot_memory = %lu\n",
339 EiC_ENV->CODE.nextinst,
343 (unsigned long)EiC_tot_alloc,
345 EiC_listcode(&EiC_ENV->CODE);
350 void EiC_remTempories(void);
351 void EiC_peephole(code_t *c);
352 int EiC_getHistLineNo(), hfrom = 0;
354 /* Hawk start change */
358 /* Hawk start change */
361 switch(setjmp(env)) {
365 EiCp_initiateReset();
368 hfrom = EiC_getHistLineNo();
370 inbuf = EiC_nextproline();
375 EiC_peephole(&getenvcode(EiC_ENV));
379 if (EiC_ENV->CODE.nextinst && EiC_interpON && !EiC_ParseError)
380 EiC_interpret(EiC_ENV);
384 EiC_messageDisplay("EiC reports an unRecognised jmp condition in starteic.c");
389 EiC_messageDisplay("Exit called: force clean up!\n");
395 /* Hawk start change */
400 EiC_clear_err_msgs();
403 EiC_xfreemark(eicgstring);
409 if(EiC_ENV->lsp != 0) {
410 EiC_messageDisplay("EiC::Reset Local Stack Pointer\n");
415 xmark(EiC_ENV->ARgar.val,eicstay);
420 /* Hawk start change */
421 // EiC_ParseError = 0;
427 EiC_save_history(EiChist,hfrom);
432 EiC_marksyms(NON_LEAK);
434 printf("--- XMEM DUMP\n");
435 xdumpnonmark("eicxdump", NON_LEAK);
439 #define FORMAT1 "\n#ifdef _STDLIBH\nexit(main());\n"\
440 "#else\nmain();\n#endif\n"
442 #define FORMAT2 "\n"\
444 "exit(main(_Argc,_Argv));\n"\
446 "main(_Argc,_Argv);\n"\
450 #define FORMAT3 "\n"\
452 "exit(main(_Argc,_Argv,_Envp));\n"\
454 "main(_Argc,_Argv,_Envp);\n"\
462 sym = EiC_lookup(stand_tab,"main");
466 EiC_messageDisplay("Error: Missing `main'\n");
470 if(EiC_gettype(sym->type) != t_func) {
471 EiC_messageDisplay("Error: `main' NOT DECLARED as a function\n");
474 /* check return type of main */
475 if(EiC_gettype(nextType(sym->type)) != t_int) {
476 EiC_messageDisplay("Error: function `main' MUST return an `int' type\n");
480 /* get number of arguments */
481 F = EiC_getInf(sym->type);
482 if(getFNp(F) <= 1) /* allow for void argument */
483 EiC_prolineString(FORMAT1);
484 else if(getFNp(F) <= 2)
485 EiC_prolineString(FORMAT2);
487 EiC_messageDisplay("Error: too many arguments being "
488 "passed to `main'\n");
489 /*EiC_prolineString(FORMAT3);*/
494 char * doargs(int argc, char **argv)
500 sprintf(buf,"int _Argc = %d;char *_Argv[] = {",argc);
502 /* get size of string needed */
505 sz += strlen(argv[i]) + 3; /* 3 comma + quotes */
506 /* needs to be NULL terminated */
507 sz += strlen("(void*)0};") + 2; /* 2 for NULL */
513 for(i=0;i<argc;++i) {
518 strcat(p,"(void*)0};");
523 void EiC_parseString(char * fmt,...)
528 int h = EiC_interActive;
529 int gs = FREE_G_STRING;
539 len = 2 * strlen(fmt);
540 str = malloc(len > 256 ? len : 256);
541 vsprintf(str,fmt,args);
543 EiC_interActive = 0; /* turn off interactive mode */
544 EiC_prolineString(str);
547 code = EiC_ENV->CODE;
548 EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0;
549 EiC_ENV->CODE.inst = NULL;
550 EiC_ENV->CODE.prev = &code;
551 /* sp = EiC_ENV->sp;*/
555 /* rem: runEiC will call free_env_code */
556 EiC_ENV->CODE = code;
564 void EiC_callBack(void *c)
567 int gs = FREE_G_STRING;
574 code = EiC_ENV->CODE;
575 EiC_ENV->CODE = *(code_t*)c;
576 EiC_ENV->CODE.prev = &code; /* link */
578 EiC_interpret(EiC_ENV);
580 EiC_ENV->CODE.prev = NULL; /* unlink */
581 EiC_ENV->CODE = code;
586 void EiC_switches(char *switches)
589 char *p,*c = malloc(strlen(switches)+2);
591 p = strtok(c," \t\n");
595 p = strtok(NULL," \t\n");
601 int EiC_run(int argc, char **argv)
603 char * n2 = doargs(argc,argv);
604 int h = EiC_interActive;
607 EiC_interActive = 0; /* turn off interactive mode */
609 code = EiC_ENV->CODE;
610 EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0;
611 EiC_ENV->CODE.inst = NULL;
612 EiC_ENV->CODE.prev = &code;
613 /*sp = EiC_ENV->sp;*/
616 EiC_prolineString(n2);
620 if(!EiC_Include_file(argv[0],1))
628 /* rem: runEiC will call free_env_code */
629 EiC_ENV->CODE.prev = NULL;
630 EiC_ENV->CODE = code;
631 /*EiC_ENV->sp = sp;*/
639 void EiC_getSwitchCommands(int *Argc, char ***Argv)
647 static int gotSwitches = 0;
656 if(argv[1][0] == '-') {
657 if(!do_sw_commands(&argv[1][1])) {
658 EiC_error("Unknown switch command [%s]\n",
669 if(!EiC_run(argc+1,argv+1))
670 EiC_error("Failed to run %s\n",argv[1]);
681 void EiC_startEiC(int argc, char **argv)
683 extern int EiC_load_history(char *fname,int prompt);
685 #if defined(WIN32) || defined(_DJGPP)
686 signal(SIGABRT, EiC_bus_err);
688 signal(SIGBUS, EiC_bus_err);
690 signal(SIGILL, EiC_ill_oper);
691 signal(SIGSEGV, EiC_stor_access);
692 signal(SIGFPE, EiC_float_err);
693 signal(SIGINT, EiC_term_int);
694 #if defined(WIN32) || defined(_DJGPP)
695 signal(SIGTERM, EiC_exit_call);
697 signal(SIGUSR1, EiC_exit_call);
701 EiC_getSwitchCommands(&argc,&argv);
706 if(!EiC_run(argc+1,argv+1))
707 EiC_error("Error: Failed to run %s\n",argv[1]);
713 fputs(Version,stdout);
718 EiC_setinfile("starteic.h");
721 char * name = "EiChist.lst";
723 puts("Re Initiating EiC -- please wait.");
724 if(EiC_load_history(name,prompt)) {
725 runEiC(); /* ensure that startup files have
726 been loaded and compiled */
727 EiChist = fopen(name,"w");
728 EiC_save_history(EiChist,0);
731 EiC_Include_file(name,1);
733 EiChist = fopen(name,"a");
735 EiC_error("Error: unable to load history file\n");
741 EiChist = fopen(name,"w");
743 EiC_messageDisplay("Failed to create EiChist.lst\n"
744 "Start No history file mode switch\n");
749 setvbuf(EiChist,NULL,_IOLBF,0);
754 setvbuf(stdout,NULL,_IONBF,0);
755 setvbuf(stderr,NULL,_IONBF,0);
757 /* Hawk start change */