changeset 75:92dcf107a837 c-code-output

c code output
author kono
date Mon, 24 Feb 2003 19:50:20 +0900
parents 6de658ae384c
children fb3fb9e9a462
files Changes conv/c.c mc-parse.c mc-tree.c
diffstat 4 files changed, 32 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Feb 24 17:18:48 2003 +0900
+++ b/Changes	Mon Feb 24 19:50:20 2003 +0900
@@ -1619,7 +1619,7 @@
 みたいな時に自分自身を壊してしまう。なので、emit_copy
 が、ちゃんと方向を見て壊さないように処理する必要がある。
 
-call bcop でいいじゃん。まね。
+call bcopy でいいじゃん。まね。
 
 Wed Feb 19 20:42:07 JST 2003
 
@@ -1747,3 +1747,20 @@
 合に表示を行ってはいけない。
 
 なんか関数の引数の型の値が微妙に変わるんですけど... やだなぁ...
+
+まだ、関数定義のtypedefがstructに変わってしまう。gtypedefed
+がうまく動いていない?
+
+Mon Feb 24 17:24:31 JST 2003
+
+まぁねぇ。やっぱり完全に構文木から再構成した方が
+便利ではあるよね。特に getsym (空白など)と conv->x_()
+との総合作用はめんどくさい。
+
+そのためには、局所変数名をtree上で持ち歩く必要がある。
+まぁ、そうすれば良いだけだけど。
+
+実際、今のセットで出来るかどうかは、ちょっと怪しい。
+たぶん、buffer に出力するってのをいれればおそらくは
+変換できるだろう。
+
--- a/conv/c.c	Mon Feb 24 17:18:48 2003 +0900
+++ b/conv/c.c	Mon Feb 24 19:50:20 2003 +0900
@@ -192,8 +192,8 @@
 }
 
 void
-function_(NMTBL *n,int args){
-    type_print(n->ty,0,vout);
+function_(NMTBL *n,int args,int cont){
+    type_print1(n->ty,0,vout,cont);
     fprintf(vout,"%s(",n->nm);
     args=reverse0(args);
     while(args) {
--- a/mc-parse.c	Mon Feb 24 17:18:48 2003 +0900
+++ b/mc-parse.c	Mon Feb 24 19:50:20 2003 +0900
@@ -356,7 +356,7 @@
 decl(void)
 {
     NMTBL *n;
-    int t;
+    int t; int sd;
     if (mode==GDECL) typedefed=0;
 
     if(sym==STATIC) {
@@ -398,7 +398,7 @@
 	conv->return_type_(t,0,stypedecl);
 	conv->sm_(); return;
     }
-    type=t;
+    type=t; sd=stypedecl;
     n=decl0();
     reverse(t);
     if (n == &null_nptr) {
@@ -406,13 +406,14 @@
 	return;
     }
     if(sym==LC || ( sym!=SM && sym!=COMMA && sym!=ASS )) {
+	stypedecl=sd;
 	if (car(type)==CODE) {
 	    code_decl(n); return;
 	} else if (car(type)==FUNCTION) {
 	    fdecl(n); return;
 	} else error(TYERR);
     }
-    conv->return_type_(type,n,stypedecl);
+    conv->return_type_(type,n,sd);
     def(n);
     while(sym==COMMA) {	
 	conv->comma_();
@@ -474,8 +475,6 @@
 		getsym();
 		break;
 	    } else if(nptr->sc==EMPTY && gnptr->sc==TYPE) {	
-		t=gnptr->ty;
-		gtypedefed=glist2((int)gnptr,gtypedefed);
 		getsym();
 		break;
 	    }
@@ -746,6 +745,8 @@
 	break;
     case GTDECL:
 	nsc = TYPE;
+	if (gnptr!=n) error(-1);
+	gtypedefed=glist2((int)gnptr,gtypedefed);
 	break;
     case ADECL:
 	arglist = list3((int)n,arglist,0);
@@ -1050,6 +1051,7 @@
     control=0;
     conv->code_end_();
     if(!chk) code_leave(n->nm);
+    arglist=0;
 }
 
 static NMTBL *tmp_struct;
@@ -1057,6 +1059,7 @@
 static void
 fdecl(NMTBL *n)
 {
+    int sd = stypedecl;
     if(!chk) enter(n->nm);
     fnptr=n;
     retlabel=fwdlabel();
@@ -1076,7 +1079,7 @@
     }
     fdecl_struct(fnptr->ty);
     typedefed=0;
-    conv->function_(fnptr,arglist); conv->lc_();
+    conv->function_(fnptr,arglist,sd); conv->lc_();
     disp=0;
     init_vars=0;
     /* local variable declaration */
@@ -1098,6 +1101,7 @@
     if(!chk) leave(control,n->nm);
     retpending = 0;
     control=0;
+    arglist=0;
 }
 
 static NMTBL str_ret;
--- a/mc-tree.c	Mon Feb 24 17:18:48 2003 +0900
+++ b/mc-tree.c	Mon Feb 24 19:50:20 2003 +0900
@@ -308,10 +308,10 @@
     NMTBL *td;
     int args;
 
-    if((td=typedef_search(typedefed,type))) {
+    if(type>0&&(td=typedef_search(typedefed,type))) {
 	if (!cont)
 	    fprintf(out,"%s ",td->nm);
-    } else if((td=typedef_search(gtypedefed,type))) {
+    } else if(type>0&&(td=typedef_search(gtypedefed,type))) {
 	if (!cont)
 	    fprintf(out,"%s ",td->nm);
     } else if (type<0) {