- --argc;
- while(argc--) {
- fi = fopen(*++argv,"r");
- if (fi == NULL) {
- fprintf(stderr, "ranlib: cannot open %s\n", *argv);
- continue;
- }
- off = SARMAG;
- fread((char *)magbuf, 1, SARMAG, fi);
- if (strncmp((char *)magbuf, ARMAG, SARMAG)) {
- if (magbuf[0] == OARMAG)
- fprintf(stderr, "old format ");
- else
- fprintf(stderr, "not an ");
- fprintf(stderr, "archive: %s\n", *argv);
- continue;
- }
- fseek(fi, 0L, 0);
- new = tnum = 0;
- if (nextel(fi) == 0) {
- fclose(fi);
- continue;
- }
- do {
- long o;
- register n;
- struct nlist sym;
-
- fread((char *)&exp, 1, sizeof(struct exec), fi);
- if (N_BADMAG(exp))
- continue;
- if (exp.a_syms == 0) {
- fprintf(stderr, "ranlib: warning: %s(%s): no symbol table\n", *argv, archdr.ar_name);
- continue;
- }
- o = N_STROFF(exp) - sizeof (struct exec);
- if (ftell(fi)+o+sizeof(ssiz) >= off) {
- fprintf(stderr, "ranlib: %s(%s): old format .o file\n", *argv, archdr.ar_name);
- exit(1);
- }
- fseek(fi, o, 1);
- fread((char *)&ssiz, 1, sizeof (ssiz), fi);
- if (ssiz < sizeof ssiz){
- /* sanity check */
- fprintf(stderr, "ranlib: %s(%s): mangled string table\n", *argv, archdr.ar_name);
- exit(1);
- }
- strtab = (char *)calloc(1, ssiz);
- if (strtab == 0) {
- fprintf(stderr, "ranlib: ran out of memory\n");
- exit(1);
- }
- fread(strtab+sizeof(ssiz), ssiz - sizeof(ssiz), 1, fi);
- fseek(fi, -(exp.a_syms+ssiz), 1);
- n = exp.a_syms / sizeof(struct nlist);
- while (--n >= 0) {
- fread((char *)&sym, 1, sizeof(sym), fi);
- if (sym.n_un.n_strx == 0)
- continue;
- sym.n_un.n_name = strtab + sym.n_un.n_strx;
- if ((sym.n_type&N_EXT)==0)
- continue;
- switch (sym.n_type&N_TYPE) {
-
- case N_UNDF:
- if (sym.n_value!=0)
- stash(&sym);
- continue;
-
- default:
- stash(&sym);
- continue;
- }
- }
- } while(nextel(fi));
- new = fixsize();
- fclose(fi);
- fo = fopen(tempnm, "w");
- if(fo == NULL) {
- fprintf(stderr, "can't create temporary\n");
- exit(1);
- }
- tnum *= sizeof (struct ranlib);
- fwrite(&tnum, 1, sizeof (tnum), fo);
- tnum /= sizeof (struct ranlib);
- fwrite((char *)tab, tnum, sizeof(struct ranlib), fo);
- fwrite(&tssiz, 1, sizeof (tssiz), fo);
- fwrite(tstrtab, tssiz, 1, fo);
- fclose(fo);
- if(new)
- sprintf(cmdbuf, "ar rlb %s %s %s\n", firstname, *argv, tempnm);
- else
- sprintf(cmdbuf, "ar rl %s %s\n", *argv, tempnm);
- if(system(cmdbuf))
- fprintf(stderr, "ranlib: ``%s'' failed\n", cmdbuf);
- else
- fixdate(*argv);
- unlink(tempnm);
- }
- exit(0);
-}
-
-nextel(af)
-FILE *af;
-{
- register r;
- register char *cp;