int fout; int cflg; int nflg; int uflg; int rflg 1; int gflg; int pflg; struct nl { char name[8]; int typ; int *val; } *nlp; int fi; int buf[8]; main(argc, argv) char **argv; { int n, i, j; int compare(); if(--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) { argv++; while (*++*argv) switch (**argv) { case 'n': nflg++; continue; case 'c': cflg++; continue; case 'g': gflg++; continue; case 'u': uflg++; continue; case 'r': rflg = -1; continue; case 'p': pflg ++; continue; default: continue; } argc--; } if (argc==0) fi = open("a.out", 0); else if ((++argv)[0][0]=='-' && argv[0][1]==0) fi = 0; else fi = open(*argv, 0); if(fi < 0) { write(2,"cannot open input\n",18); exit(1); } read(fi, buf, 020); if(buf[0]!=0405 && buf[0]!=0407 && buf[0]!=0410 && buf[0]!=0411) { write(2,"bad format\n",11); exit(2); } lseek(fi, 0, buf[1], 1); /* text */ lseek(fi, 0, buf[2], 1); /* data */ if(buf[7] != 1) { lseek(fi, 0, buf[1], 1); lseek(fi, 0, buf[2], 1); /* reloc */ } n = ldiv(0, buf[4], 12); if(n == 0) { write(2,"no name list\n",13); exit(3); } nlp = sbrk(12*n); read(fi, nlp, n*12); if (pflg==0) qsort(nlp, n, 12, compare); fout = dup(1); close(1); for(i=0; i<n; i++) { if(gflg && (nlp->typ&040)==0) goto out; if(cflg) { if(nlp->name[0] != '_') goto out; for(j=0; j<7; j++) nlp->name[j] = nlp->name[j+1]; nlp->name[7] = '\0'; } j = nlp->typ&037; if(j > 4) j = 1; if(j==0 && nlp->val) j = 5; if(uflg && j!=0) goto out; if(!uflg) { if(j==0) printf(" "); else printo(nlp->val); printf("%c ", (nlp->typ&040? "UATDBC":"uatdbc")[j]); } printf("%.8s\n", nlp); out: nlp++; } flush(); exit(0); } compare(p1, p2) struct nl *p1, *p2; { int a, i; a = 0; if(nflg) { if(p1->val > p2->val) { a = 1; goto out; } if(p1->val < p2->val) { a = -1; goto out; } } for(i=0; i<8; i++) if(p1->name[i] != p2->name[i]) { if(p1->name[i] > p2->name[i]) a = 1; else a = -1; goto out; } out: return(a*rflg); } printo(v) { int i; printf("%c", v<0?'1':'0'); for(i=0; i<5; i++) { printf("%c", ((v>>12)&7)+'0'); v =<<3; } }