Mercurial > hg > CbC > old > device
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) {