|
|
1.1 root 1: /*
2: * Interpress utility
3: *
4: * Written for Xerox Corporation by William LeFebvre
5: *
6: * 7-June-1984
7: *
8: * Copyright (c) 1984, 1985, 1986 Xerox Corp.
9: *
10: * HISTORY
11: * 20-Mar-86 Lee Moore (lee) at Xerox Webster Research Center
12: * Changed the output comment for sequencePackedPixel to print out the
13: * number of bits per sample and the number of samples per scan line.
14: *
15: * 13-Jan-86 lee at Xerox, WRC
16: * Changed a call to strmpn to strncmp.
17: *
18: * 01-Dec-85 lee at Xerox, WRC
19: * Linted
20: *
21: * 11-oct-85 ed flint
22: * don't worry about version # in Interpress header
23: * look only for 'Interpress/Xerox/'
24: *
25: * 23-may-85 ed flint
26: * fixed bug in print_string_from_file & print_string
27: * that would strip off high byte of ch in isprint
28: *
29: * 8-apr-85 ed flint
30: * add -d option to dump pixel arrays
31: * conditional compilation for vax-11c (vms)
32: */
33:
34: /*
35: * iptotext - convert an encoded interpress file into readable text
36: */
37:
38: #ifdef vax11c
39: # include stdio
40: # include setjmp
41: # include ctype
42: # include "iptokens.h"
43: # include "ipnames.h"
44: #else
45: # include <stdio.h>
46: # include <setjmp.h>
47: # include <ctype.h>
48: # include "iptokens.h"
49: # include "ipnames.h"
50: #endif
51:
52: int hlen;
53: jmp_buf next_file;
54: FILE *file;
55: FILE *output;
56:
57: int errno; /* imported value */
58:
59: char *op_name();
60: int dump_pixel= 0;
61:
62: main(argc, argv)
63:
64: int argc;
65: char *argv[];
66:
67: {
68: int arg;
69: int temp;
70: char *outputname;
71:
72: hlen = strlen(IP_Header);
73:
74: outputname= 0;
75:
76: /* look for options */
77: for ( arg= 1; arg < argc; arg++ )
78: {
79: if ( argv[arg][0] == '-' )
80: {
81: switch(argv[arg][1])
82: {
83: case('o'):
84: case('O'):
85: if ( strlen(argv[arg]) > 2 )
86: outputname= &(argv[arg][2]);
87: else
88: outputname= argv[++arg];
89: break;
90:
91: case('d'):
92: case('D'):
93: dump_pixel= 1;
94: break;
95:
96: default:
97: fprintf(stderr,"invalid option %s\n",argv[arg]);
98: break;
99: }
100: }
101: else
102: {
103: break;
104: }
105: }
106:
107: /* open the output file */
108: if ( outputname != 0 )
109: {
110: if ((output = fopen(outputname, "w")) == NULL)
111: {
112: /* save errno value */
113: temp = errno;
114: fputs("iptotext: ", stderr);
115: errno = temp;
116: perror(outputname);
117: exit(1);
118: }
119: }
120: else
121: {
122: /* default output -- use stdout */
123: output = stdout;
124: }
125:
126: if (argc == 1)
127: {
128: file = stdin;
129: do_file();
130: (void) putc('\n', output);
131: }
132:
133: /* make the begin- and end-block names be upper case */
134: op_names[OP_beginBlock] = "BEGIN";
135: op_names[OP_endBlock] = "END";
136:
137: for ( ; arg < argc; arg++) /* assume arg is index of first file name */
138: {
139: if ((file = fopen(argv[arg], "r")) == NULL)
140: {
141: perror(argv[arg]);
142: continue; /* on to the next file */
143: }
144:
145: /* print pretty banner */
146: fprintf(output, "(File: \"%s\")\n", argv[arg]);
147:
148: do_file();
149: (void) fclose(file);
150: (void) putc('\n', output);
151: }
152: }
153:
154: do_file()
155:
156: {
157: # define Buffsize 256
158: unsigned char buff[Buffsize];
159: unsigned char *ptr;
160: int val;
161: int len;
162: int byte; /* has to be "int" for stdio EOF detection */
163: /* stdio is a pile! */
164:
165: /* for error recovery */
166: if (setjmp(next_file) != 0)
167: {
168: return;
169: }
170:
171: /* get the header */
172: for (hlen = 0, ptr = buff; hlen < Buffsize; hlen++)
173: {
174: if ((*ptr++ = getnoeofc(file)) == ' ')
175: break;
176: }
177: *ptr = '\0';
178:
179: /* display the header */
180: fputs("Header: ", output);
181: print_string(buff);
182:
183: /* check the validity of the header */
184: if (strncmp((char *)buff, IP_Header, 17) != 0)
185: {
186: fprintf(output, " (INVALID HEADER!)");
187: }
188: (void) putc('\n', output);
189:
190: /* main loop */
191: while ((byte = getc(file)) != EOF)
192: {
193: if ((byte & 0200) == 0)
194: {
195: /* a short number */
196: val = (byte << 8) + getnoeofc(file) - INTEGER_ZERO;
197: fprintf(output, "%d\n", val);
198: }
199: else
200: {
201: /* something else */
202: switch(byte >> 5)
203: {
204: case (SHORT_OP >> 5):
205: fprintf(output, "%s\n", op_name(byte & 037));
206: break;
207:
208: case (LONG_OP >> 5):
209: val = ((byte & 037) << 8) + getnoeofc(file);
210: fprintf(output, "%s%s\n", op_name(val),
211: val == OP_beginBlock || val == OP_endBlock ?
212: " (block)" : "");
213: break;
214:
215: case (SHORT_SEQUENCE >> 5):
216: len = getnoeofc(file);
217: fputs("> ", output);
218: do_sequence(byte & 037, len);
219: break;
220:
221: case (LONG_SEQUENCE >> 5):
222: len = getnoeofc(file) << 16;
223: len += (getnoeofc(file) << 8);
224: len += getnoeofc(file);
225: fputs(">>", output);
226: do_sequence(byte & 037, len);
227: break;
228: }
229: }
230: }
231: }
232:
233: do_sequence(type, length)
234:
235: int type;
236: int length;
237:
238: {
239: int val;
240: int val2;
241:
242: switch(type)
243: {
244: case sequenceAdaptivePixelVector:
245: fprintf(output, "Adaptive Pixel Vector: (%d words) [\n", length/2);
246: print_words_from_file(file, length);
247: fputs("]\n", file);
248: break;
249:
250: case sequenceComment:
251: fputs("Comment: ", output);
252: print_string_from_file(file, length);
253: (void) putc('\n', output);
254: break;
255:
256: case sequenceCompressedPixelVector:
257: fprintf(output, "Compressed Pixel Vector: (%d words) [\n", length/2);
258: print_words_from_file(file, length);
259: fputs("]\n", file);
260: break;
261:
262: case sequenceContinued:
263: fprintf(output, "Continuing last sequence: ");
264: break;
265:
266: case sequenceIdentifier:
267: fprintf(output, "Identifier: ");
268: iocopy(length);
269: fputs("\n", output);
270: break;
271:
272: case sequenceInsertFile:
273: fputs("Insert file: ", output);
274: print_string_from_file(file, length);
275: (void) putc('\n', output);
276: break;
277:
278: case sequenceInteger:
279: val = getint(length);
280: fprintf(output, "Integer: %d\n", val);
281: (void) putc('\n', output);
282: break;
283:
284: case sequenceLargeVector:
285: #ifdef notdef
286: val = getnoeofc(file);
287: fprintf(output, "Large Pixel Vector: (%d words of %d bytes) [\n"
288: (length - 1) / val, val);
289: #endif
290: break;
291:
292: case sequencePackedPixelVector:
293: val = getint(2);
294: val2 = getint(2);
295: fprintf(output, "Packed Pixel Vector: (%d + 2 = %d words, %d bit(s) per sample, %d sample(s) per scanline) [\n",
296: length/2 -2, length/2, val, val2);
297: print_words_from_file(file, length - 4);
298: fputs("]\n", output);
299: break;
300:
301: case sequenceRational:
302: length >>= 1;
303: val = getint(length);
304: val2 = getint(length);
305: fprintf(output, "Rational: %d/%d ", val, val2);
306: if (val2 != 0)
307: {
308: fprintf(output, "(%f)\n", (float)val / (float)val2);
309: }
310: else
311: {
312: fputs("(???)\n", output);
313: }
314: break;
315:
316: case sequenceString:
317: fputs("String: ", output);
318: print_string_from_file(file, length);
319: (void) putc('\n', output);
320: break;
321: }
322: }
323:
324: iocopy(length)
325:
326: int length;
327:
328: {
329: int byte;
330:
331: while(length-- > 0)
332: {
333: byte = getnoeofc(file);
334: (void) putc(byte, output);
335: }
336: }
337:
338: getint(length)
339:
340: int length;
341:
342: {
343: int val;
344:
345: val = getnoeofc(file);
346:
347: if ((val & 0x80) != 0) {
348: /* this is a negative number -- extend the sign */
349: val |= (-1 & ~(0xFF));
350: }
351:
352: while (--length > 0) {
353: val <<= 8;
354: val |= getnoeofc(file);
355: }
356:
357: return(val);
358: }
359:
360: char *op_name(op_code)
361:
362: int op_code;
363:
364: {
365: static char nbuff[10];
366:
367: if (op_names[op_code] == NULL)
368: {
369: (void) sprintf(nbuff, "--Unknown op: %d--", op_code);
370: return(nbuff);
371: }
372: else
373: {
374: return(op_names[op_code]);
375: }
376: }
377:
378: getnoeofc(file)
379:
380: FILE *file;
381:
382: {
383: int val;
384:
385: #ifdef vax11c
386: val= getc(file);
387: if ( feof(file) )
388: #else
389: if ((val = getc(file)) == EOF)
390: #endif
391: {
392: fprintf(output, "Unexpected EOF!");
393: longjmp(next_file, 1);
394: }
395: return(val);
396: }
397:
398: print_string_from_file(file, length)
399:
400: FILE *file;
401: int length;
402:
403: {
404: register int ch;
405: register int val;
406:
407: (void) putc('"', output);
408: for (val = 0; val < length; val++)
409: {
410: ch = getnoeofc(file);
411: if ( ((ch & 0x80) == 0) && (isprint(ch)) )
412: {
413: if (ch == '"' || ch == '\\')
414: {
415: (void) putc('\\', output);
416: }
417: (void) putc(ch, output);
418: }
419: else
420: {
421: fprintf(output, "\\%03o", ch);
422: }
423: }
424: (void) putc('"', output);
425: }
426:
427: print_string(string)
428:
429: unsigned char *string;
430:
431: {
432: register unsigned char *ptr;
433: register unsigned char ch;
434:
435: (void) putc('"', output);
436: ptr = string;
437: while ((ch = *ptr++) != '\0')
438: {
439: if ( ((ch & 0x80) == 0) && (isprint(ch)) )
440: {
441: if (ch == '"')
442: {
443: (void) putc('\\', output);
444: }
445: (void) putc(ch, output);
446: }
447: else
448: {
449: fprintf(output, "\\%03o", ch);
450: }
451: }
452: (void) putc('"', output);
453: }
454:
455: print_words_from_file(file, length)
456:
457: FILE *file;
458: int length;
459:
460: {
461: int val;
462: int cnt = 0;
463:
464: if ( dump_pixel == 1 )
465: {
466: while (length > 0)
467: {
468: val = getnoeofc(file) << 8;
469: val += getnoeofc(file);
470:
471: fprintf(output, "%04x ", val);
472: if (++cnt > 12)
473: {
474: (void) fputc('\n',output);
475: cnt = 0;
476: }
477:
478: length -= 2;
479: }
480: }
481: else
482: {
483: while ( length > 0 )
484: {
485: val= getnoeofc(file);
486: length--;
487: }
488: }
489: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.