changeset 31:8b87de87eb54

*** empty log message ***
author kono
date Sat, 08 Feb 2003 18:59:45 +0900
parents 20ed2786a276
children b35787d8a442
files Idea mc-parse.c
diffstat 2 files changed, 24 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/Idea	Sat Feb 08 18:18:46 2003 +0900
+++ b/Idea	Sat Feb 08 18:59:45 2003 +0900
@@ -1407,9 +1407,22 @@
 
 いちおう、mflag まではデバッグしたが....  mflag を戻してないんじゃないの?
 
-     ---c(a,b)-----------------------  mflag ==0
-        ----g(ac,bc)-----------------  mflag ==1
-            ----printf(a,b)----------  mflag ==2
+     ---c(a,b)-----------------------  mflag ==1
+          a=>hoge, b=>hoga (mflag==1)
+        ----g(ac,bc)-----------------  mflag ==2
+              ac=>goge, bc=>goga(mflag==2)
+            ----printf(a,b)----------  mflag ==3
+                a=>poge, b=>poga(mflag==3)
 
 g が呼び出されると、ac,bc は mflag==1 でのみ置換される。
 
+あるテキストを置き換えると、それは置き換えたマクロのmflag level
+(つまり一つ少ないレベル)になる。
+置き換え終ったら、元のlevelに戻す。
+
+mflag==2のlevel では、mflag==2のlocal macroの展開しかしない。
+
+置き換えると、mflag level 1 になるので、そこで mflag==1 のlocal
+macro を展開する。mflag==0 は常に展開を行う。
+
+
--- a/mc-parse.c	Sat Feb 08 18:18:46 2003 +0900
+++ b/mc-parse.c	Sat Feb 08 18:59:45 2003 +0900
@@ -2236,6 +2236,7 @@
 	    if (cadddr(i)) {
 		mflag--;
 	    }
+fprintf(stderr,"macro subsitite: %d %s=>%s\n",mflag,name,macro);
 	    chptr = macro;
 	    getch();
 	    return getsym();
@@ -2452,7 +2453,7 @@
     NMTBL *nptr,*iptr;
     int hash,i;
 
-    i = 0;
+    i = 0; hash = 0;
     while((name[i])) {
 	hash=((7*hash) ^ name[i++]);
     }
@@ -2518,7 +2519,7 @@
 {
     NMTBL *nptr0;
     int sargs;
-    if(*chptr) return ch= *chptr++;
+    if(*chptr) return ch = *chptr++;
 
     if(chptrsave) {
 	nptr0=(NMTBL *)car(cadddr(chptrsave));
@@ -2529,7 +2530,10 @@
 		sargs = cadr(sargs);
 	    }
 	}
-	mflag--;
+	if (nptr0->ty>0) { /* local macro's current mflag level */
+	    mflag++;       /* for global macro, this is 0 */
+	}
+fprintf(stderr,"macro subsitite end: %d %s\n",mflag,nptr0->nm);
 	chptr=(char *)car(chptrsave);
 	ch=caddr(chptrsave);
 	chptrsave=cadr(chptrsave);
@@ -2832,32 +2836,17 @@
 fmacro()
 {
     int args,values;
-#if 1
-int i;
-fprintf(stderr,"linebuf: %s\n",linebuf);
-fprintf(stderr,"fmacro: %s\n",nptr->nm);
-fprintf(stderr,"fmacro body: %s\n",(char *)car(nptr->dsp));
-i = 1;
-#endif
     args = cadr(nptr->dsp);
     values = macro_args();
     mflag++;
     while(args) {
-#if 1
-fprintf(stderr,"fmacro args %d: %s\n",i++,(char *) car(args));
-fprintf(stderr,"fmacro args value %d: %s\n",i,(char *) car(values));
-#endif
 	local_define(car(args),car(values));
 	args = cadr(args);
 	values = cadr(values);
-fprintf(stderr,"fmacro body: %s\n",(char *)car(nptr->dsp));
     }
     ch = *chptr;
     chptrsave = list4((int)chptr,chptrsave,ch,list2((int)nptr,car(nptr->dsp)));
     chptr = (char *)car(nptr->dsp);
-#if 1
-fprintf(stderr,"fmacro replace result: %s\n",chptr);
-#endif
     getch();
 }
 
@@ -2881,6 +2870,7 @@
     nptr0->ty=list4(nptr0->sc,nptr0->dsp,nptr0->ty,mflag); 
     nptr0->sc=MACRO; 
     nptr0->dsp=list2((int)value,0); 
+fprintf(stderr,"local define: %d %s=>%s\n",mflag,macro,value);
 }
 
 void