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