148112Sbostic /*-
2*62193Sbostic * Copyright (c) 1980, 1993
3*62193Sbostic * The Regents of the University of California. All rights reserved.
448112Sbostic *
548112Sbostic * %sccs.include.redist.c%
622240Sdist */
715988Saoki
822240Sdist #ifndef lint
9*62193Sbostic static char sccsid[] = "@(#)type.c 8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1115988Saoki
122866Speter /*
132866Speter * pxp - Pascal execution profiler
142866Speter *
152866Speter * Bill Joy UCB
162866Speter * Version 1.2 January 1979
172866Speter */
182866Speter
192866Speter #include "0.h"
202866Speter #include "tree.h"
212866Speter
223053Smckusic STATIC int typecnt = -1;
232866Speter /*
242866Speter * Type declaration part
252866Speter */
typebeg(l,tline)262866Speter typebeg(l, tline)
272866Speter int l, tline;
282866Speter {
292866Speter
302866Speter line = l;
312866Speter if (nodecl)
322866Speter printoff();
332866Speter puthedr();
342866Speter putcm();
352866Speter ppnl();
362866Speter indent();
372866Speter ppkw("type");
382866Speter ppgoin(DECL);
392866Speter typecnt = 0;
402866Speter setline(tline);
412866Speter }
422866Speter
type(tline,tid,tdecl)432866Speter type(tline, tid, tdecl)
442866Speter int tline;
452866Speter char *tid;
462866Speter int *tdecl;
472866Speter {
482866Speter
492866Speter if (typecnt)
502866Speter putcm();
512866Speter setline(tline);
522866Speter ppitem();
532866Speter ppid(tid);
542866Speter ppsep(" =");
552866Speter gtype(tdecl);
562866Speter ppsep(";");
572866Speter setinfo(tline);
582866Speter putcml();
592866Speter typecnt++;
602866Speter }
612866Speter
typeend()622866Speter typeend()
632866Speter {
642866Speter
652866Speter if (typecnt == -1)
662866Speter return;
672866Speter if (typecnt == 0)
682866Speter ppid("{type decls}");
692866Speter ppgoout(DECL);
702866Speter typecnt = -1;
712866Speter }
722866Speter
732866Speter /*
742866Speter * A single type declaration
752866Speter */
gtype(r)762866Speter gtype(r)
772866Speter register int *r;
782866Speter {
792866Speter
802866Speter if (r == NIL) {
812866Speter ppid("{type}");
822866Speter return;
832866Speter }
842866Speter if (r[0] != T_ID && r[0] != T_TYPACK)
852866Speter setline(r[1]);
862866Speter switch (r[0]) {
872866Speter default:
882866Speter panic("type");
892866Speter case T_ID:
902866Speter ppspac();
912866Speter ppid(r[1]);
922866Speter return;
932866Speter case T_TYID:
942866Speter ppspac();
952866Speter ppid(r[2]);
962866Speter break;
972866Speter case T_TYSCAL:
982866Speter ppspac();
992866Speter tyscal(r);
1002866Speter break;
10115988Saoki case T_TYCRANG:
10215988Saoki ppspac();
10315988Saoki tycrang(r);
10415988Saoki break;
1052866Speter case T_TYRANG:
1062866Speter ppspac();
1072866Speter tyrang(r);
1082866Speter break;
1092866Speter case T_TYPTR:
1102866Speter ppspac();
1112866Speter ppop("^");
1122866Speter gtype(r[2]);
1132866Speter break;
1142866Speter case T_TYPACK:
1152866Speter ppspac();
1162866Speter ppkw("packed");
1172866Speter gtype(r[2]);
1182866Speter break;
11915988Saoki case T_TYCARY:
1202866Speter case T_TYARY:
1212866Speter ppspac();
1222866Speter tyary(r);
1232866Speter break;
1242866Speter case T_TYREC:
1252866Speter ppspac();
1262866Speter tyrec(r[2], NIL);
1272866Speter break;
1282866Speter case T_TYFILE:
1292866Speter ppspac();
1302866Speter ppkw("file");
1312866Speter ppspac();
1322866Speter ppkw("of");
1332866Speter gtype(r[2]);
1342866Speter break;
1352866Speter case T_TYSET:
1362866Speter ppspac();
1372866Speter ppkw("set");
1382866Speter ppspac();
1392866Speter ppkw("of");
1402866Speter gtype(r[2]);
1412866Speter break;
1422866Speter }
1432866Speter setline(r[1]);
1442866Speter putcml();
1452866Speter }
1462866Speter
1472866Speter /*
1482866Speter * Scalar type declaration
1492866Speter */
tyscal(r)1502866Speter tyscal(r)
1512866Speter register int *r;
1522866Speter {
1532866Speter register int i;
1542866Speter
1552866Speter ppsep("(");
1562866Speter r = r[2];
1572866Speter if (r != NIL) {
1582866Speter i = 0;
1592866Speter ppgoin(DECL);
1602866Speter for (;;) {
1612866Speter ppid(r[1]);
1622866Speter r = r[2];
1632866Speter if (r == NIL)
1642866Speter break;
1652866Speter ppsep(", ");
1662866Speter i++;
1672866Speter if (i == 7) {
1682866Speter ppitem();
1692866Speter i = 0;
1702866Speter }
1712866Speter }
1722866Speter ppgoout(DECL);
1732866Speter } else
1742866Speter ppid("{constant list}");
1752866Speter ppsep(")");
1762866Speter }
1772866Speter
1782866Speter /*
17915988Saoki * Conformant array subrange.
18015988Saoki */
tycrang(r)18115988Saoki tycrang(r)
18215988Saoki register int *r;
18315988Saoki {
18415988Saoki
18515988Saoki ppid(r[2]);
18615988Saoki ppsep("..");
18715988Saoki ppid(r[3]);
18815988Saoki ppsep(":");
18915988Saoki gtype(r[4]);
19015988Saoki }
19115988Saoki
19215988Saoki /*
1932866Speter * Subrange type declaration
1942866Speter */
tyrang(r)1952866Speter tyrang(r)
1962866Speter register int *r;
1972866Speter {
1982866Speter
1992866Speter gconst(r[2]);
2002866Speter ppsep("..");
2012866Speter gconst(r[3]);
2022866Speter }
2032866Speter
2042866Speter /*
2052866Speter * Array type declaration
2062866Speter */
tyary(r)2072866Speter tyary(r)
2082866Speter register int *r;
2092866Speter {
2102866Speter register int *tl;
2112866Speter
2122866Speter ppkw("array");
2132866Speter ppspac();
2142866Speter ppsep("[");
2152866Speter tl = r[2];
2162866Speter if (tl != NIL) {
2172866Speter ppunspac();
2182866Speter for (;;) {
2192866Speter gtype(tl[1]);
2202866Speter tl = tl[2];
2212866Speter if (tl == NIL)
2222866Speter break;
2232866Speter ppsep(",");
2242866Speter }
2252866Speter } else
2262866Speter ppid("{subscr list}");
2272866Speter ppsep("]");
2282866Speter ppspac();
2292866Speter ppkw("of");
2302866Speter gtype(r[3]);
2312866Speter }
232