home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / glisp / glisp.000 / GLISP.UNIX.TAR / closunix / closmain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-03  |  14.2 KB  |  534 lines

  1. /*                 GRAPHIC LISP            */
  2. /*        Scritto nel 1991-94 da Zoia Andrea Michele     */
  3. /*        Via Pergola #1 Tirano (SO) Tel. 0342-704210    */
  4. /* file closmain.c */
  5.  
  6. #include"clos.h"
  7.  
  8. /* variabili globali */
  9. struct  config_s config;
  10. jmp_buf critical_jmp;
  11. jmp_buf break_jmp;
  12. node    nilhandler;
  13. node    truehandler;
  14. node     voidhandler;
  15. FILE   *dribble_file=NULL;
  16. char    buf1[MAX_ID_LENGHT+1];
  17. char    buf2[MAX_ID_LENGHT+1];
  18. char    buf3[MAX_ID_LENGHT+1];
  19.  
  20. /* variabili locali al modulo closmain.c */
  21. unsigned Break_level_counter=0;
  22. char     *EvalFileName;
  23. int     ReadCmdLineFiles=TRUE;
  24. int     Gargc;
  25. char     **Gargv;
  26.  
  27. #define N_LISP_STREA    5
  28. #define N_LISP_G_FUNCS  15
  29. #define N_LISP_S_FUNCS    159
  30. #ifdef __NOGRAPH__
  31.  #define N_LISP_FUNCS    N_LISP_S_FUNCS
  32. #else
  33.  #define N_LISP_FUNCS     N_LISP_S_FUNCS + N_LISP_G_FUNCS
  34. #endif
  35.  
  36. #define MINSTRINGS 5000
  37. #define MINNODES   1000L+N_LISP_FUNCS*2L+3L+N_LISP_STREA*2L
  38. #define MINHASH    100L +N_LISP_FUNCS+2L   +N_LISP_STREA
  39.  
  40. struct env_s{
  41.     n_func        address;
  42.     char        *name;
  43. }lf[N_LISP_FUNCS+N_LISP_STREA]={
  44. lf_backquote    ,"BACKQUOTE",    lf_defmacro        ,"DEFMACRO",
  45. lf_function        ,"FUNCTION",     lf_dotimes         ,"DOTIMES",
  46. lf_print           ,"PRINT",        lf_defun           ,"DEFUN",
  47. lf_defvar          ,"DEFVAR",       lf_load            ,"LOAD",
  48. lf_gc              ,"GC",           lf_plus            ,"+",
  49. lf_minus           ,"-",            lf_mult            ,"*",
  50.  
  51. lf_div             ,"/",            lf_plusone         ,"ADD1",
  52. lf_minusone        ,"SUB1",         lf_if              ,"IF",
  53. lf_less            ,"<",            lf_great           ,">",
  54. lf_atom            ,"ATOM",         lf_gettime         ,"GET-TIME",
  55. lf_oblist          ,"OBLIST",       lf_input           ,"INPUT",
  56.  
  57. lf_cons            ,"CONS",         lf_cdr             ,"CDR",
  58. lf_car             ,"CAR",          lf_quote           ,"QUOTE",
  59. lf_lambda          ,"LAMBDA",       lf_setf            ,"SETF",
  60. lf_sin             ,"SIN",          lf_cos             ,"COS",
  61. lf_tan             ,"TAN",          lf_asin            ,"ASIN",
  62.  
  63. lf_acos        ,"ACOS",         lf_atan            ,"ATAN",
  64. lf_sinh            ,"SINH",         lf_cosh            ,"COSH",
  65. lf_tanh            ,"TANH",         lf_exp             ,"EXP",
  66. lf_log             ,"LOG",          lf_log10           ,"LOG10",
  67. lf_sqrt            ,"SQRT",         lf_break           ,"BREAK",
  68.  
  69. lf_getlenv         ,"GET-LENV",     lf_getgenv         ,"GET-GENV",
  70. lf_let               ,"LET",             lf_letspecial      ,"LET*",
  71. lf_list               ,"LIST",         lf_do               ,"DO",
  72. lf_plist           ,"PLIST",        lf_str2name        ,"STR2NAME",
  73. lf_name2str        ,"NAME2STR",     lf_eval            ,"EVAL",
  74.  
  75. lf_exit            ,"EXIT",         lf_not               ,"NULL"/**/,
  76. lf_iszero          ,"=0"/**/,       lf_and             ,"AND",
  77. lf_or              ,"OR",           lf_eq              ,"EQ",
  78. lf_apply           ,"APPLY",        lf_funcall         ,"FUNCALL",
  79. lf_strcat    ,"STRCAT",       lf_iszero          ,"ZEROP",
  80.  
  81. lf_loop        ,"LOOP",         lf_return          ,"RETURN",
  82. lf_car        ,"FIRST"/**/,    lf_cdr               ,"REST",/**/
  83. lf_set        ,"SET",             lf_setf               ,"SETQ",/**/
  84. lf_continue    ,"CONTINUE",     lf_consp           ,"CONSP",
  85. lf_listp        ,"LISTP",        lf_numberp         ,"NUMBERP",
  86.  
  87. lf_symbolp      ,"SYMBOLP",      lf_endp            ,"ENDP",
  88. lf_not          ,"NOT",             lf_mapcar          ,"MAPCAR",
  89. lf_prog1    ,"PROG1",        lf_progn           ,"PROGN",
  90. lf_when        ,"WHEN",         lf_unless          ,"UNLESS",
  91. lf_defclass    ,"DEFCLASS",     lf_plusp           ,"PLUSP",
  92.  
  93. lf_minusp    ,"MINUSP",       lf_evenp           ,"EVENP",
  94. lf_oddp        ,"ODDP",         lf_cond               ,"COND",
  95. lf_numequal    ,"=",             lf_reverse         ,"REVERSE",
  96. lf_hashstat    ,"HASHSTAT",     lf_lenght          ,"LENGHT",
  97. lf_dolist       ,"DOLIST",
  98.  
  99. lf_defmethod    ,"DEFMETHOD",    lf_mkinstance      ,"MAKE-INSTANCE",
  100. lf_functionp    ,"FUNCTIONP",    lf_elt               ,"ELT",
  101. lf_dospecial    ,"DO*",             lf_plusone         ,"1+",/**/
  102. lf_minusone    ,"1-",/**/       lf_append          ,"APPEND",
  103. lf_max        ,"MAX",             lf_min               ,"MIN",
  104.  
  105. lf_abs        ,"ABS",        lf_rem        ,"REM",
  106. lf_float    ,"FLOAT",    lf_round    ,"ROUND",
  107. lf_push        ,"PUSH",    lf_pop        ,"POP",
  108. lf_last        ,"LAST",    lf_equal    ,"EQUAL",
  109. lf_stringp    ,"STRINGP",    lf_classp    ,"CLASSP",
  110.  
  111. lf_intp        ,"INTP",    lf_realp    ,"REALP",
  112. lf_ratiop    ,"RATIOP",    lf_cnamep    ,"CNAMEP",
  113. lf_enamep    ,"ENAMEP",    lf_readline    ,"READ-LINE",
  114. lf_stringeq    ,"STRING=",    lf_stringequal    ,"STRING-EQUAL",
  115.  
  116. lf_assoc    ,"ASSOC",
  117. lf_stacktrace   ,"STACKTRACE",    lf_sysfuncp       ,"SYSFUNCP",
  118. lf_ufuncp       ,"UFUNCP",       lf_methodp         ,"METHODP",
  119. lf_accessorp    ,"ACCESSORP",    lf_valuep          ,"VALUEP",
  120.  
  121. lf_readchar    ,"READCHAR",    lf_strprintf    ,"STRPRINTF",
  122. lf_fopen    ,"FOPEN",    lf_fclose    ,"FCLOSE",
  123. lf_fprint    ,"FPRINT",     lf_fseek    ,"FSEEK",
  124. lf_freadbyte    ,"FREADBYTE",    lf_fwritebyte    ,"FWRITEBYTE",
  125. lf_ftell    ,"FTELL",    lf_finput    ,"FINPUT",
  126.  
  127. lf_feof        ,"FEOF",    lf_ferror    ,"FERROR",
  128. lf_fclearerr    ,"FCLEARERR",
  129.  
  130. lf_curpos    ,"CURPOS",    lf_streamp    ,"STREAMP",
  131. lf_fscanf    ,"FSCANF",       lf_trace    ,"TRACE",
  132. lf_untrace    ,"UNTRACE",    lf_textcolor    ,"TEXTCOLOR",
  133. lf_str2real    ,"STR2REAL",    lf_str2int    ,"STR2INT",
  134. lf_cls        ,"CLS",        lf_strsub    ,"STRSUB",
  135.  
  136. lf_str2ascii    ,"STR2ASCII",    lf_strnum    ,"STRNUM",
  137. lf_strlen    ,"STRLEN",    lf_while    ,"WHILE",
  138. lf_nconc    ,"NCONC",    lf_dribble    ,"DRIBBLE",
  139. lf_prog        ,"PROG",    lf_go        ,"GO",
  140. lf_macrop    ,"MACROP",    lf_fixlist    ,"FIXLIST",
  141.  
  142. #ifndef __NOGRAPH__
  143. lf_graphopen    ,"GMODE",    lf_graphclear    ,"GCLEAR",
  144. lf_gpencolor    ,"GPENCOLOR",    lf_gpentick    ,"GPENTICK",
  145. lf_gpentype    ,"GPENTYPE",    lf_gbrushcolor    ,"GBRUSHCOLOR",
  146. lf_gbrushtype    ,"GBRUSHTYPE",    lf_gputpixel    ,"GPUTPIXEL",
  147. lf_gmoveto     ,"GMOVETO",    lf_glineto    ,"GLINETO",
  148. lf_gfillpoly     ,"GFILLPOLY",   lf_gfillellipse    ,"GFILLELLIPSE",
  149. lf_gfillsector    ,"GFILLSECTOR",    lf_ggetpixel    ,"GGETPIXEL",
  150. lf_gouttext    ,"GOUTTEXT",
  151. #endif
  152.  
  153.  
  154. (n_func)stdin    ,"*STDIN*",    (n_func)stdout    ,"*STDOUT*",
  155. (n_func)stderr  ,"*STDERR*",    (n_func)stdprn    ,"*STDPRN*",
  156. (n_func)stdaux    ,"*STDAUX*"
  157. };
  158.  
  159.  
  160. void    make_environment();
  161. int     lisp_malloc();
  162. int    parse_cmdline();
  163. void    read_cmdline_files();
  164.  
  165. main(argc,argv)
  166. int  argc;
  167. char **argv;
  168. {
  169.  extern int loop_jmp_valid; /* clos_lf6 */
  170.  extern int go_jmp_valid;   /* clos_lf6 */
  171.  /******************************************************************/
  172.  /*         Solo per TurboC                       */
  173.  /*         si allocano 0x100 bytes in modo che quando si verifica */
  174.  /*         uno stack-overflow non si corrompa la memoria dei nodi */
  175.  /*        NB: la variabile _stklen e' uguale a 0xff00            */
  176.  
  177. #ifdef __TURBOC__
  178.  #ifndef _Windows
  179.    malloc(0x100);
  180.  #endif
  181. #endif
  182.  /*                                   */
  183.  /******************************************************************/
  184.  
  185.  Gargc=argc;
  186.  Gargv=argv;
  187.  if(parse_cmdline(argc,argv))
  188.    return ERROR;
  189.  if(lisp_malloc((lsiz_t)config.nodes,(lsiz_t)config.hashes,(lsiz_t)config.strings))
  190.    return ERROR;
  191.  make_environment();
  192.  if(clos_non_ansi_init())
  193.    return ERROR;
  194.  
  195.  switch(setjmp(critical_jmp)){
  196.    case LONGJMP_SET:
  197.      /* la prima volta che si chiama NLSETJMP */
  198.      break;
  199.    case LONGJMP_STACK:
  200.      /* stack-overflow */
  201.      error(E_STACK,ERR_TNORM|ERR_MERRORMSGBOX|ERR_PVOID,NULL);
  202.      node_criticalgc();
  203.      break;
  204.   case LONGJMP_CONTROLC:
  205.     /* control-c */
  206.     node_criticalgc();
  207.     error(E_CTRLC,ERR_TNORM|ERR_MERROR|ERR_PVOID,NULL);
  208.     break;
  209.   case LONGJMP_CRITICAL:
  210.     node_criticalgc();
  211.     /* out-of-memory ecc.. */
  212.     break;
  213.  }
  214. #ifdef _Windows
  215.  /////////////////////////////////////
  216.  ClosDDEUnInit();
  217.  ClosDDEInit();
  218.  ////////////////////////////////////
  219. #endif
  220.  
  221.  
  222.  
  223.  /* main loop */
  224.  /* local-environment e' una lista di a-list */
  225.  /* il global-environment e' una a-list */
  226.  /* NOTA BENE: NIL e T sono due nodi che non si possono mai unbound-are */
  227.  
  228.  loop_jmp_valid=FALSE;
  229.  go_jmp_valid  =FALSE;
  230.  Break_level_counter=0;
  231.  Break_level_counter--;
  232.  /* distruggi la lock-list */
  233.  lisp_main_loop(NIL,NIL,node_lockreset());
  234.  return OK;
  235. }
  236.  
  237.  
  238. void lisp_main_loop(global_environment,local_environment,lastlock)
  239. node global_environment;
  240. node local_environment;
  241. node lastlock;
  242. {
  243.  extern int    loop_jmp_valid; /* clos_lf6 */
  244.  int        old_loop_jmp_valid;
  245.  extern int    go_jmp_valid; /* clos_lf6 */
  246.  int        old_go_jmp_valid;
  247.  node_p        nout;
  248.  jmp_buf        this_break_jmp;
  249.  char        prompt[10];
  250.  unsigned    this_break_level=(++Break_level_counter);
  251.  static node    in;
  252.  
  253.  
  254.  switch(setjmp(break_jmp)){
  255.    case LONGJMP_SET:
  256.      memcpy(this_break_jmp,break_jmp,sizeof(jmp_buf));
  257.      old_loop_jmp_valid=loop_jmp_valid;
  258.      old_go_jmp_valid=go_jmp_valid;
  259.      break;
  260.    case LONGJMP_CONTINUE:
  261.      if(!this_break_level){
  262.        error(E_BADCONTINUE,ERR_MERROR|ERR_TNORM|ERR_PVOID,NULL);
  263.        break;
  264.      }
  265.      Break_level_counter--;
  266.      return;
  267.    case LONGJMP_ERROR: /* errori sintattici,unbounds,ecc.... */
  268.      go_jmp_valid=old_go_jmp_valid;
  269.      loop_jmp_valid=old_loop_jmp_valid;
  270.      break;
  271.  }
  272.  if(ReadCmdLineFiles){
  273.    ReadCmdLineFiles=FALSE;
  274.    read_cmdline_files();
  275.  }
  276.  for(;;){ /* LISP MAIN LOOP */
  277.    memcpy(break_jmp,this_break_jmp,sizeof(jmp_buf));
  278.    Break_level_counter=this_break_level;
  279.    if(!this_break_level){
  280.      sprintf(prompt,"%s",STANDARD_PROMPT);
  281.    }else{
  282.      sprintf(prompt,"(%u)%s",this_break_level,STANDARD_PROMPT);
  283.    }
  284.    node_signal(lastlock);
  285.    in=input_func(stdin,stdout,prompt);
  286.    if(in==VOID)continue;
  287.    eval(in,&nout,global_environment,local_environment,EVAL_NORM);
  288.    fprint_func(calc_pointer(&nout),stdout);
  289.    lisp_print_string("\n",stdout);
  290.  }
  291. }
  292.  
  293.  
  294.  
  295. void make_environment()
  296. {
  297.  node    ni;
  298.  node    no;
  299.  int    i,j;
  300.  
  301.  
  302.  /* NB: sono stati allocati almeno N_LISP_FUNCS*2+2 nodi */
  303.  /*       almeno N_LISP_FUNCS+2 Hash entryes */
  304.  /*       ed almeno 1000 caratteri per le stringhe */
  305.  /*      1000 non e' un vlore esatto ma dovrebbe essere sufficiente */
  306.  /*      a contenere almeno tutti i nomi delle funzioni  */
  307.  
  308.  TYPE(NIL=node_alloc(NIL_IDENTIFIER))|=NT_IS_NAME|NT_HAS_NAME|NT_HAS_VALUE;
  309.  VALUE(NIL)=NIL;
  310.  
  311.  TYPE(T=node_alloc(TRUE_IDENTIFIER))|=NT_IS_NAME|NT_HAS_NAME|NT_HAS_VALUE|NT_HAS_CLASS;
  312.  VALUE(T)=T;
  313.  CLASS(T)=NIL;
  314.  
  315.  for(i=0;i<N_LISP_FUNCS;i++){
  316.     TYPE(no=node_alloc(lf[i].name))|=NT_IS_NAME|NT_HAS_NAME|NT_HAS_FUNCTION;
  317.     TYPE(ni=node_make())|=NT_IS_VALUE|NT_SYSFUNC;
  318.     SYSFUNC(ni)=lf[i].address;
  319.     FUNCTION(no)=ni;
  320.  }
  321.  for(j=0;j<N_LISP_STREA;i++,j++){
  322.     TYPE(no=node_alloc(lf[i].name))|=NT_IS_NAME|NT_HAS_NAME|NT_HAS_VALUE;
  323.     TYPE(ni=node_make())|=NT_IS_VALUE|NT_STREAM;
  324.     STREAM(ni)=(FILE*)lf[i].address;
  325.     VALUE(no)=ni;
  326.  }
  327.  
  328.  TYPE(no=node_alloc(WINDOWS_ID))|=NT_IS_NAME|NT_HAS_NAME|NT_HAS_VALUE;
  329. #ifdef _Windows
  330.    VALUE(no)=T;
  331. #else
  332.    VALUE(no)=NIL;
  333. #endif
  334. }
  335.  
  336.  
  337. void read_cmdline_files()
  338. {
  339.  int i;
  340.  
  341.  for(i=1;i<Gargc;i++){
  342.   if(!(Gargv[i][0]=='/' || Gargv[i][0]=='-')){
  343.     sprintf(buf1,"reading file %s\n",Gargv[i]);
  344.     lisp_print_string(buf1,stdout);
  345.     eval_lisp_file(Gargv[i],NIL,NIL);
  346.   }
  347.  }
  348. }
  349.  
  350.  
  351.      
  352.  
  353.  
  354. int parse_cmdline(argc,argv)
  355. int argc;
  356. char **argv;
  357. {
  358.  FILE *cf;
  359.  int i;
  360.  char cnfmark[50];
  361.  char cnfchk[50];
  362.  int write_cfg=FALSE;
  363.  unsigned long lv;
  364.  unsigned uv;
  365.  
  366.  
  367.  strcpy(cnfmark,CONFIGFILE);
  368.  strcat(cnfmark,CLOS_VERSION);
  369.  
  370.  if((cf=fopen(CONFIGFILE,"r"))==NULL){
  371.     config.nodes=MINNODES;
  372.     config.strings=MINSTRINGS;
  373.     config.hashes=MINHASH;
  374.     config.bad_char_error=FALSE;
  375.     config.case_sensitive=FALSE;
  376.     config.max_id_lenght=50;        /* <=MAX_ID_LENGHT  */
  377.     config.max_string_lenght=80;    /* <=MAX_STR_LENGHT */
  378.     config.gcbeep=TRUE;
  379.  }
  380.  else{
  381.     fread((void*)cnfchk,strlen(cnfmark)+1,1,cf);
  382.     if(strcmp(cnfmark,cnfchk)){
  383.       return error(E_INVALIDCFGFILE,ERR_TNORM|ERR_MERRORMSGBOX|ERR_PSTRING,CONFIGFILE);
  384.     }else{
  385.       fread((void*)&config,sizeof(struct config_s),1,cf);
  386.       fclose(cf);
  387.    }
  388.  }
  389.  for(i=1;i<argc;i++){
  390.      if(argv[i][0]=='/' || argv[i][0]=='-')
  391.      switch(argv[i][1]){
  392.          case 'n':case 'N':sscanf(&argv[i][2],"%lu",&lv);
  393.           if(lv>MINNODES)config.nodes=lv;
  394.           break;
  395.          case 's':case 'S':sscanf(&argv[i][2],"%lu",&lv);
  396.           if(lv>MINSTRINGS)config.strings=lv;
  397.           break;
  398.          case 'h':case 'H':sscanf(&argv[i][2],"%lu",&lv);
  399.          if(lv>MINHASH)config.hashes=lv;
  400.          break;
  401.          case 'i':case 'I':
  402.           sscanf(&argv[i][2],"%u",&uv);
  403.           if(uv<=MAX_ID_LENGHT && uv>=2)config.max_id_lenght=uv;
  404.           break;
  405.          case 'r':case 'R':
  406.           sscanf(&argv[i][2],"%u",&uv);
  407.           if(uv<=MAX_STR_LENGHT && uv>=2)uv=config.max_string_lenght;
  408.           break;
  409.          case 'c':case 'C':config.bad_char_error=argv[i][2]!='-';break;
  410.          case 'a':case 'A':config.case_sensitive=argv[i][2]!='-';break;
  411.          case 'w':case 'W':write_cfg=TRUE;break;
  412.          default:
  413.          return error(E_CMDLINE,ERR_TNORM|ERR_MERRORMSGBOX|ERR_PVOID,NULL);
  414.      }
  415.  }
  416.  if(write_cfg){
  417.   if((cf=fopen(CONFIGFILE,"w"))==NULL){
  418.     error(E_CNFFILE,ERR_TNORM|ERR_MWARN|ERR_PSTRING,CONFIGFILE);
  419.   }
  420.   else{
  421.     fwrite((void*)cnfmark,strlen(cnfmark)+1,1,cf);
  422.     fwrite((void*)&config,sizeof(struct config_s),1,cf);
  423.     fclose(cf);
  424.   }
  425.  }
  426.  return OK;
  427. }
  428.  
  429.  
  430. int    lisp_malloc(no,ha,st)
  431. lsiz_t no;
  432. lsiz_t ha;
  433. lsiz_t st;
  434. {
  435.  if(node_malloc(no))
  436.     return error(E_NODEINIT,ERR_MERRORMSGBOX|ERR_TNORM|ERR_PVOID,NULL);
  437.  if(hash_malloc(ha)){
  438.     node_free();
  439.     return error(E_HASHINIT,ERR_MERRORMSGBOX|ERR_TNORM|ERR_PVOID,NULL);
  440.  }
  441.  if(string_malloc(st)){
  442.     hash_free();
  443.     node_free();
  444.     return error(E_STRINGINIT,ERR_MERRORMSGBOX|ERR_TNORM|ERR_PVOID,NULL);
  445.  }
  446.  return OK;
  447. }
  448.  
  449.  
  450. void    lisp_free()
  451. {
  452.  string_free();
  453.  hash_free();
  454.  node_free();
  455. }
  456.  
  457.  
  458.  
  459.  
  460.  
  461. node eval_lisp_file(name, genv,lenv)
  462. char *name;
  463. node genv;
  464. node lenv;
  465. {
  466.  node        in,n=node_getlastlock();
  467.  node_p        nout;
  468.  FILE        *LoadFile;
  469.  FILE        *PrintFile=NULL;
  470.  jmp_buf    this_break_jmp; 
  471.  
  472.  memcpy(this_break_jmp,break_jmp,sizeof(jmp_buf));
  473.  switch(setjmp(break_jmp)){
  474.    case LONGJMP_SET:
  475.      break;
  476.    case LONGJMP_CONTINUE:
  477.      error(E_BADCONTINUE,ERR_MERROR|ERR_TNORM|ERR_PVOID,NULL);
  478.      goto ELF_Error;
  479.    case LONGJMP_ERROR: /* errori sintattici,unbounds,ecc.... */
  480.      goto ELF_Error;
  481.  }
  482.  
  483.  if((LoadFile=fopen(name,"r"))==NULL){
  484.    error(E_BADFILE,ERR_MERROR|ERR_PSTRING|ERR_TNORM,name);
  485.    goto ELF_Error;
  486.  }
  487.  nout.node=NIL;
  488.  nout.type=P_ALLNODE;
  489.  while(skip_spaces_tabs_nwl(LoadFile)){
  490.    in=input_func(LoadFile,PrintFile,"");
  491.     /* Uso PrintFile=NULL perche' mettendo direttamente NULL
  492.        il compilatore borlandc si incasina e mette sullo stack
  493.        solo la word 0000 e non la dword 0000:0000
  494.     */
  495.  
  496.    if(in==VOID){
  497.      goto ELF_Error;
  498.    }
  499.    eval(in,&nout,genv,lenv,EVAL_NORM);
  500.    node_signal(n);/* recupera tutto */
  501.  }
  502.  memcpy(break_jmp,this_break_jmp,sizeof(jmp_buf));
  503.  node_signal(n);
  504.  fclose(LoadFile);
  505.  return calc_pointer(&nout);
  506.  
  507.  ELF_Error:;
  508.  memcpy(break_jmp,this_break_jmp,sizeof(jmp_buf));
  509.  node_signal(n);
  510.  fclose(LoadFile);
  511.  return VOID;
  512. }
  513.  
  514.  
  515. int     skip_spaces_tabs_nwl(f)
  516. FILE *f;
  517. {
  518.  int ch;
  519.  
  520.  for(;;){
  521.   switch(getc(f)){
  522.     case EOF:return 0;
  523.     case ' ':case '\t':case '\n':continue;
  524.     case ';':    /* skip comment */
  525.       do{
  526.     if((ch=getc(f))==EOF)
  527.       return 0;
  528.       }while(ch!='\n');
  529.       continue;
  530.     default:fseek(f,-1L,SEEK_CUR);return 1;
  531.   }
  532.  }
  533. }
  534.