*** ranlib.c Mon Sep 15 16:26:28 1986 --- /usr/staff/tadl/nfs/usr.bin/ranlib.c Sun May 18 18:48:42 1986 *************** *** 1,23 **** --- 1,11 ---- -</* -< * Copyright (c) 1980 Regents of the University of California. -< * All rights reserved. The Berkeley software License Agreement -< * specifies the terms and conditions for redistribution. -< */ -< #ifndef lint !<char copyright[] = !<"@(#) Copyright (c) 1980 Regents of the University of California.\n\ !< All rights reserved.\n"; !<#endif not lint !< !<#ifndef lint !<static char sccsid[] = "@(#)ranlib.c 5.3 (Berkeley) 1/22/86"; !<#endif not lint !< /* * ranlib - create table of contents for archive; string table version */ #include <sys/types.h> #include <ar.h> #include <ranlib.h> #include <a.out.h> --------------- #ifndef lint !>static char sccsid[] = "@(#)ranlib.c 1.1 85/05/31 SMI"; /* from UCB 4.6 05/22/83 */ !>#endif /* * ranlib - create table of contents for archive; string table version */ #include <sys/types.h> +>#include <sys/stat.h> #include <ar.h> #include <ranlib.h> #include <a.out.h> *************** *** 30,38 **** --- 18,30 ---- FILE *fi, *fo; long off, oldoff; long atol(), ftell(); !<#define TABSZ 3000 int tnum; !<#define STRTABSZ 30000 int tssiz; char *strtab; int ssiz; --------------- FILE *fi, *fo; long off, oldoff; long atol(), ftell(); !>#define TABSZ 6000 !>int tabsz = TABSZ; !>struct ranlib *tab; int tnum; !>#define STRTABSZ 75000 !>int strtabsz = STRTABSZ; !>char *tstrtab; int tssiz; char *strtab; int ssiz; *************** *** 39,63 **** --- 31,37 ---- int new; char tempnm[] = "__.SYMDEF"; char firstname[17]; -<void stash(); -<char *malloc(), *calloc(); -</* -< * table segment definitions -< */ -<char *segalloc(); -<void segclean(); -<struct tabsegment { -< struct tabsegment *pnext; -< unsigned nelem; -< struct ranlib tab[TABSZ]; -<} tabbase, *ptabseg; -<struct strsegment { -< struct strsegment *pnext; -< unsigned nelem; -< char stab[STRTABSZ]; -<} strbase, *pstrseg; -< main(argc, argv) char **argv; { --------------- main(argc, argv) char **argv; { *************** *** 65,82 **** --- 39,52 ---- /* magbuf must be an int array so it is aligned on an int-ish boundary, so that we may access its first word as an int! */ int magbuf[(SARMAG+sizeof(int))/sizeof(int)]; -< register int just_touch = 0; -< register struct tabsegment *ptab; -< register struct strsegment *pstr; -< /* check for the "-t" flag" */ -< if (argc > 1 && strcmp(argv[1], "-t") == 0) { -< just_touch++; -< argc--; -< argv++; -< } -< --argc; while(argc--) { fi = fopen(*++argv,"r"); if (fi == NULL) { --------------- /* magbuf must be an int array so it is aligned on an int-ish boundary, so that we may access its first word as an int! */ int magbuf[(SARMAG+sizeof(int))/sizeof(int)]; --argc; +> /* allocate initial buffers */ +> if ( (tab= (struct ranlib *)malloc( TABSZ*sizeof *tab )) == 0 +> || (tstrtab = (char *)malloc( STRTABSZ*sizeof *tstrtab)) == 0 ) { +> fprintf(stderr, "ranlib: cannot allocate buffers\n"); +> exit(1); +> } while(argc--) { fi = fopen(*++argv,"r"); if (fi == NULL) { *************** *** 93,120 **** --- 63,70 ---- fprintf(stderr, "archive: %s\n", *argv); continue; } -< if (just_touch) { -< register int len; -< -< fseek(fi, (long) SARMAG, 0); -< if (fread(cmdbuf, sizeof archdr.ar_name, 1, fi) != 1) { -< fprintf(stderr, "malformed archive: %s\n", -< *argv); -< continue; -< } -< len = strlen(tempnm); -< if (bcmp(cmdbuf, tempnm, len) != 0 || -< cmdbuf[len] != ' ') { -< fprintf(stderr, "no symbol table: %s\n", *argv); -< continue; -< } -< fclose(fi); -< fixdate(*argv); -< continue; -< } fseek(fi, 0L, 0); !< new = tssiz = tnum = 0; !< segclean(); if (nextel(fi) == 0) { fclose(fi); continue; --------------- fprintf(stderr, "archive: %s\n", *argv); continue; } fseek(fi, 0L, 0); !> new = tnum = 0; if (nextel(fi) == 0) { fclose(fi); continue; *************** *** 127,134 **** --- 77,82 ---- fread((char *)&exp, 1, sizeof(struct exec), fi); if (N_BADMAG(exp)) continue; -< if (!strncmp(tempnm, archdr.ar_name, sizeof(archdr.ar_name))) -< continue; if (exp.a_syms == 0) { fprintf(stderr, "ranlib: warning: %s(%s): no symbol table\n", *argv, archdr.ar_name); continue; --------------- if (exp.a_syms == 0) { fprintf(stderr, "ranlib: warning: %s(%s): no symbol table\n", *argv, archdr.ar_name); continue; *************** *** 135,149 **** --- 83,97 ---- } o = N_STROFF(exp) - sizeof (struct exec); if (ftell(fi)+o+sizeof(ssiz) >= off) { !< fprintf(stderr, "ranlib: warning: %s(%s): old format .o file\n", *argv, archdr.ar_name); !< continue; } fseek(fi, o, 1); fread((char *)&ssiz, 1, sizeof (ssiz), fi); if (ssiz < sizeof ssiz){ /* sanity check */ !< fprintf(stderr, "ranlib: warning: %s(%s): mangled string table\n", *argv, archdr.ar_name); !< continue; } strtab = (char *)calloc(1, ssiz); if (strtab == 0) { --------------- } 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) { *************** *** 172,178 **** --- 120,125 ---- continue; } } -< free(strtab); } while(nextel(fi)); new = fixsize(); fclose(fi); --------------- } while(nextel(fi)); new = fixsize(); fclose(fi); *************** *** 184,202 **** --- 131,139 ---- tnum *= sizeof (struct ranlib); fwrite(&tnum, 1, sizeof (tnum), fo); tnum /= sizeof (struct ranlib); !< ptab = &tabbase; !< do { !< fwrite((char *)ptab->tab, ptab->nelem, !< sizeof(struct ranlib), fo); !< } while (ptab = ptab->pnext); fwrite(&tssiz, 1, sizeof (tssiz), fo); !< pstr = &strbase; !< do { !< fwrite(pstr->stab, pstr->nelem, 1, fo); !< tssiz -= pstr->nelem; !< } while (pstr = pstr->pnext); !< /* pad with nulls */ !< while (tssiz--) putc('\0', fo); fclose(fo); if(new) sprintf(cmdbuf, "ar rlb %s %s %s\n", firstname, *argv, tempnm); --------------- 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); *************** *** 232,345 **** --- 169,206 ---- return(1); } -<void stash(s) struct nlist *s; { register char *cp; -< register char *strtab; -< register strsiz; -< register struct ranlib *tab; -< register tabsiz; !< if (ptabseg->nelem >= TABSZ) { !< /* allocate a new symbol table segment */ !< ptabseg = ptabseg->pnext = !< (struct tabsegment *) segalloc(sizeof(struct tabsegment)); !< ptabseg->pnext = NULL; !< ptabseg->nelem = 0; } -< tabsiz = ptabseg->nelem; -< tab = ptabseg->tab; -< -< if (pstrseg->nelem >= STRTABSZ) { -< /* allocate a new string table segment */ -< pstrseg = pstrseg->pnext = -< (struct strsegment *) segalloc(sizeof(struct strsegment)); -< pstrseg->pnext = NULL; -< pstrseg->nelem = 0; } !< strsiz = pstrseg->nelem; !< strtab = pstrseg->stab; !< !< tab[tabsiz].ran_un.ran_strx = tssiz; !< tab[tabsiz].ran_off = oldoff; !<redo: !< for (cp = s->n_un.n_name; strtab[strsiz++] = *cp++;) !< if (strsiz >= STRTABSZ) { !< /* allocate a new string table segment */ !< pstrseg = pstrseg->pnext = !< (struct strsegment *) segalloc(sizeof(struct strsegment)); !< pstrseg->pnext = NULL; !< strsiz = pstrseg->nelem = 0; !< strtab = pstrseg->stab; !< goto redo; !< } !< !< tssiz += strsiz - pstrseg->nelem; /* length of the string */ !< pstrseg->nelem = strsiz; !< tnum++; !< ptabseg->nelem++; !<} !< !</* allocate a zero filled segment of size bytes */ !<char * !<segalloc(size) !<unsigned size; !<{ !< char *pseg = NULL; !< !< pseg = malloc(size); !< if (pseg == NULL) { !< fprintf(stderr, "ranlib: ran out of memeory\n"); exit(1); } -< return(pseg); } !< !</* free segments */ !<void !<segclean() !<{ !< register struct tabsegment *ptab; !< register struct strsegment *pstr; !< !< /* !< * symbol table !< * !< * The first entry is static. !< */ !< ptabseg = &tabbase; !< ptab = ptabseg->pnext; !< while (ptabseg = ptab) { !< ptab = ptabseg->pnext; !< free((char *)ptabseg); } -< ptabseg = &tabbase; -< ptabseg->pnext = NULL; -< ptabseg->nelem = 0; -< /* -< * string table -< * -< * The first entry is static. -< */ -< pstrseg = &strbase; -< pstr = pstrseg->pnext; -< while (pstrseg = pstr) { -< pstr = pstrseg->pnext; -< free((char *)pstrseg); -< } -< pstrseg = &strbase; -< pstrseg->pnext = NULL; -< pstrseg->nelem = 0; -<} -< fixsize() { int i; off_t offdelta; -< register struct tabsegment *ptab; if (tssiz&1) tssiz++; --------------- return(1); } stash(s) struct nlist *s; { +> int i; register char *cp; !> if (tnum >= tabsz) { !> tabsz *= 2; !> tab = (struct ranlib *)realloc( tab, tabsz*sizeof *tab ); !> if (tab == 0){ !> fprintf(stderr, "ranlib: symbol table overflow\n"); !> exit(1); } } !> tab[tnum].ran_un.ran_strx = tssiz; !> tab[tnum].ran_off = oldoff; !> for (cp = s->n_un.n_name; tstrtab[tssiz++] = *cp++;) !> if (tssiz > strtabsz) { !> strtabsz *= 2; !> tstrtab = (char *)realloc( tstrtab, strtabsz*sizeof *tstrtab); !> if (tstrtab == 0) { !> fprintf(stderr, "ranlib: string table overflow\n"); exit(1); } } !> tnum++; } fixsize() { int i; off_t offdelta; if (tssiz&1) tssiz++; *************** *** 354,364 **** --- 215,222 ---- new = 1; strncpy(firstname, archdr.ar_name, sizeof(archdr.ar_name)); } !< ptab = &tabbase; !< do { !< for (i = 0; i < ptab->nelem; i++) !< ptab->tab[i].ran_off += offdelta; !< } while (ptab = ptab->pnext); return(new); } --------------- new = 1; strncpy(firstname, archdr.ar_name, sizeof(archdr.ar_name)); } !> for(i=0; i<tnum; i++) !> tab[i].ran_off += offdelta; return(new); } *************** *** 368,374 **** --- 226,233 ---- { long time(); char buf[24]; !< int fd; fd = open(s, 1); if(fd < 0) { --------------- { long time(); char buf[24]; !> int fd, tm; !> struct stat stat; fd = open(s, 1); if(fd < 0) { *************** *** 375,381 **** --- 234,246 ---- fprintf(stderr, "ranlib: can't reopen %s\n", s); return; } !< sprintf(buf, "%-*ld", sizeof(archdr.ar_date), time((long *)NULL)+5); lseek(fd, (long)SARMAG + ((char *)archdr.ar_date-(char *)&archdr), 0); write(fd, buf, sizeof(archdr.ar_date)); close(fd); --------------- fprintf(stderr, "ranlib: can't reopen %s\n", s); return; } !> if (fstat(fd, &stat) < 0) { !> fprintf(stderr, "ranlib: can't stat %s\n", s); !> return; !> } !> tm = time((long *)NULL); !> tm = (tm > stat.st_mtime) ? tm : stat.st_mtime; !> sprintf(buf, "%-*ld", sizeof(archdr.ar_date), tm + 5); lseek(fd, (long)SARMAG + ((char *)archdr.ar_date-(char *)&archdr), 0); write(fd, buf, sizeof(archdr.ar_date)); close(fd);