|
|
1.1 root 1: static char sccsid[] = "@(#)sym.c 2.11";
2:
3: #include "cdb.h"
4:
5:
6: #ifdef BSD41
7: /* these are used for caching string space info */
8: export int vcbSbCache;
9: char *vsbCache;
10: char *vsbSs;
11: export int vcbSbFirst, vissLo, vissLim, vissMax;
12: #define cbProcMax 20
13: #define iCacheMax 1000 /* number of symbols in cache */
14:
15: #else
16:
17: export char *vsbProcHdr;
18: export char *vsbLHdr;
19: export char *vsbLnHdr;
20: export char *vsbLeHdr;
21: #define cbProcMax 7
22: #define iCacheMax 256 /* number of symbols in cache */
23: #endif
24:
25: export int vcbVarHdr, vcbProcHdr, vcbLHdr, vcbLeHdr, vcbLnHdr;
26:
27:
28:
29: #ifdef SYSIII
30: #define cbVarHdr 1
31: #define cbProcHdr 2
32: #define cbLHdr 3
33: #define cbLnHdr 4
34: #define cbLeHdr 4
35: #endif
36:
37: #ifdef BSD41
38: #define cbVarHdr 0
39: #define cbProcHdr 0
40: #define cbLHdr 0
41: #define cbLnHdr 0
42: #define cbLeHdr 0
43: #endif
44:
45: export long visym; /* last symbol index used */
46: export long visymGlobal; /* isym of first global */
47: export pSYMR vsymCur; /* the `current' symbol */
48: export char *vsbCorefile, *vsbSymfile;
49: export int vcaseMod; /* has 0 or 040 for case sensitive search */
50: export int vfnSym, vfnCore; /* the symbol file and core file numbers */
51:
52: export long visymMax; /* number of symbols */
53: export long vcbSymFirst; /* byte offset to first symbol */
54: static SYMR vsymCache[iCacheMax]; /* symbol cache */
55: #define cbSymCache sizeof(vsymCache)
56: export long visymLo, visymLim; /* min/max values for what is in cache */
57:
58:
59: /* F S B C M P */
60:
61: export FLAGT FSbCmp(sb1, sb2)
62: char *sb1, *sb2;
63: {
64: while ((*sb1|vcaseMod) == (*sb2|vcaseMod)) {
65: if (*sb1 == chNull)
66: return(true);
67: sb1++;
68: sb2++;
69: } /* while */
70: #ifdef BSD42
71: if ((*sb1 == chNull AND *sb2 == ':')
72: OR (*sb2 == chNull AND *sb1 == ':'))
73: return(true);
74: #endif
75: return(false);
76: } /* FSbCmp */
77:
78:
79: /* F H D R C M P */
80:
81: export FLAGT FHdrCmp(sbHdr, sb2)
82: char *sbHdr, *sb2;
83: {
84: for ( ; (*sbHdr|vcaseMod) == (*sb2|vcaseMod) ; sbHdr++, sb2++)
85: if (*sbHdr == chNull)
86: return(true);
87: return(*sbHdr == chNull);
88: } /* FHdrCmp */
89:
90:
91: /* F P R O C C M P */
92:
93: export FLAGT FProcCmp(sbProc, sbCheck)
94: char *sbProc, *sbCheck;
95: {
96: char *sbSave;
97:
98: /* this is ALMOST like FHdrCmp. If sbProc <= cbProcMax chars in length,
99: * an exact match is required, else it is like FHdrCmp.
100: * This allows us to have '1234567' match '1234567*'
101: * BUT '1234' does NOT match '12345' (or 6 or 7 or *)
102: */
103: sbSave = sbProc;
104: for ( ; (*sbProc|vcaseMod)==(*sbCheck|vcaseMod); sbProc++, sbCheck++) {
105: if (*sbProc == chNull)
106: return(true); /* exact match */
107: } /* for */
108: #ifdef BSD42
109: if ( ((*sbProc == ':') AND (*sbCheck == chNull))
110: OR ((*sbProc == chNull) AND (*sbCheck == ':')) )
111: return(true);
112: #else
113: if ( (*sbProc == chNull)
114: AND (sbProc-sbSave == cbProcMax) )
115: return(true);
116: #endif
117: return(false);
118: } /* FProcCmp */
119:
120:
121: /* S E T C A C H E */
122:
123: local void SetCache(isym)
124: long isym;
125: {
126: int cRead;
127: long offset;
128:
129: if (isym >= visymLo AND isym < visymLim)
130: return; /* it is already in there, somewhere */
131: offset = vcbSymFirst + (isym * cbSYMR);
132: if (lseek(vfnSym, offset, 0) < 0L)
133: Panic("Bad seek in SetCache");
134: cRead = read(vfnSym, vsymCache, cbSymCache);
135: if (cRead < 0)
136: Panic("Bad read in SetCache (cRead: %d)", cRead);
137: visymLo = isym;
138: visymLim = isym + (cRead/cbSYMR);
139: if (visymLim > visymMax)
140: visymLim = visymMax;
141: } /* SetCache */
142:
143:
144: /* S E T S Y M */
145:
146: export void SetSym(isym)
147: long isym;
148: {
149: if (isym < 0 OR isym >= visymMax)
150: Panic("isym out of bounds in SetSym - %d", isym);
151: visym = isym;
152: SetCache(isym);
153: vsymCur = &(vsymCache[isym-visymLo]);
154: } /* SetSym */
155:
156:
157: /* S E T N E X T */
158:
159: export void SetNext(isym)
160: long isym;
161: {
162: if (isym < 0 OR isym >= visymMax)
163: Panic("isym out of bounds in SetNext - %d", isym);
164: visym = isym - 1;
165: if (visym < 0)
166: vsymCur = symNil;
167: else SetSym(visym);
168: } /* SetNext */
169:
170:
171: /* F N E X T S Y M */
172:
173: export FLAGT FNextSym(typHit1, typHit2, typStop, sbHit, Cmp)
174: int typHit1, typHit2, typStop;
175: char *sbHit;
176: FLAGT (* Cmp)();
177: {
178: int typ, i;
179: long isym;
180:
181: isym = visym + 1;
182: while (isym < visymMax) {
183: SetCache(isym);
184: for (i=(isym-visymLo); isym<visymLim; i++, isym++) {
185: vsymCur = &(vsymCache[i]);
186: #ifdef REGULUS
187: typ = vsymCur->type & N_TYPE;
188: #else
189: typ = vsymCur->type & ~N_EXT;
190: #endif
191: if ( ((typ == typHit1)
192: OR (typ == typHit2))
193: AND ((sbHit == sbNil)
194: OR ((*Cmp)(sbHit, SbInCore(vsymCur->sbSym)))) ) {
195: visym = isym;
196: return(true);
197: }
198: else if (typ == typStop) {
199: return(false);
200: } /* if */
201: } /* for */
202: } /* while */
203: return(false); /* off the end of the symbol table */
204: } /* FNextSym */
205:
206:
207: /* I L N F I S Y M */
208:
209: export int IlnFIsym(isym)
210: long isym;
211: {
212: ADRT adr;
213:
214: SetNext(isym);
215: #ifdef SYSIII
216: if (FNextSym(N_TEXT, N_ABS, N_FN, vsbLnHdr, FHdrCmp))
217: return(atoi(vsymCur->sbSym+vcbLnHdr));
218: #endif
219: #ifdef BSD41
220: if (FNextSym(stLine, 0, stProc, sbNil, nil)) {
221: adr = vsymCur->value;
222: isym = visym;
223: /* see if there are any more lines w/ same address, take highest */
224: while (FNextSym(stLine, 0, stProc, sbNil, nil)) {
225: if (vsymCur->value > adr)
226: break;
227: isym = visym;
228: } /* while */
229: SetSym(isym);
230: return(vsymCur->desc);
231: } /* if */
232: #endif
233: return(ilnNil);
234: } /* IlnFIsym */
235:
236:
237: /* F N E X T L O C A L */
238:
239: export FLAGT FNextLocal(fLocal, fParam, sbVar)
240: FLAGT fLocal, fParam;
241: char *sbVar;
242: {
243: int value;
244: long isymSave;
245: char *sbSym;
246: /* set vsymCur to point to next local (or param) and return true,
247: * return false if no more, leaving symbol advanced by one.
248: */
249:
250: isymSave = visym;
251: #ifdef SYSIII
252: while (FNextSym(N_ABS, N_TEXT, 0, "~", FHdrCmp)) {
253: sbSym = SbInCore(vsymCur->sbSym);
254: if (sbSym[1] == '~')
255: break; /* it's the strart of another procedure, bail out */
256: value = vsymCur->value;
257: if ( ((value < 0) AND (!fLocal))
258: OR ((value > 0) AND (!fParam)) )
259: continue; /* wrong value */
260: if (sbVar != sbNil) {
261: if (!FProcCmp(sbSym+vcbVarHdr, sbVar))
262: continue; /* wrong name */
263: }
264: else {
265: /* a non-specific request */
266: if (FHdrCmp(vsbLHdr, sbSym))
267: continue; /* we aren't interested in line numbers */
268: } /* if */
269: return(true);
270: } /* while */
271: #endif
272: #ifdef BSD41
273: while (FNextSym(stLocal, stParam, stProc, sbNil, nil)) {
274: /* we have a param OR a local */
275: if ( ((vsymCur->type == stParam) AND (!fParam))
276: OR ((vsymCur->type == stLocal) AND (!fLocal)) ) {
277: if (fParam AND !fLocal) {
278: SetSym(isymSave+1);
279: return(false); /* NEVER any params after locals */
280: } /* if */
281: continue;
282: } /* if */
283: sbSym = SbInCore(vsymCur->sbSym);
284: if ( (sbVar != sbNil)
285: AND (!FProcCmp(sbSym, sbVar)) )
286: continue; /* wrong name */
287: #ifdef BSD42
288: if (FSbCmp(sbSym, "int"))
289: return(false); /* we ran into the next file */
290: #endif
291: return(true);
292: } /* while */
293: #endif
294: SetSym(isymSave+1); /* we failed, sigh..... */
295: return(false);
296: } /* FNextLocal */
297:
298:
299: /* A D R F E N D O F P R O C */
300:
301: export ADRT AdrFEndOfProc(ipd)
302: int ipd;
303: {
304: long isym;
305:
306: SetNext(vrgPd[ipd].isym);
307: #ifdef SYSIII
308: if (FNextSym(N_TEXT, N_ABS, N_FN, vsbLeHdr, FHdrCmp))
309: return(vsymCur->value);
310: UError("Can't find end of '%s'", vrgPd[ipd].sbProc);
311: #endif
312: #ifdef BSD41
313: SetNext(vrgPd[ipd].isym+1);
314: FNextSym(stProc, 0, stSource, sbNil, nil); /* don't care about true/false */
315: isym = visym;
316: /* now we back up to first stLine we can find - that should be it! */
317: while (true) {
318: SetSym(--isym);
319: if (vsymCur->type == stLine)
320: return(vsymCur->value);
321: } /* while */
322: #endif
323: } /* AdrFEndOfProc */
324:
325:
326: /* A D R F I F D L N */
327:
328: export ADRT AdrFIfdLn(ifd, iln)
329: int ifd, iln;
330: {
331: long isym, isymLast, ilnCur;
332: ADRT adr;
333:
334: SetNext(vrgFd[ifd].isym+1); /* start just AFTER the file symbol */
335:
336: isym = isymLast = isymNil;
337: #ifdef SYSIII
338: while (FNextSym(N_TEXT, N_ABS, N_FN, vsbLnHdr, FHdrCmp)) {
339: if ((ilnCur=atoi(vsymCur->sbSym+vcbLnHdr)) >= iln) {
340: #endif
341: #ifdef BSD41
342: while (FNextSym(stLine, 0, 0, sbNil, nil)) {
343: if ((ilnCur=vsymCur->desc) >= iln) {
344: #endif
345: isym = (ilnCur == iln) ? visym : isymLast;
346: break;
347: } /* if */
348: isymLast = visym;
349: } /* while */
350:
351: if (isym != isymNil) {
352: SetSym(isym);
353: adr = vsymCur->value;
354: }
355: else {
356: adr = adrNil;
357: } /* if */
358: return(adr);
359: } /* AdrFIfdLn */
360:
361:
362: /* I F D L N F A D R */
363:
364: export void IfdLnFAdr(adr, isym, pifd, piln, pslop)
365: ADRT adr;
366: long isym;
367: int *pifd, *piln, *pslop;
368: {
369: int ifd;
370: long isymLast;
371:
372: *pifd = ifd = IfdFAdr(adr);
373: if (ifd == vifdNil)
374: return;
375:
376: /* we now have the file, try to get the line number */
377: if (isym == 0)
378: isym = vrgFd[ifd].isym+1; /* start just AFTER the file symbol */
379: SetNext(isym);
380:
381: isym = isymNil;
382: isymLast = isymNil;
383: #ifndef BSD41
384: while (FNextSym(N_TEXT, N_ABS, N_FN, vsbLnHdr, FHdrCmp)) {
385: if ((vsymCur->value) >= adr) {
386: isym = (vsymCur->value == adr) ? visym : isymLast;
387: break;
388: } /* if */
389: isymLast = visym;
390: } /* while */
391: #else
392: /* we want the HIGHEST line number that applies to a given address */
393: while (FNextSym(stLine, 0, stSource, sbNil, nil)) {
394: if ((vsymCur->value) >= adr) {
395: if ((vsymCur->value > adr)
396: AND (isym != isymNil))
397: break;
398: isym = (vsymCur->value == adr) ? visym : isymLast;
399: } /* if */
400: isymLast = visym;
401: } /* while */
402: #endif
403:
404: *pslop = -1;
405: if (isym != isymNil) {
406: SetSym(isym);
407: #ifdef BSD41
408: *piln = vsymCur->desc;
409: #else
410: *piln = atoi(vsymCur->sbSym+vcbLnHdr);
411: #endif
412: *pslop = adr - vsymCur->value;
413: }
414: else {
415: *piln = ilnNil;
416: } /* if */
417: } /* IfdLnFAdr */
418:
419:
420: #ifdef BSD41
421: /* I N I T S S */
422:
423: export void InitSs()
424: {
425: if (vcbSbCache == 0) {
426: /* we will read the whole thing in. This means that we
427: * aren't really using the cacheing mechanism, but we
428: * leave it for compatibility with systems where we can't
429: * get away with this.
430: */
431: vcbSbCache = vissMax;
432: } /* if */
433: vsbCache = malloc(vcbSbCache);
434: SetIss(0); /* force read first section */
435: } /* InitSs */
436:
437:
438: /* S B I N C O R E */
439:
440: /* neither export NOR local - it is a macro for NON-BSD systems */
441: char * SbInCore(sb)
442: char *sb;
443: {
444: long iss;
445:
446: iss = (long) sb;
447: if (iss == -1)
448: return(sbNil);
449: if (iss & bitHigh)
450: return((char *)(iss & ~bitHigh)); /* a cdb string */
451: /* an a.out string */
452: SetIss(iss);
453: return(vsbSs);
454: } /* SbInCore */
455:
456:
457: /* S E T I S S */
458:
459: export void SetIss(iss)
460: int iss;
461: {
462: long ret, offset, cRead, issSave;
463: char *sbTest;
464:
465: /* printf("SetIss entered with iss=%d\n",iss); */
466: if (iss < 0 OR iss >= vissMax)
467: Panic("Iss out of bounds");
468: if (iss >= vissLo AND iss < vissLim) {
469: /* make sure the WHOLE string is in the cache */
470: issSave = iss;
471: sbTest = vsbCache + (iss - vissLo);
472: while ((iss < vissLim) AND (*sbTest != chNull)) {
473: sbTest++;
474: iss++;
475: } /* while */
476: iss = issSave;
477: if (*sbTest == chNull) {
478: vsbSs = vsbCache + (iss - vissLo);
479: return;
480: }
481: } /* if */
482:
483: /* not in (or not ALL in) the cache - make it the first thing */
484: offset = vcbSbFirst + iss;
485: /* printf("Seeking in symbols file at offset %d\n", offset); */
486: if ((ret=lseek(vfnSym, offset, 0)) < 0L)
487: Panic("Bad seek in SetIss");
488: cRead = read(vfnSym, vsbCache, vcbSbCache);
489: if (cRead < 0)
490: Panic("Bad read in SetIss (cRead: %d)", cRead);
491: vissLo = iss;
492: vissLim = iss + cRead;
493: vsbSs = vsbCache + (iss - vissLo);
494: } /* SetIss */
495: #endif
496:
497:
498: /* I N I T F D P D */
499:
500: export void InitFdPd()
501: {
502: short ipd, i;
503: FLAGT fGotit, fStop;
504: ADRT adr;
505: char *sbTemp, *sbDot;
506: char sbWorking[cbVarMax+5]; /* used for non-bsd41 stuff */
507: pFDR fd;
508: pPDR pd;
509:
510: #ifdef SYSIII
511: /* set up line number names */
512: vsbLHdr = "~_l";
513: vsbLnHdr = "~_lN";
514: vsbLeHdr = "~_lE";
515: vsbProcHdr = "~~";
516: vityMac = 0;
517: #endif
518: vcbVarHdr = cbVarHdr;
519: vcbProcHdr = cbProcHdr;
520: vcbLHdr = cbLHdr;
521: vcbLeHdr = cbLeHdr;
522: vcbLnHdr = cbLnHdr;
523:
524: visymLo = 0;
525: visymLim = -1;
526:
527: /* first we have to see how big file and proc arrays should be */
528: vifdMac = 0;
529: vipdMac = 0;
530: SetNext(isym0);
531: fStop = false; /* goes true when we are processing 'end.o' */
532: #ifdef SYSIII
533: while (FNextSym(N_FN, N_TEXT, 0, sbNil, nil)) {
534: if (vsymCur->type == N_FN) {
535: if (fStop)
536: break;
537: ++vifdMac;
538: }
539: else if (FHdrCmp(vsbProcHdr, SbInCore(vsymCur->sbSym))) {
540: ++vipdMac;
541: if (FSbCmp(SbInCore(vsymCur->sbSym+vcbProcHdr), "_end_"))
542: fStop = true; /* will stop on next file symbol */
543: } /* if */
544: } /* while */
545: #ifndef REGULUS
546: vifdMac -= 1; /* ignore crt0.o */
547: #endif
548: #endif
549: #ifdef BSD41
550: while (FNextSym(stSource, stProc, 0, sbNil, nil)) {
551: if (vsymCur->type == stSource) {
552: /* a file {ning */
553: if (fStop)
554: break;
555: ++vifdMac;
556: }
557: else {
558: /* a procedure */
559: ++vipdMac;
560: if (FSbCmp(SbInCore(vsymCur->sbSym), "_end_"))
561: fStop = true; /* will stop on next file symbol */
562: } /* if */
563: } /* while */
564: #endif
565: if (vipdMac == 0)
566: UError("It appears that NO files have debugging information");
567: if (!fStop)
568: printf("WARNING! 'end.o' was not loaded with this program\n");
569: vifdTemp = vifdMac++;
570: vifd = vifdNil = vifdMac++;
571: vrgFd = (pFDR) malloc(vifdMac * cbFDR); /* allocate the arrays */
572: vcbTot += vifdMac * cbFDR;
573: vrgPd = (pPDR) malloc(vipdMac * cbPDR);
574: vcbTot += vipdMac * cbPDR;
575:
576: /* we scan through again, filling the arrays */
577: fd = vrgFd;
578: pd = vrgPd;
579: ipd = 0;
580: SetNext(isym0);
581: fStop = false;
582: #ifdef SYSIII
583: while (FNextSym(N_FN, N_TEXT, 0, sbNil, nil)) {
584: if (vsymCur->type == N_FN) {
585: #ifndef REGULUS
586: if (FSbCmp(vsymCur->sbSym, "crt0.o"))
587: continue;
588: #endif
589: #endif
590: #ifdef BSD41
591: while (FNextSym(stSource, stProc, 0, sbNil, nil)) {
592: if (vsymCur->type == stSource) {
593: #endif
594: if (fStop)
595: break; /* we have finished processing end.c */
596: fd->adrStart = vsymCur->value;
597: fd->isym = visym;
598: fd->ipd = ipd;
599: fd->ilnMac = ilnNil;
600: fd->rgLn = (uint *) 0;
601: fd->fHasDecl = true; /* will go false if none - IfdFOpen */
602: fd->fWarned = false;
603: #ifdef SYSIII
604: sbTemp = sbWorking;
605: strncpy(sbTemp, vsymCur->sbSym, cbVarMax);
606: sbTemp[cbVarMax] = chNull; /* make sure we have a clean buffer */
607: sbDot = strrchr(sbTemp, '.'); /* find last period */
608: if (sbDot != nil) {
609: sbDot[1] = 'c'; /* somewhat presumptuous, but I write in C */
610: sbDot[2] = 0;
611: }
612: else {
613: /* this will help if name is `01234567' and lost the `.c' */
614: sbTemp[cbVarMax] = '.';
615: sbTemp[cbVarMax+1] = 'c';
616: sbTemp[cbVarMax+2] = 0;
617: } /* if */
618: fd->sbFile = malloc(cbVarMax+5);
619: vcbTot += cbVarMax + 5;
620: #endif
621: #ifdef BSD41
622: #ifdef BSD42
623: sbTemp = SbInCore(SbSafe(SbInCore(vsymCur->sbSym)));
624: #else
625: sbTemp = SbInCore(vsymCur->sbSym);
626: #endif
627: fd->sbFile = malloc(strlen(sbTemp)+2);
628: #endif
629: strcpy(fd->sbFile, sbTemp);
630: fd++;
631: #ifdef SYSIII
632: }
633: else if (FHdrCmp(vsbProcHdr, vsymCur->sbSym)) {
634: #endif
635: #ifdef BSD41
636: }
637: else {
638: #endif
639: adr = vsymCur->value;
640: pd->adrStart = adr;
641: pd->isym = visym;
642: #ifdef SYSIII
643: sbTemp = sbWorking;
644: /* given ~~foo, copy ~foo */
645: strncpy(sbTemp, vsymCur->sbSym+1, cbVarMax-1);
646: /* make it _foo */
647: sbTemp[0] = '_';
648: sbTemp[7] = chNull;
649: pd->sbProc = malloc(cbVarMax+2);
650: vcbTot += cbVarMax + 2;
651: #endif
652: #ifdef BSD41
653: #ifdef BSD42
654: sbTemp = SbInCore(SbSafe(SbInCore(vsymCur->sbSym)));
655: #else
656: sbTemp = SbInCore(vsymCur->sbSym);
657: #endif
658: pd->sbProc = malloc(strlen(sbTemp)+2);
659: #endif
660: strcpy(pd->sbProc, sbTemp);
661: pd++;
662: ipd++;
663: #ifdef BSD41
664: if (FSbCmp(sbTemp, "_end_")) {
665: fStop = true; /* causes us to stop on next file symbol */
666: }
667: #else
668: if (FSbCmp(sbTemp, "__end_"))
669: fStop = true; /* causes us to stop on next file symbol */
670: #endif
671: } /* if */
672: } /* while */
673: visymGlobal = visym;
674: vipd = ipdNil;
675: printf("%d source files, %d procedures\n", vifdMac-2, vipdMac);
676:
677: fd = vrgFd + vifdTemp;
678: fd->adrStart = 0; /* we use vifdTemp for `other' files */
679: fd->sbFile = sbNil;
680: fd->fHasDecl = false;
681: fd->fWarned = true; /* we assume warning here isn't important */
682: fd->isym = isym0;
683: fd->ipd = ipdNil;
684: fd->ilnMac = ilnNil;
685: fd->rgLn = (uint *) 0;
686:
687: fd = vrgFd + vifdNil; /* we use vifdNil as a `catchall' */
688: fd->adrStart = 0;
689: fd->sbFile = "no src file";
690: fd->fHasDecl = false;
691: fd->fWarned = true;
692: fd->isym = isym0;
693: fd->ipd = ipdNil;
694: fd->ilnMac = ilnNil;
695: fd->rgLn = (uint *) 0;
696:
697: #ifdef SYSIII
698: /* the following gives us one more char in procedure name, if it's there */
699: SetNext(visymGlobal);
700: for (i=0; i<vipdMac; i++) {
701: fGotit = false;
702: while (FNextSym(N_TEXT, 0, 0, vrgPd[i].sbProc, FProcCmp)) {
703: if (vsymCur->value == vrgPd[i].adrStart) {
704: fGotit = true;
705: break;
706: } /* if */
707: } /* while */
708: if (!fGotit) {
709: /* try it from the top of globals again */
710: SetNext(visymGlobal);
711: while (FNextSym(N_TEXT, 0, 0, vrgPd[i].sbProc, FProcCmp)) {
712: if (vsymCur->value == vrgPd[i].adrStart) {
713: fGotit = true;
714: break;
715: } /* if */
716: } /* while */
717: } /* if */
718: if (!fGotit) {
719: /* Can't find it, I hope it is a static, else oooops! */
720: strncpy(vrgPd[i].sbProc, vrgPd[i].sbProc+1, 6);
721: vrgPd[i].sbProc[6] = 0;
722: }
723: else {
724: /* we found _foo, copy foo into name area */
725: strncpy(vrgPd[i].sbProc, vsymCur->sbSym+1, 7);
726: vrgPd[i].sbProc[7] = 0;
727: } /* if */
728: } /* for */
729: #endif
730: } /* InitFdPd */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.