changeset 66:0b068058dd67

*** empty log message ***
author kono
date Sat, 22 Feb 2003 01:32:47 +0900
parents 8ad746efa4f8
children 254a0c576114
files Changes Makefile conv/c.c conv/c2cbc.c conv/cbc2c.c conv/null.c mc-code-ia32.c mc-code.h mc-codegen.c mc-codegen.h mc-parse.c mc.h
diffstat 12 files changed, 575 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Thu Feb 20 08:56:29 2003 +0900
+++ b/Changes	Sat Feb 22 01:32:47 2003 +0900
@@ -1637,3 +1637,66 @@
 ずれるみたい。6809では問題にならなかったんだけどね。
 leave で調整するべき。
 
+
+Thu Feb 20 14:42:46 JST 2003
+
+c2cbc,cbc2c なんだけど、いったん、構文木にしてから変換すると、
+結構失われる情報があるけど、いいの? 特に局所変数の名前とか型
+の情報とか。macro もそうだけど。 indent ぐらい保存できないか
+なぁ。式の途中でfunction callする場合も取り扱う必要があるの
+で、構文木にしてから計算するしかないかな。gexpr の代わりに生
+成するようにするか。そうすると、修正するのは、statement と、
+gexpr になる。でも、結局、構文木で型を持ち歩くしかないんじゃ
+ないの? やっぱり変だよ。型の情報がないのは。
+
+そうではなくて、exprN() で変換していく方法もある。この方が
+情報が欠落しないので楽だろう。そうすると、修正するのは、
+    exprN(),doXXXX()
+となる。これは、量は多い。けど、まぁ、それだけ。この方が
+オリジナルを保存しやすい。
+
+中間変数を途中で追加すると、宣言部を前もって出力できなく
+なる。{int a;...} を認めれば良いわけだど。実装は難しくない。
+じゃ、やれば? でも、汚くなるなあ。出力をいったんバッファ
+に貯めれば? どこに? cheapp ですか? 中間変数はいらないん
+じゃないの?
+     a = g(i)+a;
+でしょ。
+     goto g_1(i,f_1,save_a); }
+     code g_1(i,f_1,save_a) { .... goto f_1(ret_value,save_a); }
+     code f_1(ret_value,save_a) { a = ret_value+a; ...}
+じゃん。いらないじゃん。。
+
+
+型を表示するルーチンが必要だね。
+
+めんどくさいなぁ。CbCのProlog version とかほしいなぁ。そうすれば、
+変換は簡単。でも、やろうとしてできなかったことでもあるな。
+
+
+Thu Feb 20 21:13:23 JST 2003
+
+MC6809 の mc-codegen.c version は? (ちょっと虚しすぎる?)
+X と D で、use_data_register, use_pointer してやる。
+tosop で、X と D の間の足し算を特別扱いする。
+(なるほど...) MAX_MAX=0でうまく動くのか? やっぱり、1は
+いるよね。できれば、2だよね。
+
+結構、浮動小数点も簡単かも。
+
+汎用の書き換えツールも便利そう。
+
+でも、Prolog version ってのも面白そう。
+   code(name,interface(....)) :- 
+     p()....,goto(name,interface(....)).
+みたいな感じ? 結構、簡単にinterpreterを書けるかも知れない。
+これは、あれだね。thread diagram interpreter と似ている。
+
+Fri Feb 21 13:34:17 JST 2003
+
+構文要素での書き換えだけど、どれくらいの能力があるの?
+その場での書き換えだけだと、ちょっと低すぎない? それで、
+cbc2c,c2cbc はできるとは思う。
+
+まぁいいけど.. chk を無視しているところが結構あるんですけど。
+jmp,enter,leave ...
--- a/Makefile	Thu Feb 20 08:56:29 2003 +0900
+++ b/Makefile	Sat Feb 22 01:32:47 2003 +0900
@@ -5,7 +5,8 @@
 MFLAGS=$(MFALGS) BASE=$(BASE) STAGE=$(STAGE)
 MC=mc
 PRINTF= # printf.c
-CONVERTER=conv/c.o conv/c2cbc.o conv/cbc2c.o conv/null.o
+CONVERTER=conv/c.o 
+# conv/c2cbc.o conv/cbc2c.o conv/null.o
 
 all: mc 
 
--- a/conv/c.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/conv/c.c	Sat Feb 22 01:32:47 2003 +0900
@@ -2,23 +2,20 @@
 
 #include "mc.h"
 
-static void open(char *);
-static void print(char *);
-static void close();
-
-Converter c_converter = {
-    &open,
-    &print,
-    &close,
-};
+#include "conv/convdef.h"
 
 static FILE *vout;
 
 static void
