|
|
1.1 root 1: /*
2: * C compiler.
3: * Local variable declarations.
4: */
5: #ifdef vax
6: #include "INC$LIB:cc0.h"
7: #else
8: #include "cc0.h"
9: #endif
10:
11: /*
12: * Read local variables.
13: * The correct lexic level is in "llex".
14: * The first token of the locals is in "s".
15: */
16: locals()
17: {
18: register SYM *sp;
19: SYM *nsp;
20: DIM *dp, *ndp;
21: INFO *ip;
22: int seg;
23: int rf;
24: int c, dc, t;
25:
26: for (;;) {
27: gcandt(&c, &t, &dp, &ip, &rf);
28: if (c==C_NONE && t==T_NONE && rf==0)
29: break;
30: if (s == SEMI) {
31: lex();
32: continue;
33: }
34: if (c == C_NONE)
35: c = C_AUTO;
36: if (t == T_NONE)
37: t = T_INT;
38: for (;;) {
39: if (gdecl(&nsp, &ndp, dp, c, SL_VAR)) {
40: sp = nsp;
41: sp = declare(sp, c, t, ndp, ip, rf);
42: if ((dc=sp->s_class) == C_SIN) {
43: seg = SPURE;
44: if ((rf&S_RONLY) == 0) {
45: if (s == ASSIGN)
46: seg = SDATA;
47: else
48: seg = SBSS;
49: }
50: newseg(seg);
51: align(sp);
52: sp->s_value = here();
53: sp->s_seg = seg;
54: if (s == ASSIGN) {
55: lex();
56: putautos();
57: init(sp, sp->s_dp, (sizeof_t)0, 1);
58: } else {
59: bput(BLOCK);
60: zput(ssize(sp));
61: }
62: newseg(SCODE);
63: }
64: if (dc==C_AUTO || dc==C_REG) {
65: bindlocal(sp);
66: if (s == ASSIGN) {
67: lex();
68: putautos();
69: init(sp, sp->s_dp, (sizeof_t)0, 0);
70: }
71: }
72: #ifdef KLUDGE
73: if (dc == C_GREF) {
74: bput(SGUESS);
75: nput(sp->s_id);
76: if (isfunc(sp))
77: bput(SCODE);
78: else
79: bput(SDATA);
80: }
81: #endif
82: }
83: dblocal(sp);
84: if (s != COMMA)
85: break;
86: lex();
87: }
88: xdropinfo(t, ip);
89: mustbe(SEMI);
90: }
91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.