v06i038: 68K COFF dissassembler - patch 1
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Sat Feb 4 13:25:21 AEST 1989
Posting-number: Volume 6, Issue 38
Submitted-by: alex at 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 at umbc3.umbc.edu (NEW DOMAIN!)
Univ Md Baltimore County nerwin!alex at 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
More information about the Comp.sources.misc
mailing list