-open(char *s)
+comment_(char *s)
+{
+}
+
+static void
+open_(char *s)
 {
     char *p=cheapp;
-    while((*cheapp++ = *s++)) {
+    while ((*cheapp++ = *s++)) {
 	if (*s=='.') {
 	    *cheapp++=*s++; *cheapp++='c';
 	    *cheapp++='c'; *cheapp++=0;
@@ -26,17 +23,314 @@
 	}
     }
     vout = fopen(p,"w");
-    if(!vout) error(-1);
+    if (!vout) error(-1);
 }
 
 static void
-print(char *s)
+print_(char *s)
 {
     fprintf(vout,"c: %s\n",s);
 }
 
 static void
-close()
+close_()
 {
     fclose(vout);
 }
+
+void
+case_(int cases,int def){
+
+}
+
+void
+code_(NMTBL *fnptr,int arglist){
+
+}
+
+void
+code_end_(){
+
+}
+
+void
+comma_(){
+
+}
+
+void
+cond_(){
+
+}
+
+void
+cond1_(){
+
+}
+
+void
+cond2_(){
+
+}
+
+void
+cond_end_(){
+
+}
+
+void
+decl_data_begin_(){
+
+}
+
+void
+decl_data_end_(){
+
+}
+
+void
+def_(NMTBL *n){
+
+}
+
+void
+dowhile_(){
+
+}
+
+void
+dowhile_cond_(){
+
+}
+
+void
+dowhile_end_(){
+
+}
+
+int
+error_(n){
+    return 0;
+}
+
+void
+expr16_end_(){
+
+}
+
+void
+extern_(){
+
+}
+
+void
+for_(){
+
+}
+
+void
+for1_(){
+
+}
+
+void
+for2_(){
+
+}
+
+void
+for3_(){
+
+}
+
+void
+for_body_(){
+
+}
+
+void
+for_end_(){
+
+}
+
+void
+funcall_(int type){
+
+}
+
+void
+funcall_args_(){
+
+}
+
+void
+function_(){
+
+}
+
+void
+function_end_(){
+
+}
+
+void
+goto_(){
+
+}
+
+void
+goto_label_(){
+
+}
+
+void
+id_(int sy,NMTBL *nptr){
+
+}
+
+void
+if_(){
+
+}
+
+void
+if_else_(){
+
+}
+
+void
+if_endif_(){
+
+}
+
+void
+if_then_(){
+
+}
+
+void
+jump_(int env){
+
+}
+
+void
+label_(){
+
+}
+
+void
+lbra_(int sym){
+
+}
+
+void
+lc_(){
+
+}
+
+void
+localvar_end_(){
+
+}
+
+void
+lpar_(){
+
+}
+
+void
+op_(int sym){
+
+}
+
+void
+postfix_(int sym){
+
+}
+
+void
+prefix_(int sym){
+
+}
+
+void
+rbra_(int sym){
+
+}
+
+void
+rc_(){
+
+}
+
+void
+register_(){
+
+}
+
+void
+return_(){
+
+}
+
+void
+return_end_(){
+
+}
+
+void
+return_type_(int t){
+
+}
+
+void
+rpar_(){
+
+}
+
+void
+sm_(){
+
+}
+
+void
+static_(){
+
+}
+
+void
+switch_(){
+
+}
+
+void
+switch_body_(){
+
+}
+
+void
+switch_end_(){
+
+}
+
+void
+typedef_(){
+
+}
+
+void
+while_(){
+
+}
+
+void
+while_body_(){
+
+}
+
+void
+while_end_(){
+
+}
+
+/* end */
--- a/conv/c2cbc.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/conv/c2cbc.c	Sat Feb 22 01:32:47 2003 +0900
@@ -5,13 +5,22 @@
 static void open(char *);
 static void print(char *);
 static void close();
+static void comment(char *s);
 
 Converter c2cbc_converter = {
     &open,
     &print,
     &close,
+    &comment,
 };
 
+static FILE *vout;
+
+static void
+comment(char *s)
+{
+}
+
 static void cbcstruct_init(void);
 static void init(void);
 static void unlist(int e1);
--- a/conv/cbc2c.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/conv/cbc2c.c	Sat Feb 22 01:32:47 2003 +0900
@@ -5,16 +5,23 @@
 static void open(char *);
 static void print(char *);
 static void close();
+static void comment(char *s);
 
 Converter cbc2c_converter = {
     &open,
     &print,
     &close,
+    &comment,
 };
 
 static FILE *vout;
 
 static void
+comment(char *s)
+{
+}
+
+static void
 open(char *s)
 {
     char *p=cheapp;
--- a/conv/null.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/conv/null.c	Sat Feb 22 01:32:47 2003 +0900
@@ -5,14 +5,21 @@
 static void open(char *);
 static void print(char *);
 static void close();
+static void comment(char *s);
 
 Converter null_converter = {
     &open,
     &print,
     &close,
+    &comment,
 };
 
 static void
+comment(char *s)
+{
+}
+
+static void
 open(char *s)
 {
 }
--- a/mc-code-ia32.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc-code-ia32.c	Sat Feb 22 01:32:47 2003 +0900
@@ -87,7 +87,6 @@
 void shift(char *op, int reg);
 void ld_indexx(int byte, int n, int xreg);
 void jmp(int l);
-void global_table(void);
 void local_table(void);
 void text_mode(void);
 void data_mode(char *name);
@@ -96,7 +95,6 @@
 int register_var(int r);
 int get_register_var(void);
 void emit_push(void);
-void emit_push_x(int xreg);
 int emit_pop(int type);
 void code_crlvar(int e2);
 void code_preinc(int e1,int e2);
@@ -108,7 +106,8 @@
 void function(int e1);
 void code_assop(int op,int byte);
 int edx_setup();
-void opening(char *filename);
+void code_opening(char *filename);
+void code_closing();
 void code_leave(char *name);
 int lvar(int l);
 
@@ -251,22 +250,6 @@
     }
 }
 
