X-Git-Url: http://git.maemo.org/git/?p=opencv;a=blobdiff_plain;f=apps%2Fcvenv%2FEiC%2Fstarteic.c;fp=apps%2Fcvenv%2FEiC%2Fstarteic.c;h=0000000000000000000000000000000000000000;hp=691a7ed819c11473d62912fd28269f4c70f1ccff;hb=e4c14cdbdf2fe805e79cd96ded236f57e7b89060;hpb=454138ff8a20f6edb9b65a910101403d8b520643 diff --git a/apps/cvenv/EiC/starteic.c b/apps/cvenv/EiC/starteic.c deleted file mode 100644 index 691a7ed..0000000 --- a/apps/cvenv/EiC/starteic.c +++ /dev/null @@ -1,768 +0,0 @@ -/* starteic.c - * - * (C) Copyright Dec 31 1995, Edmond J. Breen. - * ALL RIGHTS RESERVED. - * This code may be copied for personal, non-profit use only. - * - */ - -/* In accordance with the practice of fair use, I hereby acknowledge - * that: - */ -static char *PlaugerStr_= -"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."; - - -/* Modified by Intel OpenCV team. The runEiC function has been changed - in order to catch exceptions thrown by parser and interpreter. */ - - -#include -#include -#include -#include -#include -#include -#include - -#include "MachSet.h" -#include "global.h" -#include "lexer.h" -#include "typemod.h" -#include "func.h" -#include "xalloc.h" -#include "preproc.h" -#include "emitter.h" -#include "parser.h" -#include "symbol.h" -#include "error.h" -#include "reset.h" - -#if __GLIBC__ >= 2 -#define signal sysv_signal -void (*sysv_signal(int sig, void (*func)(int a))) (int a); -#endif - - -extern void EiC_interpret(environ_t * env); -extern char *EiC_prolineString(char *str); - - -#define HERE printf("%s %d\n",__FILE__,__LINE__) - -char *Version = -"*************************************************************************\n" -"EiC V4.3.1 - Copyright (c) 1995 to 2000," -" by Edmond J. Breen\n" -"EiC comes `as is' and with ABSOLUTELY NO WARRANTY OF MERCHANTIBILITY AND\n" -" FITNESS OF PURPOSE\n" -"*************************************************************************\n" -; - - -environ_t *EiC_ENV; - -size_t EiC_ENV_NextEntryNum() -{ - return EiC_stab_NextEntryNum(&EiC_ENV->stab); -} - -void EiC_ENV_CleanUp(size_t bot) -{ - EiC_stab_CleanUp(&EiC_ENV->stab,bot); -} - -/*END STRING TABLE ROUTINES*/ - - -void EiC_reset_env_pointers(token_t * e1, int bp) -{ - EiC_ENV->lsp = bp; -} - - -void EiC_markENV(char mark) -{ - EiC_stab_Mark(&EiC_ENV->stab,mark); -} - -void free_env_code(void) -{ - unsigned int i; - InsT_t *inst; - - code_t *c = &EiC_ENV->CODE; - - while(c->prev) /* find start point */ - c = (code_t*)c->prev; - - inst = c->inst; - /* rem free up other info also */ - for (i = 0; i < c->nextinst; i++, inst++) - if (inst->opcode == jmptab) { - eicstack_t *s; - s = inst->val.p.p; - xfree(s->val); - xfree(s); - } else if (inst->opcode == assigntype) { - EiC_freetype(inst->val.p.p); - - } else if(inst->opcode == halt) { - EiC_freetype(inst->val.p.p); - } - - EiC_freecode(c); - EiC_ENV->CODE = *c; -} - -void EiC_SaveGlobalString(ptr_t *s) -{ - int len = (char*)s->ep - (char*)s->sp; - s->sp = s->p = EiC_stab_SaveString(&EiC_ENV->stab,s->p); - s->ep = (char*)s->p + len; -} - -/* signal handling routines - * - * If a new signal hangling rountines gets added - * make sure it gets also added in module/stdClib/src/signal.c - * - */ - -jmp_buf env; -static int jmpOn = 0; -#define Err_ 1 -#define Exit_ 2 - -char * EiC_CurrentFile =NULL; -unsigned int EiC_CurrentLine = -1; - -#define errStr(x) if(EiC_CurrentFile) EiC_error("\n" x ", file %s, line %d\n",EiC_CurrentFile,EiC_CurrentLine) -#define eic_disaster() EiC_error("exit EiC\n");exit(1) - - - -size_t fopen_NextEntryNum(void); -void _ffexit(size_t); - -void EiC_exit_call(int i) -{ -#ifndef _SEIC_ - size_t fopen_entry = fopen_NextEntryNum(); -#if defined(WIN32) || defined(_DJGPP) - signal(SIGTERM, EiC_exit_call); -#else - signal(SIGUSR1, EiC_exit_call); -#endif - _ffexit(fopen_entry); - if(jmpOn && jmpOn++ <= 1) - longjmp(env,Exit_); - else - eic_disaster(); -#else - eic_disaster(); -#endif -} - -void EiC_bus_err(int i) -{ - -#if defined(WIN32) || defined(_DJGPP) - signal(SIGABRT,EiC_bus_err); -#else - signal(SIGBUS, EiC_bus_err); -#endif - errStr("EiC bus error trapped"); - if(jmpOn && jmpOn++ <= 1) - longjmp(env,Err_); - else - eic_disaster(); -} -void EiC_ill_oper(int i) -{ - signal(SIGILL, EiC_ill_oper); - errStr("EiC illegal operation attempted\n"); - if(jmpOn && jmpOn++ <= 1) - longjmp(env,Err_); - else - eic_disaster(); -} -void EiC_stor_access(int i) -{ - signal(SIGSEGV, EiC_stor_access); - errStr("EiC illegal storage access"); - if(jmpOn && jmpOn++ <= 1) { - longjmp(env,Err_); - } else - eic_disaster(); -} - -void EiC_float_err(int i) -{ - signal(SIGFPE, EiC_float_err); - errStr("EiC maths exception"); - if(jmpOn && jmpOn++ <= 1) - longjmp(env,Err_); - else - eic_disaster(); -} - -void EiC_term_int(int i) -{ - signal(SIGINT, EiC_term_int); - errStr("EiC interrupted"); - if(jmpOn && jmpOn++ <= 1) - longjmp(env,Err_); - else - eic_disaster(); -} - -FILE *EiChist = NULL; -extern int EiC_verboseON, EiC_SHOWLINE, EiC_traceON, EiC_TIMER, - EiC_interActive, EiC_showIncludes; -int silent = 0, HistoryFile = 1; -int StartUpH = 1; -int reStart = 0, prompt = 0; -int EiC_Interact = 1; -int ScriptMode = 0; -static int FREE_G_STRING = 1; - - -void usage(void) -{ - puts("\n\t\tEiC\n" - " An Extensible Interactive C interpreter\n" - " To start eic, type eic.\n" - " To exit eic, type :exit.\n" - "\n Usage:\n" - "\teic [-Ipath] [-Dname[=var]] -[hHvVcCrR] [[file] [fileargs]]\n" - " Options:\n" - " C preprocessor directives:\n" - "\t-Ipath search for include files in path\n" - "\t-Dname define a symbolic name to the value 1\n" - "\t-Dname=var define a symbolic name to the value var\n" - "\t Note, there is no spaces allowed\n" - " EiC directives:\n" - "\t-h -H causes this usage to be displayed\n" - "\t-v -V print EiC's Log information\n" - "\t-p showline\n" - "\t-P show path of include files\n" - "\t-t -T turns trace on\n" - "\t-c -C turns timer on\n" - "\t-e echo HTML mode\n" - "\t-r restart EiC. Causes EiC to be re initiated\n" - "\t from the contents of EiChist.lst file\n" - "\t-R same as `r', but prompts the user to accept\n" - "\t or reject each input line first\n" - "\t-s -S run silently\n" - "\t-f run in script mode\n" - "\t-n no history file\n" - "\t-N don't use any startup.h files\n" - "\t-A Non-interactive-mode\n" - "\tfile EiC will execute `file' and then stop; for example:\n" - "\t % eic foo.c \n" - "\tfileargs command line arguments, which get passed onto file\n" - ); - exit(1); -} - -int do_sw_commands(char *cp) -{ - while(*cp) { - switch(*cp++) { - case 'D': dodefine(cp); return 1; - case 'I': EiC_insertpath(cp); return 1; - case '\?': - case 'h': - case 'H': usage(); - case 'c': - case 'C': EiC_TIMER = 1; break; - #ifndef NO_HTML - case 'e': - /* connect stderr to stdout */ - dup2(1,2); - /* setup stdout to behave like stderr */ - if(setvbuf(stdout,NULL,_IONBF,0) != 0) - EiC_error("failed to setup stdout\n"); - /* inform the browser */ - puts("Content-type: text/plain\n\n"); - break; - #endif - case 'v': - case 'V': puts(Version); exit(1); - - case 'R': prompt = 1; - case 'r': reStart = 1; break; - - case 's': - case 'S': silent = 1; break; - - case 'f': ScriptMode = 1; break; - case 'p': EiC_SHOWLINE = 1; break; - case 'P': EiC_showIncludes = 1; break; - case 't': - case 'T': EiC_traceON = 1; break; - case 'n': HistoryFile = 0; break; - case 'N': StartUpH = 0; break; - case 'A': EiC_Interact = 0; break; - default: - while(isspace(*cp)) cp++; - if(*cp == '-') /* assume script mode */ - while(isspace(*++cp)); - else if(*cp) /* catch for lines ending with whitespace */ - return 0; - } - } - return 1; -} - - - -void EiC_save_history(FILE *fp, int from); - -extern int EiC_verboseON; - -int EiC_Include_file(char *, int); -void EiC_marksyms(char); - -char *inbuf; -extern char *EiC_nextproline(); -extern int EiC_listcodeON, EiC_interpON,EiC_memdumpON; -extern unsigned long EiC_tot_memory; -extern size_t EiC_tot_alloc; - -void do_displays() -{ - if(EiC_verboseON) - printf("\ninstr = %d sARsize = %d lsp = %d aARsize = %d\n" - "EiC_tot_alloc = %lu EiC_tot_memory = %lu\n", - EiC_ENV->CODE.nextinst, - EiC_ENV->ARsize, - EiC_ENV->lsp, - EiC_ENV->LARsize, - (unsigned long)EiC_tot_alloc, - EiC_tot_memory); - EiC_listcode(&EiC_ENV->CODE); -} - -void runEiC() -{ - void EiC_remTempories(void); - void EiC_peephole(code_t *c); - int EiC_getHistLineNo(), hfrom = 0; - - /* Hawk start change */ - EiC_ParseError = 0; - /* Hawk change */ - - /* Hawk start change */ -#ifdef WIN32 - __try { -#endif - /* Hawk change */ - switch(setjmp(env)) { - case 0: - jmpOn = 1; - - EiCp_initiateReset(); - -#ifndef NO_HISTORY - hfrom = EiC_getHistLineNo(); -#endif - inbuf = EiC_nextproline(); - - EiC_initlex(inbuf); - EiC_initparser(); - EiC_parse(EiC_ENV); - EiC_peephole(&getenvcode(EiC_ENV)); - - if(EiC_listcodeON) - do_displays(); - if (EiC_ENV->CODE.nextinst && EiC_interpON && !EiC_ParseError) - EiC_interpret(EiC_ENV); - break; - - default: - EiC_messageDisplay("EiC reports an unRecognised jmp condition in starteic.c"); - case Err_: - EiC_ParseError = 1; - break; - case Exit_: - EiC_messageDisplay("Exit called: force clean up!\n"); - EiC_ParseError = 1; - break; - - - } - /* Hawk start change */ -#ifdef WIN32 - } __finally { -#endif - /* Hawk change */ - - if (EiC_errs) - EiC_clear_err_msgs(); - - if(FREE_G_STRING) - EiC_xfreemark(eicgstring); - free_env_code(); - EiC_remTempories(); - - if(EiC_ParseError) { - - if(EiC_ENV->lsp != 0) { - EiC_messageDisplay("EiC::Reset Local Stack Pointer\n"); - EiC_ENV->lsp = 0; - } - /* - if(EiC_ENV->ARgar.n) - xmark(EiC_ENV->ARgar.val,eicstay); - */ - - EiCp_Reset(1); - - /* Hawk start change */ - EiC_ParseError = 0; - /* Hawk change */ - } else { - -#ifndef NO_HISTORY - if(EiChist) - EiC_save_history(EiChist,hfrom); -#endif - } - - if(EiC_memdumpON) { - EiC_marksyms(NON_LEAK); - if(EiC_verboseON) - printf("--- XMEM DUMP\n"); - xdumpnonmark("eicxdump", NON_LEAK); - } -#ifdef WIN32 - } -#endif -} -#define FORMAT1 "\n#ifdef _STDLIBH\nexit(main());\n"\ - "#else\nmain();\n#endif\n" - -#define FORMAT2 "\n"\ - "#ifdef _STDLIBH\n"\ - "exit(main(_Argc,_Argv));\n"\ - "#else\n"\ - "main(_Argc,_Argv);\n"\ - "#endif\n" - -/* -#define FORMAT3 "\n"\ - "#ifdef _STDLIBH\n"\ - "exit(main(_Argc,_Argv,_Envp));\n"\ - "#else\n"\ - "main(_Argc,_Argv,_Envp);\n"\ - "#endif\n" -*/ - -int doEntry() -{ - func_t *F; - symentry_t *sym; - sym = EiC_lookup(stand_tab,"main"); - - if(!sym) { - if(!ScriptMode) - EiC_messageDisplay("Error: Missing `main'\n"); - return 0; - } - if(sym) { - if(EiC_gettype(sym->type) != t_func) { - EiC_messageDisplay("Error: `main' NOT DECLARED as a function\n"); - return 0; - } - /* check return type of main */ - if(EiC_gettype(nextType(sym->type)) != t_int) { - EiC_messageDisplay("Error: function `main' MUST return an `int' type\n"); - return 0; - } - - /* get number of arguments */ - F = EiC_getInf(sym->type); - if(getFNp(F) <= 1) /* allow for void argument */ - EiC_prolineString(FORMAT1); - else if(getFNp(F) <= 2) - EiC_prolineString(FORMAT2); - else - EiC_messageDisplay("Error: too many arguments being " - "passed to `main'\n"); - /*EiC_prolineString(FORMAT3);*/ - } - return 1; -} - -char * doargs(int argc, char **argv) -{ - int i,sz; - char buf[51]; - char *p; - - sprintf(buf,"int _Argc = %d;char *_Argv[] = {",argc); - - /* get size of string needed */ - sz = strlen(buf); - for(i=0;i 256 ? len : 256); - vsprintf(str,fmt,args); - - EiC_interActive = 0; /* turn off interactive mode */ - EiC_prolineString(str); - - - code = EiC_ENV->CODE; - EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0; - EiC_ENV->CODE.inst = NULL; - EiC_ENV->CODE.prev = &code; - /* sp = EiC_ENV->sp;*/ - - runEiC(); - - /* rem: runEiC will call free_env_code */ - EiC_ENV->CODE = code; - - EiC_interActive = h; - free(str); - va_end(args); - FREE_G_STRING = gs; -} - -void EiC_callBack(void *c) -{ - code_t code; - int gs = FREE_G_STRING; - - FREE_G_STRING = 0; - - if(!c) - return; - - code = EiC_ENV->CODE; - EiC_ENV->CODE = *(code_t*)c; - EiC_ENV->CODE.prev = &code; /* link */ - - EiC_interpret(EiC_ENV); - - EiC_ENV->CODE.prev = NULL; /* unlink */ - EiC_ENV->CODE = code; - FREE_G_STRING = gs; -} - - -void EiC_switches(char *switches) -{ - if(switches) { - char *p,*c = malloc(strlen(switches)+2); - strcpy(c,switches); - p = strtok(c," \t\n"); - while(p) { - if(*p == '-') - do_sw_commands(p+1); - p = strtok(NULL," \t\n"); - } - free(c); - } -} - -int EiC_run(int argc, char **argv) -{ - char * n2 = doargs(argc,argv); - int h = EiC_interActive; - code_t code; - - EiC_interActive = 0; /* turn off interactive mode */ - - code = EiC_ENV->CODE; - EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0; - EiC_ENV->CODE.inst = NULL; - EiC_ENV->CODE.prev = &code; - /*sp = EiC_ENV->sp;*/ - - - EiC_prolineString(n2); - runEiC(); - - - if(!EiC_Include_file(argv[0],1)) - return 0; - else - runEiC(); - - if(doEntry()) - runEiC(); - - /* rem: runEiC will call free_env_code */ - EiC_ENV->CODE.prev = NULL; - EiC_ENV->CODE = code; - /*EiC_ENV->sp = sp;*/ - - xfree(n2); - - EiC_interActive = h; - return 1; -} - -void EiC_getSwitchCommands(int *Argc, char ***Argv) -{ - -#ifndef NO_ARGV - - int argc = *Argc; - char **argv = *Argv; - - static int gotSwitches = 0; - - if(gotSwitches) - return; - - gotSwitches = 1; - - if(argc-- > 0) - while(argv[1]) { - if(argv[1][0] == '-') { - if(!do_sw_commands(&argv[1][1])) { - EiC_error("Unknown switch command [%s]\n", - argv[1]); - usage(); - } - } else - break; - argv++; - argc--; - } - - if(argc-- >0) { - if(!EiC_run(argc+1,argv+1)) - EiC_error("Failed to run %s\n",argv[1]); - exit(0); - } - - *Argc = argc; - *Argv = argv; - -#endif - -} - -void EiC_startEiC(int argc, char **argv) -{ - extern int EiC_load_history(char *fname,int prompt); - -#if defined(WIN32) || defined(_DJGPP) - signal(SIGABRT, EiC_bus_err); -#else - signal(SIGBUS, EiC_bus_err); -#endif - signal(SIGILL, EiC_ill_oper); - signal(SIGSEGV, EiC_stor_access); - signal(SIGFPE, EiC_float_err); - signal(SIGINT, EiC_term_int); -#if defined(WIN32) || defined(_DJGPP) - signal(SIGTERM, EiC_exit_call); -#else - signal(SIGUSR1, EiC_exit_call); -#endif - - - EiC_getSwitchCommands(&argc,&argv); - -#ifndef NO_ARGV - - if(argc-- >0) { - if(!EiC_run(argc+1,argv+1)) - EiC_error("Error: Failed to run %s\n",argv[1]); - exit(0); - } -#endif - - if(!silent) { - fputs(Version,stdout); - } - - #ifndef NO_HISTORY - if(StartUpH) - EiC_setinfile("starteic.h"); - - if(HistoryFile) { - char * name = "EiChist.lst"; - if(reStart) { - puts("Re Initiating EiC -- please wait."); - if(EiC_load_history(name,prompt)) { - runEiC(); /* ensure that startup files have - been loaded and compiled */ - EiChist = fopen(name,"w"); - EiC_save_history(EiChist,0); - fclose(EiChist); - EiChist=NULL; - EiC_Include_file(name,1); - runEiC(); - EiChist = fopen(name,"a"); - }else { - EiC_error("Error: unable to load history file\n"); - HistoryFile = 0; - EiChist = NULL; - } - puts("Done."); - } else { - EiChist = fopen(name,"w"); - if(!EiChist) { - EiC_messageDisplay("Failed to create EiChist.lst\n" - "Start No history file mode switch\n"); - HistoryFile = 0; - } - } - if(HistoryFile) - setvbuf(EiChist,NULL,_IOLBF,0); - } - #endif - - #ifdef PPCLIB - setvbuf(stdout,NULL,_IONBF,0); - setvbuf(stderr,NULL,_IONBF,0); - #endif - /* Hawk start change */ - /* while(1) */ - /* runEiC(); */ - /* Hawk change */ -} -