|
|
1.1 ! root 1: /* ! 2: * various subroutines to deal with archive headers ! 3: */ ! 4: ! 5: #include "asd.h" ! 6: #include <ctype.h> ! 7: #include <stdio.h> ! 8: #include <string.h> ! 9: ! 10: struct hdr hdr; ! 11: ! 12: /* ! 13: * convert p to a long value. maximum input length is len, ! 14: * input is to be interpreted in base b. No negative values. ! 15: */ ! 16: long ! 17: cvlong (char *p, size_t len, int base) ! 18: { ! 19: register int i; ! 20: register long r; ! 21: ! 22: r = 0; ! 23: i = len; ! 24: ! 25: do { ! 26: register int c = *p++; ! 27: if (isdigit (c)) ! 28: r = r * base + c - '0'; ! 29: } while (--i > 0); ! 30: ! 31: return r; ! 32: } ! 33: ! 34: long ! 35: read_header (char *name, FILE *file) ! 36: { ! 37: register int n; ! 38: register int i; ! 39: register char *p, *q; ! 40: ! 41: n = fread ((char *) &ar_hdr, sizeof (ar_hdr), 1, file); ! 42: if (n != 1) { ! 43: fprintf (stderr, "can't read %s\n", name); ! 44: exit (1); ! 45: } ! 46: ! 47: if (strncmp (ar_hdr.ar_fmag, ARFMAG, sizeof (ar_hdr.ar_fmag)) != 0) { ! 48: fprintf (stderr, "input phase error on %s\n", name); ! 49: exit (1); ! 50: } ! 51: ! 52: /* check the component name, allowing for trailing blanks */ ! 53: p = name; ! 54: q = ar_hdr.ar_name; ! 55: for (i = 0; i < sizeof (ar_hdr.ar_name); i++) { ! 56: if (*q++ != (*p? *p++: ' ')) { ! 57: fprintf (stderr, "expected %s, got %.*s\n", ! 58: name, sizeof (ar_hdr.ar_name), ar_hdr.ar_name); ! 59: } ! 60: } ! 61: ! 62: /* crack the archive header and put the information in "hdr" */ ! 63: hdr.size = cvlong (ar_hdr.ar_size, sizeof (ar_hdr.ar_size), 10); ! 64: hdr.mode = cvlong (ar_hdr.ar_mode, sizeof (ar_hdr.ar_mode), 8); ! 65: hdr.date = cvlong (ar_hdr.ar_date, sizeof (ar_hdr.ar_date), 10); ! 66: ! 67: return hdr.size; ! 68: } ! 69: ! 70: /* advance to the start of the next archive header */ ! 71: void ! 72: next_header(FILE *f) ! 73: { ! 74: if (hdr.size & 1) ! 75: getc(f); ! 76: } ! 77: ! 78: /* skip leading white space, return a field */ ! 79: char * ! 80: getfield (FILE *f) ! 81: { ! 82: register char c; ! 83: ! 84: /* skip leading white space */ ! 85: do c = getc (f); ! 86: while (isspace (c) && c != '\n'); ! 87: ! 88: /* if we hit a newline, something's wrong */ ! 89: if (c == '\n') { ! 90: fprintf (stderr, "unexpected newline\n"); ! 91: exit (1); ! 92: } ! 93: ! 94: /* return the nonblank, read a "pathname" and return it */ ! 95: ungetc (c, f); ! 96: return getpath (f); ! 97: } ! 98: ! 99: /* insist on an end of line right here */ ! 100: void ! 101: geteol (FILE *f) ! 102: { ! 103: register int c; ! 104: ! 105: c = getc (f); ! 106: if (c != '\n') { ! 107: fprintf (stderr, "expected newline, got %c\n", c); ! 108: exit (1); ! 109: } ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.