3 * (C) Copyright Apr 15 1995, Edmond J. Breen.
5 * This code may be copied for personal, non-profit use only.
29 extern char EiC_LEXEM[];
30 extern token_t *token;
32 int EiC_listcodeON = 0;
37 int EiC_memdumpON = 0;
38 int EiC_memtraceON = 0;
40 int EiC_traceFunc = 0;
41 int EiC_verboseON = 0;
43 int EiC_interActive=1;
44 int EiC_showIncludes = 0;
48 static void outputval(int obj, void *v)
51 case t_char: fprintf(stdout,"%d",*(char *) v);break;
52 case t_uchar: fprintf(stdout,"%d",*(unsigned char *) v); break;
53 case t_short: fprintf(stdout,"%d",*(short *) v); break;
54 case t_ushort: fprintf(stdout,"%d",*(unsigned short*) v); break;
55 case t_int: fprintf(stdout,"%d",*(int *) v); break;
56 case t_uint: fprintf(stdout,"%u",*(unsigned *) v); break;
57 case t_long: fprintf(stdout,"%ld",*(long *) v); break;
58 case t_ulong: fprintf(stdout,"%lu",*(long *) v); break;
62 case t_llong: fprintf(stdout,"%Ld",*(eic_llong *) v); break;
64 case t_llong: fprintf(stdout,"%ld",*(eic_llong *) v); break;
67 case t_float: fprintf(stdout,"%.9g",*(float *) v); break;
68 case t_double: fprintf(stdout,"%.9g",*(double *) v); break;
70 case t_pointer: fprintf(stdout,"%p",(void*)*(long *) v); break;
71 case t_void: fprintf(stdout,"(void)"); break;
72 case t_enum: fprintf(stdout,"(enumeration)"); break;
73 case STR: fprintf(stdout,"%.100s",*(char **) v); break;
74 default: fprintf(stdout,"Unknown type"); break;
79 static void showstruct(AR_t * arg)
84 S = (struct_t *) EiC_getInf(arg->type);
88 fputs("(null struct) ", stdout);
90 for (i = 0; i < S->n; i++) {
91 switch ((t = EiC_gettype(S->type[i]))) {
93 fputs("Array", stdout);
96 fputs("Union",stdout);
99 fputs("Struct", stdout);
102 outputval(t, &D[S->offset[i]]);
107 fputs("\b}", stdout);
110 void EiC_showvalue(AR_t * arg)
114 if(!EiC_interActive || !arg->type)
119 t = EiC_gettype(arg->type);
121 if(isconst(arg->type) && t != t_pointer) {
122 outputval(t, &arg->v);
127 switch ((t = EiC_gettype(arg->type))) {
128 case t_union: fputs("(Union)",stdout); break;
129 case t_struct: showstruct(arg); break;
130 case t_char: case t_uchar: case t_short:
131 case t_ushort: outputval(t_int, &arg->v.ival); break;
132 case t_float: outputval(t_double, &arg->v.ival); break;
135 if (EiC_gettype(nextType(arg->type)) == t_char)
140 outputval(t, &arg->v);
147 static void EiC_showdectype(type_expr *, int, FILE *);
149 static void showFunc(type_expr **t, FILE *fp)
151 static int level = 0;
155 F = (func_t *) EiC_getInf(*t);
158 if (F && getFNp(F)) {
159 for (i = 0; i < getFNp(F); i++) {
164 printf("%s: ",getFPname(F,i));
165 EiC_showdectype(getFPty(F,i), 0,fp);
174 fputs(") returning ", fp);
177 EiC_showdectype(*t,0,fp);
184 fprintf(fp,"\n\n /* %s/\n", getFComm(F)); /**/
189 static void EiC_showdectype(type_expr * t, int expand, FILE *fp)
194 static int level = 0;
197 if(isconst(t) || isconstp(t))
200 switch (EiC_gettype(t)) {
201 case t_var: fputs("...", fp); break;
202 case t_enum: fputs("enum ", fp); break;
203 case t_char: fputs("char ", fp); break;
204 case t_uchar: fputs("unsigned char ", fp); break;
205 case t_short: fputs("short ", fp); break;
206 case t_ushort:fputs("unsigned short ", fp); break;
207 case t_int: fputs("int ", fp); break;
208 case t_uint: fputs("unsigned ", fp); break;
209 case t_long: fputs("long int ", fp); break;
210 case t_ulong: fputs("unsigned long int ", fp); break;
211 case t_llong: fputs("long long ",fp); break;
212 case t_float: fputs("float ", fp); break;
213 case t_double:fputs("double ", fp); break;
217 fputs("unsafe ", fp);
219 fputs("safe ", fp);*/
224 case t_void: fputs("void ", fp); break;
225 case t_hidden: fputs("hidden ",fp); break;
227 case t_funcdec: fputs("dec_", fp); showFunc(&t,fp); break;
228 case t_func: showFunc(&t,fp); break;
229 case t_builtin: fputs("Builtin ",fp); showFunc(&t,fp); break;
232 fprintf(fp,"ARY[%d]",(int) EiC_getInf(t));
238 fputs("Incomplete", fp);
241 if (EiC_gettype(t) == t_struct)
242 fprintf(fp,"struct: size %u bytes",S->tsize);
244 fprintf(fp,"union: size %u bytes",S->tsize);
250 for (i = 0; i < S->n; i++) {
251 for (j = 0; j < level; j++)
255 EiC_showdectype(S->type[i], expand,fp);
262 case t_ref: fputs("Reference ",fp);break;
263 case ID: fputs("Identifier ", fp); break;
264 default: fputs("Uknown identifier", fp); return;
270 static int IsObject(int t)
272 if(t != t_func && t !=t_funcdec && t != t_builtin)
278 int EiC_IsFunc(int t)
283 static void displaySclass(symentry_t *sym)
285 /* display storage class */
286 if (sym->sclass == c_typedef)
287 fputs("typedef ", stdout);
288 else if(sym->sclass & c_private)
289 fprintf(stdout,"private to %s: ", sym->fname);
290 else if (sym->sclass & c_static)
291 fputs("static ", stdout);
292 if (sym->typequal == q_const)
293 fputs("const ", stdout);
294 else if (sym->typequal == q_volatile)
295 fputs("volatile ", stdout);
298 static void showtab(int tab, int expand, token_t * e1, char *fname, int allowed())
303 for (i = 0; i < HSIZE; i++)
304 for (sym = EiC_HTAB[i]; sym; sym = sym->next) {
306 if ((t = EiC_gettype(sym->type)) == t_eic || sym->nspace != tab)
309 if(e1 && e1->Type && ! EiC_sametypes(e1->Type,sym->type))
312 /*printf("looking at [%s]\n",sym->fname);*/
313 if(fname && strcmp(fname,sym->fname) != 0)
316 if(allowed && !allowed(t))
319 fputs(sym->id, stdout);
320 fputs(" -> ", stdout);
321 EiC_showdectype(sym->type, expand,stdout);
327 static int show(void)
330 int h = EiC_work_tab;
333 EiC_work_tab = stand_tab;
335 if ((t = EiC_lexan()) == ID || t == TYPENAME) {
336 if(!EiC_showMacro(token->Val.sym->id)) { /* test macros first */
337 t = EiC_gettype(token->Val.sym->type);
339 EiC_remsym(token->Val.sym);
341 * check for struct/union tag name.
343 if ((token->Val.sym = EiC_lookup(tag_tab, EiC_LEXEM)) == NULL) {
344 EiC_error("Unknown identifier %s",EiC_LEXEM);
347 fputs("Tag::",stdout);
350 displaySclass(token->Val.sym);
351 fputs(token->Val.sym->id, stdout);
352 fputs(" -> ", stdout);
353 EiC_showdectype(token->Val.sym->type, 1,stdout);
356 /* -----------------------------------------------------*/
358 t = EiC_gettype(token->Val.sym->type);
359 if (! (token->Val.sym->sclass == c_typedef ||
360 (t==t_builtin) || (t==t_func) || (t==t_funcdec)))
362 fputs("value= ", stdout);
364 arg.v=EiC_ENV->AR[token->Val.sym->val.ival].v;
365 arg.type = token->Val.sym->type;
372 /* -------------------------------------------------*/
373 if (t == t_func && EiC_listcodeON) {
374 if (EiC_ENV->AR[token->Val.sym->val.ival].v.p.p)
375 EiC_listcode(EiC_ENV->AR[token->Val.sym->val.ival].v.p.p);
378 EiC_remsym(token->Val.sym);
380 EiC_error("Expected identifier");
385 static char *getNextInput()
389 static char buf[256];
391 while(isspace(c = EiC_nextchar()));
393 while( c && c != DONE && !isspace(c)) {
403 static int ResetEiC()
406 void EiCp_ResetStart(void);
407 void EiCp_setResetStart(void);
409 buf = getNextInput();
411 if(strcmp(buf,"here") == 0)
412 EiCp_setResetStart();
414 EiC_error("Unrecgonised command `%s' for reset",buf);
421 static int filesCommand(void)
423 void EiC_showIncludedFiles(void);
424 void EiC_showFileMacros(char *fname);
425 char EiC_nextchar(void);
427 int EiC_IsIncluded(char *fname);
430 buf = getNextInput();
433 if(!EiC_IsIncluded(buf))
434 EiC_warningerror("Failed to find %s",buf);
436 EiC_showFileMacros(buf);
437 showtab(stand_tab,0,NULL,buf,IsObject);
438 showtab(stand_tab,0,NULL,buf,EiC_IsFunc);
441 EiC_showIncludedFiles();
446 static int clearCommand(void)
449 * syntax :clear file1[,file]*
452 int EiC_lutClearFileEntries(char *FileName);
453 void EiC_ClearFileMacros(char *fname);
454 void EiC_rmIncludeFileName(char *fname);
456 char EiC_nextchar(void);
458 int EiC_IsIncluded(char *fname);
461 buf = getNextInput();
470 if(!EiC_IsIncluded(buf))
471 EiC_warningerror("Failed to find %s",buf);
473 int r = EiC_lutClearFileEntries(buf);
474 EiC_ClearFileMacros(buf);
476 EiC_rmIncludeFileName(buf);
484 EiC_error("Expected file name");
491 static int setnextinf(void *info)
496 for (i = 0; i < HSIZE; i++)
497 for (sym = EiC_HTAB[i]; sym; sym = sym->next)
498 if ((t = EiC_gettype(sym->type)) == t_union || t == t_struct)
499 for (type = sym->type; type; type = nextType(type))
500 if (type->alias && EiC_getInf(type) == info) {
507 static void checktype(type_expr * type)
511 if ((t = EiC_gettype(type)) == t_struct || t == t_union)
513 if (setnextinf(EiC_getInf(type)))
515 type = nextType(type);
520 static long getmitem(val_t *v, int t)
523 case INT: return v->ival;
524 case UINT: return v->uival;
525 case LONG: return v->lval;
526 case ULONG: return v->ulval;
535 int t, h = EiC_work_tab;
536 EiC_work_tab = stand_tab;
538 switch(EiC_lexan()) {
541 t = EiC_gettype(token->Val.sym->type);
543 EiC_remsym(token->Val.sym);
545 * check for a tag name.
547 if((token->Val.sym = EiC_lookup(tag_tab,EiC_LEXEM)) == NULL) {
548 EiC_error("Unknown identifier %s",EiC_LEXEM);
550 checktype(token->Val.sym->type);
551 EiC_remsym(token->Val.sym);
553 } else if (t == t_builtin) {
554 EiC_error("Cannot remove builtin functions");
556 checktype(token->Val.sym->type);
557 EiC_remsym(token->Val.sym);
564 mitem = getmitem(&token->Val,token->Tok);
565 if(EiC_getMemMark(mitem) == MEM_LEAK)
566 EiC_freeMemItem(mitem);
568 EiC_error("Memory item %ld is not a leak\n", mitem);
571 EiC_error("UnExpected input to rm");
575 } while (EiC_lexan() == ',');
582 static int showhashtab(void)
587 EiC_work_tab = tab = stand_tab; /* standard name space */
590 switch(EiC_lexan()) {
597 if(strcmp(EiC_LEXEM,"tags") == 0)
599 else if(strcmp(EiC_LEXEM,"builtin") == 0)
600 e1.Type = EiC_addtype(t_builtin,0);
608 showtab(tab, 0,&e1,NULL,NULL);
609 EiC_freetype(e1.Type);
611 showtab(tab,0,NULL,NULL,IsObject);
612 showtab(tab,0,NULL,NULL,EiC_IsFunc);
617 static int extra_option(char * option)
619 EiC_work_tab = stand_tab; /* standard name space */
620 if (EiC_lexan() == ID) {
621 if(strcmp(EiC_LEXEM,option) == 0)
632 extern FILE *EiChist;
635 fputs("EiC Bye\n", stdout);
642 static int toggle_verbose()
644 EiC_verboseON = !EiC_verboseON;
645 return EiC_verboseON;
648 static int toggle_interface()
650 interfaceON = !interfaceON;
655 static int toggle_memdump()
657 EiC_memdumpON = !EiC_memdumpON;
658 return EiC_memdumpON;
661 static int toggle_memtrace()
663 EiC_memtraceON = !EiC_memtraceON;
664 return EiC_memtraceON;
667 static int toggle_showline()
669 EiC_SHOWLINE = !EiC_SHOWLINE;
674 static int toggle_timer()
676 EiC_TIMER = !EiC_TIMER;
680 static int toggle_interp()
682 EiC_interpON = !EiC_interpON;
686 static int toggle_includes()
688 EiC_showIncludes= !EiC_showIncludes;
689 return EiC_showIncludes;
692 static int toggle_trace()
694 if(extra_option("funcs"))
695 EiC_traceFunc = !EiC_traceFunc;
702 EiC_traceON = !EiC_traceON;
707 static int toggle_listcode()
709 if(extra_option("linenums"))
710 EiC_lineNums = !EiC_lineNums;
717 EiC_listcodeON = !EiC_listcodeON;
719 return EiC_listcodeON;
723 static int showhistory()
726 void EiC_show_history(FILE *fp);
727 EiC_show_history(stdout);
732 static int showHelp()
734 puts("-----------------------------------------------------------------------------\n"
735 "EiC-COMMAND SUMMARY DESCRIPTION\n"
736 "-----------------------------------------------------------------------------\n"
737 ":-I path Append path to the include-file search list.\n"
738 ":-L List search paths.\n"
739 ":-R path Remove path from the include-file search list.\n"
740 ":clear fname Removes the contents of file fname from EiC.\n"
741 ":exit Terminates an EiC session.\n"
742 ":files Display the names of all included files.\n"
743 ":files fname Summarize the contents of the included file `fname'.\n"
744 ":gen fname Generates EiC interface of the included file `fname'.\n"
745 ":gen fname [<\"outfile\">] Places the interface in outfile\n"
746 ":gen fname 4 Generates EiC interface with 4 levels of multiplexing.\n"
747 ":help Display summary of EiC commands.\n"
748 ":history List the history of all input commands.\n"
749 ":includes Display path of include files when loaded.\n"
750 ":interpreter Execute input commands. By default it is on.\n"
751 ":listcode List stack code.\n"
752 ":listcode linenums List stack code with associated line numbers.\n"
753 ":memdump Show potential memory leaks.\n"
754 ":reset Reset EiC back to its start state.\n"
755 ":reset here Set the `reset' state to EiC's current state.\n"
756 ":rm dddd Remove memory item dddd, which is a constant integer value.\n"
757 ":rm f Removes f's definition from the symbol tables.\n"
758 ":show f Shows type or macro definition of `f'.\n"
759 ":showline Show input line after macro expansion.\n"
760 ":status Display the status of the toggle switches.\n"
761 ":timer Time in seconds of execution.\n"
762 ":trace Trace function calls and line numbers during code execution.\n"
763 ":trace funcs Trace function calls only during code execution.\n"
764 ":variables Display declared variables and interpreter-ed function names.\n"
765 ":variables tags Display the tag identifiers.\n"
766 ":variables type-name Display variables of type `type-name'.\n"
767 ":verbose Suppresses EiC's copyright and warning messages on start up.\n"
768 "------------------------------------------------------------------------------\n"
773 static int EiCstatus()
779 {"includes",&EiC_showIncludes},
780 {"interpreter", &EiC_interpON},
781 {"listcode",&EiC_listcodeON},
782 {"memdump", &EiC_memdumpON},
783 {"showline",&EiC_SHOWLINE},
784 {"timer",&EiC_TIMER},
785 {"trace",&EiC_traceON},
786 {"verbose",&EiC_verboseON},
788 int n = sizeof(toggles)/sizeof(struct toggle);
791 printf("\t%-15s %d\n",toggles[n].name, *toggles[n].val);
797 static symentry_t *add_eicfunc(char *name, int (*func) ())
800 sym = EiC_insertLUT(eic_tab, name, t_eic);
802 sym->val.func = func;
806 symentry_t *EiC_add_builtinfunc(char *name, val_t(*vfunc) ())
809 sym = EiC_insertLUT(stand_tab, name, ID);
810 EiC_freetype(sym->type);
812 sym->val.vfunc = vfunc;
813 sym->type = EiC_addtype(t_builtin,NULL);
818 void EiC_comm_switch(void)
820 int EiC_insertpath(char *);
821 int EiC_removepath(char *);
822 void EiC_listpath(void);
823 char EiC_nextchar(void);
826 if (EiC_lexan() == ID) {
827 if(EiC_gettype(token->Val.sym->type) == ID) {
828 EiC_remsym(token->Val.sym);
831 buf = getNextInput();
833 switch(EiC_LEXEM[0]) {
835 if(!*buf || !EiC_insertpath(buf))
836 EiC_warningerror("Failed to add path");
839 if(!*buf || !EiC_removepath(buf))
840 EiC_warningerror("Failed to remove path");
843 EiC_listpath();break;
845 EiC_error("Unknown command switch");
849 EiC_error("Expected command switch");
856 /* Jean-Bruno Richard personal Modification inside eicmod.c */
858 /* Semi-automatic module code generation */
859 /* functions. Thanks to the function prototype, it's possible to */
860 /* generate it's interfacing function to EiC. */
861 /* Few manual modification of the generated code are sometimes needed, */
862 /* but it helps a lot.... */
863 /* How to use it : */
864 /* Launch EiC, #include the desired header file */
865 /* (Example #include "gl.h") */
866 /* and use the new EiC command :gen with the name of the header file */
867 /* (In the example :gen gl.h) EiC will output the interface to stdout */
868 /* Hope it helps..... : */
869 /* jean-bruno.richard@mg2.com */
876 static int callBack=0;
877 static int * callNo =NULL;
878 static int *callpos = NULL;
879 static int Ncalls = 0;
880 static char *callName="EiC_Cfunc_";
881 static char *middleName="MiddleOne_";
882 static int MULTIPLEX = 1;
884 static void EiC__generateType(type_expr *t, char *id,FILE *fp, int level)
895 switch(EiC_gettype(t)) {
896 case t_pointer: /* pointer */
897 sprintf(tmp,"*%s",out);
901 case t_char: sprintf(tmp,"%s %s", "char", out); strcpy(out,tmp); break;
902 case t_uchar: sprintf(tmp,"%s %s", "unsigned char",out);strcpy(out,tmp); break;
903 case t_short: sprintf(tmp,"%s %s", "short",out);strcpy(out,tmp);break;
904 case t_ushort: sprintf(tmp,"%s %s", "unsigned short",out);strcpy(out,tmp);break;
905 case t_int: sprintf(tmp,"%s %s", "int",out);strcpy(out,tmp);break;
906 case t_uint: sprintf(tmp,"%s %s", "unsigned",out);strcpy(out,tmp);break;
907 case t_long: sprintf(tmp,"%s %s", "long",out);strcpy(out,tmp);break;
908 case t_ulong: sprintf(tmp,"%s %s", "unsigned long",out);strcpy(out,tmp);break;
909 case t_float: sprintf(tmp,"%s %s", "float",out);strcpy(out,tmp);break;
910 case t_double: sprintf(tmp,"%s %s", "double",out);strcpy(out,tmp);break;
911 case t_void: sprintf(tmp,"%s %s", "void",out);strcpy(out,tmp);break;
915 if(EiC_gettype(t) == t_union)
918 fputs("struct {",fp);
922 fputs("Incomplete", fp);
928 for (i = 0; i < S->n; i++) {
929 EiC__generateType(S->type[i], S->id[i], fp,level);
933 sprintf(tmp,"} %s ",out);
938 case t_array: /* array */
940 sprintf(tmp,"(%s)%s",out,"[]");
943 sprintf(tmp,"[%d]",(int)EiC_getInf(t));
951 } while ( (t=nextType(t)));
953 fprintf(fp,"%s",out);
956 static int DoCallBackNames(func_t *F, FILE *fp)
961 callpos = realloc(callpos,sizeof(int)*getFNp(F));
962 for (i = 0; i < getFNp(F); i++) {
963 type_expr *t = getFPty(F,i);
964 if(EiC_gettype(t) == t_pointer &&
965 EiC_IsFunc(EiC_gettype(nextType(t)))) {
966 callNo = realloc(callNo, sizeof(*callNo) * (x+1));
968 callNo[x] = callBack++;
969 fprintf(fp,"static void * %s%d = NULL;\n",callName,callNo[x]);
978 static void genCallBackFunc(type_expr *ty,
988 t = getFPty(F,callpos[p]);
992 fprintf(fp,"static ");
993 EiC_showdectype(nextType(t),0,fp);
995 fprintf(fp," %s%d(",middleName,callNo[p]);
997 /* check 4 varadic function calls */
998 for(i=0;i<getFNp(F2);i++)
999 if(EiC_gettype(getFPty(F2,i)) == t_var) {
1005 for(i=0;i<getFNp(F2)-1;i++) {
1006 if((v=EiC_gettype(getFPty(F2,i))) == t_void)
1008 sprintf(buff,"x%d, ",i);
1009 EiC__generateType(getFPty(F2,i),buff,fp,1);
1012 if((v=EiC_gettype(getFPty(F2,i))) != t_void) {
1013 sprintf(buff,"x%d ",i);
1014 EiC__generateType(getFPty(F2,i),buff,fp,1);
1016 fprintf(fp,")\n{\n");
1018 for (i = 0; i < getFNp(F2); i++) {
1019 if(EiC_gettype(getFPty(F2,i)) == t_void)
1021 fprintf(fp," setArg(%d, %s%d, ",i,callName,callNo[p]);
1023 EiC__generateType(getFPty(F2,i),"",fp,1);
1025 fprintf(fp,",x%d);\n",i);
1029 fprintf(fp," va_alist ) va_dcl\n{\n");
1030 fprintf(fp," void Auto_EiC_CallBack(code_t *callback, va_list ap);\n");
1031 fprintf(fp," va_list ap; va_start(ap);\n");
1032 fprintf(fp," Auto_EiC_CallBack(%s%d,ap);\n",callName,callNo[p]);
1035 fprintf(fp,"\n EiC_callBack(%s%d);\n",callName,callNo[p]);
1037 if(EiC_gettype(nextType(t)) != t_void) {
1038 fputs(" return EiC_ReturnValue( ",fp);
1039 /*EiC_showdectype(nextType(t),0,fp);*/
1040 EiC__generateType(nextType(t),"",fp,1);
1044 fputs(" va_end(ap);\n",fp);
1052 static void genArg(type_expr * t, int idx, FILE *fp)
1055 if ((ob = EiC_gettype(t)) == t_void) {
1059 if(ob == t_pointer) {
1060 int k = EiC_gettype((nextType(t)));
1063 while(k<Ncalls && callpos[k] != idx) k++;
1064 fprintf(fp,"%s%d",middleName,callNo[k]+adjustNum);
1070 fprintf(fp,"%d",idx);
1071 fputs(",getargs(),",fp);
1074 case t_char: fputs("char)", fp); break;
1075 case t_uchar: fputs("char)", fp); break;
1076 case t_short: fputs("short)", fp); break;
1077 case t_ushort:fputs("short)", fp); break;
1078 case t_int: fputs("int)", fp); break;
1079 case t_uint: fputs("unsigned)", fp); break;
1080 case t_long: fputs("long) ", fp); break;
1081 case t_ulong: fputs("unsigned long)", fp); break;
1082 case t_float: fputs("float)", fp); break;
1083 case t_double:fputs("double)", fp); break;
1085 fputs("ptr_t).p",fp);
1087 default: fputs("Uknown identifier", fp); return;
1091 static void genAffect(type_expr * t, int expand, FILE *fp)
1095 switch (EiC_gettype(t)) {
1098 case t_int: fputs("v.ival = ", fp); break;
1101 case t_uint: fputs("v.uival = ", fp); break;
1102 case t_long: fputs("v.lval = ", fp); break;
1103 case t_ulong: fputs("v.ulval = ", fp); break;
1105 case t_double:fputs("v.dval = ", fp); break;
1109 fputs("v.p.ep = (void*)ULONG_MAX;\n"
1110 "\tv.p.sp = v.p.p = ",fp);
1112 fputs("v.p.ep = v.p.sp = v.p.p = ", fp);
1115 case t_hidden: break;
1118 fprintf(fp,"ARY[%d]",(int) EiC_getInf(t));
1124 fputs("Incomplete", fp);
1127 if (EiC_gettype(t) == t_struct)
1128 fprintf(fp,"struct: size %u bytes",S->tsize);
1130 fprintf(fp,"union: size %u bytes",S->tsize);
1136 for (i = 0; i < S->n; i++) {
1137 for (j = 0; j < level; j++)
1139 fputs(S->id[i], fp);
1141 EiC_showdectype(S->type[i], expand,fp);
1148 case t_ref: fputs("Reference ",fp);break;
1149 case ID: fputs("Identifier ", fp); break;
1151 default: fputs("Uknown identifier", fp); return;
1155 static void genCall(type_expr *t, char *fname, FILE *fp)
1157 static int level = 0;
1161 F = (func_t *) EiC_getInf(t);
1168 for(k=0;k<Ncalls;++k)
1169 fprintf(fp,"\t%s%d = arg(%d,getargs(),ptr_t).p;\n",
1170 callName,callNo[k],callpos[k]);
1183 if (F && getFNp(F)) {
1184 for (i = 0; i < getFNp(F); i++) {
1185 genArg(getFPty(F,i), i, fp);
1186 if(i < getFNp(F)-1) {
1199 static void genMultiCall(type_expr *t, char *fname, FILE *fp)
1201 static int level = 0;
1206 F = (func_t *) EiC_getInf(t);
1209 fputs("\tstatic int nb = 0;\n\n",fp);
1211 fprintf(fp,"\tswitch(nb)\n");
1212 fprintf(fp,"\t{\n");
1213 for (n = 0;n < MULTIPLEX;++n)
1215 adjustNum = n+1-MULTIPLEX;
1216 fprintf(fp,"\tcase %d :\n",n);
1220 for(k=0;k<Ncalls;++k)
1221 fprintf(fp,"\t%s%d = arg(%d,getargs(),ptr_t).p;\n",
1222 callName,callNo[k]+adjustNum,callpos[k]);
1244 if (F && getFNp(F)) {
1245 for (i = 0; i < getFNp(F); i++) {
1246 genArg(getFPty(F,i), i, fp);
1247 if(i < getFNp(F)-1) {
1258 fprintf(fp,"\tbreak;\n");
1260 fprintf(fp,"\t}\n");
1261 fprintf(fp,"\t++nb;\n");
1262 fprintf(fp,"\tnb %%= %d;\n",MULTIPLEX);
1267 static void genFunctions(int tab, int expand,
1270 int allowed(), FILE *fp)
1276 for (i = 0; i < HSIZE; i++)
1277 for (sym = EiC_HTAB[i]; sym; sym = sym->next) {
1278 if ((t = EiC_gettype(sym->type)) == t_eic || sym->nspace != tab)
1281 if(e1 && e1->Type && ! EiC_sametypes(e1->Type,sym->type))
1284 if(mname && strcmp(mname,sym->fname) != 0)
1287 if(allowed && !allowed(t))
1294 if(DoCallBackNames(EiC_getInf(sym->type),fp)) {
1302 genCallBackFunc(sym->type,k++,fp);
1308 fputs("static val_t eic_",fp);
1310 fputs("(void)\n",fp);
1313 fputs("\tval_t v;\n",fp);
1314 /*fputs("\tstatic int nb = 0;\n",fp);*/
1318 genMultiCall(sym->type, sym->id, fp);
1322 genCall(sym->type, sym->id, fp);
1326 fputs("\treturn v;\n",fp);
1337 static void genInterface(int tab,
1348 strcpy(iname,mname);
1349 pt = strrchr(iname,'.');
1354 pt = strrchr(iname,'/');
1364 fputs("/**********************************/\n\n",fp);
1366 fprintf(fp,"void module_%s()\n",pt);
1370 for (i = 0; i < HSIZE; i++)
1371 for (sym = EiC_HTAB[i]; sym; sym = sym->next) {
1373 if ((t = EiC_gettype(sym->type)) == t_eic || sym->nspace != tab)
1376 if(e1 && e1->Type && ! EiC_sametypes(e1->Type,sym->type))
1379 if(mname && strcmp(mname,sym->fname) != 0)
1382 if(EiC_IsFunc(t) || sym->sclass == c_typedef || sym->sclass == c_enum)
1385 fprintf(fp,"\tEiC_parseString(\"");
1386 EiC__generateType(sym->type,sym->id,fp,1);
1387 fprintf(fp," @ %%ld;\", (long)&%s);\n",sym->id);
1392 for (i = 0; i < HSIZE; i++)
1393 for (sym = EiC_HTAB[i]; sym; sym = sym->next) {
1395 if ((t = EiC_gettype(sym->type)) == t_eic || sym->nspace != tab)
1398 if(e1 && e1->Type && ! EiC_sametypes(e1->Type,sym->type))
1401 if(mname && strcmp(mname,sym->fname) != 0)
1407 fprintf(fp,"\tEiC_add_builtinfunc(\"%s\",eic_%s);\n",sym->id,sym->id);
1411 fputs("/**********************************/\n\n",fp);
1414 static void genHeader(char *mname, FILE *fp)
1416 fputs("#include <stdlib.h>\n"
1417 "#include <varargs.h>\n"
1418 "#include <limits.h>\n"
1419 "#include \"eic.h\"\n",fp);
1420 fprintf(fp,"#include \"%s\"\n",mname);
1424 static void genModule(int tab, int expand, token_t * e1, char *mname)
1428 if(EiC_lexan() == INT)
1429 MULTIPLEX = token->Val.ival;
1433 if(EiC_lexan() == STR) {
1434 fp = fopen(token->Val.p.p,"w");
1435 EiC_formatMessage("redirecting to [%s]\n",(char*)token->Val.p.p);
1437 EiC_warningerror("Failed to open file %s\n", token->Val.p.p);
1443 genHeader(mname,fp);
1444 genFunctions(tab, expand, e1, mname, EiC_IsFunc,fp);
1445 genInterface(tab, expand, e1, mname,fp);
1455 * By Jean-Bruno Richard
1458 static int genCommand(void)
1460 char EiC_nextchar(void);
1461 int EiC_IsIncluded(char *fname);
1465 buf = getNextInput();
1467 if(!EiC_IsIncluded(buf))
1468 EiC_warningerror("Failed to find %s",buf);
1470 genModule(stand_tab,0,NULL,buf);
1473 EiC_warningerror("Need a included file name for generating module");
1480 static void establish_ARs(void)
1482 EiC_ENV->LARsize = 4000;
1483 EiC_ENV->ARsize = 3000;
1484 EiC_ENV->LAR =(AR_t*)xmalloc(sizeof(AR_t)*EiC_ENV->LARsize);
1485 EiC_ENV->AR = (AR_t*)xmalloc(sizeof(AR_t)*EiC_ENV->ARsize);
1488 void EiC_init_EiC(void)
1490 EiC_ENV = (environ_t *) xcalloc(1, sizeof(environ_t));
1491 EiC_ENV->CODE.Filename = "::EiC::";
1495 EiC_work_tab = stand_tab;
1496 /*init_hashtab(31);*/
1497 /* add EiC command line functions */
1498 add_eicfunc("listcode", toggle_listcode);
1499 add_eicfunc("interpreter", toggle_interp);
1500 add_eicfunc("variables", showhashtab);
1501 add_eicfunc("exit", EiC_exit_EiC);
1502 add_eicfunc("quit", EiC_exit_EiC);
1503 add_eicfunc("timer", toggle_timer);
1504 add_eicfunc("showline", toggle_showline);
1505 add_eicfunc("show", show);
1506 add_eicfunc("memdump", toggle_memdump);
1507 add_eicfunc("memtrace", toggle_memtrace);
1508 add_eicfunc("rm", rm);
1509 add_eicfunc("trace",toggle_trace);
1510 add_eicfunc("verbose",toggle_verbose);
1511 add_eicfunc("interface",toggle_interface);
1514 add_eicfunc("history",showhistory);
1516 add_eicfunc("help", showHelp);
1517 add_eicfunc("status",EiCstatus);
1518 add_eicfunc("includes",toggle_includes);
1519 add_eicfunc("files",filesCommand);
1520 add_eicfunc("clear",clearCommand);
1522 add_eicfunc("gen",genCommand);
1523 add_eicfunc("reset",ResetEiC);
1524 /* Remenber to modify help message too... */