/* SYMP.C Written by Leor Zolman, 3/82 Given a SYM file put out by ASM86, this aplphabetizes the symbols, eliminates all symbols starting with "L0", and writes the result into T.SYM. */ #include char iobuf[BUFSIZ]; int strcmp(); main(argc,argv) char **argv; { char iname[30]; int i,j,c; unsigned valtab[1000], newval; char *namtab[1000], newnam[30]; int count; int ncols, colno; if (argc == 1) exit(puts("Usage:\nsymp [ncols]\n")); ncols = 80; if (isdigit(argv[2][0])) ncols = atoi(argv[2]); strcpy(iname,argv[1]); strcat(iname,".SYM"); if (fopen(iname,iobuf) == ERROR) exit(puts("Can't open input file")); count = 0; while (1) { while (isspace(c = getc(iobuf))) /* skip leading space */ ; if (c == EOF || c == CPMEOF) break; if (!ishexd(c)) { printf("Bad 1st char of value: %c\n",c); printf("Read %d symbols, last was: %s\n", count, namtab[count-1]); exit(); } newval = 0; /* accumulate new hex value */ do { newval = newval * 16 + (c < ':' ? (c - '0') : (c - '7')); c = getc(iobuf); } while (ishexd(c)); /* skip white space between value and symbol */ while (isspace(c)) c = getc(iobuf); /* collect up new symbol name */ i = 0; do { newnam[i++] = c; } while (!isspace(c = getc(iobuf))); newnam[i] = '\0'; valtab[count] = newval; namtab[count] = sbrk(strlen(newnam) + 1); strcpy(namtab[count++],newnam); } qsort(namtab,count,2,&strcmp,valtab); /* alphabetize */ fclose(iobuf); if (fcreat("T.SYM",iobuf) == ERROR) exit(puts("Can't creat T.SYM")); colno = 1; for (i = 0; i < count; i++) { if (namtab[i][0] == 'L' && namtab[i][1] == '0') continue; fprintf(iobuf, "%04x %-8s ",valtab[i],namtab[i]); colno += 15; if (colno + 15 >= ncols) { fputs("\n",iobuf); colno = 1; } } fputs("\n",iobuf); putc(CPMEOF,iobuf); fflush(iobuf); fclose(iobuf); puts("T.SYM is ready for action...\n"); } isspace(c) char c; { return (c == ' ' || c == '\t' || c == 0x0d || c == 0x0a); } qsort(base, nel, width, compar,base2) char *base; int (*compar)(); unsigned width,nel; { int i, j; unsigned gap, ngap, t1; int jd, t2; t1 = nel * width; for (ngap = nel / 2; ngap > 0; ngap /= 2) { gap = ngap * width; t2 = gap + width; jd = base + gap; for (i = t2; i <= t1; i += width) for (j = i - t2; j >= 0; j -= gap) { if ((*compar)(base+j, jd+j) <=0) break; _swp(base+j, jd+j); _swp(base2+j,base2+gap+j); } } } _swp(a,b) int *a, *b; { int temp; temp = *a; *a = *b; *b = temp; } int strcmp(s,t) char **s, **t; { char *s1, *t1; s1 = *s; t1 = *t; int i; i = 0; while (s1[i] == t1[i]) if (s1[i++] == '\0') return 0; return s1[i] - t1[i]; } int ishexd(c) char c; { return isdigit(c) || (c >= 'A' && c <= 'F'); }  .