|
|
1.1 root 1: /* $Header: tables.c,v 1.1 86/03/24 16:19:23 rcs Exp $ */
2: /* (C) Copyright 1985 Third Eye Software, Inc. - All Rights Reserved */
3:
4: #include "tes42.h"
5:
6: #include <stab.h>
7:
8:
9: /* E N D P R O C */
10:
11: export void EndProc(adr)
12: ADRT adr;
13: {
14: pSYMR sym;
15:
16: sym = SymFInsert();
17: sym->st = stEnd;
18: sym->sc = scText;
19: sym->index = IsymFSym(vsymProc);
20: sym->value = adr;
21: ChangeAux(vsymProc->index, visym+1);
22: vsymProc = symNil;
23:
24: sym = SymFIsym(visym-1); /* check previous guy, too */
25: if (sym->st == stEnd)
26: sym->value = adr;
27: } /* EndProc */
28:
29:
30: /* D O P R O C */
31:
32: export void DoProc(nlist)
33: pNLISTR nlist;
34: {
35: if (vsymProc != symNil)
36: EndProc(nlist->n_value);
37:
38: vsymProc = SymFInsert();
39: vsymProc->st = stProc;
40: vsymProc->index = AddAux(-1);
41: ProcInsert(IsymFSym(vsymProc), nlist->n_value, vilineMac);
42: vcLinesInProc = 0;
43: } /* DoProc */
44:
45:
46: /* P S B H F H A S H S B */
47:
48: local pSBHR PsbhFHashSb(sb)
49: register char *sb;
50: {
51: register int sum = 0;
52:
53: while (sb && *sb)
54: sum += *sb++;
55:
56: return(&vpsbhBucket [sum % hashMod]);
57: } /* PsbhFHashSb */
58:
59:
60: /* I S S F S B I N S E R T */
61:
62: export long IssFSbInsert(sb)
63: register char *sb;
64: {
65: register pSBHR psbh;
66: register pSBHR psbhPrev;
67: register char *sbT;
68: register int sum;
69:
70: sum = 0;
71: if (sb != 0) {
72: sbT = sb;
73: while (*sbT)
74: sum += *sbT++;
75: } /* if */
76: psbh = vpsbhBucket + (sum % hashMod);
77:
78: while (psbh) {
79: if ( (psbh->sb != 0)
80: && (!strcmp(sb, psbh->sb)) ) {
81: return(psbh->iss);
82: } /* if */
83: psbhPrev = psbh;
84: psbh = psbh->psbh;
85: } /* while */
86:
87: psbh = psbhPrev;
88: psbh->psbh = (pSBHR) malloc (cbSBHR);
89: psbh = psbh->psbh;
90: sbT = psbh->sb = vsbMax;
91: psbh->iss = vissMac;
92: while (*(sbT++) = *(sb++))
93: ;
94:
95: vsbMax = sbT;
96: vissMac = vsbMax - vsbNewStr;
97: if (vissMac > vissMax)
98: panic("Ran out of string space - use scaling factor");
99:
100: vissMac++;
101: *(vsbMax++) = '\0';
102: psbh->psbh = (pSBHR) 0;
103:
104: return (psbh->iss);
105: } /* IssFSbInsert */
106:
107:
108: /* D O L I N E */
109:
110: export void DoLine(nlist)
111: pNLISTR nlist;
112: {
113: pLINER line;
114: static ADRT adrSecondLine;
115:
116: if (vcLinesInProc == 1) {
117: /* If there is more than one line in a proc, we ignore the first.
118: * This is correct for all cases except:
119: * foo() {int x = 1;
120: * .... etc.
121: *
122: * Which is brain damaged and life is tough, so there.
123: */
124: vilineMac--;
125: adrSecondLine = nlist->n_value;
126: } else if ((vcLinesInProc >= 2) && (nlist->n_value == adrSecondLine)) {
127: /* throw away previous line */
128: vilineMac--;
129: } /* if */
130:
131: if (vilineMac >= vilineMax)
132: panic ("line table overflow");
133: viline = vilineMac++;
134:
135: line= vrgLine + viline;
136: line->iln= nlist->n_desc;
137: line->dadr= nlist->n_value - vrgPd[vipd].adr;
138: vdot = nlist->n_value;
139: vcLinesInProc++;
140: } /* DoLine */
141:
142:
143: /* E N D F I L E */
144:
145: export void EndFile(adr)
146: ADRT adr;
147: {
148: register pSYMR sym;
149:
150: if (vsymProc != symNil)
151: EndProc(adr);
152:
153: vrgFd[vifd].ilnMac = vrgLine[viline].iln; /* kludge? */
154: sym = SymFInsert();
155: sym->st = stEnd;
156: sym->sc = scText;
157: sym->index = IsymFSym (vsymFile);
158: vsymFile->index = IsymFSym(sym) + 1; /* forward link */
159: sym->value = (vdot == vsymFile->value) ? adr : vdot;
160: } /* EndFile */
161:
162:
163: /* D O F I L E */
164:
165: export void DoFile (nlist, sbName)
166: pNLISTR nlist;
167: char *sbName;
168: {
169: register pFDR fd;
170: register pSYMR sym;
171: ADRT adr;
172: int cb;
173:
174: if (vsymFile != symNil)
175: EndFile(nlist->n_value);
176:
177: adr = (nlist == nlistNil) ? -1L : nlist->n_value;
178:
179: /* The weird chack for ending character of the filename
180: * is to see if a file of pure data came before us.
181: */
182: if ((vifd > 0)
183: && (sbName[strlen(sbName)-1] != 'o')
184: && (vrgFd[vifd].adr == adr)) {
185: /* this is the TRUE source file after Loader freebie symbol */
186: fd= vrgFd + vifd;
187: visymMac = IsymFSym(vsymFile); /* one more time! */
188: } else {
189: if (vifdMac >= vifdMax)
190: panic ("file table overflow");
191: vifd = vifdMac++;
192: fd= vrgFd + vifd;
193: } /* if */
194:
195: cb = strlen(sbName);
196: fd->iss = IssFSbInsert(sbName);
197: fd->adr = adr;
198: fd->isym = visymMac;
199: fd->iline = vilineMac;
200:
201: vsymFile = sym = SymFInsert();
202: sym->iss = fd->iss;
203: sym->st = stFile;
204: sym->sc = scText;
205: vdot = sym->value = adr;
206:
207: /* reinit mapping array */
208: ZeroBlock(&vrgTesF42 [tesF42Low],
209: ((vites42Max + 1) - tesF42Low) * sizeof(int) );
210: vites42Max = tesF42Low;
211: } /* DoFile */
212:
213:
214: /* P R O C I N S E R T */
215:
216: export void ProcInsert(isym, adr, iline)
217: register int isym;
218: register long adr;
219: register int iline;
220: {
221: register pPDR pd, pd2;
222:
223: if (vipdMac >= vipdMax)
224: panic("proc table overflow");
225:
226: vipd = vipdMac++;
227:
228: if ((vipd > 0) && (adr < vrgPd [vipd - 1].adr)) {
229: /* we need to INSERT - not Append */
230:
231: /* find the proc we come AFTER */
232: for (pd = vrgPd + vipd - 1; (pd >= vrgPd) && (pd->adr > adr); pd--)
233: ;
234: /* move everything below it DOWN one */
235: for (pd2 = vrgPd + vipd - 1; pd2 > pd; pd2--)
236: pd2[1] = *pd2;
237: pd++; /* point at new empty slot */
238: } else {
239: pd = vrgPd + vipd;
240: } /* if */
241:
242: pd->isym = isym;
243: pd->adr = adr;
244: pd->iline = iline;
245: } /* ProcInsert */
246:
247: strcmp(sb1, sb2)
248: char *sb1, *sb2;
249: {
250: if (sb1 == 0 || sb2 == 0)
251: return(1);
252: while (*sb1 == *sb2) {
253: if (*sb1 == '\0')
254: return(0);
255: sb1++;
256: sb2++;
257: } /* while */
258: return(1);
259: } /* strcmp */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.