Mercurial > hg > CbC > old > device
diff mc-macro.c @ 861:c005a392e27e
fix for Marvaricks
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 31 Mar 2014 18:33:20 +0900 |
parents | cd0467ebee31 |
children | e253ffedf947 |
line wrap: on
line diff
--- a/mc-macro.c Mon Sep 16 18:02:58 2013 +0900 +++ b/mc-macro.c Mon Mar 31 18:33:20 2014 +0900 @@ -63,12 +63,12 @@ In macro_function and macro_eavl, expand result is put into macrop local variable. - list3s(STRING,next,char*) + list3s(STRING,next,char*) to generate result, mappend/reverse0 is necessary. */ -extern void +void macro_expansion(NMTBL *nptrm) { int i = mode; @@ -110,37 +110,37 @@ while (mconcat) { // ## re-eval macro -if (lsrc) printf("## before %s",macropp); + if (lsrc) printf("## before %s",macropp); mconcat = 0; macrop = 0; - for(s=t=macropp;*s;) { - if ((c=*s++)=='#'&&*s=='#') { - if (t>s-3) t=s-2; else t--; - while(*t<=' '&&t>macropp) t--; t++; - for(s++;*s && *s<=' ';) s++; - continue; - } else if (c==STRING) { - c = '"'; - } - *t++=c; - } - *t++=0; - // evaluate generated result again + for(s=t=macropp;*s;) { + if ((c=*s++)=='#'&&*s=='#') { + if (t>s-3) t=s-2; else t--; + while(*t<=' '&&t>macropp) t--; t++; + for(s++;*s && *s<=' ';) s++; + continue; + } else if (c==STRING) { + c = '"'; + } + *t++=c; + } + *t++=0; #if 0 -if (1 && lsrc) { - printf("\n### %s\n",macropp); - if (t[-2]!='\n') putchar('\n'); -} + if (1 && lsrc) { + printf("\n### %s\n",macropp); + if (t[-2]!='\n') putchar('\n'); + } #endif + // evaluate generated result again macrop=macro_eval(macrop,macropp,macro_history); - cheap = reset_cheap(&scheap); - macropp = cheap->ptr; - // will not override evaled list + cheap = reset_cheap(&scheap); + macropp = cheap->ptr; + // will not override evaled list mappend0(reverse0(macrop),¯opp); - // cheap->ptr[-1] ='\n'; - cheap->ptr[-1] =0; - cheap->ptr[0] =0; - cheap = increment_cheap(cheap,¯opp); + // cheap->ptr[-1] ='\n'; + cheap->ptr[-1] =0; + cheap->ptr[0] =0; + cheap = increment_cheap(cheap,¯opp); } cheap = reset_cheap(&scheap); // genrated macro will be overwrited by cheap, but it's OK, again @@ -148,8 +148,8 @@ set_lfree(slfree); #if 0 if (lsrc && !asmf && nptrm->sc==FMACRO) { - gen_comment(macropp); - if (0 && t[-2]!='\n') putchar('\n'); + gen_comment(macropp); + if (0 && t[-2]!='\n') putchar('\n'); } #endif // push previous chptr, and change it to the generate macro @@ -164,7 +164,7 @@ /* file name concatenation - on cheap + on cheap */ static char * @@ -174,7 +174,7 @@ if (! *path) return name; while(( *cheap->ptr = *path++ )) cheap = increment_cheap(cheap,&p); if (cheap->ptr[-1]!='/') { - *cheap->ptr = '/'; cheap = increment_cheap(cheap,&p); + *cheap->ptr = '/'; cheap = increment_cheap(cheap,&p); } while(( *cheap->ptr = *name++ )) cheap = increment_cheap(cheap,&p); *cheap->ptr = 0; @@ -218,7 +218,7 @@ "name" => name current_file_name_dir / name include_path / name - (no difference?) + (no difference?) next flag ignores the first occurence. */ @@ -238,8 +238,8 @@ } else { error(INCERR); err=1; } for(i=0;(getch()!=end && ch!='\n');) { - *cheap->ptr = ch; - cheap = increment_cheap(cheap,&name); + *cheap->ptr = ch; + cheap = increment_cheap(cheap,&name); } if(ch=='\n') error(INCERR); if (err) return filep->fcb; @@ -250,31 +250,31 @@ if (next && fp) { fclose(fp); fp=0; next=0; prev=name; } p = name; if (!fp) { - // no deferenced on "" and <>? - for(pp=include_path; *pp;pp++) { - p = expand_file_name(*pp,name); - if(prev && nameeq(p,prev)) continue; - if ((fp = fopen(p,"r"))) { - if (next) { - fclose(fp); fp=0; next=0; prev=p; - continue; - } else - break ; - } - } + // no deferenced on "" and <>? + for(pp=include_path; *pp;pp++) { + p = expand_file_name(*pp,name); + if(prev && nameeq(p,prev)) continue; + if ((fp = fopen(p,"r"))) { + if (next) { + fclose(fp); fp=0; next=0; prev=p; + continue; + } else + break ; + } + } if (!fp /* && (end=='>'||filep->inc=='>') */ ) { // <> case only - for(pp=l_include_path; *pp;pp++) { - p = expand_file_name(*pp,name); - if(prev && nameeq(p,prev)) continue; - if ((fp = fopen(p,"r"))) { - if (next) { - fclose(fp); fp=0; next=0; prev=p; - continue; - } else - break ; - } - } - } + for(pp=l_include_path; *pp;pp++) { + p = expand_file_name(*pp,name); + if(prev && nameeq(p,prev)) continue; + if ((fp = fopen(p,"r"))) { + if (next) { + fclose(fp); fp=0; next=0; prev=p; + continue; + } else + break ; + } + } + } } if(!fp) { error(FILERR); return filep->fcb; } // we have so search current directory of the included file @@ -284,10 +284,10 @@ cheap = reset_cheap(&scheap); // Generated name needs copy. if (p!=name) { - name = cheap->ptr; - while((*cheap->ptr = *s++)) cheap = increment_cheap(cheap,&name); - *cheap->ptr = 0; - cheap = increment_cheap(cheap,&name); + name = cheap->ptr; + while((*cheap->ptr = *s++)) cheap = increment_cheap(cheap,&name); + *cheap->ptr = 0; + cheap = increment_cheap(cheap,&name); } // should check filep over flow (sigh...) (filep+1)->inc = end; @@ -302,7 +302,7 @@ static int macro_if_skip ; /* there may extra non-terminate comment after #if/#else directive */ -/* #endif / * hoge */ +/* #endif / * hoge */ /* */ /* */ @@ -311,26 +311,26 @@ { getch(); do { - while(ch!='\n'&&ch!='\r') { - if (!in_comment) { - if (ch=='/') { - getch(); - if (ch=='/') in_comment=2; - else if (ch=='*') { - in_comment=1; - } else continue; - } - } else if (ch=='*') { - getch(); - if (ch=='/') { - in_comment=0; - return macro_if_skip?0:1; - } - else continue; - } - getch(); - } - if (in_comment==1) { getline1(); getch(); } + while(ch!='\n'&&ch!='\r') { + if (!in_comment) { + if (ch=='/') { + getch(); + if (ch=='/') in_comment=2; + else if (ch=='*') { + in_comment=1; + } else continue; + } + } else if (ch=='*') { + getch(); + if (ch=='/') { + in_comment=0; + return macro_if_skip?0:1; + } + else continue; + } + getch(); + } + if (in_comment==1) { getline1(); getch(); } } while(in_comment==1); in_comment=0; return 0; @@ -339,8 +339,8 @@ /* getline1 from chptr or chinput (for internal source) with macro processing - generate comment - generate ST_COMMENT parse tree, in inline mode + generate comment + generate ST_COMMENT parse tree, in inline mode In getch, if chptr is empty, pop chptr stack, if stack is empy read from fp. */ @@ -359,92 +359,92 @@ char *p; if (next_eof) { - next_eof=0; - error(EOFERR); + next_eof=0; + error(EOFERR); } do { - if (chinput) { - // some another input source ( init string ) - if (! *chinput) { - chinput=0; - continue; - } - chptr=linebuf; - i=0; - while((*chptr++=c=*chinput++)&&(c!='\n')) { - if (++i > LBUFSIZE-2) error(LNERR); - } - } else { - // get the line from input stream - lineno++; - glineno++; - chptr=linebuf; - i=0; - while ((*chptr++ = c = getc(filep->fcb)) != '\n') { - if (++i > LBUFSIZE-2) error(LNERR); - if (c=='\r') { - c = getc(filep->fcb); - if (c == '\n') { - chptr[-1]='\n'; break; - } else { - // single cr equal to nl - ungetc(c,filep->fcb); - chptr[-1]=c='\n'; i--; break; - } - } - if (c==EOF) { - next_eof=1; - --chptr; - break; - } - } - } + if (chinput) { + // some another input source ( init string ) + if (! *chinput) { + chinput=0; + continue; + } + chptr=linebuf; + i=0; + while((*chptr++=c=*chinput++)&&(c!='\n')) { + if (++i > LBUFSIZE-2) error(LNERR); + } + } else { + // get the line from input stream + lineno++; + glineno++; + chptr=linebuf; + i=0; + while ((*chptr++ = c = getc(filep->fcb)) != '\n') { + if (++i > LBUFSIZE-2) error(LNERR); + if (c=='\r') { + c = getc(filep->fcb); + if (c == '\n') { + chptr[-1]='\n'; break; + } else { + // single cr equal to nl + ungetc(c,filep->fcb); + chptr[-1]=c='\n'; i--; break; + } + } + if (c==EOF) { + next_eof=1; + --chptr; + break; + } + } + } - *chptr = '\0'; - if (lsrc && !asmf && !macro_if_skip && linebuf[0]) { - if (!inmode) - gen_comment(linebuf); // #if ed line will not be commented - if (inmode) { - // inline mode + *chptr = '\0'; + if (lsrc && !asmf && !macro_if_skip && linebuf[0]) { + if (!inmode) + gen_comment(linebuf); // #if ed line will not be commented + if (inmode) { + // inline mode - // generate inlined line in assembler output + // generate inlined line in assembler output - int i=0; - int c; - // should be done in some init - if (!st_cheap) { - st_cheap = cheap1 = new_cheap(); - } + int i=0; + int c; + // should be done in some init + if (!st_cheap) { + st_cheap = cheap1 = new_cheap(); + } - p = st_cheap->ptr; - sprintf(num,"%d: ",lineno); - parse = list4n(ST_COMMENT,parse,lineno,(NMTBL*)p); - // should contain file name - c = 0; - while((*st_cheap->ptr = num[c++])) - st_cheap = increment_cheap(st_cheap,&p); - while((c = *st_cheap->ptr = linebuf[i++])) { - st_cheap = increment_cheap(st_cheap,&p); - if (c=='\n') { - *st_cheap->ptr = 0; - st_cheap = increment_cheap(st_cheap,&p); - p = st_cheap->ptr; - // parse = list3n(ST_COMMENT,parse,(NMTBL*)p); - sprintf(num,"%d: ",lineno); - c = 0; - while((*cheap->ptr = num[c++])) - st_cheap = increment_cheap(st_cheap,&p); - } - } - } - } - p = chptr = linebuf; while(*p==' '||*p=='\t') p++; - if (*p == '#' && !in_comment && !in_quote) { - // macro directive - chptr = p; - if (macro_processing()) return; - } - if (c==EOF) break; + p = st_cheap->ptr; + sprintf(num,"%d: ",lineno); + parse = list4n(ST_COMMENT,parse,lineno,(NMTBL*)p); + // should contain file name + c = 0; + while((*st_cheap->ptr = num[c++])) + st_cheap = increment_cheap(st_cheap,&p); + while((c = *st_cheap->ptr = linebuf[i++])) { + st_cheap = increment_cheap(st_cheap,&p); + if (c=='\n') { + *st_cheap->ptr = 0; + st_cheap = increment_cheap(st_cheap,&p); + p = st_cheap->ptr; + // parse = list3n(ST_COMMENT,parse,(NMTBL*)p); + sprintf(num,"%d: ",lineno); + c = 0; + while((*cheap->ptr = num[c++])) + st_cheap = increment_cheap(st_cheap,&p); + } + } + } + } + p = chptr = linebuf; while(*p==' '||*p=='\t') p++; + if (*p == '#' && !in_comment && !in_quote) { + // macro directive + chptr = p; + if (macro_processing()) return; + } + if (c==EOF) break; } while(!in_quote && (macro_if_skip || linebuf[0] == '#')); } @@ -459,13 +459,13 @@ // can't be in macro expansion for(c=0;c<LBUFSIZE-3&&chptr[c];c++); if (c>0&&chptr[c-1]=='\\') { - return; + return; } else if (c>0&&chptr[c-1]=='\n') { - if (c>0&&chptr[c-2]=='\\') { - return; - } else { - c--; - } + if (c>0&&chptr[c-2]=='\\') { + return; + } else { + c--; + } } chptr[c] = ';'; chptr[c+1] = '\n'; @@ -489,11 +489,11 @@ if (car(i)==CONST) i=cadr(i); else i=0; if (ch) { - if (chptr[-1]==ch) { - /* we are fall into getch(), which lost the last ch */ - /* chptr[-1]==ch check is fanatic, but ... */ - chptr--; - } else error(-1); + if (chptr[-1]==ch) { + /* we are fall into getch(), which lost the last ch */ + /* chptr[-1]==ch check is fanatic, but ... */ + chptr--; + } else error(-1); } macro_if_depth = macro_if_current; macro_if_skip = !i; @@ -519,140 +519,140 @@ while (*chptr==' '||*chptr=='\t') ++chptr; switch(chptr[0]*chptr[1]) { case 'i'*'f': - if ((macroeq("ifdef") || macroeq("ifndef"))) { - c = (chptr[-4]=='n'); - macro_if_current++; - if (!macro_if_skip) { - // try getsym in IFDEF mode to avoid symbol define - mode_save = mode; mode = IFDEF; - ch= *chptr; - i = getsym(0); - mode = mode_save; - macro_if_depth = macro_if_current; - macro_if_skip = (!i)^c; - } - return 0; - } else if (macroeq("if")) { - macro_if_current++; - if (!macro_if_skip) { - macro_if(); - } - return 0; - } - break; + if ((macroeq("ifdef") || macroeq("ifndef"))) { + c = (chptr[-4]=='n'); + macro_if_current++; + if (!macro_if_skip) { + // try getsym in IFDEF mode to avoid symbol define + mode_save = mode; mode = IFDEF; + ch= *chptr; + i = getsym(0); + mode = mode_save; + macro_if_depth = macro_if_current; + macro_if_skip = (!i)^c; + } + return 0; + } else if (macroeq("if")) { + macro_if_current++; + if (!macro_if_skip) { + macro_if(); + } + return 0; + } + break; case 'e'*'l': - if (macroeq("elif")) { - if (macro_if_current==0) { - error(MCERR); /* extra #else */ - return 0; - } - if (macro_if_current == macro_if_depth) { - if (!macro_if_skip || macro_if_skip==2) { - macro_if_skip=2; - return 0; - } - macro_if(); - } - return 0; - } else if (macroeq("else")) { - if (macro_if_current==0) { - error(MCERR); /* extra #else */ - return 0; - } - if (macro_if_current == macro_if_depth) { - if (macro_if_skip==2) ; - else if (macro_if_skip) macro_if_skip=0; - else macro_if_skip=1; - } - return skip_rest_of_line(); - } - break; + if (macroeq("elif")) { + if (macro_if_current==0) { + error(MCERR); /* extra #else */ + return 0; + } + if (macro_if_current == macro_if_depth) { + if (!macro_if_skip || macro_if_skip==2) { + macro_if_skip=2; + return 0; + } + macro_if(); + } + return 0; + } else if (macroeq("else")) { + if (macro_if_current==0) { + error(MCERR); /* extra #else */ + return 0; + } + if (macro_if_current == macro_if_depth) { + if (macro_if_skip==2) ; + else if (macro_if_skip) macro_if_skip=0; + else macro_if_skip=1; + } + return skip_rest_of_line(); + } + break; case 'e'*'n': - if (macroeq("endif")) { - if (macro_if_current == macro_if_depth) { - macro_if_skip = 0; - macro_if_depth = --macro_if_current; - } else { - if (macro_if_current<=0) { - error(MCERR); /* extra #if */ - return 0; - } - macro_if_current--; - } - return skip_rest_of_line(); - } + if (macroeq("endif")) { + if (macro_if_current == macro_if_depth) { + macro_if_skip = 0; + macro_if_depth = --macro_if_current; + } else { + if (macro_if_current<=0) { + error(MCERR); /* extra #if */ + return 0; + } + macro_if_current--; + } + return skip_rest_of_line(); + } } if (macro_if_skip) return 0; switch(chptr[0]) { case 'd': - if (macroeq("define")) { - ch= *chptr; - macro_define0(); - *(chptr = linebuf) = '\0'; - return 0; - } - break; + if (macroeq("define")) { + ch= *chptr; + macro_define0(); + *(chptr = linebuf) = '\0'; + return 0; + } + break; case 'u': - if (macroeq("undef")) { - i=mode; - mode=IFDEF; - ch= *chptr; - if (getsym(0)) { - // make it EMPTY - if (nptr->sc == MACRO) { - nptr->sc = EMPTY; - } else if (nptr->sc == FMACRO) { - nptr->sc = EMPTY; - /* we cannot reclaim it's arg */ - } else error(MCERR); - } - mode=i; - return 0; - } - break; + if (macroeq("undef")) { + i=mode; + mode=IFDEF; + ch= *chptr; + if (getsym(0)) { + // make it EMPTY + if (nptr->sc == MACRO) { + nptr->sc = EMPTY; + } else if (nptr->sc == FMACRO) { + nptr->sc = EMPTY; + /* we cannot reclaim it's arg */ + } else error(MCERR); + } + mode=i; + return 0; + } + break; case 'i': - next = 1; - if (macroeq("include_next")|| (next=0, macroeq("include"))) { - if(filep+1 >= filestack + FILES) error(FILERR); - if ( ((filep+1)->fcb=getfname(next)) == NULL) error(FILERR); - (filep+1)->ln=lineno; - lineno=0; - ++filep; - *(chptr = linebuf) = '\0'; - return 0; - } - break; + next = 1; + if (macroeq("include_next")|| (next=0, macroeq("include"))) { + if(filep+1 >= filestack + FILES) error(FILERR); + if ( ((filep+1)->fcb=getfname(next)) == NULL) error(FILERR); + (filep+1)->ln=lineno; + lineno=0; + ++filep; + *(chptr = linebuf) = '\0'; + return 0; + } + break; case 'p': - if (macroeq("pragma")) { - getline1(); - return 0; - } - break; + if (macroeq("pragma")) { + getline1(); + return 0; + } + break; #if ASM_CODE // deprecated, use asm function case 'a': - if (macroeq("asm")) { - if (asmf) error(MCERR); - asmf = 1; - getline1(); - while (asmf) { - printf("%s",linebuf); - getline1(); - } - return 0; - } - break; + if (macroeq("asm")) { + if (asmf) error(MCERR); + asmf = 1; + getline1(); + while (asmf) { + printf("%s",linebuf); + getline1(); + } + return 0; + } + break; case 'e': - if (macroeq("endasm")) { - if (!asmf) error(MCERR); - asmf = 0; - return 0; - } - break; + if (macroeq("endasm")) { + if (!asmf) error(MCERR); + asmf = 0; + return 0; + } + break; #endif case ' ': case '\t': case '\n': case 0: - getline1(); - return 0; + getline1(); + return 0; } error(MCERR); return 0; @@ -690,7 +690,7 @@ /* macro define from chptr body will be copied and stored in nptr->dsp - list3s( STRING, list of argments (if any), char *) + list3s( STRING, list of argments (if any), char *) We don't expand macro here, it just copied. */ @@ -711,11 +711,11 @@ } args = 0; if (ch=='(') { - nptr->sc = FMACRO; - args = macro_args(&chptr); + nptr->sc = FMACRO; + args = macro_args(&chptr); } else { - nptr->sc = MACRO; - nptr->ty = -1; + nptr->sc = MACRO; + nptr->ty = -1; } // equal is allowed for -Dhoge=aho option // if (ch=='=') chptr++; @@ -725,33 +725,35 @@ // now copy it to the body while ((*cheap->ptr = c = *chptr++) - && c != '\n') { - cheap = increment_cheap(cheap,body); - if (c=='/'&&chptr[0]=='/') { - cheap->ptr--; - *cheap->ptr = '\0'; - while(*chptr++); break; - } else if (c=='/'&&chptr[0]=='*') { - cheap->ptr--; chptr++; - for(;;) { - c = *chptr++; - if (!c) { - getline1(); - continue; - } - if (c=='*'&&chptr[0]=='/') { - c = *chptr++; break; - } - } - if (!c) break; - } else if (c=='\\' && (*chptr=='\n'||*chptr==0)) { - chptr++; - cheap->ptr--; - getline1(); - } + && c != '\n') { + cheap = increment_cheap(cheap,body); + if (c=='/'&&chptr[0]=='/') { + cheap->ptr--; + *cheap->ptr = '\0'; + while(*chptr++) + ; + break; + } else if (c=='/'&&chptr[0]=='*') { + cheap->ptr--; chptr++; + for(;;) { + c = *chptr++; + if (!c) { + getline1(); + continue; + } + if (c=='*'&&chptr[0]=='/') { + c = *chptr++; break; + } + } + if (!c) break; + } else if (c=='\\' && (*chptr=='\n'||*chptr==0)) { + chptr++; + cheap->ptr--; + getline1(); + } } if (c=='\n') { - *cheap->ptr = '\0'; + *cheap->ptr = '\0'; } cheap = increment_cheap(cheap,body); // fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); @@ -776,82 +778,82 @@ body = (char **)&scaddr(args); for(;;) { *cheap->ptr = c = *chptr++; - cheap = increment_cheap(cheap,body); - if (c=='\\') { - if (*chptr=='\n') { - cheap->ptr--; - getline1(); - chptr = *pchptr; - continue; - } - } - if (!c) { - chptr--; - error(MCERR); - *pchptr = chptr; - return reverse0(args); - } - if (in_quote) { - if (c=='\\') { - if (*chptr != '\n') { - *cheap->ptr = *chptr++; - cheap = increment_cheap(cheap,body); - } else { - getline1(); - chptr = *pchptr; - } - } else if (c=='\'') { - in_quote = 0; - } - } else if (in_wquote) { - if (c=='\\') { - if (*chptr !='\n') { - *cheap->ptr = *chptr++; - cheap = increment_cheap(cheap,body); - } else { - *cheap->ptr = '\n'; - getline1(); - chptr = *pchptr; - } - } else if (c=='"') { - in_wquote = 0; - } - } else if (c=='"') { - in_wquote = 1; - } else if (c=='\'') { - in_quote = 1; - } if (plevel==0) { - if (c==',') { - cheap->ptr[-1] = 0; - args = list3s(STRING,args,cheap->ptr); - body = (char **)&scaddr(args); - } else if (c==')') { - cheap->ptr[-1] = 0; - break; - } else if (c=='(') { - plevel++; - } else if (c=='\\') { - if (*chptr=='\n') { - cheap->ptr--; - getline1(); - chptr = *pchptr; - } -// } else if (c==' '||c=='\t') { -// cheap->ptr--; - } else if (c=='\n') { - cheap->ptr--; - getline1(); - chptr = *pchptr; - } - } else if (c==')') { - plevel--; - } else if (c=='(') { - plevel++; - } else if (c=='\n') { - cheap->ptr--; - getline1(); - chptr = *pchptr; - } + cheap = increment_cheap(cheap,body); + if (c=='\\') { + if (*chptr=='\n') { + cheap->ptr--; + getline1(); + chptr = *pchptr; + continue; + } + } + if (!c) { + chptr--; + error(MCERR); + *pchptr = chptr; + return reverse0(args); + } + if (in_quote) { + if (c=='\\') { + if (*chptr != '\n') { + *cheap->ptr = *chptr++; + cheap = increment_cheap(cheap,body); + } else { + getline1(); + chptr = *pchptr; + } + } else if (c=='\'') { + in_quote = 0; + } + } else if (in_wquote) { + if (c=='\\') { + if (*chptr !='\n') { + *cheap->ptr = *chptr++; + cheap = increment_cheap(cheap,body); + } else { + *cheap->ptr = '\n'; + getline1(); + chptr = *pchptr; + } + } else if (c=='"') { + in_wquote = 0; + } + } else if (c=='"') { + in_wquote = 1; + } else if (c=='\'') { + in_quote = 1; + } if (plevel==0) { + if (c==',') { + cheap->ptr[-1] = 0; + args = list3s(STRING,args,cheap->ptr); + body = (char **)&scaddr(args); + } else if (c==')') { + cheap->ptr[-1] = 0; + break; + } else if (c=='(') { + plevel++; + } else if (c=='\\') { + if (*chptr=='\n') { + cheap->ptr--; + getline1(); + chptr = *pchptr; + } +// } else if (c==' '||c=='\t') { +// cheap->ptr--; + } else if (c=='\n') { + cheap->ptr--; + getline1(); + chptr = *pchptr; + } + } else if (c==')') { + plevel--; + } else if (c=='(') { + plevel++; + } else if (c=='\n') { + cheap->ptr--; + getline1(); + chptr = *pchptr; + } } *pchptr = chptr; return reverse0(args); @@ -873,8 +875,8 @@ sargs = args = cadr(nptr->dsp); values = macro_args(pchptr); if (pchptr==&chptr) { - getch(); - // ch = *chptr++; + getch(); + // ch = *chptr++; } // eval all argument list int evalues = 0; @@ -892,9 +894,9 @@ while(args) { mappend0(reverse0(car(evalues)),¯o); local_define(scaddr(args),macro, scaddr(values)); - args = cadr(args); - evalues = cadr(evalues); - values = cadr(values); + args = cadr(args); + evalues = cadr(evalues); + values = cadr(values); } // process body replacement macro = scaddr(nptr->dsp); @@ -933,8 +935,8 @@ { if (c=='#' && body[0]=='#') return 1; while((c=*body++)) { - if (c=='#' && body[0]=='#') return 1; - if (c!=' ' && c!='\t' && c!='\n') return 0; + if (c=='#' && body[0]=='#') return 1; + if (c!=' ' && c!='\t' && c!='\n') return 0; } return 0; } @@ -945,7 +947,7 @@ This is a recursive interpreter. reuslt: list2("replaced string",next) - history is necessary to avoid recursion + history is necessary to avoid recursion */ static int @@ -965,122 +967,122 @@ macrop = list3s(STRING,macrop,cheap->ptr); expand = (char **)&scaddr(macrop); for(; (c = *body++) ;) { - if (in_quote) { - if (c=='\\') { - *cheap->ptr = c; c = *body++; - cheap = increment_cheap(cheap,expand); - } else if (c=='\'') { - in_quote = 0; - } - } else if (in_wquote) { - if (c=='\\') { - *cheap->ptr = c; c = *body++; - cheap = increment_cheap(cheap,expand); - } else if (c=='"') { - in_wquote = 0; - } - } else if (c=='"') { - in_wquote = 1; prev_concat = 0; - } else if (c=='\'') { - in_quote = 1; prev_concat = 0; - } else if (c=='#' && *body=='#') { - mconcat = 1; - prev_concat = 1; - // name concatenation. flag only. remove and re-evaluate - // in the top level. (and skip space) - } else if (!mconcat && c=='#' && alpha(*body)) { - // turn into string next macro literal - string_flag = 1; - string_mark(expand); - prev_concat = 0; + if (in_quote) { + if (c=='\\') { + *cheap->ptr = c; c = *body++; + cheap = increment_cheap(cheap,expand); + } else if (c=='\'') { + in_quote = 0; + } + } else if (in_wquote) { + if (c=='\\') { + *cheap->ptr = c; c = *body++; + cheap = increment_cheap(cheap,expand); + } else if (c=='"') { + in_wquote = 0; + } + } else if (c=='"') { + in_wquote = 1; prev_concat = 0; + } else if (c=='\'') { + in_quote = 1; prev_concat = 0; + } else if (c=='#' && *body=='#') { + mconcat = 1; + prev_concat = 1; + // name concatenation. flag only. remove and re-evaluate + // in the top level. (and skip space) + } else if (!mconcat && c=='#' && alpha(*body)) { + // turn into string next macro literal + string_flag = 1; + string_mark(expand); + prev_concat = 0; goto names; - } else if (alpha(c)) { - // find a name - body--; // ungetc + } else if (alpha(c)) { + // find a name + body--; // ungetc names: - nptrm = get_name(body,&len,NONDEF); - if (!nptrm) { - while((*cheap->ptr = *body++) && len--) - cheap = increment_cheap(cheap,expand); - body--; - if (string_flag) { - string_flag = 0; - string_mark(expand); - } - continue; - } - body += len; - c = *body; - nptrm = name_space_search(nptrm,MACRO); - if (nptrm->dsp) - macro = scaddr(nptrm->dsp); - else - macro=""; - if (check_recurse(nptrm->nm,history)) { - // should return the most original one, but how? - // save_cheap/reset_cheap and return here? - macro = nptrm->nm; - goto skip; - } - switch(nptrm->sc) { - case FMACRO: - if (c==' '||c=='\t') { - while (c==' '||c=='\t') c=*body++; - body--; - } - if(c!='(') { - macro = nptrm->nm; - goto skip; // error(MCERR); this isn't error - } - *cheap->ptr = 0; - cheap = increment_cheap(cheap,expand); - body++; - macrop = macro_function(macrop,&body,nptrm, - glist3s(STRING,history,nptrm->nm)); - macrop = list3s(STRING,macrop,cheap->ptr); - expand = (char **)&(scaddr(macrop)); - break; - default: - if (prev_concat) { - prev_concat = 0; - macro = nptrm->u.nm; - } else if (next_concat(c,body)) { - prev_concat = 1; - macro = nptrm->u.nm; - } - if (macro==0 || !macro[0]) - macro = nptrm->nm; - goto skip; - case MACRO: - if (neqname(nptrm->nm,macro)) { - if (macro[0]==0) { - if (string_flag) { - string_flag = 0; - string_mark(expand); - } - continue; - } - *cheap->ptr = 0; - cheap = increment_cheap(cheap,expand); - macrop=macro_eval(macrop,macro,glist3s(STRING,history,nptrm->nm)); - macrop = list3s(STRING,macrop,cheap->ptr); - expand = (char **)&(scaddr(macrop)); - break; - } - macro = nptrm->nm; + nptrm = get_name(body,&len,NONDEF); + if (!nptrm) { + while((*cheap->ptr = *body++) && len--) + cheap = increment_cheap(cheap,expand); + body--; + if (string_flag) { + string_flag = 0; + string_mark(expand); + } + continue; + } + body += len; + c = *body; + nptrm = name_space_search(nptrm,MACRO); + if (nptrm->dsp) + macro = scaddr(nptrm->dsp); + else + macro=""; + if (check_recurse(nptrm->nm,history)) { + // should return the most original one, but how? + // save_cheap/reset_cheap and return here? + macro = nptrm->nm; + goto skip; + } + switch(nptrm->sc) { + case FMACRO: + if (c==' '||c=='\t') { + while (c==' '||c=='\t') c=*body++; + body--; + } + if(c!='(') { + macro = nptrm->nm; + goto skip; // error(MCERR); this isn't error + } + *cheap->ptr = 0; + cheap = increment_cheap(cheap,expand); + body++; + macrop = macro_function(macrop,&body,nptrm, + glist3s(STRING,history,nptrm->nm)); + macrop = list3s(STRING,macrop,cheap->ptr); + expand = (char **)&(scaddr(macrop)); + break; + default: + if (prev_concat) { + prev_concat = 0; + macro = nptrm->u.nm; + } else if (next_concat(c,body)) { + prev_concat = 1; + macro = nptrm->u.nm; + } + if (macro==0 || !macro[0]) + macro = nptrm->nm; + goto skip; + case MACRO: + if (neqname(nptrm->nm,macro)) { + if (macro[0]==0) { + if (string_flag) { + string_flag = 0; + string_mark(expand); + } + continue; + } + *cheap->ptr = 0; + cheap = increment_cheap(cheap,expand); + macrop=macro_eval(macrop,macro,glist3s(STRING,history,nptrm->nm)); + macrop = list3s(STRING,macrop,cheap->ptr); + expand = (char **)&(scaddr(macrop)); + break; + } + macro = nptrm->nm; skip: - case LMACRO: - while((*cheap->ptr = *macro++)/* && len-- */) - cheap = increment_cheap(cheap,expand); - } - if (string_flag) { - string_flag = 0; - string_mark(expand); - } - continue; - } - *cheap->ptr = c; - cheap = increment_cheap(cheap,expand); + case LMACRO: + while((*cheap->ptr = *macro++)/* && len-- */) + cheap = increment_cheap(cheap,expand); + } + if (string_flag) { + string_flag = 0; + string_mark(expand); + } + continue; + } + *cheap->ptr = c; + cheap = increment_cheap(cheap,expand); } *cheap->ptr = 0; cheap = increment_cheap(cheap,expand); @@ -1100,9 +1102,9 @@ for(;lists;lists = cadr(lists)) { p = scaddr(lists); for(;(*cheap->ptr = *p++);cheap = increment_cheap(cheap,result)) { - // in_quote + \n case ? should be \n. - if (p[-1]=='\n') cheap->ptr[0]=' '; - } + // in_quote + \n case ? should be \n. + if (p[-1]=='\n') cheap->ptr[0]=' '; + } } cheap = increment_cheap(cheap,result); return *result; @@ -1117,9 +1119,9 @@ for(;lists;lists = cadr(lists)) { p = scaddr(lists); for(;(*cheap->ptr=*p++);cheap = increment_cheap(cheap,result)) { - // in_quote + \n case ? should be \n. - // if (p[-1]=='\n') cheap->ptr[0]=' '; - } + // in_quote + \n case ? should be \n. + // if (p[-1]=='\n') cheap->ptr[0]=' '; + } } cheap = increment_cheap(cheap,result); return *result; @@ -1129,11 +1131,11 @@ check_recurse(char *macro,int history) { for(;history;history = cadr(history)) { - if (macro==scaddr(history)) { + if (macro==scaddr(history)) { // fprintf(stderr,"check_recurse: %s %s = ",macro,scaddr(history)); // fprintf(stderr,"1\n"); - return 1; - } + return 1; + } } // fprintf(stderr,"0\n"); return 0;