|
|
1.1 root 1: static char sccsid[] = "@(#)ty.c 2.16";
2:
3: #include <ctype.h>
4: #include "cdb.h"
5: #include "macdefs.h"
6:
7: #ifdef BSD41
8: #define crockValue -1
9: #define cbSbSafe 1024
10: #else
11: #define crockValue ""
12: #define cbSbSafe 256
13: #endif
14: char vsbSafe[cbSbSafe]; /* where we stick names of things */
15: char *vsbNextSafe = vsbSafe; /* next available place */
16:
17: /* v - that is the fConstant field */
18: #ifdef SUN
19: TYR atyCnChar = {
20: crockValue, stValue, true, 0, 0,0,0,0,0,0, btChar, 0};
21: TYR atyChar = {
22: crockValue, stValue, false, 0, 0,0,0,0,0,0, btChar, 0};
23: TYR atyCnShort ={
24: crockValue, stValue, true, 0, 0,0,0,0,0,0, btShort, 0};
25: TYR atyShort = {
26: crockValue, stValue, false, 0, 0,0,0,0,0,0, btShort, 0};
27: TYR atyCnInt = {
28: crockValue, stValue, true, 0, 0,0,0,0,0,0, btInt, 0};
29: TYR atyInt = {
30: crockValue, stValue, false, 0, 0,0,0,0,0,0, btInt, 0};
31: TYR atyCnLong = {
32: crockValue, stValue, true, 0, 0,0,0,0,0,0, btLong, 0};
33: TYR atyLong = {
34: crockValue, stValue, false, 0, 0,0,0,0,0,0, btLong, 0};
35: TYR atyCnFloat ={
36: crockValue, stValue, true, 0, 0,0,0,0,0,0, btFloat, 0};
37: TYR atyFloat = {
38: crockValue, stValue, false, 0, 0,0,0,0,0,0, btFloat, 0};
39: #else
40: TYR atyCnChar = {
41: crockValue, stValue, true, 0, btChar, 0,0,0,0,0,0, 0};
42: TYR atyChar = {
43: crockValue, stValue, false, 0, btChar, 0,0,0,0,0,0, 0};
44: TYR atyCnShort ={
45: crockValue, stValue, true, 0, btShort, 0,0,0,0,0,0, 0};
46: TYR atyShort = {
47: crockValue, stValue, false, 0, btShort, 0,0,0,0,0,0, 0};
48: TYR atyCnInt = {
49: crockValue, stValue, true, 0, btInt, 0,0,0,0,0,0, 0};
50: TYR atyInt = {
51: crockValue, stValue, false, 0, btInt, 0,0,0,0,0,0, 0};
52: TYR atyCnLong = {
53: crockValue, stValue, true, 0, btLong, 0,0,0,0,0,0, 0};
54: TYR atyLong = {
55: crockValue, stValue, false, 0, btLong, 0,0,0,0,0,0, 0};
56: TYR atyCnFloat ={
57: crockValue, stValue, true, 0, btFloat, 0,0,0,0,0,0, 0};
58: TYR atyFloat = {
59: crockValue, stValue, false, 0, btFloat, 0,0,0,0,0,0, 0};
60: #endif
61: TYR atyZeros;
62:
63: export pTYR vtyZeros;
64: export pTYR vtyChar, vtyCnChar;
65: export pTYR vtyShort, vtyCnShort;
66: export pTYR vtyInt, vtyCnInt;
67: export pTYR vtyLong, vtyCnLong;
68: export pTYR vtyFloat, vtyCnFloat;
69:
70: /* most of this type code is NOT needed if we have berkely symbol tables */
71: #ifndef BSD41
72: export int vityMac; /* # TY's in current decl file */
73: int vityBase, vityLim; /* bounds on the ty cache */
74: int vcTyCache; /* # of things actually in cache */
75: #define cTyCacheMax 100
76: TYR vtyCache[cTyCacheMax]; /* buffer where we stick type stuff */
77: int vity; /* index of TY of current interest */
78: pTYR vtyCur; /* TY of current interest */
79: #define cbTyCache sizeof(vtyCache)
80:
81: #define fDoForward true
82: #define fDoBackward false
83:
84: /* S E T T Y C A C H E */
85:
86: local void SetTyCache(ity)
87: int ity;
88: {
89: int ityTemp, cRead;
90: long l1, l2, offset;
91:
92: if ( ((ity >= vityBase) AND (ity < vityLim-(cTyMax-1)))
93: OR ((ity == vityLim-(cTyMax-1)) AND (vityLim == vityMac)) ) {
94: return; /* it is already in there, somewhere */
95: } /* if */
96: ityTemp = (ity / cTyCacheMax) * cTyCacheMax; /* adjust to 'page' boundary */
97: if ((ity+(cTyMax-1)) % cTyCacheMax == 0)
98: ityTemp += (cTyMax-1); /* allow room for a possible second TYR */
99: l1 = ityTemp;
100: l2 = cbTYR;
101: offset = l1 * l2;
102: if (lseek(vfnDecl, offset, 0) < 0L) {
103: Panic("Bad seek in SetTyCache");
104: } /* if */
105: if ((cRead=read(vfnDecl, vtyCache, cbTyCache)) < 0)
106: Panic("Bad read in SetTyCache");
107: vcTyCache = cRead / cbTYR;
108: vityBase = ityTemp;
109: vityLim = vityBase + vcTyCache;
110: } /* SetTyCache */
111:
112:
113: /* S E T T Y */
114:
115: local void SetTy(ity)
116: int ity;
117: {
118: if (ity < 0 OR ity >= vityMac)
119: Panic("ity out of bounds in SetTy - %d", ity);
120: vity = ity;
121: SetTyCache(ity);
122: vtyCur = vtyCache + (ity-vityBase);
123: } /* SetTy */
124:
125:
126: /* S E T T Y N E X T */
127:
128: local void SetTyNext(ity, fForward)
129: FLAGT fForward;
130: {
131: if ((ity < 0) OR (ity >= vityMac))
132: Panic("ity out of bounds in SetTyNext - %d", ity);
133: vity = ity + ((fForward) ? -1 : 1);
134: if (vity < 0)
135: vity = 0;
136: else if (vity >= vityMac)
137: vity = vityMac - 1;
138: SetTy(vity);
139: } /* SetTyNext */
140:
141:
142: /* F N E X T T Y */
143:
144: local FLAGT FNextTy(fForward, sbVar, stLook1, stLook2, stStop1, stStop2)
145: FLAGT fForward;
146: char *sbVar;
147: int stLook1, stLook2, stStop1, stStop2;
148: {
149: int i, st, ityEnd, dity, ity;
150:
151: if (vityMac == 0)
152: return(false); /* there is no valid decl file open */
153: dity = (fForward) ? 1 : -1;
154: ity = vity + dity;
155: while ((ity >= 0) AND (ity < vityMac)) {
156: SetTyCache(ity);
157: ityEnd = (fForward) ? vityLim : vityBase-1;
158: for (i = ity; ity != ityEnd; i+=dity, ity+=dity) {
159: vtyCur = vtyCache + i;
160: st = vtyCur->td.st & 0x00ff;
161: if ( (st == stLook1)
162: OR (st == stLook2)
163: OR ((sbVar != sbNil)
164: AND (stLook1 == 0)
165: AND (stLook2 == 0))) {
166: if ((sbVar == sbNil)
167: OR (FProcCmp(vtyCur->sbVar, sbVar)) ) {
168: SetTy(ity);
169: return(true);
170: } /* if */
171: }
172: else if (st == stStop1 OR st == stStop2) {
173: return(false);
174: } /* if */
175: } /* for */
176: } /* while */
177: return(false);
178: } /* FNextTY */
179:
180:
181: /* I T Y F S B L N */
182:
183: local int ItyFSbLn(sbVar, ln)
184: char *sbVar;
185: int ln;
186: {
187: int ity;
188: FLAGT fFoundBlock;
189:
190: if ((vfnDecl == fnNil)
191: OR (ln <= 0))
192: return(ityNil);
193:
194: /* first we find a block mark with a line number GREATER than ln */
195: SetTyNext(0, fDoForward);
196: fFoundBlock = false;
197: while (FNextTy(fDoForward, sbNil, stLBrac, stRBrac, 0, 0)) {
198: if (vtyCur->valTy > ln) {
199: fFoundBlock = true;
200: break;
201: } /* if */
202: } /* while */
203: if (!fFoundBlock) {
204: /* this could happen when looking for a formal of the
205: * last procedure in a file, and the procedure does not have
206: * any locals.
207: */
208: ity = vityMac-1; /* this might not be quite right - kludge */
209: SetTyNext(ity, fDoBackward);
210: } /* if */
211:
212: /* now we back up and find the name (if it's there) */
213: if (FNextTy(fDoBackward, sbVar, 0, 0, 0, 0)) {
214: return(vity);
215: } /* if */
216: return(ityNil);
217: } /* ItyFSbLn */
218:
219:
220: /* I N I T T Y C A C H E */
221:
222: export void InitTyCache()
223: {
224: vityBase = 0;
225: vityLim = 0;
226: SetTyCache(0);
227: } /* InitTyCache */
228: #endif
229:
230:
231: /* S B S A F E */
232:
233: export SBT SbSafe(sb)
234: char *sb;
235: {
236: int i;
237: SBT sbRet;
238: char *sbT;
239:
240: /* this guy sticks names in a temporarily safe place */
241: /* find the null or : */
242: for (sbT = sb; *sbT != chNull; sbT++)
243: if (*sbT == ':')
244: break;
245: i = sbT - sb + 1;
246: if (vsbNextSafe+i >= vsbSafe+cbSbSafe)
247: /* would run off end of buffer */
248: vsbNextSafe = vsbSafe; /* reuse the buffer */
249: strncpy(vsbNextSafe, sb, i);
250: #ifdef BSD41
251: sbRet = bitHigh | (SBT)vsbNextSafe;
252: #else
253: sbRet = vsbNextSafe;
254: #endif
255: vsbNextSafe[i-1] = chNull;
256: vsbNextSafe += i;
257: return(sbRet);
258: } /* SbSafe */
259:
260:
261: /* S B I N S A F E */
262:
263: export char * SbInSafe(iss)
264: long iss;
265: {
266: return( SbInCore(SbSafe(SbInCore(iss))) );
267: }
268:
269:
270: #ifdef BSD42
271:
272: /* I S S F I D B */
273:
274: local long IssFIdb(idb, iss)
275: int idb;
276: long iss;
277: {
278: int ifd, cbTarget;
279: long isym, issMac;
280: char *sbSym, *sbT1, *sbT2, sbIdb[10];
281:
282: /* given a DBX type number and a maximum iss, find the
283: * definition of the type.
284: * Return the index into string space.
285: */
286:
287: /* first we find beginning of THIS file's symbols */
288: issMac = iss + 1;
289: ifd = vifdNil;
290: if (vifd != vifdNil) {
291: SetSym(vrgFd[vifd].isym);
292: if (vsymCur->sbSym < issMac) {
293: SetSym(vrgFd[vifd+1].isym);
294: if (vsymCur->sbSym >= issMac)
295: ifd = vifd;
296: }
297: }
298: if (ifd == vifdNil) {
299: for (ifd=0; ifd < vifdMac; ifd++) {
300: SetSym(vrgFd[ifd].isym);
301: if (vsymCur->sbSym >= issMac) {
302: ifd--;
303: break;
304: }
305: } /* for */
306: } /* if */
307: sprintf(sbIdb, "%d", idb);
308: cbTarget = strlen(sbIdb);
309: isym = vrgFd[ifd].isym
310: #ifdef SUN
311: + 12; /* skip file sym + standard 11 types*/
312: #else
313: + 13; /* skip file sym + standard 12 types*/
314: #endif
315: SetSym(isym);
316: while (vsymCur->sbSym < issMac) {
317: sbT1 = sbSym = SbInCore(vsymCur->sbSym);
318: while ((sbT2 = strchr(sbT1, '=')) != sbNil) {
319: /* a cadidate */
320: if (FHdrCmp(sbIdb, sbT2-cbTarget)) {
321: /* found it! */
322: return(vsymCur->sbSym + (1+(sbT2-sbSym)));
323: }
324: sbT1 = sbT2 + 1; /* move past '=', see if there is another one */
325: } /* while */
326: isym++;
327: SetSym(isym);
328: } /* while */
329: Panic("Can't find idb: %d in ifd: %d", idb, ifd);
330: } /* IssFIdb */
331:
332:
333: /* T Y F I D B */
334:
335: local void TyFIdb(rgTy, idb)
336: pTYR rgTy;
337: int idb;
338: {
339: int bt;
340: /* these are the standard DBX types */
341: switch (idb) {
342: case 1:
343: bt = btInt;
344: break;
345: case 2:
346: bt = btChar;
347: break;
348: case 3:
349: bt = btLong;
350: break;
351: case 4:
352: bt = btShort;
353: break;
354: case 5:
355: bt = btUChar;
356: break;
357: case 6:
358: bt = btUShort;
359: break;
360: case 7:
361: bt = btULong;
362: break;
363: case 8:
364: bt = btUInt;
365: break;
366: case 9:
367: bt = btFloat;
368: break;
369: case 10:
370: bt = btDouble;
371: break;
372: case 11:
373: bt = btNil;
374: break;
375: } /* switch */
376: rgTy->td.bt = bt;
377: } /* TyFIdb */
378:
379:
380: /* I S S F S T A R T */
381:
382: export long IssFStart(iss)
383: {
384: char *sb;
385: /* given an iss at the beginning of a struct, union or enum definition
386: * return the iss of the NAME of this thing
387: * We have something like "FOOR:t18=s12....." and iss is pointing
388: * at the 's' after the '='.
389: */
390: do {
391: sb = SbInCore(--iss);
392: }
393: while ((*sb != chNull) AND (*sb != ';'));
394: return(++iss);
395: } /* IssFStart */
396:
397:
398: /* T Y F S C A N D B X */
399:
400: local void TyFScanDbx(rgTy, iss)
401: pTYR rgTy;
402: long iss;
403: {
404: int i, idb;
405: char ch;
406: char *sb;
407: pXTYR xty;
408:
409: printf("TyFScanDBX caled with 0x%x and %d\n",rgTy, iss);
410: xty = (pXTYR) (rgTy + 1); /* in case anyone needs it */
411: while (true) {
412: sb = SbInCore(iss);
413: printf("-1- sb :%s:\n",sb);
414: ch = *sb;
415: switch (ch) {
416: case chNull:
417: case ',':
418: case ';':
419: return;
420: case '0':
421: case '1':
422: case '2':
423: case '3':
424: case '4':
425: case '5':
426: case '6':
427: case '7':
428: case '8':
429: case '9':
430: idb = atoi(sb);
431: printf("-2- idb : %d\n",idb);
432: while (isdigit(*sb)) {
433: sb++;
434: iss++;
435: }
436: printf("-3- iss:%d sb:%s:\n", iss,sb);
437: if (*sb == '=')
438: break; /* continue onwards */
439: if (idb <= 11) {
440: TyFIdb(rgTy, idb);
441: return;
442: }
443: else {
444: iss = IssFIdb(idb, iss);
445: }
446: continue;
447: break;
448: case '*':
449: FAdjTd(rgTy, tqPtr);
450: break;
451: case '=':
452: break;
453: case 'a':
454: /* we expect this to look like 'ar1;0;#1;#2;
455: * where 0 is the lower bounds (always for C),
456: * #1 is the upper bound,
457: * #2 is the element type (possibley another array)
458: */
459: sb++;
460: if ((*sb++ != 'r')
461: OR (*sb++ != '1')
462: OR (*sb++ != ';')
463: OR (*sb++ != '0')
464: OR (*sb++ != ';'))
465: Panic("Lost in array spec??");
466: iss += 6;
467: i = atoi(sb); /* get the size of the dimension */
468: while (isdigit(*sb) OR (*sb == '-')) {
469: sb++;
470: iss++;
471: }
472: if (*sb++ != ';')
473: Panic("Lost in array spec");
474: if (xty->rgDim[1] == 0) {
475: if (TqFTy(rgTy, 1) != tqArray)
476: FAdjTd(rgTy, tqArray);
477: xty->st = stExtend;
478: if (xty->rgDim[0] == 0)
479: xty->rgDim[0] = i;
480: else
481: xty->rgDim[1] = i;
482: }
483: /* we should have sb pointing at the type number.
484: * loop will continue and go find it for us.
485: */
486: break;
487: case 'e':
488: rgTy[0].td.bt = btEType;
489: xty->st = stExtend;
490: xty->issRef = IssFStart(iss);
491: return;
492: case 'f':
493: case 'F':
494: rgTy[0].td.st = stProc;
495: break;
496: case 'G':
497: rgTy[0].td.st = stGlobal;
498: break;
499: case 'v': /* 'vaires' parameter - i.e. REFerenced */
500: case 'p':
501: rgTy[0].td.st = stParam;
502: break;
503: case 'r': /* I don't know what this means!!! */
504: break;
505: case 'V': /* 'local' static */
506: case 'S': /* 'global' static */
507: rgTy[0].td.st = stStatic;
508: break;
509: case 's':
510: case 'u':
511: rgTy[0].td.bt = (ch == 's') ? btStruct : btUnion;
512: xty->st = stExtend;
513: xty->issRef = IssFStart(iss);
514: xty->cb = atoi(++sb); /* size in bytes */
515: return;
516: case 'T': /* tag - named type */
517: case 't': /* type */
518: break;
519: } /* switch */
520: iss++;
521: } /* while */
522: } /* TyFScanDbx */
523:
524:
525: /* T Y F 4 2 */
526:
527: export void TyF42(rgTy, isym)
528: pTYR rgTy;
529: long isym;
530: {
531: char *sb, *sbStart;
532: long iss;
533: pTYR ty;
534:
535: SetSym(isym);
536: iss = vsymCur->sbSym;
537: sbStart = SbInCore(iss);
538: sb = strchr(sbStart, ':');
539: if (sb == sbNil) {
540: /* sdb symbol - what you see is what you get */
541: rgTy[0] = *((pTYR) vsymCur);
542: SetSym(isym+1);
543: rgTy[1] = *((pTYR) vsymCur);
544: }
545: else {
546: /* dbx symbol */
547: ty = (pTYR) vsymCur;
548: rgTy[0] = rgTy[1] = *vtyZeros;
549: rgTy->sbVar = SbSafe(sbStart); /* copies up to ':' */
550: rgTy->td.st = ty->td.st;
551: rgTy->valTy = ty->valTy;
552: iss += sb - sbStart;
553: TyFScanDbx(rgTy, iss, isym);
554: SetSym(isym);
555: }
556: } /* TyF42 */
557:
558:
559: /* T Y F F I E L D */
560:
561: local void TyFField(ty, iss)
562: pTYR ty;
563: long iss;
564: {
565: int i, offset, width;
566: char *sbF, *sbS, sbTemp[100];
567:
568: /* somewhere in this symbol is the field info, stuff it in ty */
569: sbF = SbInCore(ty->sbVar);
570: sprintf(sbTemp, "%s:", sbF);
571: sbS = SbInCore(iss);
572: i = IFSbSb(sbS, sbTemp); /* moving window search */
573: if ((i == -1)
574: OR ((sbS[i-1] != ';') AND (!isdigit(sbS[i-1]))) )
575: return; /* caller can detect fact because ty->td.bt == btNil */
576: iss += i + strlen(sbTemp);
577: TyFScanDbx(ty, iss); /* this will build the type info */
578: sbS = 1 + strchr(SbInCore(iss), ',');
579: sscanf(sbS,"%d,%d", &offset, &width);
580: if (((ty->td.bt == btUInt) AND (width != SZINT))
581: OR ((offset % SZCHAR) != 0)
582: OR ((width % SZCHAR) != 0)) {
583: /* this MUST be a bit field */
584: if ((ty->td.bt != btUInt) OR (width > SZINT))
585: Panic("Confused looking at bit field %s @ %ld", sbF, iss);
586: ty->td.width = width;
587: ty->td.bt = btUInt;
588: ty->valTy = offset;
589: }
590: else {
591: ty->td.width = 0;
592: ty->valTy = offset / SZCHAR;
593: }
594: } /* TyFField */
595:
596:
597: /* T Y F L O O K U P */
598:
599: local void TyFLookup(tyStruct, tyField)
600: pTYR tyStruct, tyField;
601: {
602: long iss;
603: pXTYR xty;
604:
605: /* given a structure, see if the field is a member. If so,
606: * return its type stuff. If not, see if we can find a
607: * field by this name and use it. This search is user
608: * selectable.
609: */
610: if ( ((tyStruct->td.bt == btStruct) OR (tyStruct->td.bt == btUnion))
611: AND (tyStruct[1].td.st == stExtend) ) {
612: xty = (pXTYR) (tyStruct+1);
613: iss = xty->issRef; /* this is already absolute because of TyFScanDbx */
614: TyFField(tyField, iss);
615: if (tyField->td.bt != btNil)
616: return;
617: UError("No such field name %s for %s %s",
618: SbInSafe(tyField->sbVar),
619: (tyStruct->td.bt==btStruct) ? "struct" : "union",
620: SbInSafe(iss) );
621: }
622:
623: /* we get here if it wasn't a structure, OR it did not have a field
624: * name as referenced. We will now go looking for something reasonable.
625: * We do not currently do the scan. This means you can't reference
626: * a field name not part of the appropriate struct/union.
627: */
628:
629: } /* TyFLookup */
630:
631:
632: #endif
633:
634: /* ------------------ Back to normal ------------------------ */
635:
636:
637: /* I N I T T Y */
638:
639: export void InitTy()
640: {
641: /* set up standard type descriptors */
642: vtyZeros = &atyZeros;
643: vtyCnChar = &atyCnChar;
644: vtyChar = &atyChar;
645: vtyCnShort = &atyCnShort;
646: vtyShort = &atyShort;
647: vtyCnInt = &atyCnInt;
648: vtyInt = &atyInt;
649: vtyCnLong = &atyCnLong;
650: vtyLong = &atyLong;
651: vtyCnFloat = &atyCnFloat;
652: vtyFloat = &atyFloat;
653: } /* InitTy */
654:
655:
656: /* F I N T F T Y */
657:
658: export FLAGT FIntFTy(ty)
659: pTYR ty;
660: {
661: if (tqPtr == TqFTy(ty, 1))
662: return(true);
663: switch (ty->td.bt) {
664: case btInt:
665: case btUInt:
666: case btUShort:
667: case btShort:
668: case btLong:
669: case btULong:
670: case btChar:
671: case btUChar:
672: case btFArg: /* is this one right??? - kludge */
673: case btEMember:
674: return(true);
675: case btNil:
676: case btFloat:
677: case btDouble:
678: case btEType:
679: case btUnion:
680: case btStruct:
681: return(false);
682: } /* switch */
683: return(false);
684: } /* FIntFTy */
685:
686:
687: /* M A X F T Y T Y */
688:
689: export FLAGT MaxFTyTy(rgTyMax, rgTy1, rgTy2)
690: pTYR rgTyMax, rgTy1, rgTy2;
691: {
692: if (FIntFTy(rgTy1) AND FIntFTy(rgTy2)) {
693: if (CbFTy(rgTy1) >= CbFTy(rgTy2))
694: CopyTy(rgTyMax, rgTy1);
695: else
696: CopyTy(rgTyMax, rgTy2);
697: return(true);
698: } /* if */
699: return(false);
700: } /* MaxFTyTy */
701:
702:
703: /* C O P Y T Y */
704:
705: export void CopyTy(tyDest, tySrc)
706: pTYR tyDest, tySrc;
707: {
708: *tyDest++ = *tySrc++;
709: *tyDest = *tySrc;
710: } /* CopyTy */
711:
712:
713: /* T Y F G L O B A L */
714:
715: export void TyFGlobal(rgTy, sbVar)
716: pTYR rgTy;
717: char *sbVar;
718: {
719:
720: #ifdef SYSIII
721: if (vfnDecl != fnNil) {
722: SetTyNext(vityMac-1, fDoBackward);
723: if (FNextTy(fDoBackward, sbVar, 0, 0, 0, 0)) {
724: CopyTy(rgTy, vtyCur);
725: return;
726: } /* if */
727: } /* if */
728: rgTy[0] = *vtyInt; /* this could easily be WRONG! */
729: strncpy(rgTy[0].sbVar, sbVar, 8);
730: #endif
731: #ifdef BSD41
732: long isymSave;
733: pTYR ty;
734:
735: isymSave = visym;
736: SetSym(isym0);
737: if (FNextSym(stGlobal, stStatic, 0, sbVar, FProcCmp)) {
738: #ifdef BSD42
739: TyF42(rgTy, visym);
740: #else
741: ty = (pTYR) vsymCur;
742: rgTy[0] = *ty;
743: SetSym(visym+1);
744: ty = (pTYR) vsymCur;
745: rgTy[1] = *ty;
746: #endif
747: }
748: else {
749: rgTy[0] = *vtyInt;
750: } /* if */
751: SetSym(isymSave);
752: #endif
753: } /* TyFGlobal */
754:
755:
756: /* T Y F L O C A L */
757:
758: export void TyFLocal(rgTy, sbVar, isym)
759: pTYR rgTy;
760: char *sbVar;
761: long isym;
762: {
763:
764: #ifdef BSD41
765: /* with BSD symbols, the location info for locals is same sym as type */
766: long isymSave;
767: pTYR ty;
768:
769: isymSave = isym;
770: #ifdef BSD42
771: TyF42(rgTy, isym);
772: #else
773: SetSym(isym);
774: ty = (pTYR) vsymCur;
775: rgTy[0] = *ty;
776: SetSym(visym+1);
777: ty = (pTYR) vsymCur;
778: rgTy[1] = *ty;
779: #endif
780: SetSym(isymSave);
781: #else
782: int cb, ln, ity;
783: long isymSave;
784:
785: isymSave = isym;
786: ln = IlnFIsym(isym);
787: if ( (vfnDecl == fnNil)
788: OR ((ity = ItyFSbLn(sbVar, ln)) == ityNil) ) {
789: cb = CbFLocal(isym);
790: SetSym(isymSave);
791: if (cb == 1)
792: CopyTy(rgTy, vtyChar);
793: else if (cb != 4)
794: CopyTy(rgTy, vtyInt);
795: else
796: CopyTy(rgTy, vtyLong);
797: /* this could easily be WRONG! */
798: }
799: else {
800: SetSym(isymSave);
801: SetTy(ity);
802: CopyTy(rgTy, vtyCur);
803: } /* if */
804: rgTy->td.st = stValue;
805: if (vsymCur->type == N_REG)
806: rgTy->td.st = stReg;
807: else if (FHdrCmp(vsbProcHdr, vsymCur->sbSym))
808: rgTy->td.st = stProc;
809: strncpy(rgTy->sbVar, sbVar, cbVarMax-1);
810: rgTy->sbVar[cbVarMax-1] = chNull;
811: #endif
812: } /* TyFLocal */
813:
814:
815: /* T Q F T Y */
816:
817: export int TqFTy(ty, cnt)
818: pTYR ty;
819: int cnt;
820: {
821: #ifdef REGULUS
822: return(tqNil);
823: #else
824: switch (cnt) {
825: case 1:
826: return(ty->td.tq1);
827: case 2:
828: return(ty->td.tq2);
829: case 3:
830: return(ty->td.tq3);
831: case 4:
832: return(ty->td.tq4);
833: case 5:
834: return(ty->td.tq5);
835: case 6:
836: return(ty->td.tq6);
837: } /* switch */
838: #endif
839: } /* TqFTy */
840:
841:
842: /* F A D J T D */
843:
844: export FLAGT FAdjTd(ty, tq)
845: pTYR ty;
846: int tq;
847: {
848: pTDR td;
849: #ifdef REGULUS
850: return(true);
851: #else
852: td = &(ty->td);
853: if (tq != tqNil) {
854: if (td->tq6 != tqNil) {
855: /* all seats are taken */
856: return(false);
857: }
858: else {
859: td->tq6 = td->tq5;
860: td->tq5 = td->tq4;
861: td->tq4 = td->tq3;
862: td->tq3 = td->tq2;
863: td->tq2 = td->tq1;
864: td->tq1 = tq;
865: } /* if */
866: }
867: else {
868: td->tq1 = td->tq2;
869: td->tq2 = td->tq3;
870: td->tq3 = td->tq4;
871: td->tq4 = td->tq5;
872: td->tq5 = td->tq6;
873: td->tq6 = tqNil;
874: } /* if */
875: return(true);
876: #endif
877: } /* FAdjTd */
878:
879:
880: /* C B F T Y */
881:
882: export int CbFTy(ty)
883: pTYR ty;
884: {
885: int tq;
886: pXTYR xty;
887:
888: if (ty == tyNil)
889: return(0);
890:
891: if (ty->td.width != 0)
892: return(-1); /* a bit field */
893:
894: tq = TqFTy(ty, 1);
895: if (tq != tqNil)
896: return(CBPOINT); /* treat it as a pointer */
897:
898: switch (ty->td.bt) {
899: case btNil:
900: return(0);
901: case btInt:
902: case btUInt:
903: return(CBINT);
904: case btUShort:
905: case btShort:
906: return(CBSHORT);
907: case btLong:
908: case btULong:
909: return(CBLONG);
910: case btChar:
911: case btUChar:
912: return(1);
913: case btFloat:
914: return(CBFLOAT);
915: case btDouble:
916: return(CBDOUBLE);
917: case btFArg:
918: case btEType:
919: case btEMember:
920: return(CBINT);
921: case btUnion:
922: case btStruct:
923: /* the following boils down to 'if !BSD41 OR (BSD41 AND !BSD42)' */
924: #ifdef BSD41
925: #ifndef BSD42
926: if (ty[1].td.st != stLeng)
927: return(CBINT);
928: return(ty[1].valTy);
929: #else
930: if (ty[1].td.st != stExtend) {
931: if (ty[1].td.st == stLeng)
932: return(ty[1].valTy);
933: else
934: return(CBINT);
935: }
936: xty = (pXTYR) (ty + 1);
937: return(xty->cb);
938: #endif
939: #else
940: if (ty[1].td.st != stExtend) {
941: if (ty[1].td.st == stLeng)
942: return(ty[1].valTy);
943: else
944: return(CBINT);
945: }
946: xty = (pXTYR) (ty + 1);
947: return(xty->cb);
948: #endif
949: } /* switch */
950: return(0);
951: } /* CbFTy */
952:
953:
954: /* A D R F F I E L D */
955:
956: export long AdrFField(adrLong, tyStruct, tyField)
957: long adrLong;
958: pTYR tyStruct, tyField;
959: {
960: long isymSave;
961: char *sbField;
962: pTYR ty;
963: int issSave;
964:
965: #ifdef BSD41
966: issSave = tyField[0].sbVar; /* wipe everything clean but the name */
967: tyField[0] = *vtyZeros;
968: tyField[1] = *vtyZeros;
969: tyField[0].sbVar = issSave;
970: #ifdef BSD42
971: TyFLookup(tyStruct, tyField); /* does all the 4.2 crap */
972: #endif
973: if (tyField[0].td.bt == btNil) {
974: /* this SUCKS! It is because <4.2 Berkeley compilers have
975: * neanderthal ideas about binding (ie. they don't) field
976: * names to the parent structure.
977: */
978: isymSave = visym;
979: sbField = SbInSafe(tyField->sbVar);
980: SetSym(vrgFd[vifd].isym);
981: if (!FNextSym(stStruct, 0, stSource, sbField, FProcCmp))
982: if (vfPascal)
983: UError("Sorry, Berkeley Pascal does not give me the field names");
984: else
985: UError("No such field name: %s", sbField);
986: ty = (pTYR) vsymCur;
987: tyField[0] = *ty;
988: SetSym(visym+1);
989: ty = (pTYR) vsymCur;
990: tyField[1] = *ty;
991: SetSym(isymSave);
992: if (tyField->td.st != stStruct)
993: UError("'%s' is not a field name", SbInCore(tyField->sbVar));
994: } /* if */
995:
996: if (tyField->td.width != 0) {
997: adrLong += tyField->valTy / SZCHAR; /* set to nearest byte boundary */
998: tyField->valTy %= SZCHAR;
999: }
1000: else {
1001: adrLong += tyField->valTy; /* add its offset to base address */
1002: }
1003: return(adrLong);
1004: #endif
1005: } /* AdrFField */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.