|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79: extern struct _iobuf {
80: int _cnt;
81: unsigned char *_ptr;
82: unsigned char *_base;
83: short _flag;
84: char _file;
85: } _iob[120];
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112: struct _iobuf *fopen();
113: struct _iobuf *fdopen();
114: struct _iobuf *freopen();
115: struct _iobuf *popen();
116: long ftell();
117: char *fgets();
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432: char *hash();
433: char *savestr();
434: char *tstr();
435: extern int tstrused;
436: extern char *tstrbuf[];
437: extern char **curtstr;
438:
439:
440:
441:
442:
443:
444: extern int nerrors;
445:
446: typedef union ndu NODE;
447: typedef unsigned int TWORD;
448: typedef long CONSZ;
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460: extern int dope[];
461: extern char *opst[];
462:
463:
464:
465:
466:
467: union ndu {
468:
469: struct {
470: int op;
471: int goal;
472: TWORD type;
473: int cst[(6+4)];
474: char * name;
475: char pad[8-sizeof(char *)];
476: NODE *left;
477: NODE *right;
478: }in;
479: struct {
480: int op;
481: int goal;
482: TWORD type;
483: int cst[(6+4)];
484: char * name;
485: char pad[8-sizeof(char *)];
486: NODE *left;
487: NODE *right;
488: int lineno;
489: }ln;
490:
491: struct {
492: int op;
493: int goal;
494: TWORD type;
495: int cst[(6+4)];
496: char * name;
497: char pad[8-sizeof(char *)];
498: CONSZ lval;
499: int rval;
500: }tn;
501:
502: struct {
503: int op;
504: int goal;
505: TWORD type;
506: int cst[(6+4)];
507: int label;
508: int lop;
509: }bn;
510:
511: struct {
512: int op;
513: int goal;
514: TWORD type;
515: int cst[(6+4)];
516: int stsize;
517: short stalign;
518: short argsize;
519: }stn;
520:
521: struct {
522: int op;
523: int goal;
524: TWORD type;
525: int cdim;
526: int csiz;
527: }fn;
528:
529: struct {
530:
531:
532: int op;
533: int goal;
534: TWORD type;
535: int cdim;
536: int csiz;
537: double dval;
538: }fpn;
539:
540: };
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566: extern char *scnames();
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586: typedef long OFFSZ;
587:
588: struct symtab {
589: char *sname;
590: TWORD stype;
591:
592: char sclass;
593: char slevel;
594: char sflags;
595: int offset;
596: short dimoff;
597: short sizoff;
598: short suse;
599: struct symtab *scopelink;
600: };
601:
602:
603: struct sw {
604: CONSZ sval;
605: int slab;
606: };
607:
608: extern struct sw swtab[];
609: extern struct sw *swp;
610: extern int swx;
611:
612: extern int ftnno;
613: extern int blevel;
614: extern int instruct, stwart;
615:
616: extern int lineno, slineno, nerrors;
617: typedef struct {
618: union {
619: int u_intval;
620: NODE *u_nodep;
621: } YY_un;
622: int lineno;
623: } YYSTYPE;
624:
625:
626: extern YYSTYPE yylval;
627:
628: extern CONSZ lastcon;
629: extern CONSZ ccast();
630: extern double dcon;
631:
632: extern char ftitle[];
633: extern struct symtab stab[];
634: extern int curftn;
635: extern int strftn;
636: extern char *locnames[];
637: extern int curloc;
638: extern int curclass;
639: extern int curdim;
640: extern int *dimtab;
641: extern int paramstk[];
642: extern int paramno;
643: extern int argstk[];
644: extern int argsoff[];
645: extern TWORD argty[];
646: extern int argno;
647: extern int autooff, argoff, strucoff;
648: extern int regvar;
649: extern int nextrvar;
650: extern int brkflag;
651: extern char yytext[];
652:
653: extern int strflg;
654:
655: extern OFFSZ inoff;
656:
657: extern int reached;
658:
659:
660:
661: extern int idname;
662:
663: extern NODE node[];
664: extern NODE *lastfree;
665:
666: extern int cflag, hflag, pflag;
667:
668:
669: extern int brklab;
670: extern int contlab;
671:
672: extern int flostat;
673: extern int retlab;
674: extern int retstat;
675: extern int asavbc[], *psavbc;
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717: extern NODE
718: *aadjust(),
719: *bcon(),
720: *bdty(),
721: *block(),
722: *bpsize(),
723: *buildtree(),
724:
725: *clocal(),
726: *conval(),
727: *convert(),
728: *dclstruct(),
729: *doszof(),
730: *getstr(),
731: *makety(),
732: *mkty(),
733: *oconvert(),
734: *offcon(),
735: *optim(),
736: *pconvert(),
737: *ptmatch(),
738: *pvconvert(),
739: *rstruct(),
740: *sconvert(),
741: *strargs(),
742: *stref(),
743: *talloc(),
744: *tymatch(),
745: *tymerge(),
746: *unconvert(),
747: *xicolon();
748:
749: OFFSZ tsize(),
750: psize();
751:
752: TWORD types(),
753: ctype();
754:
755: char *exname(), *exdcon();
756:
757:
758:
759:
760:
761:
762:
763:
764: unsigned int maxoffset;
765:
766: struct instk
767: {
768: int in_sz;
769: int in_x;
770: int in_n;
771: int in_s;
772: int in_d;
773: TWORD in_t;
774: int in_id;
775: int in_fl;
776: OFFSZ in_off;
777: }instack[10],*pstk;
778:
779: struct symtab *relook();
780:
781: int ddebug = 0;
782:
783: struct symtab * mknonuniq();
784:
785: defid( q, class )
786: register NODE *q;
787: {
788: register struct symtab *p;
789: extern struct symtab *scopestack[];
790: int idp;
791: register TWORD type;
792: register TWORD stp;
793: register scl;
794: register dsym, ddef;
795: register slev, temp;
796:
797: if( q == (NODE *)0 ) return;
798: if( q < node || q >= &node[1500] ) cerror( "defid call" );
799: idp = q->tn.rval;
800: if( idp < 0 ) cerror( "tyreduce" );
801: p = &stab[idp];
802:
803: if( ddebug )
804: {
805: printf( "defid( %s (%d), ", p->sname, idp );
806: tprint( q->in.type );
807: printf( ", %s, (%d,%d) ), level %d\n", scnames(class),
808: q->fn.cdim, q->fn.csiz, blevel );
809: }
810:
811: fixtype( q, class );
812: type = q->in.type;
813: class = fixclass( class, type );
814: stp = p->stype;
815: slev = p->slevel;
816:
817: if( ddebug )
818: {
819: printf( " modified to " );
820: tprint( type );
821: printf( ", %s\n", scnames(class) );
822: printf( " previous def'n: " );
823: tprint( stp );
824: printf( ", %s, (%d,%d) ), level %d\n", scnames(p->sclass),
825: p->dimoff, p->sizoff, slev );
826: }
827:
828: if( stp == 0100 && p->sclass == 0 )goto enter;
829:
830:
831: if( stp == 17|| stp == 1 )
832: {
833: if( blevel==1 && stp!=1 ) switch( class )
834: {
835: default:
836: if(!(class&0100))
837: uerror("declared argument %s is missing", p->sname);
838: case 8:
839: case 10:
840: case 11:
841: case 12:
842: case 16:
843: case 15:
844: case 13:
845: ;
846: }
847: goto enter;
848: }
849: if( type != stp ) goto mismatch;
850:
851: dsym = p->dimoff;
852: ddef = q->fn.cdim;
853: for( temp=type; temp&(03<<5); temp = (((temp>>2)&~037)|(temp&037)) )
854: {
855: if( ((temp&(03<<5))==0140) )
856: {
857: if( dimtab[dsym] == 0 ) dimtab[dsym] = dimtab[ddef];
858: else if( dimtab[ddef]!=0 && dimtab[dsym] != dimtab[ddef] )
859: {
860: goto mismatch;
861: }
862: ++dsym;
863: ++ddef;
864: }
865: }
866:
867: if( (temp==8||temp==9||temp==10) && p->sizoff != q->fn.csiz
868: && class!=10 && class!=12 && class!=15 )
869: {
870: goto mismatch;
871: }
872: scl = ( p->sclass );
873:
874: if( ddebug )
875: {
876: printf( " previous class: %s\n", scnames(scl) );
877: }
878:
879: if( class&0100 )
880: {
881:
882: if( !falloc( p, class&077, 1, (NODE *)0 ) )
883: {
884:
885: psave( idp );
886: return;
887: }
888:
889: }
890: else switch( class )
891: {
892: case 2:
893: switch( scl )
894: {
895: case 3:
896: case 18:
897: if( slev==0 ) return;
898: break;
899: case 5:
900: case 2:
901: case 14:
902: case 17:
903: return;
904: }
905: break;
906: case 3:
907: if( scl==18 || (scl==2 && blevel==0) )
908: {
909: p->sclass = 3;
910: if( ((type&(03<<5))==0100) ) curftn = idp;
911: return;
912: }
913: break;
914: case 18:
915: if( scl==3 || scl==18 ) return;
916: break;
917: case 6:
918: if( scl == 7 )
919: {
920: p->sclass = 6;
921: deflab( p->offset );
922: return;
923: }
924: break;
925: case 13:
926: if( scl == class ) return;
927: break;
928: case 17:
929: if( scl == 17 || scl == 14 ) return;
930: break;
931: case 14:
932: if( scl == 17 )
933: {
934: p->sclass = 14;
935: if( ((type&(03<<5))==0100) ) curftn = idp;
936: return;
937: }
938: break;
939: case 11:
940: case 8:
941: if( scl == class )
942: {
943: if( oalloc( p, &strucoff ) ) break;
944: if( class == 11 ) strucoff = 0;
945: psave( idp );
946: return;
947: }
948: break;
949: case 16:
950: if( scl == class )
951: {
952: if( p->offset!= strucoff++ ) break;
953: psave( idp );
954: }
955: break;
956: case 5:
957: if( scl == 2 )
958: {
959: p->sclass = 5;
960: if( ((type&(03<<5))==0100) ) curftn = idp;
961: return;
962: }
963: break;
964: case 10:
965: case 12:
966: case 15:
967: if( scl != class ) break;
968: if( dimtab[p->sizoff] == 0 )
969: return;
970: break;
971: case 7:
972: if( scl == 6 || scl == 7 ) return;
973: case 9:
974: case 1:
975: case 4:
976: ;
977: }
978: mismatch:
979:
980: if( class==11 || class==8 || class & 0100 )
981: {
982:
983: register * memp;
984: p->sflags |= 040;
985:
986: for( memp = ¶mstk[paramno-1];
987: *memp>=0 && stab[*memp].sclass != 10
988: && stab[*memp].sclass != 12;
989: --memp)
990: {
991: if( stab[*memp].sflags & 040 )
992: { int i;
993: if ( p->sname != stab[*memp].sname )
994: continue;
995: i = stab[*memp].suse;
996: if(i < 0)
997: i = -i;
998: uerror("redeclaration of: %s from line %d",
999: p->sname, i);
1000: break;
1001: }
1002: }
1003: p = mknonuniq( &idp );
1004: goto enter;
1005: }
1006: if( blevel > slev && class != 2 && class != 14 &&
1007: class != 17 && !( class == 6 && slev >= 2 ) )
1008: {
1009: q->tn.rval = idp = hide( p );
1010: p = &stab[idp];
1011: goto enter;
1012: }
1013: uerror( "redeclaration of %s from some line %d", p->sname, p->suse);
1014: if( class==5 && ((type&(03<<5))==0100) ) curftn = idp;
1015: return;
1016: enter:
1017:
1018: if( ddebug ) printf( " new entry made\n" );
1019:
1020: if( type == 17 ) uerror("void type for %s",p->sname);
1021: p->stype = type;
1022: p->sclass = class;
1023: p->slevel = (class == 6 || class == 7) ? 2 : blevel;
1024: p->offset = (-10201);
1025: p->suse = lineno;
1026: if( class == 10 || class == 12 || class == 15 )
1027: {
1028: p->sizoff = curdim;
1029: dstash( 0 );
1030: dstash( -1 );
1031: dstash( 8 );
1032: dstash( idp );
1033: }
1034: else
1035: {
1036: switch( (type&037) )
1037: {
1038: case 8:
1039: case 9:
1040: case 10:
1041: p->sizoff = q->fn.csiz;
1042: break;
1043: default:
1044: p->sizoff = (type&037);
1045: }
1046: }
1047:
1048: p->dimoff = q->fn.cdim;
1049:
1050: if( class&0100 )
1051: {
1052: falloc( p, class&077, 0, (NODE *)0 );
1053: psave( idp );
1054: }
1055: else switch( class )
1056: {
1057: case 1:
1058: oalloc( p, &autooff );
1059: break;
1060: case 3:
1061: case 5:
1062: p->offset = getlab();
1063: if( ((type&(03<<5))==0100) ) curftn = idp;
1064: break;
1065: case 7:
1066: case 6:
1067: p->offset = getlab();
1068: if( class == 6 )
1069: {
1070: locctr( 0 );
1071: deflab( p->offset );
1072: }
1073: break;
1074: case 2:
1075: case 17:
1076: case 14:
1077: p->offset = getlab();
1078: break;
1079: case 11:
1080: case 8:
1081: oalloc( p, &strucoff );
1082: if( class == 11 ) strucoff = 0;
1083: psave( idp );
1084: break;
1085: case 16:
1086: p->offset = strucoff++;
1087: psave( idp );
1088: break;
1089: case 4:
1090:
1091: p->offset = nextrvar;
1092: if( blevel == 1 ) p->sflags |= 010;
1093: break;
1094: }
1095:
1096:
1097:
1098: if (blevel >= 100)
1099: {
1100: cerror("too many nesting levels (%d>=%d)", blevel, 100);
1101:
1102: }
1103: p->scopelink = scopestack[slev = p->slevel];
1104: scopestack[slev] = p;
1105:
1106:
1107:
1108: switch( class )
1109: {
1110: case 7:
1111: case 6:
1112: p->slevel = 2;
1113: break;
1114: case 2:
1115: case 17:
1116: case 14:
1117: p->slevel = 0;
1118: break;
1119: }
1120:
1121: if( ddebug )
1122: printf( " dimoff, sizoff, offset: %d, %d, %d\n",
1123: p->dimoff, p->sizoff, p->offset );
1124:
1125: }
1126:
1127: asave( i )
1128: {
1129: if( argno >= 50 )
1130: {
1131: cerror( "too many arguments (%d>=%d)", argno, 50);
1132: }
1133: argstk[ argno++ ] = i;
1134: }
1135:
1136: psave( i )
1137: {
1138: if( paramno >= 650 )
1139: {
1140: cerror( "parameter stack overflow (%d>=%d)", paramno, 650);
1141: }
1142: paramstk[ paramno++ ] = i;
1143: }
1144:
1145:
1146: int maxarg;
1147:
1148: ftnend()
1149: {
1150:
1151: if( retlab != (-1) )
1152: {
1153:
1154:
1155: efcode();
1156:
1157: p2bend();
1158:
1159: }
1160: ;
1161: retstat = 0;
1162: tcheck();
1163: curclass = 0;
1164: brklab = contlab = retlab = (-1);
1165: flostat = 0;
1166: strftn = 0;
1167: argno = 0;
1168: if( nerrors == 0 )
1169: {
1170: if( psavbc != & asavbc[0] ) cerror("bcsave error");
1171: if( paramno != 0 ) cerror("parameter reset error");
1172: if( swx != 0 ) cerror( "switch error");
1173: }
1174: psavbc = &asavbc[0];
1175: paramno = 0;
1176: autooff = 0;
1177: maxarg = 0;
1178: reached = 1;
1179: swx = 0;
1180: swp = swtab;
1181: locctr(2);
1182: }
1183:
1184: dclargs()
1185: {
1186: register i, j;
1187: register struct symtab *p;
1188: register NODE *q;
1189: register TWORD temp;
1190: extern TWORD simpstr();
1191:
1192: argoff = 32;
1193:
1194:
1195: if( ddebug > 2) printf("dclargs()\n");
1196:
1197: for( i=0; i<argno; ++i )
1198: {
1199: if( (j = argstk[i]) < 0 ) continue;
1200: p = &stab[j];
1201:
1202: if( ddebug > 2 )
1203: {
1204: printf("\t%s (%d) ",p->sname, j);
1205: tprint(p->stype);
1206: printf("\n");
1207: }
1208:
1209: if( p->stype == 1 )
1210: {
1211: q = block(97,(NODE *)0,(NODE *)0,4,0,4);
1212: q->tn.rval = j;
1213: defid( q, 9 );
1214: }
1215: if( p->sclass == 4 )
1216: {
1217:
1218: int tmp = p->offset;
1219: p->offset = (-10201);
1220: p->sclass = 9;
1221: oalloc( p, &argoff );
1222: argsoff[i] = p->offset;
1223: argty[i] = p->stype;
1224: p->sclass = 4;
1225: p->offset = tmp;
1226: }
1227: else
1228: {
1229: oalloc( p, &argoff );
1230: argsoff[i] = p->offset;
1231: argty[i] = p->stype;
1232: }
1233: }
1234: autooff = 0;
1235:
1236: locctr(0);
1237: defalign(32);
1238: ++ftnno;
1239: p = &stab[curftn];
1240:
1241: if( p->slevel>1 && p->sclass == 3 ) deflab( p->offset );
1242: else defnam( p );
1243: temp = p->stype;
1244: temp = ((( temp >>2)&~037)|( temp &037));
1245:
1246:
1247:
1248: strftn = (temp==8) || (temp==9);
1249: if( strftn && simpstr( p->dimoff, p->sizoff ) != 8 )
1250: strftn = 0;
1251:
1252: bfcode(argstk, argno, p->sname);
1253:
1254: regargs();
1255:
1256:
1257: if( strftn )
1258: {
1259:
1260:
1261:
1262: i = tsize( temp, p->dimoff, p->sizoff);
1263:
1264: sretname(i);
1265:
1266:
1267:
1268: }
1269: }
1270:
1271:
1272: regargs()
1273: {
1274: register i;
1275: register NODE *p, *q;
1276: register struct symtab *s;
1277:
1278: for( i=0; i<argno; ++i )
1279: {
1280: s = &stab[argstk[i]];
1281: if( s->sclass == 4 )
1282: {
1283: int temp;
1284: idname = argstk[i];
1285: p = buildtree( 2, (NODE *)0, (NODE *)0 );
1286: temp = s->offset;
1287: s->offset = argsoff[i];
1288: s->sclass = 9;
1289: q = buildtree( 2, (NODE *)0, (NODE *)0 );
1290: p = buildtree( 58, p, q );
1291: ecomp( p );
1292: s->offset = temp;
1293: s->sclass = 4;
1294: }
1295: }
1296: }
1297:
1298:
1299: NODE *
1300: rstruct( idn, soru )
1301: register idn,soru;
1302: {
1303:
1304: register struct symtab *p;
1305: register NODE *q;
1306: p = &stab[idn];
1307: switch( p->stype )
1308: {
1309: case 17:
1310: def:
1311: q = block( 97, (NODE *)0, (NODE *)0, 0, 0, 0 );
1312: q->tn.rval = idn;
1313: q->in.type = (soru&02) ? 8 : ( (soru&04) ? 9 : 10 );
1314: defid( q, (soru&02) ? 10 : ( (soru&04) ? 12 : 15 ) );
1315: break;
1316: case 8:
1317: if( soru & 02 ) break;
1318: goto def;
1319: case 9:
1320: if( soru & 04 ) break;
1321: goto def;
1322: case 10:
1323: if( !(soru&(04|02)) ) break;
1324: goto def;
1325: }
1326: stwart = instruct;
1327: return( mkty( p->stype, 0, p->sizoff ) );
1328: }
1329:
1330: moedef( idn )
1331: register idn;
1332: {
1333: register NODE *q;
1334:
1335: q = block( 97, (NODE *)0, (NODE *)0, 11, 0, 0 );
1336: q->tn.rval = idn;
1337: if( idn>=0 ) defid( q, 16 );
1338: }
1339:
1340: extern char *hash(), *index(), *rindex();
1341: static int fakeprev, fakenum;
1342: static char fakestub[32], fakename[64];
1343:
1344: bstruct( idn, soru )
1345: register idn,soru;
1346: {
1347:
1348: register NODE *q;
1349:
1350: if (idn < 0) {
1351: char *p;
1352: if ((p = rindex(ftitle, '/')) == 0)
1353: p = ftitle;
1354: strcpy(fakestub, ++p);
1355: if (p = index(fakestub, '"'))
1356: *p = '\0';
1357: sprintf(fakename, "%s$%d.%d", fakestub, lineno, ++fakenum);
1358: idn = lookup(hash(fakename), 0100);
1359: }
1360: psave( instruct );
1361: psave( curclass );
1362: psave( strucoff );
1363: strucoff = 0;
1364: instruct = soru;
1365: q = block( 97, (NODE *)0, (NODE *)0, 0, 0, 0 );
1366: q->tn.rval = idn;
1367: if( instruct==02 )
1368: {
1369: curclass = 8;
1370: q->in.type = 8;
1371: defid( q, 10 );
1372: }
1373: else if( instruct == 04 )
1374: {
1375: curclass = 11;
1376: q->in.type = 9;
1377: defid( q, 12 );
1378: }
1379: else
1380: {
1381:
1382: curclass = 16;
1383: q->in.type = 10;
1384: defid( q, 15 );
1385: }
1386: psave( idn = q->tn.rval );
1387:
1388: if( idn >= 0 ) stab[idn].suse = lineno;
1389: return( paramno-4 );
1390: }
1391:
1392:
1393:
1394:
1395:
1396: NODE *
1397: dclstruct( oparam )
1398: register oparam;
1399: {
1400: register struct symtab *p;
1401: register i, al, sa, j, sz, szindex;
1402: register TWORD temp;
1403: register high, low;
1404:
1405:
1406:
1407:
1408:
1409:
1410:
1411:
1412:
1413:
1414:
1415:
1416: if( (i=paramstk[oparam+3]) < 0 )
1417: {
1418: szindex = curdim;
1419: dstash( 0 );
1420: dstash( -1 );
1421: dstash( 8 );
1422: dstash( -lineno );
1423: }
1424: else
1425: {
1426: szindex = stab[i].sizoff;
1427: }
1428:
1429:
1430:
1431: if( ddebug )
1432: {
1433: printf( "dclstruct( %szindex = %d\n",
1434: (i>=0)? stab[i].sname : "??", szindex );
1435: }
1436:
1437: temp = (instruct&02)?8:((instruct&04)?9:10);
1438: stwart = instruct = paramstk[ oparam ];
1439: curclass = paramstk[ oparam+1 ];
1440: dimtab[ szindex+1 ] = curdim;
1441: al = 8;
1442:
1443: high = low = 0;
1444:
1445: for( i = oparam+4; i< paramno; ++i )
1446: {
1447: dstash( j=paramstk[i] );
1448: if( j<0 || j>= 6000 ) cerror( "gummy structure member" );
1449: p = &stab[j];
1450: if( temp == 10 )
1451: {
1452: if( p->offset < low ) low = p->offset;
1453: if( p->offset > high ) high = p->offset;
1454: p->sizoff = szindex;
1455: continue;
1456: }
1457: sa = talign( p->stype, p->sizoff );
1458: if( p->sclass & 0100 )
1459: {
1460: sz = p->sclass&077;
1461: }
1462: else
1463: {
1464: sz = tsize( p->stype, p->dimoff, p->sizoff );
1465: }
1466: if( sz == 0 )
1467: {
1468: werror( "structure member has size 0: %s", p->sname );
1469: }
1470: if( sz > strucoff ) strucoff = sz;
1471: if( ( al)%( sa ) != 0 ) al = ( (( al)/( sa ) + 1) * ( sa ));
1472:
1473: }
1474: dstash( -1 );
1475: if( ( strucoff)%( al ) != 0 ) strucoff = ( (( strucoff)/( al ) + 1) * ( al ));
1476:
1477: if( temp == 10 )
1478: {
1479: register TWORD ty;
1480:
1481: ty = 4;
1482: strucoff = tsize( ty, 0, (int)ty );
1483: dimtab[ szindex+2 ] = al = talign( ty, (int)ty );
1484: }
1485:
1486: if( strucoff == 0 ) uerror( "zero sized structure" );
1487: dimtab[ szindex ] = strucoff;
1488: dimtab[ szindex+2 ] = al;
1489: dimtab[ szindex+3 ] = paramstk[ oparam+3 ];
1490:
1491:
1492:
1493:
1494: if( ddebug>1 )
1495: {
1496: printf( "\tdimtab[%d,%d,%d,%d] = %d,%d,%d,%d\n",
1497: szindex,szindex+1,szindex+2,szindex+3,
1498: dimtab[szindex],dimtab[szindex+1],dimtab[szindex+2],
1499: dimtab[szindex+3] );
1500: for( i = dimtab[szindex+1]; dimtab[i] >= 0; ++i )
1501: {
1502: printf( "\tmember %s(%d)\n", stab[dimtab[i]].sname, dimtab[i] );
1503: }
1504: }
1505:
1506:
1507: strucoff = paramstk[ oparam+2 ];
1508: paramno = oparam;
1509:
1510: return( mkty( temp, 0, szindex ) );
1511: }
1512:
1513:
1514: yyerror( s, a, b, c, d, e, f, g ) char *s;
1515:
1516: {
1517:
1518: uerror( s, a, b, c, d, e, f, g );
1519:
1520: }
1521:
1522: yyaccpt()
1523: {
1524: ftnend();
1525: }
1526:
1527: ftnarg( idn )
1528: register idn;
1529: {
1530: register struct symtab *p;
1531: p = &stab[idn];
1532: switch( p->stype )
1533: {
1534:
1535: case 17:
1536:
1537: break;
1538: case 1:
1539: uerror("redeclaration of formal parameter, %s",p->sname);
1540:
1541: case 0100:
1542:
1543:
1544: default:
1545: idn = hide(p);
1546: p = &stab[idn];
1547: break;
1548: case 0:
1549:
1550: ;
1551: }
1552: p->stype = 1;
1553: p->sclass = 9;
1554: asave( idn );
1555: }
1556:
1557: talign( ty, s)
1558: register unsigned ty;
1559: register s;
1560: {
1561:
1562:
1563: register i;
1564:
1565:
1566: for( i=0; i<=(32-5-1); i+=2 )
1567: {
1568: switch( (ty>>i)&(03<<5) )
1569: {
1570:
1571: case 0100:
1572: cerror( "compiler takes alignment of function");
1573: case 040:
1574: return( 32 );
1575: case 0140:
1576: continue;
1577: case 0:
1578: break;
1579: }
1580: }
1581:
1582: switch( (ty&037) )
1583: {
1584:
1585: case 9:
1586: case 10:
1587: case 8:
1588: return( dimtab[ s+2 ] );
1589: case 2:
1590: case 12:
1591: return( 8 );
1592: case 6:
1593: return( 32 );
1594: case 7:
1595: return( 32 );
1596: case 5:
1597: case 15:
1598: return( 32 );
1599: case 3:
1600: case 13:
1601: return( 16 );
1602: default:
1603: return( 32 );
1604: }
1605: }
1606:
1607: OFFSZ
1608: tsize( ty, d, s )
1609: register TWORD ty;
1610: {
1611:
1612:
1613:
1614:
1615:
1616: register i;
1617: register OFFSZ mult;
1618:
1619: mult = 1;
1620:
1621: for( i=0; i<=(32-5-1); i+=2 )
1622: {
1623: switch( (ty>>i)&(03<<5) )
1624: {
1625:
1626: case 0100:
1627: uerror("illegal use of function pointer");
1628: case 040:
1629: return( 32 * mult );
1630: case 0140:
1631: mult *= dimtab[ d++ ];
1632: continue;
1633: case 0:
1634: break;
1635:
1636: }
1637: }
1638: if(ty == 10)
1639: return(32);
1640: if(ty == 16)
1641: uerror("using a void value");
1642: if( dimtab[s]==0 ) {
1643: uerror( "unknown size");
1644: return( 32 );
1645: }
1646: return( dimtab[ s ] * mult );
1647: }
1648:
1649: inforce( n )
1650: register OFFSZ n;
1651: {
1652:
1653:
1654: register OFFSZ wb;
1655: register rest;
1656:
1657:
1658: if( inoff == n ) return;
1659: if( inoff > n )
1660: {
1661: uerror("too many initializers (%d>%d)", inoff, n);
1662: inoff = n;
1663: return;
1664: }
1665:
1666: wb = inoff;
1667: if( ( wb)%( 32 ) != 0 ) wb = ( (( wb)/( 32 ) + 1) * ( 32 ));
1668:
1669:
1670: if( wb >= n )
1671: {
1672:
1673: rest = n - inoff;
1674: vfdzero( rest );
1675: return;
1676: }
1677:
1678:
1679:
1680: rest = wb - inoff;
1681: vfdzero( rest );
1682:
1683:
1684:
1685: rest = (n-inoff)/32;
1686: zecode( rest );
1687:
1688:
1689:
1690: rest = n-inoff;
1691: vfdzero( rest );
1692: if( inoff != n ) cerror( "inoff error");
1693:
1694: }
1695:
1696: vfdalign( n )
1697: {
1698:
1699: register OFFSZ m;
1700:
1701: m = inoff;
1702: if( ( m)%( n ) != 0 ) m = ( (( m)/( n ) + 1) * ( n ));
1703: inforce( m );
1704: }
1705:
1706:
1707:
1708: extern int idebug;
1709:
1710:
1711: int ibseen = 0;
1712:
1713: int iclass;
1714:
1715: int ilocctr = 0;
1716:
1717: beginit(curid)
1718: {
1719:
1720: register struct symtab *p;
1721:
1722:
1723: if( idebug >= 3 ) printf( "beginit(), curid = %d\n", curid );
1724:
1725:
1726: p = &stab[curid];
1727:
1728: iclass = p->sclass;
1729: if( curclass == 2 || curclass == 14 ) iclass = 2;
1730: switch( iclass )
1731: {
1732:
1733: case 12:
1734: case 2:
1735: return;
1736: case 1:
1737: case 4:
1738: break;
1739: case 5:
1740: case 3:
1741: ilocctr = ((p->stype&(03<<5))==0140)?1:2;
1742: locctr( ilocctr );
1743: defalign( talign( p->stype, p->sizoff ) );
1744: if( p->slevel>1 && p->sclass == 3 ) deflab( p->offset );
1745: else defnam( p );
1746:
1747: }
1748:
1749: inoff = 0;
1750: ibseen = 0;
1751:
1752: pstk = 0;
1753:
1754: instk( curid, p->stype, p->dimoff, p->sizoff, inoff );
1755:
1756: }
1757:
1758: instk( id, t, d, s, off )
1759: register OFFSZ off;
1760: register TWORD t;
1761:
1762: {
1763:
1764:
1765: register struct symtab *p;
1766:
1767: for(;;)
1768: {
1769:
1770: if( idebug ) printf( "instk((%d, %o,%d,%d, %d)\n", id, t, d, s, off );
1771:
1772:
1773:
1774:
1775: if( !pstk ) pstk = instack;
1776: else ++pstk;
1777:
1778: pstk->in_fl = 0;
1779: pstk->in_id = id ;
1780: pstk->in_t = t ;
1781: pstk->in_d = d ;
1782: pstk->in_s = s ;
1783: pstk->in_n = 0;
1784: pstk->in_x = t==8 ?dimtab[s+1] : 0 ;
1785: pstk->in_off = off;
1786:
1787:
1788: if( ((t&(03<<5))==0140) )
1789: {
1790: pstk->in_sz = tsize( (((t>>2)&~037)|(t&037)), d+1, s );
1791: }
1792: else if( stab[id].sclass & 0100 )
1793: {
1794: pstk->in_sz = - ( stab[id].sclass & 077 );
1795: }
1796: else
1797: {
1798: pstk->in_sz = 0;
1799: }
1800:
1801: if( (iclass==1 || iclass == 4 ) &&
1802: (((t&(03<<5))==0140) || t==8) )
1803: uerror( "no automatic aggregate initialization" );
1804:
1805:
1806:
1807: if( ((t&(03<<5))==0140) )
1808: {
1809: t = (((t>>2)&~037)|(t&037));
1810: ++d;
1811: continue;
1812: }
1813: else if( t == 8 )
1814: {
1815: id = dimtab[pstk->in_x];
1816: p = &stab[id];
1817: if( p->sclass != 8 && !(p->sclass&0100) )
1818: cerror( "insane structure member list" );
1819: t = p->stype;
1820: d = p->dimoff;
1821: s = p->sizoff;
1822: off += p->offset;
1823: continue;
1824: }
1825: else return;
1826: }
1827: }
1828:
1829: NODE *
1830: getstr()
1831: {
1832:
1833:
1834: register l, temp;
1835: register NODE *p;
1836:
1837: if( (iclass==5||iclass==3) &&
1838: (pstk->in_t == 2 || pstk->in_t == 12) &&
1839: pstk!=instack && (( pstk[-1].in_t &(03<<5))==0140) )
1840: {
1841:
1842: strflg = 1;
1843: ilbrace();
1844: inforce( pstk->in_off );
1845:
1846:
1847:
1848:
1849:
1850:
1851: lxstr((pstk-1)!=instack?dimtab[(pstk-1)->in_d]:0);
1852: irbrace();
1853: return( (NODE *)0 );
1854: }
1855: else
1856: {
1857:
1858: if( iclass != 0 )
1859: {
1860:
1861:
1862: vfdalign( 32 );
1863: }
1864:
1865: temp = locctr( blevel==0?3:4 );
1866: deflab( l = getlab() );
1867: strflg = 0;
1868: lxstr(0);
1869: locctr( blevel==0?ilocctr:temp );
1870: p = buildtree( 3, (NODE *)0, (NODE *)0 );
1871: p->tn.rval = -l;
1872: return(p);
1873: }
1874: }
1875:
1876: putbyte( v )
1877: {
1878:
1879: register NODE *p;
1880: p = bcon(v);
1881: incode( p, 8 );
1882: tfree( p );
1883: gotscal();
1884: }
1885:
1886: endinit()
1887: {
1888: register TWORD t;
1889: register d, s, n, d1;
1890:
1891:
1892: if( idebug ) printf( "endinit(), inoff = %d\n", inoff );
1893:
1894:
1895: switch( iclass )
1896: {
1897:
1898: case 2:
1899: case 1:
1900: case 4:
1901: iclass = 0;
1902: return;
1903: }
1904:
1905: pstk = instack;
1906:
1907: t = pstk->in_t;
1908: d = pstk->in_d;
1909: s = pstk->in_s;
1910: n = pstk->in_n;
1911:
1912: if( ((t&(03<<5))==0140) )
1913: {
1914: d1 = dimtab[d];
1915:
1916:
1917: vfdalign( pstk->in_sz );
1918:
1919: n = inoff/pstk->in_sz;
1920: if( d1 >= n )
1921: {
1922:
1923: inforce( tsize( t, d, s ) );
1924: n = d1;
1925: }
1926: if( d1!=0 && d1!=n ) uerror( "too many initializers (%d>%d)",
1927: n, d1);
1928: if( n==0 ) werror( "empty array declaration");
1929: dimtab[d] = n;
1930: }
1931:
1932: else if( t == 8 || t == 9 )
1933: {
1934:
1935: inforce( tsize( t, d, s ) );
1936: }
1937: else if( n > 1 ) uerror("%d initializers for a scalar", n);
1938:
1939: else inforce( tsize(t,d,s) );
1940:
1941: paramno = 0;
1942: vfdalign( 32 );
1943: inoff = 0;
1944: iclass = 0;
1945:
1946: }
1947:
1948: doinit( p )
1949: register NODE *p;
1950:
1951: {
1952:
1953:
1954:
1955:
1956:
1957:
1958: register sz, d, s;
1959: register TWORD t;
1960:
1961:
1962:
1963: if(nerrors)
1964: goto leave;
1965: if( iclass < 0 ) goto leave;
1966: if( iclass == 2 || iclass == 12 )
1967: {
1968: uerror( "cannot initialize extern or union" );
1969: iclass = -1;
1970: goto leave;
1971: }
1972:
1973: if( iclass == 1 || iclass == 4 )
1974: {
1975:
1976:
1977:
1978: bccode();
1979: idname = pstk->in_id;
1980: p = buildtree( 58, buildtree( 2, (NODE *)0, (NODE *)0 ), p );
1981: ecomp(p);
1982: return;
1983: }
1984:
1985: if( p == (NODE *)0 ) return;
1986:
1987: if( ibseen )
1988: {
1989: uerror( "} expected");
1990: goto leave;
1991: }
1992:
1993:
1994: if( idebug > 1 ) printf( "doinit(%o)\n", p );
1995:
1996:
1997: t = pstk->in_t;
1998: d = pstk->in_d;
1999: s = pstk->in_s;
2000: if( pstk->in_sz < 0 )
2001: {
2002:
2003: sz = -pstk->in_sz;
2004: }
2005: else
2006: {
2007: sz = tsize( t, d, s );
2008: }
2009:
2010: inforce( pstk->in_off );
2011:
2012: p = buildtree( 58, block( 2, (NODE *)0,(NODE *)0, t, d, s ), p );
2013: p->in.left->in.op = 97;
2014: p->in.left = p->in.right;
2015: p->in.right = (NODE *)0;
2016: p->in.left = optim( p->in.left );
2017: if( p->in.left->in.op == 2+ 14 )
2018: {
2019: p->in.left->in.op = 97;
2020: p->in.left = p->in.left->in.left;
2021: }
2022: p->in.op = 113;
2023: p = optim(p);
2024:
2025:
2026: if( p->in.left->in.op == 5 )
2027: {
2028: fincode( p->in.left->fpn.dval, sz );
2029: }
2030: else
2031:
2032: if( p->in.left->in.op != 4 )
2033: {
2034: uerror( "initialization by non-constant" );
2035: inoff += sz;
2036: }
2037: else
2038: {
2039:
2040: if( sz < 32 )
2041: {
2042:
2043: incode( p->in.left, sz );
2044: }
2045: else
2046: {
2047:
2048: ecode( optim(p) );
2049: inoff += sz;
2050:
2051: }
2052: }
2053:
2054: gotscal();
2055:
2056: leave:
2057: tfree(p);
2058: }
2059:
2060: gotscal()
2061: {
2062: register t, ix;
2063: register n, id;
2064: register struct symtab *p;
2065: register OFFSZ temp;
2066:
2067: for( ; pstk > instack; )
2068: {
2069:
2070: if( pstk->in_fl ) ++ibseen;
2071:
2072: --pstk;
2073:
2074: t = pstk->in_t;
2075:
2076: if( t == 8 )
2077: {
2078: ix = ++pstk->in_x;
2079: if( (id=dimtab[ix]) < 0 ) continue;
2080:
2081:
2082:
2083: p = &stab[id];
2084: instk( id, p->stype, p->dimoff, p->sizoff, p->offset+pstk->in_off );
2085: return;
2086: }
2087: else if( ((t&(03<<5))==0140) )
2088: {
2089: n = ++pstk->in_n;
2090: if( n >= dimtab[pstk->in_d] && pstk > instack ) continue;
2091:
2092:
2093:
2094: temp = pstk->in_sz;
2095: instk( pstk->in_id, (TWORD)(((pstk->in_t>>2)&~037)|(pstk->in_t&037)), pstk->in_d+1, pstk->in_s,
2096: pstk->in_off+n*temp );
2097: return;
2098: }
2099:
2100: }
2101:
2102: }
2103:
2104: ilbrace()
2105: {
2106:
2107: register t;
2108: register struct instk *temp;
2109:
2110: temp = pstk;
2111:
2112: for( ; pstk > instack; --pstk )
2113: {
2114:
2115: t = pstk->in_t;
2116: if( t != 8 && !((t&(03<<5))==0140) ) continue;
2117: if( pstk->in_fl )
2118: {
2119:
2120: if( pstk->in_n ) uerror( "illegal {");
2121: continue;
2122: }
2123:
2124:
2125: pstk->in_fl = 1;
2126: break;
2127: }
2128:
2129:
2130:
2131:
2132: pstk = temp;
2133: }
2134:
2135: irbrace()
2136: {
2137:
2138:
2139:
2140: if( idebug ) printf( "irbrace(): paramno = %d on entry\n", paramno );
2141:
2142:
2143: if( ibseen )
2144: {
2145: --ibseen;
2146: return;
2147: }
2148:
2149: for( ; pstk > instack; --pstk )
2150: {
2151: if( !pstk->in_fl ) continue;
2152:
2153:
2154:
2155: pstk->in_fl = 0;
2156: gotscal();
2157: return;
2158: }
2159:
2160:
2161:
2162: }
2163:
2164: upoff( size, alignment, poff )
2165: register alignment, *poff;
2166: {
2167:
2168:
2169:
2170:
2171:
2172: register off;
2173:
2174: off = *poff;
2175: if( ( off)%( alignment ) != 0 ) off = ( (( off)/( alignment ) + 1) * ( alignment ));
2176: if( (maxoffset-off) < size )
2177: {
2178: if( instruct!=02 )cerror("local variables fill memory");
2179: else cerror("structure larger than address space");
2180: }
2181: *poff = off+size;
2182: return( off );
2183: }
2184:
2185: oalloc( p, poff )
2186: register struct symtab *p;
2187: register *poff;
2188: {
2189:
2190: register al, off, tsz;
2191: int noff;
2192:
2193: al = talign( p->stype, p->sizoff );
2194: noff = off = *poff;
2195: tsz = tsize( p->stype, p->dimoff, p->sizoff );
2196:
2197: if( p->sclass == 1 )
2198: {
2199: if( (maxoffset-off) < tsz ) cerror("local variables fill memory");
2200: noff = off + tsz;
2201: if( ( noff)%( al ) != 0 ) noff = ( (( noff)/( al ) + 1) * ( al ));
2202: off = -noff;
2203: }
2204: else
2205:
2206:
2207: if( p->sclass == 9 && ( tsz % 32 ) )
2208: {
2209:
2210: tsz = (tsz+32-1)/32;
2211: off = upoff(tsz*32, 32, &noff );
2212:
2213: }
2214: else
2215: {
2216: off = upoff( tsz, al, &noff );
2217: }
2218:
2219: if( p->sclass != 4 )
2220: {
2221:
2222: if( p->offset == (-10201) ) p->offset = off;
2223: else if( off != p->offset ) return(1);
2224: }
2225:
2226: *poff = noff;
2227: return(0);
2228: }
2229:
2230: falloc( p, w, new, pty )
2231: register struct symtab *p;
2232: register NODE *pty;
2233: {
2234:
2235:
2236:
2237: register al,sz,type;
2238:
2239: type = (new<0)? pty->in.type : p->stype;
2240:
2241:
2242: switch( new<0?pty->in.type:p->stype )
2243: {
2244:
2245: case 10:
2246: {
2247: register s;
2248: s = new<0 ? pty->fn.csiz : p->sizoff;
2249: al = dimtab[s+2];
2250: sz = dimtab[s];
2251: break;
2252: }
2253:
2254: case 2:
2255: case 12:
2256: al = 8;
2257: sz = 8;
2258: break;
2259:
2260: case 3:
2261: case 13:
2262: al = 16;
2263: sz = 16;
2264: break;
2265:
2266: case 4:
2267: case 14:
2268: al = 32;
2269: sz = 32;
2270: break;
2271:
2272:
2273: default:
2274:
2275: uerror( "illegal field type" );
2276: al = 32;
2277:
2278: }
2279:
2280: if( w > sz )
2281: {
2282: uerror( "field too big (%d>%d)", w, sz);
2283: w = sz;
2284: }
2285:
2286: if( w == 0 )
2287: {
2288:
2289: if( ( strucoff)%( al ) != 0 ) strucoff = ( (( strucoff)/( al ) + 1) * ( al ));
2290: if( new >= 0 ) uerror( "zero size field");
2291: return(0);
2292: }
2293:
2294: if( strucoff%al + w > sz ) if( ( strucoff)%( al ) != 0 ) strucoff = ( (( strucoff)/( al ) + 1) * ( al ));
2295: if( new < 0 )
2296: {
2297: if( (maxoffset-strucoff) < w )
2298: cerror("structure fills memory");
2299: strucoff += w;
2300: return(0);
2301: }
2302:
2303:
2304:
2305: if( new == 1 )
2306: {
2307:
2308: if( p->offset != strucoff || p->sclass != (0100|w) ) return(1);
2309: }
2310: p->offset = strucoff;
2311: if( (maxoffset-strucoff) < w ) cerror("structure overflows memory");
2312: strucoff += w;
2313: p->stype = type;
2314: return(0);
2315: }
2316:
2317:
2318:
2319:
2320:
2321: nidcl( p )
2322: register NODE *p;
2323: {
2324:
2325:
2326: register class;
2327: register commflag;
2328:
2329: commflag = 0;
2330:
2331:
2332: if( (class=curclass) == 0 )
2333: {
2334: if( blevel > 1 ) class = 1;
2335: else if( blevel != 0 || instruct ) cerror( "nidcl error" );
2336: else
2337: {
2338:
2339: if( (class = 2) == 2 ) commflag = 1;
2340: }
2341: }
2342:
2343: defid( p, class );
2344:
2345: if( class==5 || class==3 )
2346: {
2347:
2348:
2349: commflag = 1;
2350:
2351:
2352: }
2353: if( commflag ) commdec( p->tn.rval );
2354: }
2355:
2356: TWORD
2357: types( t1, t2, t3 )
2358: register TWORD t1, t2, t3;
2359: {
2360:
2361:
2362: TWORD t[3];
2363: register TWORD noun, adj, unsg;
2364: register i;
2365:
2366: t[0] = t1;
2367: t[1] = t2;
2368: t[2] = t3;
2369:
2370: unsg = 4;
2371: noun = 17;
2372: adj = 4;
2373:
2374: for( i=0; i<3; ++i )
2375: {
2376: switch( t[i] )
2377: {
2378:
2379: default:
2380: bad:
2381: uerror( "illegal type combination" );
2382: return( 4 );
2383:
2384: case 17:
2385: continue;
2386:
2387: case 14:
2388: if( unsg != 4 ) goto bad;
2389: unsg = 14;
2390: continue;
2391:
2392: case 5:
2393: case 3:
2394: if( adj != 4 ) goto bad;
2395: adj = t[i];
2396: continue;
2397:
2398: case 4:
2399: case 2:
2400: case 6:
2401: if( noun != 17 ) goto bad;
2402: noun = t[i];
2403: continue;
2404: }
2405: }
2406:
2407:
2408: if( noun == 17 ) noun = 4;
2409: else if( noun == 6 )
2410: {
2411: if( unsg != 4 || adj == 3 ) goto bad;
2412: return( adj==5 ? 7 : 6 );
2413: }
2414: else if( noun == 2 && adj != 4 ) goto bad;
2415:
2416:
2417: if( adj != 4 ) noun = adj;
2418: if( unsg == 14 ) return( noun + (14-4) );
2419: else return( noun );
2420: }
2421:
2422: NODE *
2423: tymerge( typ, idp )
2424: register NODE *typ, *idp;
2425:
2426: {
2427:
2428:
2429: register unsigned t;
2430: register i;
2431:
2432: if( typ->in.op != 33 ) cerror( "tymerge: arg 1" );
2433: if(idp == (NODE *)0 ) return( (NODE *)0 );
2434:
2435:
2436: if( ddebug > 2 ) eprint(idp);
2437:
2438:
2439: idp->in.type = typ->in.type;
2440: idp->fn.cdim = curdim;
2441: tyreduce( idp );
2442: idp->fn.csiz = typ->fn.csiz;
2443:
2444: for( t=typ->in.type, i=typ->fn.cdim; t&(03<<5); t = (((t>>2)&~037)|(t&037)) )
2445: {
2446: if( ((t&(03<<5))==0140) ) dstash( dimtab[i++] );
2447: }
2448:
2449:
2450:
2451: idp->in.type = ctype( idp->in.type );
2452:
2453: if( (t = (idp->in.type&037)) != 8 && t != 9 && t != 10 )
2454: {
2455: idp->fn.csiz = t;
2456: }
2457:
2458: return( idp );
2459: }
2460:
2461: tyreduce( p )
2462: register NODE *p;
2463:
2464: {
2465:
2466:
2467:
2468:
2469: register o, temp;
2470: register unsigned t;
2471:
2472: o = p->in.op;
2473: p->in.op = 97;
2474:
2475: if( o == 2 ) return;
2476:
2477: t = ((( p->in.type &~037)<<2)|040|( p->in.type &037));
2478: if( o == 2+ 70 ) t += (0100-040);
2479: else if( o == 54 )
2480: {
2481: t += (0140-040);
2482: temp = p->in.right->tn.lval;
2483: p->in.right->in.op = 97;
2484: }
2485:
2486: p->in.left->in.type = t;
2487: tyreduce( p->in.left );
2488:
2489: if( o == 54 ) dstash( temp );
2490:
2491: p->tn.rval = p->in.left->tn.rval;
2492: p->in.type = p->in.left->in.type;
2493:
2494: }
2495:
2496: fixtype( p, class )
2497: register NODE *p;
2498: register class;
2499: {
2500: register unsigned t, type;
2501: register mod1, mod2;
2502:
2503:
2504: if( (type = p->in.type) == 17 ) return;
2505: if( mod2 = (type&(03<<5)) )
2506: {
2507: t = (((type>>2)&~037)|(type&037));
2508: while( mod1=mod2, mod2 = (t&(03<<5)) )
2509: {
2510: if( mod1 == 0140 && mod2 == 0100 )
2511: {
2512: uerror( "array of functions is illegal" );
2513: type = 0;
2514: }
2515: else if( mod1==0100 && ( mod2==0140 || mod2==0100 ) )
2516: {
2517: uerror( "function returns array or function" );
2518: type = 0;
2519: }
2520: t = (((t>>2)&~037)|(t&037));
2521: }
2522: }
2523:
2524:
2525:
2526:
2527:
2528: if( class==0 && blevel==1 && !(instruct&(02|04)) )
2529: class = 9;
2530: if( class == 9 || ( class==4 && blevel==1 ) )
2531: {
2532: if( type == 6 ) type = 7;
2533: else if( ((type&(03<<5))==0140) )
2534: {
2535: ++p->fn.cdim;
2536: type += (040-0140);
2537: }
2538: else if( ((type&(03<<5))==0100) )
2539: {
2540: werror( "a function is declared as an argument" );
2541: type = (((type&~037)<<2)|040|(type&037));
2542: }
2543: }
2544:
2545: if( instruct && ((type&(03<<5))==0100) )
2546: {
2547: uerror( "function illegal in structure or union" );
2548: type = (((type&~037)<<2)|040|(type&037));
2549: }
2550: p->in.type = type;
2551: }
2552:
2553:
2554: TWORD
2555: ctype( t )
2556: register TWORD t;
2557: {
2558: register TWORD bt;
2559: bt = (t&037);
2560:
2561:
2562:
2563:
2564:
2565:
2566:
2567: if( bt==5 ) t = (t&(~037))|4;
2568: else if( bt==15) t = (t&(~037))|14;
2569:
2570:
2571:
2572:
2573: return( t );
2574: }
2575:
2576:
2577: uclass( class )
2578: register class;
2579: {
2580:
2581: if( class == 0 ) return( 2 );
2582: else if( class == 3 ) return( 18 );
2583: else if( class == 14 ) return( 17 );
2584: else return( class );
2585: }
2586:
2587: fixclass( class, type )
2588: register TWORD type;
2589: register class;
2590:
2591: {
2592:
2593:
2594:
2595: if( class == 0 )
2596: {
2597: if( instruct&02 ) class = 8;
2598: else if( instruct&04 ) class = 11;
2599: else if( blevel == 0 ) class = 5;
2600: else if( blevel == 1 ) class = 9;
2601: else class = 1;
2602:
2603: }
2604:
2605:
2606: if(blevel == 1 && (class == 3 || class == 2))
2607: uerror("parameter declared with weird storage classs");
2608: if( (( type &(03<<5))==0100) )
2609: {
2610: switch( class )
2611: {
2612: default:
2613: uerror( "function has illegal storage class" );
2614: case 1:
2615: class = 2;
2616: case 2:
2617: case 5:
2618: case 14:
2619: case 13:
2620: case 3:
2621: case 17:
2622: case 18:
2623: ;
2624: }
2625: }
2626:
2627: if( class&0100 )
2628: {
2629: if( !(instruct&02) ) uerror( "field not in structure" );
2630: return( class );
2631: }
2632:
2633: switch( class )
2634: {
2635:
2636: case 11:
2637: if( !(instruct&04) ) uerror( "illegal class" );
2638: return( class );
2639:
2640: case 8:
2641: if( !(instruct&02) ) uerror( "illegal class" );
2642: return( class );
2643:
2644: case 16:
2645: if( instruct & (02|04) ) uerror( "illegal class" );
2646: return( class );
2647:
2648: case 4:
2649: if( blevel == 0 ) uerror( "register declaration outside a fncn" );
2650:
2651: else if( cisreg( type ) ) return( class );
2652: if( blevel == 1 ) return( 9 );
2653: else return( 1 );
2654:
2655: case 1:
2656: case 6:
2657: case 7:
2658: if( blevel < 2 ) uerror( "auto outside function" );
2659: return( class );
2660:
2661: case 9:
2662: if( blevel != 1 ) uerror( "illegal class" );
2663: return( class );
2664:
2665: case 17:
2666: case 14:
2667:
2668: if( !((type&(03<<5))==0100) ) uerror( "fortran declaration must apply to function" );
2669: else
2670: {
2671: type = (((type>>2)&~037)|(type&037));
2672: if( ((type&(03<<5))==0100) || ((type&(03<<5))==0140) || ((type&(03<<5))==040) )
2673: {
2674: uerror( "fortran function has wrong type" );
2675: }
2676: }
2677: case 10:
2678: case 12:
2679: case 15:
2680: case 2:
2681: case 3:
2682: case 5:
2683: case 13:
2684: case 18:
2685: return( class );
2686:
2687: default:
2688: cerror( "illegal class: %d", class );
2689:
2690: }
2691: }
2692:
2693: struct symtab *
2694: mknonuniq(idindex)
2695: register *idindex;
2696: {
2697:
2698:
2699:
2700: register i;
2701: register struct symtab * sp;
2702:
2703: sp = & stab[ i= *idindex ];
2704: while( sp->stype != 0 )
2705: {
2706:
2707: if( ++i >= 6000 )
2708: {
2709:
2710: i = 0;
2711: sp = stab;
2712: }
2713: else ++sp;
2714: if( i == *idindex ) cerror("Symbol table full");
2715: }
2716: sp->sflags = 040 | 01;
2717: sp->sname = stab[*idindex].sname;
2718: *idindex = i;
2719:
2720: if( ddebug )
2721: {
2722: printf( "\tnonunique entry for %s from %d to %d\n",
2723: sp->sname, *idindex, i );
2724: }
2725:
2726: return ( sp );
2727: }
2728:
2729:
2730:
2731: struct symtab *
2732: relook(p)
2733: register struct symtab *p;
2734:
2735: {
2736:
2737: register struct symtab *q;
2738:
2739:
2740: q = &stab[lookup( p->sname, p->sflags&(0100|01|02) )];
2741:
2742: if( q->stype == 17 )
2743: {
2744: q->stype = 0;
2745: return(q);
2746: }
2747: while( q != p )
2748: {
2749: if( q->stype == 0 ) break;
2750: if( ++q >= &stab[6000] ) q=stab;
2751: }
2752: return(q);
2753: }
2754:
2755: uplevel()
2756: {
2757: ++blevel;
2758:
2759: dblbrac();
2760:
2761: }
2762:
2763: clearst( lev )
2764: {
2765:
2766: extern struct symtab *scopestack[];
2767: register struct symtab *p, *q, *r;
2768:
2769:
2770:
2771:
2772:
2773: aobeg();
2774: p = scopestack[blevel];
2775: while (p)
2776: {
2777: aocode(p);
2778: p = p->scopelink;
2779: }
2780: aoend();
2781: if (lev != 1)
2782: dbrbrac();
2783:
2784:
2785:
2786:
2787: q = (struct symtab *) 0;
2788:
2789:
2790:
2791:
2792: p = scopestack[lev];
2793: while (p)
2794: {
2795:
2796: if (ddebug)
2797: printf("removing %s = stab[ %d], flags %o level %d\n",
2798: p->sname,p-stab,p->sflags,p->slevel);
2799:
2800:
2801: if (p->stype == 17 ||
2802: ( p->sclass == 7 && lev <=2) ) {
2803: uerror("%s undefined", p->sname);
2804: }
2805: if( p->sflags & 04 )
2806: unhide(p);
2807: if( (r=relook(p)) != p )
2808: *r = *p;
2809: if ( lev > p->slevel ) {
2810:
2811:
2812: r = p;
2813: p = p->scopelink;
2814: r->scopelink = q;
2815: q = r;
2816: } else {
2817: p->stype = 0;
2818: p = p->scopelink;
2819: }
2820: }
2821: scopestack[lev] = (struct symtab *) 0;
2822:
2823: while( q )
2824: {
2825: r = &stab[ lookup( q->sname, q->sflags ) ];
2826: if ( r != q )
2827: {
2828: *r = *q;
2829: q->stype = 0;
2830: }
2831: q = q->scopelink;
2832: r->scopelink = scopestack[ lev-1 ];
2833: scopestack[ lev-1 ] = r;
2834: }
2835: }
2836:
2837: hide( p )
2838: register struct symtab *p;
2839: {
2840: register struct symtab *q;
2841: for( q=p+1; ; ++q )
2842: {
2843: if( q >= &stab[6000] ) q = stab;
2844: if( q == p ) cerror( "symbol table full" );
2845: if( q->stype == 0 ) break;
2846: }
2847: *q = *p;
2848: p->sflags |= 02;
2849: q->sflags = (p->sflags&(01|0100)) | 04;
2850: if( hflag ) werror( "%s redefinition hides earlier one", p->sname );
2851:
2852: if( ddebug ) printf( " %d hidden in %d\n", p-stab, q-stab );
2853:
2854: return( idname = q-stab );
2855: }
2856:
2857: unhide( p )
2858: register struct symtab *p;
2859: {
2860: register struct symtab *q;
2861: register s;
2862:
2863: s = p->sflags & (01|0100);
2864: q = p;
2865:
2866: for(;;)
2867: {
2868:
2869: if( q == stab ) q = &stab[6000-1];
2870: else --q;
2871:
2872: if( q == p ) break;
2873:
2874: if( (q->sflags&(01|0100)) == s )
2875: {
2876: if ( p->sname == q->sname )
2877: {
2878:
2879: q->sflags &= ~02;
2880:
2881: if( ddebug ) printf( "unhide uncovered %d from %d\n", q-stab,p-stab);
2882:
2883: return;
2884: }
2885: }
2886:
2887: }
2888: cerror( "unhide fails" );
2889: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.