X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fasranlib%2Fasranlib.c;h=237b1f946390335e3b6a2170eacab9720c5f730c;hb=22814205e089088fdbbefbe2155018e9bd559154;hp=ab13c6785b857739342ffda4c68af151f5d16f4d;hpb=b7fec7bdb767e95165097f43e52cf1cbc4ee6017;p=fw%2Fsdcc diff --git a/as/asranlib/asranlib.c b/as/asranlib/asranlib.c index ab13c678..237b1f94 100644 --- a/as/asranlib/asranlib.c +++ b/as/asranlib/asranlib.c @@ -231,7 +231,7 @@ get_member_name_by_offset (FILE * fp, long offset) struct symbol_s { const char *name; - off_t offset; + size_t offset; struct symbol_s *next; }; @@ -362,12 +362,13 @@ enum_symbols (FILE * fp, long size, int (*func) (const char *sym, void *param), static int process_symbol_table (struct ar_hdr *hdr, FILE *fp) { + long pos = ftell (fp); + if (print_index) { char *buf, *po, *ps; int i; long nsym; - long pos; printf ("Archive index:\n"); @@ -379,8 +380,6 @@ process_symbol_table (struct ar_hdr *hdr, FILE *fp) return 0; } - pos = ftell (fp); - nsym = sgetl (buf); po = buf + 4; @@ -393,13 +392,16 @@ process_symbol_table (struct ar_hdr *hdr, FILE *fp) offset = sgetl (po); po += 4; - printf ("%s in ", ps); - ps += strlen(ps) + 1; - obj = get_member_name_by_offset (fp, offset); /* member name */ - printf ("%s\n", obj); + printf ("%s in %s", ps, obj); + if (verbose) + printf (" at 0x%04x\n", offset); + else + putchar ('\n'); free (obj); + ps += strlen(ps) + 1; + } free (buf); @@ -407,11 +409,9 @@ process_symbol_table (struct ar_hdr *hdr, FILE *fp) putchar ('\n'); } - else - { - /* skip the symbol table */ - fseek (fp, hdr->ar_size + (hdr->ar_size & 1), SEEK_CUR); - } + + /* skip the symbol table */ + fseek (fp, pos + hdr->ar_size + (hdr->ar_size & 1), SEEK_SET); return 1; } @@ -419,13 +419,14 @@ process_symbol_table (struct ar_hdr *hdr, FILE *fp) static int process_bsd_symbol_table (struct ar_hdr *hdr, FILE *fp) { + long pos = ftell (fp); + if (print_index) { char *buf, *po, *ps; int i; long tablesize; long nsym; - long pos; printf ("Archive index:\n"); @@ -437,8 +438,6 @@ process_bsd_symbol_table (struct ar_hdr *hdr, FILE *fp) return 0; } - pos = ftell (fp); - tablesize = sgetl (buf); nsym = tablesize / 8; @@ -468,11 +467,9 @@ process_bsd_symbol_table (struct ar_hdr *hdr, FILE *fp) putchar ('\n'); } - else - { - /* skip the symbol table */ - fseek (fp, hdr->ar_size + (hdr->ar_size & 1), SEEK_CUR); - } + + /* skip the symbol table */ + fseek (fp, pos + hdr->ar_size + (hdr->ar_size & 1), SEEK_SET); return 1; } @@ -481,9 +478,10 @@ int get_symbols (FILE * fp, const char *archive) { struct ar_hdr hdr; + size_t hdr_len; char *name; - if (!is_ar (fp) || !ar_get_header (&hdr, fp, &name)) + if (!is_ar (fp) || !(hdr_len = ar_get_header (&hdr, fp, &name))) { fprintf (stderr, "asranlib: %s: File format not recognized\n", archive); exit (1); @@ -494,7 +492,7 @@ get_symbols (FILE * fp, const char *archive) free (name); process_symbol_table (&hdr, fp); - if (!ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL)) + if (!(hdr_len = ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL))) return 1; } else if (AR_IS_BSD_SYMBOL_TABLE (name)) @@ -502,11 +500,13 @@ get_symbols (FILE * fp, const char *archive) free (name); process_bsd_symbol_table (&hdr, fp); - if (!ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL)) + if (!(hdr_len = ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL))) return 1; } + else if (!verbose && !list) + free (name); - first_member_offset = ftell (fp) - ARHDR_LEN; + first_member_offset = ftell (fp) - hdr_len; /* walk trough all archive members */ do @@ -523,17 +523,11 @@ get_symbols (FILE * fp, const char *archive) { long mdule_offset = ftell (fp); - offset = mdule_offset - ARHDR_LEN; + offset = mdule_offset - hdr_len; enum_symbols (fp, hdr.ar_size, add_symbol, NULL); - fseek (fp, mdule_offset + hdr.ar_size, SEEK_SET); - - if (hdr.ar_size & 1) - { - int c = getc (fp); - assert (c == EOF || c == '\n'); - } + fseek (fp, mdule_offset + hdr.ar_size + (hdr.ar_size & 1), SEEK_SET); } if (verbose) @@ -551,7 +545,7 @@ get_symbols (FILE * fp, const char *archive) fseek (fp, hdr.ar_size + (hdr.ar_size & 1), SEEK_CUR); } } - while (ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL)); + while ((hdr_len = ar_get_header (&hdr, fp, (verbose || list) ? &name : NULL))); return 1; }