|
|
1.1 ! root 1: /* @(#)lpfx.c 1.5 83/08/05 */ ! 2: #include <stdio.h> ! 3: #include <ctype.h> ! 4: /*#include "lerror.h"*/ ! 5: #include "manifest" ! 6: #define FMTARGS ! 7: #include "lint.h" ! 8: /*#include "lmanifest"*/ ! 9: /*#include "lpass2.h"*/ ! 10: #define FNSIZE LFNM ! 11: #define NSIZE LCHNM ! 12: #define LDS 0 ! 13: char *tstrbuf[1]; ! 14: ! 15: typedef struct { ! 16: union rec r; ! 17: #ifdef FLEXNAMES ! 18: char *fname; ! 19: #else ! 20: char fname[FNSIZE + 1]; ! 21: #endif ! 22: } funct; ! 23: ! 24: typedef struct LI { ! 25: struct LI *next; ! 26: funct fun; ! 27: } li; ! 28: ! 29: /* ! 30: * lpfx - read lint1 output, sort and format for dag ! 31: * ! 32: * options -i_ -ix (inclusion) ! 33: * ! 34: * while (read lint1 output into "funct" structures) ! 35: * if (this is a filename record) ! 36: * save filename ! 37: * else ! 38: * read arg records and throw on floor ! 39: * if (this is to be included) ! 40: * copy filename into "funct" ! 41: * insert into list ! 42: * format and print ! 43: */ ! 44: ! 45: ! 46: main(argc, argv) ! 47: int argc; ! 48: char **argv; ! 49: { ! 50: extern int optind; ! 51: extern char *optarg; ! 52: funct fu; ! 53: int uscore, fmask, c; ! 54: void rdargs(), insert(), putout(); ! 55: #ifdef FLEXNAMES ! 56: char *filename, *funcname, *getstr(); ! 57: #else ! 58: char filename[FNSIZE + 1], *strncpy(); ! 59: #endif ! 60: ! 61: fmask = LDS | LDX | LRV; ! 62: uscore = 0; ! 63: while ((c = getopt(argc, argv, "i:")) != EOF) ! 64: if (c == 'i') ! 65: if (*optarg == '_') ! 66: uscore = 1; ! 67: else if (*optarg == 'x') ! 68: fmask &= ~(LDS | LDX); ! 69: else ! 70: goto argerr; ! 71: else ! 72: argerr: ! 73: (void)fprintf(stderr, "lpfx: bad option %c ignored\n", c); ! 74: while (0 < fread((char *)&fu.r, sizeof(fu.r), 1, stdin)) ! 75: if (fu.r.l.decflag & LFN) ! 76: { ! 77: #ifdef FLEXNAMES ! 78: filename = fu.r.f.fn = getstr(); ! 79: fprintf(stderr, "file <%s>\n", filename); ! 80: #else ! 81: (void)strncpy(filename, fu.r.f.fn, FNSIZE); ! 82: filename[FNSIZE] = '\0'; ! 83: #endif ! 84: } ! 85: else ! 86: { ! 87: #ifdef FLEXNAMES ! 88: funcname = fu.r.l.name = getstr(); ! 89: #endif ! 90: rdargs(&fu); ! 91: if (((fmask & LDS) ? ISFTN(fu.r.l.type.aty) : ! 92: !(fu.r.l.decflag & fmask)) && ! 93: ((uscore) ? 1 : (*fu.r.l.name != '_'))) ! 94: { ! 95: #ifdef FLEXNAMES ! 96: fu.fname = filename; ! 97: #else ! 98: (void)strncpy(fu.fname, filename, FNSIZE); ! 99: fu.fname[FNSIZE] = '\0'; ! 100: #endif ! 101: insert(&fu); ! 102: } ! 103: } ! 104: putout(); ! 105: } ! 106: ! 107: /* getstr - get strings from intermediate file ! 108: * ! 109: * simple while loop reading into static buffer ! 110: * transfer into malloc'ed buffer ! 111: * panic and die if format or malloc error ! 112: * ! 113: */ ! 114: ! 115: char *getstr() ! 116: { ! 117: static char buf[BUFSIZ]; ! 118: char *malloc(), *strcat(); ! 119: register int c; ! 120: register char *p = buf; ! 121: ! 122: while ((c = getchar()) != EOF) ! 123: { ! 124: *p++ = c; ! 125: if (c == '\0' || !isascii(c)) ! 126: break; ! 127: } ! 128: if (c != '\0') ! 129: { ! 130: fputs("lpfx: PANIC! Intermediate file string format error\n", ! 131: stderr); ! 132: exit(1); ! 133: /*NOTREACHED*/ ! 134: } ! 135: if (!(p = malloc(strlen(buf) + 1))) ! 136: { ! 137: fputs("lpfx: out of heap space\n", stderr); ! 138: exit(1); ! 139: /*NOTREACHED*/ ! 140: } ! 141: return (strcat(p, buf)); ! 142: } ! 143: ! 144: /* ! 145: * rdargs - read arg records and throw on floor ! 146: * ! 147: * if ("funct" has args) ! 148: * get absolute value of nargs ! 149: * if (too many args) ! 150: * panic and die ! 151: * read args into temp array ! 152: */ ! 153: ! 154: void rdargs(pf) ! 155: register funct *pf; ! 156: { ! 157: struct ty atype[50]; ! 158: ! 159: if (pf->r.l.nargs) ! 160: { ! 161: if (pf->r.l.nargs < 0) ! 162: pf->r.l.nargs = -pf->r.l.nargs - 1; ! 163: if (pf->r.l.nargs > 50) ! 164: { ! 165: (void) fprintf(stderr, "lpfx: PANIC! nargs=%d\n", ! 166: pf->r.l.nargs); ! 167: exit(1); ! 168: } ! 169: if (fread((char *)atype, sizeof(ATYPE), pf->r.l.nargs, stdin) <= 0) ! 170: { ! 171: (void)perror("lpfx.rdargs"); ! 172: exit(1); ! 173: } ! 174: } ! 175: } ! 176: ! 177: /* ! 178: * insert - insertion sort into (singly) linked list ! 179: * ! 180: * stupid linear list insertion ! 181: */ ! 182: ! 183: static li *head = NULL; ! 184: ! 185: void insert(pfin) ! 186: register funct *pfin; ! 187: { ! 188: register li *list_item, *newf; ! 189: char *malloc(); ! 190: ! 191: if ((newf = (li *)malloc(sizeof(li))) == NULL) ! 192: { ! 193: (void)fprintf(stderr, "lpfx: out of heap space\n"); ! 194: exit(1); ! 195: } ! 196: newf->fun = *pfin; ! 197: if (list_item = head) ! 198: if (newf->fun.r.l.fline < list_item->fun.r.l.fline) ! 199: { ! 200: newf->next = head; ! 201: head = newf; ! 202: } ! 203: else ! 204: { ! 205: while (list_item->next && ! 206: list_item->next->fun.r.l.fline < newf->fun.r.l.fline) ! 207: list_item = list_item->next; ! 208: while (list_item->next && ! 209: list_item->next->fun.r.l.fline == newf->fun.r.l.fline && ! 210: list_item->next->fun.r.l.decflag < newf->fun.r.l.decflag) ! 211: list_item = list_item->next; ! 212: newf->next = list_item->next; ! 213: list_item->next = newf; ! 214: } ! 215: else ! 216: { ! 217: head = newf; ! 218: newf->next = NULL; ! 219: } ! 220: } ! 221: ! 222: /* ! 223: * putout - format and print sorted records ! 224: * ! 225: * while (there are records left) ! 226: * copy name and null terminate ! 227: * if (this is a definition) ! 228: * if (this is a function**) ! 229: * save name for reference formatting ! 230: * print definition format ! 231: * else if (this is a reference) ! 232: * print reference format ! 233: * ! 234: * ** as opposed to external/static variable ! 235: */ ! 236: ! 237: void putout() ! 238: { ! 239: register li *pli; ! 240: #ifdef FLEXNAMES ! 241: char lname[BUFSIZ], name[BUFSIZ]; ! 242: #else ! 243: char lname[NSIZE+1], name[NSIZE+1]; ! 244: #endif ! 245: char *prtype(), *strncpy(), *strcpy(); ! 246: ! 247: pli = head; ! 248: name[0] = lname[0] = '\0'; ! 249: while (pli != NULL) ! 250: { ! 251: #ifdef FLEXNAMES ! 252: (void) strcpy(name, pli->fun.r.l.name); ! 253: #else ! 254: (void)strncpy(name, pli->fun.r.l.name, NSIZE); ! 255: name[NSIZE] = '\0'; ! 256: #endif ! 257: if (pli->fun.r.l.decflag & (LDI | LDC | LDS)) ! 258: { ! 259: if (ISFTN(pli->fun.r.l.type.aty)) ! 260: (void)strcpy(lname, name); ! 261: (void)printf("%s = %s, <%s %d>\n", name, prtype(pli), ! 262: pli->fun.fname, pli->fun.r.l.fline); ! 263: } ! 264: else if (pli->fun.r.l.decflag & (LUV | LUE | LUM)) ! 265: (void)printf("%s : %s\n", lname, name); ! 266: pli = pli->next; ! 267: } ! 268: } ! 269: ! 270: static char *types[] = { ! 271: "void", "???", "char", "short", "int", "long", "float", ! 272: "double", "struct", "union", "enum", "???", "unsigned char", ! 273: "unsigned short", "unsigned int", "unsigned long"}; ! 274: ! 275: /* ! 276: * prtype - decode type fields ! 277: * ! 278: * strictly arcana ! 279: */ ! 280: ! 281: char *prtype(pli) ! 282: register li *pli; ! 283: { ! 284: static char bigbuf[64]; ! 285: char buf[32], *shift(), *strcpy(), *strcat(); ! 286: register char *bp; ! 287: register int typ; ! 288: ! 289: typ = pli->fun.r.l.type.aty; ! 290: (void)strcpy(bigbuf, types[typ & 017]); ! 291: *(bp = buf) = '\0'; ! 292: for (typ >>= 4; typ > 0; typ >>= 2) ! 293: switch (typ & 03) ! 294: { ! 295: case 1: ! 296: bp = shift(buf); ! 297: buf[0] = '*'; ! 298: break; ! 299: case 2: ! 300: *bp++ = '('; ! 301: *bp++ = ')'; ! 302: *bp = '\0'; ! 303: break; ! 304: case 3: ! 305: *bp++ = '['; ! 306: *bp++ = ']'; ! 307: *bp = '\0'; ! 308: break; ! 309: } ! 310: (void)strcat(bigbuf, buf); ! 311: return(bigbuf); ! 312: } ! 313: ! 314: char *shift(s) ! 315: register char *s; ! 316: { ! 317: register char *p1, *p2; ! 318: char *rp; ! 319: ! 320: for (p1 = s; *p1; ++p1) ! 321: ; ! 322: rp = p2 = p1++; ! 323: while (p2 >= s) ! 324: *p1-- = *p2--; ! 325: return(++rp); ! 326: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.