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