struct symbol_s
{
const char *name;
- off_t offset;
+ size_t offset;
struct symbol_s *next;
};
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");
return 0;
}
- pos = ftell (fp);
-
nsym = sgetl (buf);
po = buf + 4;
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);
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;
}
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");
return 0;
}
- pos = ftell (fp);
-
tablesize = sgetl (buf);
nsym = tablesize / 8;
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;
}
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);
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))
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
{
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)
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;
}