|
|
1.1 ! root 1: /* ! 2: * Interpress utility - count the number of pages in a interpress file ! 3: * ! 4: * Written for Xerox Corporation by Lee Moore & William LeFebvre ! 5: * ! 6: * Copyright (c) 1984, 1985, 1986 Xerox Corp. ! 7: * ! 8: * History: ! 9: * 2-sep-85 lee moore created out of iptotext.c ! 10: */ ! 11: ! 12: #ifdef vax11c ! 13: # include stdio ! 14: # include setjmp ! 15: # include ctype ! 16: # include "iptokens.h" ! 17: #else ! 18: # include <stdio.h> ! 19: # include <setjmp.h> ! 20: # include <ctype.h> ! 21: # include "iptokens.h" ! 22: #endif ! 23: ! 24: jmp_buf next_file; ! 25: ! 26: extern int errno; ! 27: ! 28: main(argc, argv) ! 29: ! 30: int argc; ! 31: char *argv[]; ! 32: ! 33: { ! 34: FILE *acctFile; ! 35: int c, ! 36: pageCount; ! 37: char *login, ! 38: *host; ! 39: extern int optind; ! 40: extern char *optarg; ! 41: ! 42: login = NULL; ! 43: host = NULL; ! 44: ! 45: while ((c = getopt(argc, argv, "cw:l:i:n:h:")) != EOF) ! 46: switch (c) { ! 47: case 'c': ! 48: case 'w': ! 49: case 'l': ! 50: case 'i': ! 51: break; ! 52: ! 53: case 'n': ! 54: login = optarg; ! 55: break; ! 56: ! 57: case 'h': ! 58: host = optarg; ! 59: break; ! 60: ! 61: default: ! 62: printf("option '%c' not allowed\n"); ! 63: } ! 64: ! 65: if (argc - optind == 1) ! 66: { ! 67: pageCount = do_file(stdin); ! 68: ! 69: if( pageCount < 0 ) ! 70: exit(2); ! 71: ! 72: if( (acctFile = fopen(argv[optind], "a")) == NULL ) { ! 73: fprintf(stderr, "ipf: can't open acct file: %s\n", argv[optind]); ! 74: exit(2); ! 75: } ! 76: ! 77: if( login ) ! 78: if( host ) ! 79: fprintf(acctFile, "%d\t%s:%s\n", pageCount, host, login); ! 80: else ! 81: fprintf(acctFile, "%d\t%s\n", pageCount, login); ! 82: ! 83: exit(0); ! 84: } ! 85: ! 86: } ! 87: ! 88: ! 89: /* ! 90: * process one file ! 91: */ ! 92: ! 93: do_file(file) ! 94: FILE *file; ! 95: { ! 96: # define Buffsize 256 ! 97: char buff[Buffsize]; ! 98: char *ptr; ! 99: int len; ! 100: int bodyDepth; /* how many bodies down we are */ ! 101: register int bodyCount, /* how many bodies we have seen so far */ ! 102: val, ! 103: byte; /* has to be "int" for stdio EOF detection */ ! 104: /* stdio is a pile! */ ! 105: int hlen; ! 106: ! 107: hlen = strlen(IP_Header); ! 108: ! 109: /* for error recovery */ ! 110: if (setjmp(next_file) != 0) ! 111: { ! 112: return -1; ! 113: } ! 114: ! 115: /* get the header */ ! 116: for (hlen = 0, ptr = buff; hlen < Buffsize; hlen++) ! 117: { ! 118: if ((*ptr++ = getnoeofc(file)) == ' ') ! 119: break; ! 120: } ! 121: *ptr = '\0'; ! 122: ! 123: /* check the validity of the header */ ! 124: if (strcmp(buff, IP_Header) != 0) ! 125: { ! 126: fprintf(stderr, " (INVALID HEADER!)"); ! 127: } ! 128: ! 129: bodyDepth = 0; ! 130: bodyCount = 0; ! 131: ! 132: /* main loop */ ! 133: while ((byte = getc(file)) != EOF) ! 134: { ! 135: if ((byte & 0200) == 0) ! 136: { ! 137: /* a short number */ ! 138: val = (byte << 8) + getnoeofc(file) - INTEGER_ZERO; ! 139: } ! 140: else ! 141: { ! 142: /* something else */ ! 143: switch(byte >> 5) ! 144: { ! 145: case (SHORT_OP >> 5): ! 146: break; ! 147: ! 148: case (LONG_OP >> 5): ! 149: val = ((byte & 037) << 8) + getnoeofc(file); ! 150: if( val == OP_beginBody ) ! 151: { ! 152: bodyDepth++; ! 153: } ! 154: else if( val == OP_endBody ) ! 155: { ! 156: bodyDepth--; ! 157: ! 158: /* is this a top level body? */ ! 159: if( bodyDepth == 0 ) ! 160: bodyCount++; ! 161: } ! 162: break; ! 163: ! 164: case (SHORT_SEQUENCE >> 5): ! 165: len = getnoeofc(file); ! 166: eatBytes(file, len); ! 167: break; ! 168: ! 169: case (LONG_SEQUENCE >> 5): ! 170: len = getnoeofc(file) << 16; ! 171: len += (getnoeofc(file) << 8); ! 172: len += getnoeofc(file); ! 173: eatBytes(file, len); ! 174: break; ! 175: } ! 176: } ! 177: } ! 178: ! 179: return bodyCount - 1; /* the preamble is an extra body */ ! 180: } ! 181: ! 182: ! 183: /* ! 184: * get a character ! 185: */ ! 186: ! 187: getnoeofc(file) ! 188: ! 189: FILE *file; ! 190: ! 191: { ! 192: register int val; ! 193: ! 194: #ifdef vax11c ! 195: val= getc(file); ! 196: if ( feof(file) ) ! 197: #else ! 198: if ((val = getc(file)) == EOF) ! 199: #endif ! 200: { ! 201: fprintf(stderr, "Unexpected EOF!"); ! 202: longjmp(next_file, 1); ! 203: } ! 204: return(val); ! 205: } ! 206: ! 207: ! 208: /* ! 209: * read some bytes from the input stream ! 210: */ ! 211: ! 212: eatBytes(file, length) ! 213: FILE *file; ! 214: int length; ! 215: ! 216: { ! 217: register int count; ! 218: ! 219: count = length; ! 220: ! 221: while(count-- > 0) ! 222: { ! 223: (void) getnoeofc(file); ! 224: } ! 225: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.