-void 
-emit_push_x(int xreg)
-{
-    int new_reg;
-    new_reg = get_register();
-    if(new_reg<0) {                     /* もうレジスタがない */
-	reg_stack[reg_sp++] =  -1;
-	printf("\tpushl %s\n",register_name(xreg,0));
-	/* creg is used soon, don't regv[xreg]=0 */
-    } else {
-	reg_stack[reg_sp++] = xreg;     /* push するかわりにレジスタを使う */
-	xreg = new_reg;
-	regv[xreg]=1;
-    }
-}
-
 int
 emit_pop(int type)
 {
@@ -1005,24 +988,23 @@
 cmpdimm(int e, int csreg)
 {
     /* used in dosiwtch() */
+    if(chk) return;
     use_register(creg,csreg,0);
     printf("\tcmpl $%d,%s\n",e,register_name(creg,0));
 }
 
 void
-opening(char *filename)
+code_opening(char *filename)
 {
     printf("\t.file \"%s\"\n",filename);
     printf("\t.version\t\"01.01\"\n");
-    printf("gcc2_compiled.:\n");
+    /* printf("gcc2_compiled.:\n"); */
     printf(".text\n");
-    emit_init();
 }
 
 void
-closing(void)
+code_closing()
 {
-    global_table();
     printf("\t.ident \"Micro-C compiled\"\n");
 }
 
@@ -1036,6 +1018,7 @@
 void
 jcond(int l, char cond)
 {       
+    if (chk) return;
     printf("\tj%s\t_%d\n",cond?"ne":"e",l);
 }
 
@@ -1043,6 +1026,7 @@
 jmp(int l)
 {       
     control=0;
+    if (chk) return;
     printf("\tjmp\t_%d\n",l);
     /* align? */
     /*
@@ -1056,7 +1040,8 @@
 void
 gen_comment(char *s)
 {
-     printf("## %s",s);
+    if (chk) return;
+    printf("## %s",s);
 }
 
 
@@ -1180,6 +1165,7 @@
     if(mode!=GDECL)  { 
 	error(-1); return;
     }
+    if (chk) return;
     if (n->dsp != -1) {
 	n->dsp = -1;   /* initiallized flag */
 	printf(".globl\t%s\n",name);
@@ -1222,6 +1208,7 @@
 emit_data_closing(NMTBL *n)
 {
     int lb;
+    if (chk) return;
     if (mode==GDECL) {
 	data_mode(0);
 	lb=fwdlabel();
--- a/mc-code.h	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc-code.h	Sat Feb 22 01:32:47 2003 +0900
@@ -57,11 +57,13 @@
 extern void code_register_assop(int e2,int op,int byte);
 extern void code_assop(int op,int byte);
 extern void tosop(int op,int oreg);
-extern void opening(char *filename);
+extern void code_opening(char *filename);
+extern void code_closing();
 extern void rexpr(int e1, int l1, char *s);
 extern void jcond(int l, char cond);
 extern void jmp(int l);
 extern void code_set_fixed_creg(int mode);
 extern void text_mode(void);
+extern void global_table(void);
 extern int lvar(int l);
 
--- a/mc-codegen.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc-codegen.c	Sat Feb 22 01:32:47 2003 +0900
@@ -111,6 +111,7 @@
 register_usage(char *s)
 {
     int i;
+    if (chk) return;
     printf("# %d: %s:",lineno,s);
     printf(" creg=%s dreg=%s ",register_name(creg,0),register_name(dreg,0));
     for(i=0;i<MAX_REGISTER;i++) {
@@ -190,6 +191,7 @@
 void
 gexpr(int e1)
 {
+    if (chk) return;
     gexpr_init();
 #if 0
     if(lineno==2862) {
@@ -212,7 +214,6 @@
     int e2,e3/*,e4*/;
     NMTBL *n;
 
-    if (chk) return;
     e2 = cadr(e1);
     switch (car(e1)){
     case GVAR:   
@@ -362,6 +363,7 @@
 void
 bexpr(int e1, char cond, int l1)
 {
+    if (chk) return;
     gexpr_init();
     b_expr(e1,cond,l1,0);
 }
@@ -370,7 +372,6 @@
 b_expr(int e1, char cond, int l1,int err)
 {
     int e2,l2;
-    if (chk) return;
     e2=cadr(e1);
     switch(car(e1)) {
     case LNOT:
@@ -865,14 +866,16 @@
 fwddef(int l)
 {       
     control=1;
-    printf("_%d:\n",l);
+    if (!chk)
+	printf("_%d:\n",l);
 }
 
 int
 backdef(void)
 {       
     control=1;
-    printf("_%d:\n",labelno);
+    if (!chk)
+	printf("_%d:\n",labelno);
     return labelno++;
 }
 
@@ -906,4 +909,19 @@
     jmp(retlabel); 
 }
 
+void
+opening(char *filename)
+{
+    emit_init();
+    if (!chk)
+	code_opening(filename);
+}
+
+void
+closing()
+{
+    if (!chk)
+	code_closing();
+}
+
 /* end */
--- a/mc-codegen.h	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc-codegen.h	Sat Feb 22 01:32:47 2003 +0900
@@ -33,7 +33,6 @@
 extern void fwddef(int l);
 
 extern int csvalue();
-extern void closing(void);
 extern void cmpdimm(int e, int csreg);
 extern void code_enter(char *name) ;
 extern void code_enter1(int args);
@@ -56,6 +55,7 @@
 extern void jmp_label(int l);
 extern void leave(int control, char *name);
 extern void opening(char *filename);
+extern void closing();
 extern void ret(void);
 extern void use_register_var(int);
 
--- a/mc-parse.c	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc-parse.c	Sat Feb 22 01:32:47 2003 +0900
@@ -94,7 +94,8 @@
 static int struct_return  = 0;
 static int arglist = 0;
 
-Converter *conv = &null_converter;
+/* Converter *conv = &null_converter; */
+Converter *conv = &c_converter;
 
 static char *ccout = 0;
 
@@ -123,7 +124,9 @@
 	    debug = 1;
 	    break;
 	case 'C':
-	    if (av[ac2+1]) { set_converter(av[ac2+1]); ac2++; }
+	    if (av[ac2+1]) set_converter(av[ac2]+2);
+	    chk = 1;
+	    ccout=0;
 	    break;
 	default:
 	    error(OPTION);
@@ -140,7 +143,7 @@
 	emit_init();
 	mode=TOP;
 	lfree= HEAPSIZE;
-	while(getsym()==SM);
+	while(getsym()==SM) conv->sm_();
 	mode=GDECL;
 	stmode=0;
 	args=0;
@@ -163,16 +166,15 @@
 	    newfile();
 	    return;
 	} else if(mode == TOP) {	
-		/*
-	    if (!chk) fprintf(stderr,
-		    "Total internal labels	: %u.\n",labelno-1);
-	    fprintf(stderr,
-		    "Total global variables : %u bytes.\n\n",gpc);
-		 */
+	    if (chk) { 
+		fprintf(stderr, "Total internal labels : %u.\n",labelno-1);
+		fprintf(stderr, "Total global variables: %u bytes.\n",gpc);
+	    }
 	    closing();
 	    exit(0);
 	}
     }
+    if (conv->error_(n)) return;
     fprintf(stderr,"%s:%d:%s\n",filep->name0,lineno,
 	(n==FILERR) ? "Can't open specified file" :
 	(n==DCERR) ? "Declaration syntax" :
@@ -290,7 +292,7 @@
     char *s;
 
     lineno=0;
-    /* fprintf(stderr,"%s:\n",av[ac2]); */
+    if (chk) fprintf(stderr,"%s:\n",av[ac2]);
     if ( (filep->fcb = fopen(av[ac2++],"r")) == NULL ) error(FILERR);
     s = av[ac2-1];
     filep->name0 = cheapp;
@@ -314,10 +316,14 @@
 set_converter(char *s)
 {
     chptr = s;
+#if 0
     if (macroeq("c2cbc")) conv=&c2cbc_converter;
     else if (macroeq("cbc2c")) conv=&cbc2c_converter;
     else if (macroeq("c")) conv=&c_converter;
     else conv=&null_converter;
+#else
+    if (macroeq("c")) conv=&c_converter;
+#endif
 }
 
 static void
@@ -351,6 +357,7 @@
     int t;
 
     if(sym==STATIC) {
+	conv->static_();
 	if(mode==LDECL) {	
 		getsym();
 		mode=STADECL;
@@ -363,12 +370,15 @@
     } else if(sym==REGISTER) {
 	if(mode!=LDECL)  
 	    error(DCERR);
+	conv->register_();
 	stmode=REGISTER;
 	getsym();
     } else if(sym==EXTRN) {
+	conv->extern_();
 	getsym();
 	stmode=EXTRN;
     } else if(sym==TYPEDEF) {
+	conv->typedef_();
 	if(mode==GDECL) {	
 		getsym();
 		mode=GTDECL;
@@ -379,7 +389,10 @@
 		error(DCERR);
     }
     if((t=typespec())==0) return;
-    if(sym==SM) return;
+    conv->return_type_(t);
+    if(sym==SM) {
+	conv->sm_(); return;
+    }
     type=t;
     n=decl0();
     reverse(t);
@@ -392,10 +405,11 @@
 	    code_decl(n); return;
 	} else if (car(type)==FUNCTION) {
 	    fdecl(n); return;
-	}
+	} else error(TYERR);
     }
     def(n);
     while(sym==COMMA) {	
+	conv->comma_();
 	getsym();
 	type=t;
 	n=decl0();
@@ -405,6 +419,7 @@
 	def(n);
     }
     if(sym!=SM) error(DCERR);
+    conv->sm_();
     if(mode==GTDECL) 
 	mode=GDECL;
     if(mode==STADECL||mode==LTDECL) 
@@ -660,6 +675,7 @@
 	n=free_nptr();
 	n->nm = "_";
     }
+    conv->def_(n);
     nsc=ndsp=0;
     if(car(type)==FUNCTION) {	
 	if (n->sc==EXTRN || (mode==GDECL)) {
@@ -805,7 +821,7 @@
     if (!init_vars) return;
     init_vars = reverse0(init_vars);
     while(init_vars) {
-	g_expr(car(init_vars));
+	gexpr(car(init_vars));
 	init_vars = cadr(init_vars);
     }
 }
@@ -856,13 +872,17 @@
     t1 = car(t);
     if (t1==ARRAY) {
 	if (sym==LC) {
+	    conv->decl_data_begin_();
 	    mode = mode_save;
 	    t1 = cadr(t);
 	    for(i=0;;i++) {
 		if (sym!=RC)
 		    offset=decl_data(t1,n,offset); /* array of some thing */
-		if (sym==COMMA) { continue;
+		if (sym==COMMA) { 
+		    conv->comma_(); 
+		    continue;
 		} else if (sym==RC) {
+		    conv->decl_data_end_();
 		    if (caddr(t)==0) {           /* size not defined      */
 			heap[t+2]=i+1;           /* define array size     */
 		    } else if (caddr(t)!=i+1) {  /* size match?           */
@@ -874,6 +894,7 @@
 		    error(TYERR);
 		}
 	    }
+	    /* NOT REACHED */
 	} else if (cadr(t)==CHAR) {
 	    e=expr1();
 	    mode = mode_save;
@@ -888,15 +909,17 @@
 	} else 
 	    error(DCERR);
     } else if (t1==STRUCT) {
+	conv->decl_data_begin_();
 	mode = mode_save;
 	if(cadr(t)==-1) error(DCERR);
 	t1 = caddr(t);  /* list of fields */
 	while(t1) {
 	    offset = decl_data(car(t1),n,offset);  /* alignment? */
 	    t1 = cadr(t1);
-	    if ( t1 && sym==COMMA) continue;
+	    if ( t1 && sym==COMMA) { conv->comma_(); continue; }
 	    if (!t1 && sym!=RC) error(DCERR);
 	}
+	conv->decl_data_end_();
 	getsym();
 	return offset;
     } else {
@@ -967,7 +990,7 @@
     int t;
 
     if (n->sc==EMPTY) n->sc = CODE;
-    code_enter(n->nm);
+    if(!chk) code_enter(n->nm);
     fnptr=n;
     disp = -args;
     reg_var=0;
@@ -985,6 +1008,7 @@
 	if(n->sc==LVAR)
 	    n->dsp = -n->dsp-caddr(t);
     }
+    conv->code_(fnptr,arglist);
     /* local variable declaration */
     stmode=0;
     mode=STAT;
@@ -994,14 +1018,16 @@
 	decl();
 	mode=STAT;
     }
+    conv->localvar_end_();
     control=1;
-    code_enter1(args);
+    if(!chk) code_enter1(args);
     emit_init_vars();
     while(sym!=RC) statement();
     if(control)
 	error(STERR);
     control=0;
-    code_leave(n->nm);
+    conv->code_end_();
+    if(!chk) code_leave(n->nm);
 }
 
 static NMTBL *tmp_struct;
@@ -1009,7 +1035,7 @@
 static void
 fdecl(NMTBL *n)
 {
-    enter(n->nm);
+    if(!chk) enter(n->nm);
     fnptr=n;
     retlabel=fwdlabel();
     retcont = 0;
@@ -1024,6 +1050,7 @@
 	decl(); getsym();
     }
     fdecl_struct(fnptr->ty);
+    conv->function_(fnptr,arglist);
     disp=0;
     init_vars=0;
     /* local variable declaration */
@@ -1035,18 +1062,28 @@
 	decl();
 	mode=STAT;
     }
+    conv->localvar_end_();
     control=1;
-    enter1();
+    if(!chk) enter1();
     emit_init_vars();
     while(sym!=RC) statement();
 
-    leave(control,n->nm);
+    conv->function_end_();
+    if(!chk) leave(control,n->nm);
     retpending = 0;
     control=0;
 }
 
 static NMTBL str_ret;
 
+/*
+    If function has structure return value, it has extra
+    argument for where to write the structure. It have to be
+    a first argument. We add it here and we have to fix all arguments' 
+    offset. If it is the last value, we don't have to fix, but
+    gcc has a first argument convention.
+ */
+
 static void
 fdecl_struct(int fntype)
 {
@@ -1140,6 +1177,7 @@
     int slfree;
 
     if(sym==SM) { 
+	conv->sm_();
 	getsym(); return; 
     }
     checkret();
@@ -1205,13 +1243,16 @@
     int l1,l2,slfree;
     getsym();
     checksym(LPAR);
+    conv->if_();
     slfree=lfree;
     bexpr(expr(),0,l1=fwdlabel());
     lfree=slfree;
     checksym(RPAR);
+    conv->if_then_();
     statement();
     checkret();
     if(sym==ELSE) {	
+	conv->if_else_();
 	if ((l2 = control)) 
 	    jmp(l2=fwdlabel());
 	fwddef(l1);
@@ -1221,6 +1262,7 @@
 	if (l2) fwddef(l2);
     }
     else fwddef(l1);
+    conv->if_endif_();
 }
 
 static void
@@ -1232,11 +1274,13 @@
     scontinue=clabel;
     blabel=fwdlabel();
     clabel=backdef();
+    conv->while_();
     getsym();
     checksym(LPAR);
     slfree=lfree;
     e=expr();
     checksym(RPAR);
+    conv->while_body_();
     if(sym==SM) {	
 	bexpr(e,1,clabel);
 	lfree=slfree;
@@ -1249,6 +1293,7 @@
 	if(control)
 	    jmp(clabel);
     }
+    conv->while_end_();
     fwddef(blabel);
     clabel=scontinue;
     blabel=sbreak;
@@ -1264,6 +1309,7 @@
     blabel=fwdlabel();
     clabel=fwdlabel();
     l=backdef();
+    conv->dowhile_();
     getsym();
     statement();
     checkret();
@@ -1271,6 +1317,7 @@
     checksym(WHILE);
     checksym(LPAR);
     slfree=lfree;
+    conv->dowhile_cond_();
     bexpr(expr(),1,l);
     lfree=slfree;
     checksym(RPAR);
@@ -1278,6 +1325,7 @@
     fwddef(blabel);
     clabel=scontinue;
     blabel=sbreak;
+    conv->dowhile_end_();
 }
 
 static void
@@ -1288,6 +1336,7 @@
     sbreak=blabel;
     scontinue=clabel;
     blabel=fwdlabel();
+    conv->for_();
     getsym();
     checksym(LPAR);
     slfree=lfree;
@@ -1296,6 +1345,7 @@
 	checksym(SM);
     }
     else getsym();
+    conv->for1_();
     lfree=slfree;
     l=backdef();
     if(sym!=SM) {	
@@ -1303,15 +1353,19 @@
 	checksym(SM);
     }
     else getsym();
+    conv->for2_();
     lfree=slfree;
     if(sym==RPAR) {	
 	clabel=l;
 	getsym();
+	conv->for_body_();
 	statement();
 	checkret();
     } else {	
+	conv->for3_();
 	clabel=fwdlabel();
 	e=expr();
+	conv->for_body_();
 	checksym(RPAR);
 	statement();
 	checkret();
@@ -1319,6 +1373,7 @@
 	gexpr(e);
 	lfree=slfree;
     }
+    conv->for_end_();
     jmp(l);
     fwddef(blabel);
     clabel=scontinue;
@@ -1335,6 +1390,7 @@
     sdefault=dlabel;    /* save parents default label */
     dlabel=0;
     scase=cslabel;      /* save parents next case label */
+    conv->switch_();
     getsym();
     checksym(LPAR);
     slfree=lfree;
@@ -1343,9 +1399,11 @@
     csvalue1=csvalue() ;
     lfree=slfree;
     checksym(RPAR);
+    conv->switch_body_();
     cslabel = control = 0;
     /* should be case statement but... */
     statement();
+    conv->switch_end_();
     checkret();
     if(dlabel) def_label(cslabel,dlabel);
     else fwddef(cslabel);
@@ -1359,8 +1417,10 @@
 static void
 docomp(void)
 {
+    conv->lc_();
     getsym();
     while(sym!=RC) { statement(); checkret();}
+    conv->rc_();
     getsym();
 }
 
@@ -1374,6 +1434,7 @@
     while(sym==CASE) {	
 	getsym();
 	c=list2(cexpr(expr()),c);
+	conv->case_(c,0);
 	checksym(COLON);
     }
     l=fwdlabel();
@@ -1401,6 +1462,7 @@
     if (dlabel) error(STERR);
     if (!cslabel) jmp(cslabel = fwdlabel());
     dlabel = backdef();
+    conv->case_(0,1);
 }
 
 static void
@@ -1413,6 +1475,7 @@
 	retpending = 1;
 	return;
     }
+    conv->return_();
     slfree=lfree;
     if (struct_return) {
 	e = expr();
@@ -1438,6 +1501,7 @@
     checksym(SM);
     /* control = 0; still control continue until pending return emittion */
     retpending = 1;
+    conv->return_end_();
 }
 
 void
@@ -1454,6 +1518,7 @@
     NMTBL *nptr0;
     int t,e1,e2,env;
 
+    conv->goto_();
     getsym();
     e1 = expr();
     t=car(e1);
@@ -1468,6 +1533,7 @@
 	}
 	control=0;
 	checksym(SM);
+	conv->goto_label_(nptr0);
 	return;
     } 
     if (t==COMMA) {
@@ -1478,6 +1544,7 @@
 	env = 0;
     }
     if (t==FUNCTION) {
+	conv->jump_(env);
 	e2 = cadr(e1);
 	if (car(e2) == FNAME) {     
 	    nptr0=(NMTBL *)cadr(e2);
@@ -1503,6 +1570,7 @@
     nptr->dsp = backdef();
     getsym();
     checksym(COLON);
+    conv->label_();
 }
 
 int
@@ -1538,7 +1606,9 @@
 int
 expr(void)
 {
-    return(rvalue(expr0()));
+    int r;
+    r=rvalue(expr0());
+    return r;
 }
 
 static int
@@ -1548,6 +1618,7 @@
 
     e=expr1();
     while(sym==COMMA) {
+	conv->op_(sym);
 	getsym();e=list3(COMMA,e,rvalue(expr1()));
     }
     return e;
@@ -1558,6 +1629,7 @@
 {
     int e1,e2,t,op;
     e1=expr2();
+    conv->op_(sym);
     switch (sym) {
     case ASS:
 	lcheck(e1);
@@ -1572,6 +1644,7 @@
 	t=type;
 	getsym();
 	e2=rvalue(expr1());
+
 	if(!integral(type)) error(TYERR);
 	if((t==UNSIGNED||type==UNSIGNED)&&
 	    (op==MUL||op==DIV||op==MOD||op==RSHIFT||op==LSHIFT))
@@ -1585,6 +1658,7 @@
 	if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR);
 	e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED);
 	type=t;
+
 	return list4(ASSOP,e1,e2,op);
     default:
 	return(e1);
@@ -1596,14 +1670,18 @@
 {
     int e1,e2,e3,t;
 
+    conv->cond_();
     e1=expr3();
     if(sym==COND) {	
 	e1=rvalue(e1);
 	getsym();
+	conv->cond1_();
 	e2=rvalue(expr2());
 	t=type;
 	checksym(COLON);
+	conv->cond2_();
 	e3=rvalue(expr2());
+	conv->cond_end_();
 	if(car(e1)==CONST) {
 	    if(cadr(e1)) {
 		type=t;return e2;
@@ -1624,6 +1702,7 @@
 
     e=expr4();
     while(sym==LOR) {	
+	    conv->op_(sym);
 	    e=rvalue(e);
 	    getsym();
 	    e=list3(LOR,e,rvalue(expr4()));
@@ -1639,6 +1718,7 @@
 
     e=expr5();
     while(sym==LAND) {	
+	conv->op_(sym);
 	e=rvalue(e);
 	getsym();
 	e=list3(LAND,e,rvalue(expr5()));
@@ -1654,6 +1734,7 @@
 
     e1=expr6();
     while(sym==BOR) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1670,6 +1751,7 @@
 
     e1=expr7();
     while(sym==EOR) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1686,6 +1768,7 @@
 
     e1=expr8();
     while(sym==BAND) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1702,6 +1785,7 @@
 
     e=expr9();
     while((op=sym)==EQ||op==NEQ) {	
+	conv->op_(sym);
 	e=rvalue(e);
 	getsym();
 	e=list3(op,e,rvalue(expr9()));
@@ -1717,6 +1801,7 @@
 
     e1=expr10();
     while((op=sym)==GT||op==GE||op==LT||op==LE) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1737,6 +1822,7 @@
 
     e1=expr11();
     while((op=sym)==RSHIFT||op==LSHIFT) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1753,6 +1839,7 @@
 
     e1=expr12();
     while((op=sym)==ADD||op==SUB) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1769,6 +1856,7 @@
 
     e1=expr13();
     while((op=sym)==MUL||op==DIV||op==MOD) {	
+	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
 	getsym();
@@ -1783,8 +1871,9 @@
 {
     int e,op;
 
+    conv->prefix_(sym);
     switch (op = sym) {
-	case INC: case DEC:
+    case INC: case DEC:
 	getsym();
 	lcheck(e=expr13());
 	if(type==CHAR) {	
@@ -1860,6 +1949,7 @@
 	return e;
     }
     e=expr14();
+    conv->postfix_(sym);
     if((op=sym)==INC||op==DEC) {	
 	lcheck(e);
 	getsym();
@@ -1882,6 +1972,7 @@
 {
     int e1,t;
 
+    conv->id_(sym,nptr);
     switch(sym) {
     case IDENT:
 	switch(nptr->sc) {
@@ -1955,14 +2046,17 @@
 	getsym();
 	break;
     case LPAR:
+	conv->lpar_();
 	if(typeid(getsym())) {	
 	    t=typename();
 	    checksym(RPAR);
 	    e1=expr13();
 	    type=t;
+	    conv->rpar_();
 	    return e1;
 	}
 	e1=expr0();
+	conv->rpar_();
 	checksym(RPAR);
 	break;
     default:error(EXERR);
@@ -1977,17 +2071,22 @@
 
     while(1) {
 	if(sym==LBRA) {	
+	    conv->lbra_(sym);
 	    e1=rvalue(e1);
 	    t=type;
 	    getsym();
 	    e2=rvalue(expr0());
 	    checksym(RBRA);
+	    conv->rbra_(sym);
 	    e1=binop(ADD,e1,e2,t,type);
 	    e1=indop(e1);
-	} else if(sym==LPAR) e1=expr15(e1);
-	else if(sym==PERIOD) e1=strop(e1);
-	else if(sym==ARROW) e1=strop(indop(rvalue(e1)));
-	else break;
+	} else if(sym==LPAR) { conv->function_(); e1=expr15(e1); }
+	else {
+	    conv->op_(sym);
+	    if(sym==PERIOD) e1=strop(e1);
+	    else if(sym==ARROW) e1=strop(indop(rvalue(e1)));
+	    else break;
+	}
     }
     if(car(e1)==FNAME) type=list2(POINTER,type);
     return e1;
@@ -2238,6 +2337,7 @@
     t=type;
     if(integral(t)|| ((car(t)!=FUNCTION)&&(car(t)!=CODE)))
 	error(TYERR);
+    conv->funcall_(type);
     getsym();
     arglist=0;
     while(sym!=RPAR) {	
@@ -2247,6 +2347,7 @@
 	getsym();
     }
     checksym(RPAR);
+    conv->funcall_args_();
     if(car(t)==CODE) 
 	return list3(FUNCTION,e1,arglist);
     type=cadr(t);
@@ -2523,15 +2624,20 @@
 	} else
 	    return sym=PERIOD;
     case '/':
-	if(ch!='*') return postequ(DIV,DIV+AS);
 	if(ch=='/') {
-	    while(ch!='\n') getch();
+	    in_comment = 1;
+	    conv->comment_('/'); conv->comment_('/'); 
+	    while(ch!='\n') { getch(); conv->comment_(ch); }
+	    in_comment = 0;
 	    getch();
 	    return getsym();
 	}
+	if(ch!='*') return postequ(DIV,DIV+AS);
 	in_comment = 1;
-	getch();
-	while(ch=='*'?getch()!='/':getch());
+	conv->comment_('/'); conv->comment_('*'); 
+	do {
+	    c=ch; getch(); conv->comment_(ch);
+	} while(!(c=='*'&&ch=='/'));
 	in_comment = 0;
 	getch();
 	return getsym();
--- a/mc.h	Thu Feb 20 08:56:29 2003 +0900
+++ b/mc.h	Sat Feb 22 01:32:47 2003 +0900
@@ -234,16 +234,13 @@
 
 #define cadddr(e) (heap[((int)(e))+3])
 
-typedef struct converter {
-    void (*open)(char *);
-    void (*print)(char *);
-    void (*close)();
-} Converter;
-
+#include "conv/conv.h"
+#include "conv/c.h"
+/*
 #include "conv/c2cbc.h"
 #include "conv/cbc2c.h"
-#include "conv/c.h"
 #include "conv/null.h"
+ */
 
 extern Converter *conv;