allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (02/04/89)
Posting-number: Volume 6, Issue 38 Submitted-by: alex@umbc3.umbc.edu (Alex S. Crain) Archive-name: 68kdisasm/patch01 These patches are for the 68K COFF dissassembler that passed through here some time ago. It makes the dissassembler pretty specific to AT&Ts UNIX-PC, but if you have one of those, it does some pretty neat stuff. See the ChangeLog file for details. :alex Alex Crain Systems Programmer alex@umbc3.umbc.edu (NEW DOMAIN!) Univ Md Baltimore County nerwin!alex@umbc3.umbc.edu BTW: some of this code is copyrighted to various people. I didn't remove any copyrights, but I don't think that I added any here, and at this point, if you can pull a profit off this sucker, you diserve the bread you get. Course, you've gotta maintain it :-). ------------------------------ snip,snip,snip --------------------------------- #!/bin/sh # shar: Shell Archiver (v1.22) # # Run the following text with /bin/sh to create: # ChangeLog # DIFFS # Makefile # README.diffs # constant.c # kernal.h # parseifile.h # parseifile.y # sed 's/^X//' << 'SHAR_EOF' > ChangeLog && XWed Jan 18 00:45:24 1989 Alex (alex at nerwin) X X * constant.c [lookp_address ()] - change to return a value for any X legal shlib address (0x300000 -> 0x380000), instead of the first & X last symbols. X X * kernal.h - fill this file with interesting addresses. X X * alloc.c [mkdref ()] allow for addresses to point to objects of X length 0. X XTue Jan 17 11:14:21 1989 Alex (alex at nerwin) X X * main.c [doopts ()] - added two globals, kernal and dup_error, X which are turned on with -k and -D respectively, to turn on kernal X symbol lookup and DUP??? symbol names (and errors). X X * robj.c [dosymb ()] - added a test for dup_error in the case of X duplicate symbols. If dup_error is not set, duplicate symbols are X simply ignores. X XMon Jan 16 23:53:26 1989 Alex (alex at nerwin) X X * constant.c [replaces syms.c] - instead of syms.c, generate X shlib.h in the same manner. include this file, along with kernal.h X into constants.c which contains the lookup code. lookup_address () X looks up an address in he shared library symbols (shlib.h) and X returns a symbol and option offset in a single string. X lookup_kernal_address () is simular but does not calculate an X offset, retunring 0 if the address is not found. X X * iset.c - many small changes X [prea ()] - output a '&' before a constant hex address. X [pmovc ()] - format MOVEC as MOV X [pcs2 ()] - movm becomes mov.m, ouput a '%' before dest register name. X XSun Jan 15 22:37:48 1989 Alex (alex at nerwin) X X * syms.c [lookup_address()] - this now returns either: X a) a symbol name X b) a symbol name + an offset as a single string ("%s+0x%x") X c) (char *) 0 if the given address is greater then the larest X known symbol value. X X XMon Jan 9 00:08:25 1989 Alex (alex at nerwin) X X * parseifile.c [new file] - generate a file containing a sorted, X initialized array of shared library symbols that can be loaded X into the disassembler. X X * syms.c [new file] - generated by parseifile. X X * iset.c [paddr()] - try to resolve unknown hex addresses by X first looking them up in the initialized array with X lookup_address(). If this doesn't work, try to generate a label X for the address with mkdlab(). At this point we are only printing X absolute address that don't exist in the text or data areas, and X arn't referenced in /lib/shlib.ifile. X X * prin.c [pdata(), pbss()] - teach the print routines about 0 X length objects. We handle these by searhingthrough memory to find X the next object, and using the difference as the size of the X current one. X X * prin.c [ptext()] - add a _start symbol to the beginning of the X text area. Don't verify the entry point, though. X SHAR_EOF chmod 0666 ChangeLog || echo "restore of ChangeLog fails" sed 's/^X//' << 'SHAR_EOF' > DIFFS && X*** olddis/alloc.c Fri Jan 20 11:13:48 1989 X--- test/alloc.c Sat Jan 21 20:45:31 1989 X*************** X*** 286,292 X if (dent.d_type != D_BYTE) { X if (dent.d_type != wsize) { X if (dent.d_type == D_ADDR) { X! if (wsize != D_LONG) X unimpl("Addr word usage"); X } X else if (dent.d_type > wsize) { X X--- 286,292 ----- X if (dent.d_type != D_BYTE) { X if (dent.d_type != wsize) { X if (dent.d_type == D_ADDR) { X! if (wsize != D_LONG && size > 0) X unimpl("Addr word usage"); X } X else if (dent.d_type > wsize) { X*** olddis/conv.c Fri Jan 20 11:13:49 1989 X--- test/conv.c Sun Jan 22 22:13:47 1989 X*************** X*** 9,15 X unsigned suntype; X X /* everything in shlib is an external constant */ X! if (sym->n_value >= 0x300000) { X sym->n_scnum = N_ABS; X sym->n_sclass = C_EXT; X } X X--- 9,15 ----- X unsigned suntype; X X /* everything in shlib is an external constant */ X! if (sym->n_value >= 0x300000 && sym->n_value < 0x380000) { X sym->n_scnum = N_ABS; X sym->n_sclass = C_EXT; X } X*** olddis/heur.c Fri Jan 20 11:13:59 1989 X--- test/heur.c Sun Jan 22 19:06:25 1989 X*************** X*** 312,318 X int lng; X long npos; X X! while (pos < endt) { X gette(&mainfile, pos, &tent); X if (tent.t_amap) /* Been here */ X return; X X--- 312,318 ----- X int lng; X long npos; X X! while (pos && pos < endt) { X gette(&mainfile, pos, &tent); X if (tent.t_amap) /* Been here */ X return; X*************** X*** 362,368 X int lng; X X endt = mainfile.ef_tbase + mainfile.ef_tsize; X! pos = mainfile.ef_entry; X nextv: X for (; pos < endt;) { X gette(&mainfile, pos, &tent); X X--- 362,369 ----- X int lng; X X endt = mainfile.ef_tbase + mainfile.ef_tsize; X! if ((pos = mainfile.ef_entry) == 0) X! pos = mainfile.ef_tbase; X nextv: X for (; pos < endt;) { X gette(&mainfile, pos, &tent); X*** olddis/iset.c Fri Jan 20 11:13:20 1989 X--- test/iset.c Tue Jan 24 12:52:24 1989 X*************** X*** 35,40 X void mkdref(); X long gettw(); X symbol textlab(); X X int l1(), l2(), el1(), lea(), lmove(), lcbch(), jj(); X int limed(), lsbit(), lmvml(), lone(), loone(), lonew(), lonel(); X X--- 35,41 ----- X void mkdref(); X long gettw(); X symbol textlab(); X+ char * lookup_address(), * lookup_kernal_address (); X X int l1(), l2(), el1(), lea(), lmove(), lcbch(), jj(); X int limed(), lsbit(), lmvml(), lone(), loone(), lonew(), lonel(); X*************** X*** 104,111 X 0xf100, 0x5000, lone, pqu, "add", X 0xf100, 0x5100, lone, pqu, "sub", X 0xf100, 0x7000, l1, pmqu, 0, X! 0xf1c0, 0x80c0, lonew, podreg,"divu", X! 0xf1c0, 0x81c0, lonew, podreg,"divs", X 0xf1f0, 0x8100, l1, ptreg, "sbcd", X 0xf000, 0x8000, loone, pomode,"or", X 0xf1f0, 0x9100, l1, ptreg, "subx.b", X X--- 105,112 ----- X 0xf100, 0x5000, lone, pqu, "add", X 0xf100, 0x5100, lone, pqu, "sub", X 0xf100, 0x7000, l1, pmqu, 0, X! 0xf1c0, 0x80c0, lonew, podreg,"divu.w", X! 0xf1c0, 0x81c0, lonew, podreg,"divs.w", X 0xf1f0, 0x8100, l1, ptreg, "sbcd", X 0xf000, 0x8000, loone, pomode,"or", X 0xf1f0, 0x9100, l1, ptreg, "subx.b", X*************** X*** 118,125 X 0xf100, 0xb000, loone, pomode,"cmp", X 0xf1c0, 0xb1c0, loone, pomode,"cmp", X 0xf100, 0xb100, loone, pomode,"eor", X! 0xf1c0, 0xc0c0, lonew, podreg,"mulu", X! 0xf1c0, 0xc1c0, lonew, podreg,"muls", X 0xf1f0, 0xc100, l1, ptreg, "abcd", X 0xf130, 0xc100, l1, pexg, 0, X 0xf000, 0xc000, loone, pomode,"and", X X--- 119,126 ----- X 0xf100, 0xb000, loone, pomode,"cmp", X 0xf1c0, 0xb1c0, loone, pomode,"cmp", X 0xf100, 0xb100, loone, pomode,"eor", X! 0xf1c0, 0xc0c0, lonew, podreg,"mulu.w", X! 0xf1c0, 0xc1c0, lonew, podreg,"muls.w", X 0xf1f0, 0xc100, l1, ptreg, "abcd", X 0xf130, 0xc100, l1, pexg, 0, X 0xf000, 0xc000, loone, pomode,"and", X*************** X*** 420,426 X */ X X void prind(n) X! unsigned short n; X { X if ((short) n > -128 && (short) n < 128) X (void) printf("%d", (long) ((short) n)); X X--- 421,427 ----- X */ X X void prind(n) X! long n; X { X if (n & 0x8000) n |= 0xffff0000; X (void) printf (((n > 128 || n < -128) ? "0x%x" : "%d"), n); X*************** X*** 422,431 X void prind(n) X unsigned short n; X { X! if ((short) n > -128 && (short) n < 128) X! (void) printf("%d", (long) ((short) n)); X! else X! (void) printf("0x%x",(unsigned long) n); X } X X int findleng(tc) X X--- 423,430 ----- X void prind(n) X long n; X { X! if (n & 0x8000) n |= 0xffff0000; X! (void) printf (((n > 128 || n < -128) ? "0x%x" : "%d"), n); X } X X X*************** X*** 446,453 X char * reg; X unsigned disp; X { X- int szc; X- X (void) printf("%d(%s,", disp & 0xff, reg); X if (disp & 0x8000) { X (void) fputs(areg[(disp >> 12) & 0x7]); X X--- 446,451 ----- X char * reg; X unsigned disp; X { X (void) printf("%d(%s,", disp & 0xff, reg); X if (disp & 0x8000) { X (void) fputs(areg[(disp >> 12) & 0x7], stdout); X*************** X*** 450,456 X X (void) printf("%d(%s,", disp & 0xff, reg); X if (disp & 0x8000) { X! (void) fputs(areg[(disp >> 12) & 0x7]); X (void) putchar('.'); X } X else X X--- 448,454 ----- X { X (void) printf("%d(%s,", disp & 0xff, reg); X if (disp & 0x8000) { X! (void) fputs(areg[(disp >> 12) & 0x7], stdout); X (void) putchar('.'); X } X else X*************** X*** 466,471 X { X t_entry tent; X symbol symb; X X gette(&mainfile, pos, &tent); X if (tent.t_relsymb != NULL) { X X--- 464,473 ----- X { X t_entry tent; X symbol symb; X+ long t_pos; X+ int pass2 = 0, i; X+ char *p; X+ extern char kernal; X X start: X /* X*************** X*** 467,472 X t_entry tent; X symbol symb; X X gette(&mainfile, pos, &tent); X if (tent.t_relsymb != NULL) { X symb = tent.t_relsymb; X X--- 469,479 ----- X char *p; X extern char kernal; X X+ start: X+ /* X+ * look up the address and see if it has a label. X+ * If so, print the label and return. X+ */ X gette(&mainfile, pos, &tent); X if (tent.t_relsymb != NULL) { X symb = tent.t_relsymb; X*************** X*** 478,484 X (void) printf("+0x%x", tent.t_reldisp); X return; X } X! if ((pos = gettw(&mainfile, pos, R_LONG)) >= 0x290000) X { X register int i; X for (i=0; i < abstab.c_int; i++) X X--- 485,515 ----- X (void) printf("+0x%x", tent.t_reldisp); X return; X } X! X! /* X! * No label, so calculate the address to print (like gettw) X! * X! */ X! t_pos = tent.t_contents; X! gette(&mainfile, pos+2, &tent); X! t_pos = (t_pos << 16) + tent.t_contents; X! X! /* X! * check the list of absolute symbols. X! */ X! X! for (i=0; i < abstab.c_int; i++) X! if (abstab.c_symb[i]->s_value == t_pos) X! { X! (void) fputs(abstab.c_symb[i]->s_name, stdout); X! return; X! } X! X! /* X! * check the list of shlib constants. X! */ X! X! if (p = lookup_address(t_pos)) X { X (void) fputs(p, stdout); X return; X*************** X*** 480,492 X } X if ((pos = gettw(&mainfile, pos, R_LONG)) >= 0x290000) X { X! register int i; X! for (i=0; i < abstab.c_int; i++) X! if (abstab.c_symb[i]->s_value == pos) X! { X! (void) fputs(abstab.c_symb[i]->s_name, stdout); X! return; X! } X } X (void) printf("0x%x", pos); X } X X--- 511,518 ----- X X if (p = lookup_address(t_pos)) X { X! (void) fputs(p, stdout); X! return; X } X X /* X*************** X*** 488,494 X return; X } X } X! (void) printf("0x%x", pos); X } X X int prea(ea, pos, sz) X X--- 514,547 ----- X (void) fputs(p, stdout); X return; X } X! X! /* X! * If this is kernal code, lookup our kernal addresses. X! */ X! X! if (kernal && (p = lookup_kernal_address(t_pos))) X! { X! (void) fputs (p, stdout); X! return; X! } X! X! /* If we've tried this already, just print the address and return. */ X! if (pass2) X! { X! (void) printf("&0x%x", t_pos); X! return; X! } X! X! /* we couldn't match up the address with anything, so decide that X! its data and give it a label. Its really too late to do this, X! because by the time this gets called, we cant do backward X! referencing. */ X! X! mkdref(pos,0); X! pass2 = 1; X! goto start; X! X! /*NOTREACHED*/ X } X X int prea(ea, pos, sz) X*************** X*** 529,534 X switch (reg) { X case 0: X disp = gettw(&mainfile, pos, R_WORD); X (void) prind(disp); X (void) putchar('.'); X (void) putchar('w'); X X--- 582,588 ----- X switch (reg) { X case 0: X disp = gettw(&mainfile, pos, R_WORD); X+ (void) putchar('&'); X (void) prind(disp); X return 2; X case 1: X*************** X*** 530,537 X case 0: X disp = gettw(&mainfile, pos, R_WORD); X (void) prind(disp); X- (void) putchar('.'); X- (void) putchar('w'); X return 2; X case 1: X paddr(pos); X X--- 584,589 ----- X disp = gettw(&mainfile, pos, R_WORD); X (void) putchar('&'); X (void) prind(disp); X return 2; X case 1: X paddr(pos); X*************** X*** 538,544 X return 4; X case 2:{ X symbol symb; X! register int addr; X disp = X ((short) gettw(&mainfile, pos, R_WORD)); X if ((addr=pos+disp) < 0 || X X--- 590,596 ----- X return 4; X case 2:{ X symbol symb; X! register long addr; X disp = X ((short) gettw(&mainfile, pos, R_WORD)); X if ((addr=pos+disp) < 0 || X*************** X*** 570,577 X piword("%pc", (unsigned)gettw(&mainfile, pos, R_WORD)); X return 2; X case 4: X! (void) putchar('&'); X! if (sz < 4) X (void) prind(gettw(&mainfile, pos, R_WORD)); X else X paddr(pos); X X--- 622,629 ----- X piword("%pc", (unsigned)gettw(&mainfile, pos, R_WORD)); X return 2; X case 4: X! if (sz < 4) { X! (void) putchar('&'); X (void) prind(gettw(&mainfile, pos, R_WORD)); X } X else X*************** X*** 573,578 X (void) putchar('&'); X if (sz < 4) X (void) prind(gettw(&mainfile, pos, R_WORD)); X else X paddr(pos); X return sz; X X--- 625,631 ----- X if (sz < 4) { X (void) putchar('&'); X (void) prind(gettw(&mainfile, pos, R_WORD)); X+ } X else X paddr(pos); X return sz; X*************** X*** 692,698 X int disp = gettw(&mainfile, pos+2, R_WORD); X int ctrl = ((disp >> 10) & 2) | (disp & 1); X X! (void) fputs("movc\t", stdout); X if ((te->t_contents & 1) == 0) X (void) fputs(creg[ctrl], stdout); X if (disp & 0x8000) X X--- 745,751 ----- X int disp = gettw(&mainfile, pos+2, R_WORD); X int ctrl = ((disp >> 10) & 2) | (disp & 1); X X! (void) fputs("mov\t", stdout); X if ((te->t_contents & 1) == 0) X (void) fputs(creg[ctrl], stdout); X if (disp & 0x8000) X*************** X*** 714,720 X X /* we need to swith the operands to compare instrucions. */ X if (strcmp (optab[te->t_iindex].prarg, "cmp")) { X! (void) printf("%s.%c\t&", optab[te->t_iindex].prarg, sz); X if (sz == 'l') { X paddr(pos+2); X (void) putchar(','); X X--- 767,773 ----- X X /* we need to swith the operands to compare instrucions. */ X if (strcmp (optab[te->t_iindex].prarg, "cmp")) { X! (void) printf("%s.%c\t", optab[te->t_iindex].prarg, sz); X if (sz == 'l') { X paddr(pos+2); X (void) putchar(','); X*************** X*** 721,726 X (void) prea(te->t_contents, pos+4, 4); X } X else { X (void) prind(gettw(&mainfile, pos+2, R_WORD)); X (void) putchar(','); X (void) prea(te->t_contents, pos+2, 2); X X--- 774,780 ----- X (void) prea(te->t_contents, pos+4, 4); X } X else { X+ (void) putchar('&'); X (void) prind(gettw(&mainfile, pos+2, R_WORD)); X (void) putchar(','); X (void) prea(te->t_contents, pos+2, 2); X*************** X*** 731,737 X if (sz == 'l') { X (void) prea(te->t_contents, pos+4, 4); X (void) putchar(','); X- (void) putchar('&'); X paddr(pos+2); X } X else { X X--- 785,790 ----- X if (sz == 'l') { X (void) prea(te->t_contents, pos+4, 4); X (void) putchar(','); X paddr(pos+2); X } X else { X*************** X*** 804,810 X { X unsigned tc = te->t_contents; X X! (void) fputs("movw\t", stdout); X if ((tc & 0xffc0) == 0x40c0) { X (void) fputs("%sr,", stdout); X (void) prea(tc, pos, 2); X X--- 857,863 ----- X { X unsigned tc = te->t_contents; X X! (void) fputs("mov.w\t", stdout); X if ((tc & 0xffc0) == 0x40c0) { X (void) fputs("%sr,", stdout); X (void) prea(tc, pos, 2); X*************** X*** 812,817 X else { X (void) prea(tc, pos, 2); X (void) putchar(','); X (void) fputs(optab[te->t_iindex].prarg, stdout); X } X } X X--- 865,871 ----- X else { X (void) prea(tc, pos, 2); X (void) putchar(','); X+ (void) putchar('%'); X (void) fputs(optab[te->t_iindex].prarg, stdout); X } X } X*************** X*** 831,837 X t_entry *te; X long pos; X { X! if (! strncmp(optab[te->t_iindex].prarg, "tas") && X (te->t_contents & 0x3f) == 0x3c) { X symbol symb; X t_entry tstr; X X--- 885,891 ----- X t_entry *te; X long pos; X { X! if (! strcmp(optab[te->t_iindex].prarg, "tas") && X (te->t_contents & 0x3f) == 0x3c) { X symbol symb; X t_entry tstr; X*************** X*** 836,843 X symbol symb; X t_entry tstr; X int counter = te->t_lng -2; X! int offset = (pos += 4); X! int dest; X char * sw_label; X X (void) printf("swbeg\t&%d\n", counter); X X--- 890,897 ----- X symbol symb; X t_entry tstr; X int counter = te->t_lng -2; X! long offset = (pos += 4); X! long dest; X char * sw_label; X X (void) printf("swbeg\t&%d\n", counter); X*************** X*** 843,849 X (void) printf("swbeg\t&%d\n", counter); X X symb = textlab(pos, pos); X! printf("%s:\n", sw_label = symb->s_name); X X while (counter--) { X gette(&mainfile, pos, &tstr); X X--- 897,903 ----- X (void) printf("swbeg\t&%d\n", counter); X X symb = textlab(pos, pos); X! (void) printf("%s:\n", sw_label = symb->s_name); X X while (counter--) { X gette(&mainfile, pos, &tstr); X*************** X*** 854,860 X || dest >= mainfile.ef_tbase+mainfile.ef_tsize X || (dest & 1) != 0 )) { X if (symb = textlab(dest,offset)) X! printf("\tshort\t%s-%s\n", X symb->s_name,sw_label); X else X printf("\tshort\t0x%x\t# Can't label destination.\n", X X--- 908,914 ----- X || dest >= mainfile.ef_tbase+mainfile.ef_tsize X || (dest & 1) != 0 )) { X if (symb = textlab(dest,offset)) X! (void) printf("\tshort\t%s-%s\n", X symb->s_name,sw_label); X else X (void) printf("\tshort\t0x%x\t# Can't label destination.\n", X*************** X*** 857,863 X printf("\tshort\t%s-%s\n", X symb->s_name,sw_label); X else X! printf("\tshort\t0x%x\t# Can't label destination.\n", X tstr.t_contents); X } X else X X--- 911,917 ----- X (void) printf("\tshort\t%s-%s\n", X symb->s_name,sw_label); X else X! (void) printf("\tshort\t0x%x\t# Can't label destination.\n", X tstr.t_contents); X } X else X*************** X*** 861,867 X tstr.t_contents); X } X else X! printf("\tshort\t0x%x\t# Illegal address\n", X tstr.t_contents); X pos += 2; X } X X--- 915,921 ----- X tstr.t_contents); X } X else X! (void) printf("\tshort\t0x%x\t# Illegal address\n", X tstr.t_contents); X pos += 2; X } X*************** X*** 964,971 X t_entry *te; X long pos; X { X! (void) printf("link\t%s,&%d", areg[te->t_contents & 0x7], X! gettw(&mainfile, pos+2, R_WORD)); X } X X X X--- 1018,1025 ----- X t_entry *te; X long pos; X { X! (void) printf("link\t%s,&", areg[te->t_contents & 0x7]); X! prind (gettw(&mainfile, pos+2, R_WORD)); X } X X X*** olddis/libmtch.c Fri Jan 20 11:13:25 1989 X--- test/libmtch.c Sat Jan 21 20:45:34 1989 X*************** X*** 102,108 X char *bp, *ep = NULL, *pathb, *pathe, *fullpath = NULL; X static char *pathn; X extern char *getenv(); X- char magic[8]; X struct ar_hdr arhdr; X LDFILE *ldptr; X X X--- 102,107 ----- X char *bp, *ep = NULL, *pathb, *pathe, *fullpath = NULL; X static char *pathn; X extern char *getenv(); X struct ar_hdr arhdr; X LDFILE *ldptr; X X*************** X*** 153,160 X found: X X str = fullpath? fullpath: str; X! if (FREAD(magic, sizeof(magic),1,ldptr) != 1 || X! strcmp(magic, ARMAG) != 0) { X if (ep != NULL) { X (void) fprintf(stderr, "%s is not library file\n", str); X exit(103); X X--- 152,158 ----- X found: X X str = fullpath? fullpath: str; X! if (TYPE(ldptr) != ARTYPE) { X if (ep != NULL) { X (void) fprintf(stderr, "%s is not library file\n", str); X exit(103); X*** olddis/main.c Fri Jan 20 11:14:02 1989 X--- test/main.c Sat Jan 21 20:45:35 1989 X*************** X*** 46,51 X int rel; /* File being analysed is relocatable */ X int lpos; X char shlibout; /* output values for shlib constants */ X X symbol dosymb(); X struct libit *getfnam(); X X--- 46,53 ----- X int rel; /* File being analysed is relocatable */ X int lpos; X char shlibout; /* output values for shlib constants */ X+ char kernal; X+ char dup_error; X X symbol dosymb(); X struct libit *getfnam(); X*************** X*** 50,55 X symbol dosymb(); X struct libit *getfnam(); X X /* X * Get hex characters, also allowing for 'k' and 'm'. X */ X X--- 52,58 ----- X symbol dosymb(); X struct libit *getfnam(); X X+ #if 0 X /* X * Get hex characters, also allowing for 'k' and 'm'. X */ X*************** X*** 95,100 X } X } X } X X /* X * Process entry line options. Return number dealt with. X X--- 98,104 ----- X } X } X } X+ #endif X X /* X * Process entry line options. Return number dealt with. X*************** X*** 136,141 X shlibout++; X goto nx; X X case 'a': X noabs++; X goto nx; X X--- 140,153 ----- X shlibout++; X goto nx; X X+ case 'k': X+ kernal++; X+ goto nx; X+ X+ case 'D': X+ dup_error++; X+ goto nx; X+ X case 'a': X noabs++; X goto nx; X*************** X*** 227,233 X } X X lfd = getfnam(argv[1]); X! if (TYPE(lfd->ldptr) == ARTYPE) { X (void) fprintf(stderr, "Main file (%s) cannot be library\n", argv[1]); X exit(2); X } X X--- 239,245 ----- X } X X lfd = getfnam(argv[1]); X! if (TYPE(lfd->ldptr) == ARTYPE && lfd->lf_name[0]) { X (void) fprintf(stderr, "Main file (%s) cannot be library\n", argv[1]); X exit(2); X } X*************** X*** 305,308 X pbss(&mainfile); X bfclose(&mainfile); X exit(0); X } X X--- 317,321 ----- X pbss(&mainfile); X bfclose(&mainfile); X exit(0); X+ /* NOTREACHED */ X } X*** olddis/prin.c Fri Jan 20 11:14:05 1989 X--- test/prin.c Sat Jan 21 20:45:35 1989 X*************** X*** 102,108 X register long tpos, endt; X t_entry tstr; X X! (void) fputs("\ttext\n", stdout); X X tpos = fid->ef_tbase; X endt = tpos + fid->ef_tsize; X X--- 102,108 ----- X register long tpos, endt; X t_entry tstr; X X! (void) fputs("\tglobal _start\n_start:\n\ttext\n", stdout); X X tpos = fid->ef_tbase; X endt = tpos + fid->ef_tsize; X*************** X*** 142,148 X { X register long dpos, endd; X register int lng, ccnt; X- unsigned ctyp; X int had, par, inc; X char *msg; X d_entry dstr; X X--- 142,147 ----- X { X register long dpos, endd; X register int lng, ccnt; X int had, par, inc; X char *msg; X d_entry dstr; X*************** X*** 156,162 X X getde(fid, dpos, &dstr); X plabs(dstr.d_lab, S_DATA); X! X switch (dstr.d_type) { X case D_CONT: X (void) fprintf(stderr, "Data sync error\n"); X X--- 155,161 ----- X X getde(fid, dpos, &dstr); X plabs(dstr.d_lab, S_DATA); X! X switch (dstr.d_type) { X case D_CONT: X (void) fprintf(stderr, "Data sync error\n"); X*************** X*** 165,171 X X case D_ASC: X case D_ASCZ: X- ctyp = dstr.d_type; X lng = dstr.d_lng; X nextline: X (void) fputs("\tbyte\t", stdout); X X--- 164,169 ----- X X case D_ASC: X case D_ASCZ: X lng = dstr.d_lng; X nextline: X if (lng > 0) X*************** X*** 168,176 X ctyp = dstr.d_type; X lng = dstr.d_lng; X nextline: X! (void) fputs("\tbyte\t", stdout); X! ccnt=0; X! while (lng > 0) { X if (ccnt) (void) putchar(','); X getde(fid, dpos, &dstr); X switch (dstr.d_contents) { X X--- 166,177 ----- X case D_ASCZ: X lng = dstr.d_lng; X nextline: X! if (lng > 0) X! { X! (void) fputs("\tbyte\t", stdout); X! ccnt=0; X! while (lng > 0) X! { X if (ccnt) (void) putchar(','); X getde(fid, dpos, &dstr); X switch (dstr.d_contents) { X*************** X*** 228,234 X (void) putchar('\n'); X goto nextline; X } X! } X (void) putchar('\n'); X break; X X X--- 229,245 ----- X (void) putchar('\n'); X goto nextline; X } X! } X! } X! else X! { X! int last = dpos; X! do { X! dpos += 2; X! getde(fid, dpos, &dstr); X! } while(dpos < endd && dstr.d_lab == (symbol) 0); X! (void) printf("\tspace\t%d\n", dpos - last); X! } X (void) putchar('\n'); X break; X X*************** X*** 249,261 X par = R_LONG; X inc = 4; X wrest: X! (void) putchar('\t'); X! (void) fputs(msg, stdout); X! (void) putchar('\t'); X! lng = dstr.d_lng; X! lpos = 16; X! had = 0; X! while (lng > 0) { X if (lpos > LINELNG) { X (void) putchar('\n'); X (void) putchar('\t'); X X--- 260,275 ----- X par = R_LONG; X inc = 4; X wrest: X! if (lng > 0) X! { X! (void) putchar('\t'); X! (void) fputs(msg, stdout); X! (void) putchar('\t'); X! lng = dstr.d_lng; X! lpos = 16; X! had = 0; X! while (lng > 0) X! { X if (lpos > LINELNG) { X (void) putchar('\n'); X (void) putchar('\t'); X*************** X*** 272,278 X lng -= inc; X dpos += inc; X had++; X! } X (void) putchar('\n'); X break; X X X--- 286,302 ----- X lng -= inc; X dpos += inc; X had++; X! } X! } X! else X! { X! int last = dpos; X! do { X! dpos += 2; X! getde(fid, dpos, &dstr); X! } while(dpos < endd && dstr.d_lab == (symbol) 0); X! (void) printf("\tspace\t%d\n", dpos - last); X! } X (void) putchar('\n'); X break; X X*************** X*** 323,330 X while (bpos < endb) { X getde(fid, bpos, &bstr); X plabs(bstr.d_lab, S_BSS); X! (void) printf("\tspace\t%d\n", bstr.d_lng); X! bpos += bstr.d_lng; X } X X getde(fid, endb, &bstr); X X--- 347,366 ----- X while (bpos < endb) { X getde(fid, bpos, &bstr); X plabs(bstr.d_lab, S_BSS); X! if (bstr.d_lng) X! { X! (void) printf("\tspace\t%d\n", bstr.d_lng); X! bpos += bstr.d_lng; X! } X! else X! { X! int last = bpos; X! do { X! bpos += 2; X! getde(fid, bpos, &bstr); X! } while(bpos < endb && bstr.d_lab == (symbol) 0); X! (void) printf("\tspace\t%d\n", bpos - last); X! } X } X X getde(fid, endb, &bstr); X*** olddis/robj.c Fri Jan 20 11:13:34 1989 X--- test/robj.c Sat Jan 21 20:45:37 1989 X*************** X*** 36,43 X long gettw(), getdw(); X void reallst(), lclash(), nomem(), unimpl(); X void addit(); X! char *malloc(); X! long lseek(); X X int par_entry, par_round, nmods, donedrel, donebrel; X struct commit abstab, comtab, dreltab; X X--- 36,42 ----- X long gettw(), getdw(); X void reallst(), lclash(), nomem(), unimpl(); X void addit(); X! unsigned convtosun(); X X int nmods, donedrel, donebrel; X struct commit abstab, comtab, dreltab; X*************** X*** 39,45 X char *malloc(); X long lseek(); X X! int par_entry, par_round, nmods, donedrel, donebrel; X struct commit abstab, comtab, dreltab; X long trelpos, drelpos, brelpos; X X X--- 38,44 ----- X void addit(); X unsigned convtosun(); X X! int nmods, donedrel, donebrel; X struct commit abstab, comtab, dreltab; X long trelpos, drelpos, brelpos; X X*************** X*** 378,383 X { X t_entry tstr; X d_entry dstr; X X if (!sy->s_newsym) { X if (type & S_EXT) { X X--- 377,383 ----- X { X t_entry tstr; X d_entry dstr; X+ extern char dup_error; X X if (!sy->s_newsym) { X if (dup_error) { X*************** X*** 379,392 X t_entry tstr; X d_entry dstr; X X! if (!sy->s_newsym) { X! if (type & S_EXT) { X! (void) fprintf(stderr, "Duplicate symbol %s\n", sy->s_name); X! /* exit(10); temporary? */ X! } X! if (++sy->s_defs > nmods) X! nmods = sy->s_defs; X! sy = inventsymb("DUP"); X } X X sy->s_value = val; X X--- 379,396 ----- X d_entry dstr; X extern char dup_error; X X! if (!sy->s_newsym) { X! if (dup_error) { X! if (type & S_EXT) { X! (void) fprintf(stderr, "Duplicate symbol %s\n", sy->s_name); X! /* exit(10); temporary? */ X! } X! if (++sy->s_defs > nmods) X! nmods = sy->s_defs; X! sy = inventsymb("DUP"); X! } X! else X! return sy; X } X X sy->s_value = val; X*************** X*** 656,662 X */ X /* trelpos, drelpos ??? */ X X! rrell2(ldptr, ldptr2, outf) X LDFILE *ldptr,*ldptr2; /* a.out file (possibly in library) */ X ef_fid outf; /* Output file descriptor */ X { X X--- 660,666 ----- X */ X /* trelpos, drelpos ??? */ X X! void rrell2(ldptr, ldptr2, outf) X LDFILE *ldptr,*ldptr2; /* a.out file (possibly in library) */ X ef_fid outf; /* Output file descriptor */ X { X*************** X*** 667,673 X struct syment isym; X int nreloc; X unsigned rtype; X- register long size; X register symbol csymb; X long pos, mpos, mval, lval; X int dhere = 0; /* Mark whether bss done */ X X--- 671,676 ----- X struct syment isym; X int nreloc; X unsigned rtype; X register symbol csymb; X long pos, mpos, mval, lval; X int dhere = 0; /* Mark whether bss done */ X*************** X*** 675,681 X ldshread(ldptr,1,&tsect); X ldshread(ldptr,2,&dsect); X if (tsect.s_nreloc <= 0 && dsect.s_nreloc <= 0) X! return 0; X X nreloc = tsect.s_nreloc; X X X--- 678,684 ----- X ldshread(ldptr,1,&tsect); X ldshread(ldptr,2,&dsect); X if (tsect.s_nreloc <= 0 && dsect.s_nreloc <= 0) X! return; X X nreloc = tsect.s_nreloc; X X*** olddis/unc.h Fri Jan 20 11:14:07 1989 X--- test/unc.h Sat Jan 21 20:45:38 1989 X*************** X*** 178,180 X #define S_FN 0x1f /* file name symbol */ X #define S_EXT 01 /* external bit, or'ed in */ X #define S_TYPE 0x1e /* mask for all the type bits */ X X--- 178,185 ----- X #define S_FN 0x1f /* file name symbol */ X #define S_EXT 01 /* external bit, or'ed in */ X #define S_TYPE 0x1e /* mask for all the type bits */ X+ X+ X+ char * malloc(); X+ void free (), exit (); X+ long lseek(); SHAR_EOF chmod 0666 DIFFS || echo "restore of DIFFS fails" sed 's/^X//' << 'SHAR_EOF' > Makefile && XCC=gcc XLD=/bin/ld XCFLAGS=-O -fwritable-strings XLDFLAGS= XOBJS= alloc.o file.o libmtch.o robj.o iset.o prin.o heur.o main.o \ X conv.o constant.o XSHAREDLIB=/lib/shlib.ifile /lib/crt0s.o XLIBS=-lgcc X#SHAREDLIB=/lib/crt0.o X#LIBS=-lc X Xdis: $(OBJS) X $(LD) $(LDFLAGS) -o dis $(OBJS) $(SHAREDLIB) -lld $(LIBS) X X$(OBJS): unc.h X Xshlib.h: parseifile X ./parseifile > shlib.h X Xparseifile: y.tab.o X $(LD) $(LDFLAGS) -o parseifile y.tab.o $(SHAREDLIB) $(LIBS) X Xy.tab.o: y.tab.c X $(CC) $(CFLAGS) -c y.tab.c X Xy.tab.c: parseifile.y parseifile.h X yacc -v parseifile.y X Xconstant.c: shlib.h X SHAR_EOF chmod 0666 Makefile || echo "restore of Makefile fails" sed 's/^X//' << 'SHAR_EOF' > README.diffs && X XThis distribution cantains the file of patches (DIFFS), 4 new source files X(constant.c kernal.h parseifile.y parseifile.h) and the change log (ChangeLog). XThe documentation (man pages? wee don't need no stinkin' man pages!) is Xforthcoming. X SHAR_EOF chmod 0666 README.diffs || echo "restore of README.diffs fails" sed 's/^X//' << 'SHAR_EOF' > constant.c && Xstruct symbol { X int address; X char * name; X}; X X#include "shlib.h" X Xchar * Xlookup_address(n) X long int n; X{ X struct symbol * lo = symtab, X * hi = &symtab[TABLE_SIZE], X * mid; X char * new, * malloc (); X X if (n < 0x300000 || n > 0x380000) X return (char *) 0; X X while (lo <= hi) X { X mid = lo + (hi - lo)/2; X if (n == mid->address) X return mid->name; X else if (n > mid->address) X lo = mid + 1; X else X hi = mid - 1; X } X mid = (hi > lo ? lo : hi); X new = malloc ((unsigned) strlen (mid->name) + 10); X sprintf(new, "%s+0x%x", mid->name, n - mid->address); X return new; X} X X#include "kernal.h" X Xchar * Xlookup_kernal_address(n) X long int n; X{ X struct symbol * lo = kerntab, X * hi = &kerntab[KERNAL_TABLE_SIZE], X * mid; X X while (lo <= hi) X { X mid = lo + (hi - lo)/2; X if (n == mid->address) X return mid->name; X else if (n > mid->address) X lo = mid + 1; X else X hi = mid - 1; X } X X return (char *) 0; X} X SHAR_EOF chmod 0666 constant.c || echo "restore of constant.c fails" sed 's/^X//' << 'SHAR_EOF' > kernal.h && X/* X kernal.h - interesting kernal addresses from various header files. X X This file is probably extremly dependant on the OS version. As distributed X is was created from the 3.51 header files. I did my best to be accurate, but X there may be typos (i did check). X*/ X X#define KERNAL_TABLE_SIZE 142 X Xstruct symbol kerntab[] = { X {0x70000, "VPG_BASE"}, X {0x70900, "u.u_rsav"}, X {0x70934, "u.u_qsav"}, X {0x70968, "u.u_ssav"}, X {0x7099C, "u.u_segflg"}, X {0x7099D, "u.u_error"}, X {0x7099E, "u.u_uid"}, X {0x709A0, "u.u_gid"}, X {0x709A2, "u.u_ruid"}, X {0x709A4, "u.u_rgid"}, X {0x709A6, "u.u_procp"}, X {0x709AA, "u.u_ap"}, X {0x709AE, "u.u_rval1"}, X {0x709B2, "u.u_rval2"}, X {0x709B6, "u.u_base"}, X {0x709BA, "u.u_count"}, X {0x709BE, "u.u_offset"}, X {0x709C2, "u.u_fmode"}, X {0x709C4, "u.u_pbsize"}, X {0x709C6, "u.u_pboff"}, X {0x709C8, "u.u_pbdev"}, X {0x709CA, "u.u_rablock"}, X {0x709CE, "u.u_errcnt"}, X {0x709D0, "u.u_cdir"}, X {0x709D4, "u.u_rdir"}, X {0x709D8, "u.u_dirp"}, X {0x709E8, "u.u_pdir"}, X {0x709EC, "u.u_ofile"}, X {0x709F0, "u.u_pofile"}, X {0x709f4, "u.FillerYUK"}, X {0x70A54, "u.u_arg"}, X {0x70A7C, "u_tsize"}, X {0x70A80, "u_dsize"}, X {0x70A84, "u_ssize"}, X {0x70A88, "u_lsize"}, X {0x70A8C, "u.u_signal"}, X {0x70B0C, "u.u_utime"}, X {0x70B10, "u.u_stime"}, X {0x70B14, "u.u_cutime"}, X {0x70B18, "u.u_cstime"}, X {0x70B1C, "u.u_ar0"}, X {0x70B20, "u.u_prof.pr_base"}, X {0x70B24, "u.u_prof.pr_size"}, X {0x70B28, "u.u_prof.pr_off"}, X {0x70B2C, "u.u_prof.pr_scale"}, X {0x70B30, "u.u_ttyp"}, X {0x70B34, "u.u_ttyd"}, X {0x70B36, "u.u_exdata.ux_mag"}, X {0x70B38, "u.u_exdata.ux_stamp"}, X {0x70B3A, "u.u_exdata.ux_tsize"}, X {0x70B3E, "u.u_exdata.ux_dsize"}, X {0x70B42, "u.u_exdata.ux_bsize"}, X {0x70B46, "u.u_exdata.ux_ssize"}, X {0x70B4A, "u.u_exdata.ux_entloc"}, X {0x70B4E, "u.u_exdata.ux_unused"}, X {0x70B52, "u.u_exdata.ux_relflag"}, X {0x70B56, "u.u_xlsize"}, X {0x70B5A, "u.u_comm"}, X {0x70B68, "u.u_start"}, X {0x70B6C, "u.u_ticks"}, X {0x70B70, "u.u_mem"}, X {0x70B74, "u.u_ior"}, X {0x70B78, "u.u_iow"}, X {0x70B7C, "u.u_iosw"}, X {0x70B80, "u.u_ioch"}, X {0x70B84, "u.u_acflag"}, X {0x70B86, "u.u_cmask"}, X {0x70B88, "u.u_limit"}, X {0x70B90, "u.u_limit[LIM_NORAISE]"}, X {0x70B90, "u.u_limit[LIM_FSIZE]"}, X {0x70B90, "u.u_limit[LIM_CPU]"}, X {0x70B90, "u.u_limit[LIM_DATA]"}, X {0x70B90, "u.u_limit[LIM_STACK]"}, X {0x70B90, "u.u_limit[LIM_CORE]"}, X {0x70B90, "u.u_limit[LIM_MAXRSS]"}, X {0x70ba4, "u.u_dmap"}, X {0x70bca, "u.u_smap"}, X {0x70bf0, "u.u_cdmap"}, X {0x70C16, "u.u_csmap"}, X {0x70C3C, "u.u_outtime"}, X {0x70C40, "u.u_usize"}, X {0x70C42, "u.u_lock"}, X {0x70E00, "VPTE_BASE"}, X {0x400000, "PG_BASE"}, X {0x4000C0, "DMA_MAP"}, X {0x4000DC, "DMA_UPTR"}, X {0x4000E0, "UPTE"}, X {0x400100, "USER_MAP"}, X {0x400600, "MAP_TOP"}, X {0x410000, "GSR_ADDR"}, X {0x420000, "VIDMEM"}, X {0x430000, "BUS0_ADDR"}, X {0x440000, "BUS1_ADDR"}, X {0x450000, "PHONE_STATUS"}, X {0x460000, "DMA_CNT"}, X {0x470000, "LP_STATUS_ADDR"}, X {0x480000, "RTC_WRITE_ADDRESS"}, X {0x490000, "HNDSET_RELAY"}, X {0x491000, "LINE_SELECT"}, X {0x492000, "HOOK1_RELAY"}, X {0x493000, "HOOK2_RELAY"}, X {0x494000, "LINE1_ACTIVE"}, X {0x495000, "LINE2_ACTIVE"}, X {0x496000, "A_LEAD1_RELAY"}, X {0x497000, "A_LEAD2_RELAY"}, X {0x4A0000, "MCR_ADDR"}, X {0x4B0000, "A_BAUD_ADDR"}, X {0x4B0400, "DIALER_LOWER"}, X {0x4B0800, "DIALER_HIGHER"}, X {0x4C0000, "CSR_ADDR"}, X {0x4D0000, "DMA_LOADDR"}, X {0x4D4000, "DMA_HIADDR"}, X {0x4E0000, "DISK_CNTRL"}, X {0x4f0000, "LP_DATA_ADDR"}, X {0xE00000, "HD_BASE"}, X {0xE10000, "FD_BASE"}, X {0xE20000, "MCR2_ADDR"}, X {0xE30000, "RTC_READ_ADDDR"}, X {0xE40000, "SYSERR_GCR_ADDR"}, X {0xE41000, "PE_INT_GCR_ADDR"}, X {0xE42000, "PE_FRC_GCR_ADDR"}, X {0xE43000, "ROM_GCR_ADDR"}, X {0xE44000, "L1MD_GCR_ADDR"}, X {0xE45000, "L2MD_GCR_ADDR"}, X {0xE46000, "DNCT_GCR_ADDR"}, X {0xE50000, "A_DATA_ADDR"}, X {0xE50002, "B_DATA_ADDR"}, X {0xE50004, "A_CMND_ADDR"}, X {0xE50006, "B_CMND_ADDR"}, X {0xE60000, "SCM_0W_Control"}, X {0xE61000, "SCM_1W_Control"}, X {0xE62000, "SCM_2R_Control"}, X {0xE63000, "SCM_3R_Control"}, X {0xE64000, "SCM_4W_Control"}, X {0xE65000, "SCM_5W_Control"}, X {0xE66000, "SCM_6W_Control"}, X {0xE68000, "SCM_8W_Control"}, X {0xE69000, "SCM_9W_Control"}, X {0xE6A000, "SCM_10R_Control"}, X {0xE70000, "C_CMND_ADDR"}, X {0xE70002, "C_DATA_ADDR"}, X {0x7fffffff, "CDLIMIT"}, X}; SHAR_EOF chmod 0666 kernal.h || echo "restore of kernal.h fails" sed 's/^X//' << 'SHAR_EOF' > parseifile.h && X/* X * parseifile.h - header file for parseifile.y X * X * Written by Alex Crain X * X */ X X#define DEFAULT_IFILE "/lib/shlib.ifile" X#define DEFAULT_TABLE_SIZE 2500 X X#define HEADER "\ X/*\n\ X * This is a computer generated file.\n\ X *\n\ X * The file contains a table declaration and accessor function for adding\n\ X * builting symbol values to the 68k dissassembler.\n\ X *\n\ X * This file is generated by the parseifile program, written by Alex Crain.\n\ X *\n\ X */\n\ X" SHAR_EOF chmod 0666 parseifile.h || echo "restore of parseifile.h fails" sed 's/^X//' << 'SHAR_EOF' > parseifile.y && X%{ X X/* X * ifile processor for unix-pc disassembler X * X * Written by Alex Crain - January 1988 X * X * Copyright 1988 Alex Crain X */ X X#include <stdio.h> X#include <string.h> X#include <ctype.h> X#include "parseifile.h" X Xchar * malloc (); Xlong strtol (); Xint GetC (), NextC (), yylex (); Xvoid fatal (), gen_file (), UnGetC (), sort_symbols (), exit (), free (); X X#define yyerror(MSG) fatal (MSG) X Xstruct symbol { X long address; X char * name; X}; X Xstatic char * ifile_name = DEFAULT_IFILE; Xstatic FILE * ifile; Xstatic struct symbol * symtab; Xstatic int table_size = 0, max_table_size = DEFAULT_TABLE_SIZE; X Xextern int yydebug; X#define YYDEBUG 1 X Xvoid Xmain (argc, argv) Xint argc; Xchar ** argv; X{ X int c; X extern char * optarg; X X yydebug = 0; X X while ((c = getopt (argc, argv, "df:s:")) != EOF) X switch (c) X { X case 'd': X yydebug = 1; X break; X case 'f': X ifile_name = optarg; X break; X case 's': X max_table_size = strtol (optarg, (char **) 0, 0); X break; X case '?': X fatal ("Usage: parseifile [-d] [-f ifile] [-s table-size]."); X } X X if ((ifile = fopen (ifile_name, "r")) == NULL) X fatal ("Cannot open ifile."); X X symtab = (struct symbol *) malloc (sizeof(struct symbol) * max_table_size); X if (symtab == NULL) X fatal ("Out of memory."); X X (void) yyparse (); X sort_symbols (); X gen_file (); X exit (0); X /*NOTREACHED*/ X} X X%} X X%union { X long integer; X char * string; X} X X%token FLAG X%token '{' X%token '}' X%token '=' X%token '+' X%token ';' X%token <string> SOMETHING X X%type <integer> expression X X%% X Xfile X : definitions X ; X Xdefinitions X : definition X | definitions definition X ; X Xdefinition X : directive X | assignment X | FLAG X ; X Xdirective X : SOMETHING block X { if ($1) (void) free ($1); } X ; X Xassignment X : SOMETHING '=' expression ';' X { add_symbol ($1, $3); } X ; X Xexpression X : SOMETHING X { if (isdigit ($1[0])) X $$ = strtol ($1, (char **)0, 0); X else X $$ = lookup_symbol ($1); X (void) free ($1); X } X | expression '+' SOMETHING X { if (isdigit ($3[0])) X $$ = $1 + strtol ($3, (char **)0, 0); X else X $$ = $1 + lookup_symbol ($3); X (void) free ($3); X } X ; X Xblock X : '{' stuff_list '}' X | '{' '}' X ; X Xstuff_list X : stuff X | stuff_list stuff X ; X Xstuff X : SOMETHING X { if ($1) (void) free ($1); } X | block X | '+' X | '=' X | ';' X ; X X%% X Xint lookahead = 0; Xint yylineno = 0; X Xint XGetC () X{ X int c; X X if (lookahead) X { X c = lookahead; X lookahead = 0; X } X else X { X c = getc (ifile); X if (c == '\n') X yylineno++; X } X return c; X} X Xint XNextC () X{ X if (! lookahead) X lookahead = getc (ifile); X return lookahead; X} X Xvoid XUnGetC (c) X int c; X{ X lookahead = c; X} X Xint Xyylex () X{ X int c; X static char buffer[128]; X X start: X while (((c = GetC ()) != EOF) && isspace (c)); X if (c == '/' && NextC () == '*') X { X do { X c=GetC (); X } while (c != EOF && (c != '*' || NextC () != '/')); X c = GetC (); X goto start; X } X X if (isalnum (c) || c == '_') X { X int i = 0; X X while ((isalnum (c) || c == '_') && i < 128) X { X buffer[i++] = c; X c = GetC (); X } X UnGetC (c); X buffer[i] = '\0'; X yylval.string = malloc (sizeof (buffer) + 1); X if (yylval.string) X (void) strcpy (yylval.string, buffer); X else X fatal ("Out of memory."); X if (yydebug) X (void) printf ("(%s)", buffer); X return SOMETHING; X } X X if (c == '-') X { X while ((c = GetC ()) != EOF && c != '\n'); X return FLAG; X } X X switch (c) X { X case '{': X case '}': X case '+': X case '=': X case ';': X return c; X case EOF: X return EOF; X default: X yylval.string = (char *) 0; X return SOMETHING; X } X} X Xvoid Xadd_symbol (symbol,address) X char * symbol; X long address; X{ X symtab[table_size].name = symbol; X symtab[table_size].address = address; X table_size++; X} X Xvoid Xgen_file () X{ X int i; X X (void) puts (HEADER); X (void) printf ("#define TABLE_SIZE %d\n", table_size); X (void) puts ("struct symbol symtab[] = {"); X for (i=0; i<table_size; i++) X (void) printf ("{0x%x,\"%s\"},\n", symtab[i].address, symtab[i].name); X (void) puts ("};"); X} X Xvoid Xfatal (msg) X char * msg; X{ X (void) fputs ("pareifile: ", stderr); X if (yylineno) X (void) fprintf (stderr, "[line %d]: ", yylineno); X (void) fputs (msg, stderr); X (void) putc('\n', stderr); X (void) exit (1); X X} X Xlong Xlookup_symbol(s) X char * s; X{ X int i = 0; X X while (i < table_size) X { X if (strcmp (symtab[i].name, s)) X i++; X else X return symtab[i].address; X } X fatal ("unreferenced symbol."); X /*NOTREACHED*/ X} X X Xvoid Xsort_symbols () X{ X int i, j; X for (i = table_size - 1; i; i--) X for (j = 0; j < table_size - 1; j++) X if (symtab[j].address > symtab[j+1].address) X { X union { long l; char * s; } temp; X X temp.l = symtab[j].address; X symtab[j].address = symtab[j+1].address; X symtab[j+1].address = temp.l; X temp.s = symtab[j].name; X symtab[j].name = symtab[j+1].name; X symtab[j+1].name = temp.s; X } X} SHAR_EOF chmod 0666 parseifile.y || echo "restore of parseifile.y fails" exit 0