changeset 179:fde8cb5d9254

*** empty log message ***
author kono
date Sun, 30 Nov 2003 06:41:38 +0900
parents 0f395aa93438
children f00e3bfa1b45
files Changes mc-parse.c
diffstat 2 files changed, 33 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Nov 30 04:30:27 2003 +0900
+++ b/Changes	Sun Nov 30 06:41:38 2003 +0900
@@ -3607,3 +3607,17 @@
 void    (*signal ()) (int);
 
 が動かなくなってます。
+
+Sun Nov 30 05:30:56 JST 2003
+
+ようやっと <stdlib.h> が通った。
+
+nkf.c が while() { int hoge;... } を使っているのは、変。
+なんで、こういうことするかなぁ。これをサポートするのは
+不可能ではないけど、いろいろ手直しがいる。
+
+なんか、少し早めに n->sc が定義されちゃって、変な
+ことが起きているみたいだね。
+
+stat の関数名とtag名が重なっているみたい。やっぱり
+tag名の名前空間をわけないとだめかぁ...
--- a/mc-parse.c	Sun Nov 30 04:30:27 2003 +0900
+++ b/mc-parse.c	Sun Nov 30 06:41:38 2003 +0900
@@ -92,6 +92,7 @@
 static int correct_type(int e,int t);
 static NMTBL *get_tag(NMTBL *n) ;
 static NMTBL *get_type(NMTBL *n) ;
+static NMTBL * get_non_tag(NMTBL *n) ;
 
 
 static int struct_return  = 0;
@@ -868,7 +869,7 @@
 	    return n;
 	}
     }
-    if (n->sc!=EMPTY &&  !(n->sc==EXTRN||n->sc==EXTRN1)) {
+    if (n->sc!=EMPTY &&  !(n->sc==EXTRN||n->sc==EXTRN1||n->sc==STATIC)) {
       if (mode==ADECL) {
 	if (n->sc==LVAR && n->ty==INT);
 	else if ( n->sc==REGISTER && n->ty==INT);
@@ -877,8 +878,8 @@
 //	if (n->sc==FIELD && n->dsp==disp);
 //	else error(DCERR);
       } else if (mode==GUDECL||mode==LUDECL) {
-	if (n->sc==FIELD && n->dsp==0);
- 	else error(DCERR);
+//	if (n->sc==FIELD && n->dsp==0);
+// 	else error(DCERR);
       } else if (mode==GTDECL && n->sc==TAG) {
 	n = gnptr = get_type(n);
       } else if (mode==LTDECL && n->sc==TAG) {
@@ -1046,6 +1047,11 @@
     mode_save = mode;
     mode=STAT;
     getsym();
+    if (sym==RC) {  /* premature end */
+	conv->decl_data_end_();
+	mode = mode_save;
+	return offset;
+    }
     if (scalar(t)) {
  	e=expr1();
 	mode = mode_save;
@@ -1078,7 +1084,7 @@
 		    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?           */
+		    } else if (0 && caddr(t)!=i+1) {  /* size match?           */
 			error(TYERR);
 		    }
 		    getsym();
@@ -1112,7 +1118,7 @@
 		t1 = cadr(t1);
 		if ( t1 && sym==COMMA) { conv->comma_(); continue; }
 		if (!t1 && sym==COMMA) getsym(); /* extra comma */
-		if (!t1 && sym!=RC) error(DCERR);
+		if (sym==RC) break; // premature end
 	    }
 	    conv->decl_data_end_(); conv->rc_();
 	    getsym();
@@ -2449,6 +2455,7 @@
     switch(sym) {
     case IDENT:
 	conv->id_(sym,nptr);
+	nptr = get_non_tag(nptr);
 	switch(nptr->sc) {
 	case EXTRN: case EXTRN1: 
 	    extrn_use(nptr);
@@ -3430,6 +3437,13 @@
     return other_sym(n);
 }
 
+static NMTBL *
+get_non_tag(NMTBL *n) 
+{
+    if (n->sc != TAG) return n;
+    return other_sym(n);
+}
+
 static int
 postequ(int s1, int s2)
 {