|
|
1.1 ! root 1: /* ! 2: * Interpress utility ! 3: * ! 4: * Written for Xerox Corporation by William LeFebvre ! 5: * ! 6: * 6-June-1984 ! 7: * ! 8: * Copyright (c) 1984, 1985, 1986 Xerox Corp. ! 9: * ! 10: * HISTORY ! 11: * 13-Jan-86 lee at Xerox, WRC ! 12: * Changed on strcmpn to strncmp. ! 13: * ! 14: * 01-Dec-85 lee at Xerox, WRC ! 15: * Linted. ! 16: * ! 17: * ! 18: * 8-apr-85 ed flint add conditional compilation for vax11-c (vms) ! 19: * add error condition for sbrk failure ! 20: * ! 21: * 30-aug-85 ed flint eliminate compiler warning on check of sbreak return ! 22: */ ! 23: ! 24: /* ! 25: * texttoip - convert a textual representation of an interpress file (such as ! 26: * produced by iptotext) to an encoded interpress format. ! 27: */ ! 28: ! 29: #ifdef vax11c ! 30: # include stdio ! 31: # include "iptokens.h" ! 32: # include "texttoken.h" ! 33: # include "literal.h" ! 34: #else ! 35: # include <stdio.h> ! 36: # include <sys/file.h> ! 37: # include <sys/types.h> ! 38: # include "iptokens.h" ! 39: # include "texttoken.h" ! 40: # include "literal.h" ! 41: #endif ! 42: ! 43: long yylval_long; ! 44: char *yylval_charP; ! 45: ! 46: int line_number; ! 47: int ipress_file; ! 48: int radix = 10; ! 49: char *filename; ! 50: char *outputname; ! 51: extern FILE *yyin; ! 52: ! 53: main(argc, argv) ! 54: ! 55: int argc; ! 56: char *argv[]; ! 57: ! 58: { ! 59: int token; ! 60: long longVal0; ! 61: int arg; ! 62: int pushed_token = 0; ! 63: char first_file = 1; ! 64: ! 65: /* look for an output option */ ! 66: if (argc > 1 && strncmp(argv[1], "-o", 2) == 0) ! 67: { ! 68: /* it's there -- get the file name */ ! 69: if (strlen(argv[1]) > 2) ! 70: { ! 71: outputname = &(argv[1][2]); ! 72: argc--; ! 73: argv++; ! 74: } ! 75: else if (argc > 2) ! 76: { ! 77: outputname = argv[2]; ! 78: argc -= 2; ! 79: argv += 2; ! 80: } ! 81: else ! 82: { ! 83: /* "-o" with no file name -- strangeness, so give up */ ! 84: exit(1); ! 85: } ! 86: } ! 87: else ! 88: { ! 89: /* default output -- use stdout if it is NOT a terminal */ ! 90: if (isatty(1)) ! 91: { ! 92: /* use default filename */ ! 93: outputname = "intertext.ip"; ! 94: } ! 95: else ! 96: { ! 97: /* use standard output */ ! 98: outputname = NULL; ! 99: ipress_file = 1; ! 100: } ! 101: } ! 102: ! 103: /* open the output file */ ! 104: #ifdef vax11c ! 105: if (outputname != NULL && ! 106: (ipress_file = creat(outputname,0,"rfm=udf")) == -1) ! 107: #else ! 108: if (outputname != NULL && ! 109: (ipress_file = open(outputname, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) ! 110: #endif ! 111: { ! 112: perror(outputname); ! 113: exit(1); ! 114: } ! 115: ! 116: /* main loop */ ! 117: for (arg = 1; arg < argc; arg++) ! 118: { ! 119: /* open next file for reading */ ! 120: if ((yyin = fopen(argv[arg], "r")) == NULL) ! 121: { ! 122: perror(argv[arg]); ! 123: continue; ! 124: } ! 125: ! 126: /* set file dependent stuff */ ! 127: filename = argv[arg]; ! 128: line_number = 1; ! 129: ! 130: /* get header */ ! 131: if (first_file) ! 132: { ! 133: if ((token = yylex()) == T_header) ! 134: { ! 135: if (yylex() != T_string) ! 136: { ! 137: terror("Header was not a string, using standard header"); ! 138: ip_select(ipress_file); ! 139: } ! 140: else ! 141: { ! 142: ip_raw_select(ipress_file); ! 143: append_bytes(strlen(yylval_charP), ! 144: (unsigned char *) yylval_charP); ! 145: } ! 146: } ! 147: else ! 148: { ! 149: terror("No header for file, using standard header"); ! 150: ip_select(ipress_file); ! 151: pushed_token = token; ! 152: } ! 153: first_file = 0; ! 154: ! 155: /* gobble the newline */ ! 156: if (yylex() != T_newline) ! 157: { ! 158: terror("newline expected"); ! 159: } ! 160: } ! 161: else ! 162: { ! 163: if ((token = yylex()) == T_header) ! 164: { ! 165: /* gobble stuff */ ! 166: (void) yylex(); (void) yylex(); ! 167: } ! 168: else ! 169: { ! 170: pushed_token = token; ! 171: } ! 172: } ! 173: ! 174: while (pushed_token == 0 ? ! 175: (token = yylex()) != 0 : ! 176: (token = pushed_token, pushed_token = 0, 1)) ! 177: { ! 178: switch(token) ! 179: { ! 180: case T_header: ! 181: terror("Stray header"); ! 182: break; ! 183: ! 184: case T_seq_comment: ! 185: if (yylex() != T_string) ! 186: { ! 187: terror("Comment was not a string"); ! 188: } ! 189: else ! 190: { ! 191: AppendComment(yylval_charP); ! 192: } ! 193: break; ! 194: ! 195: case T_seq_identifier: ! 196: if (yylex() != T_identifier) ! 197: { ! 198: terror("Identifier is invalid"); ! 199: } ! 200: else ! 201: { ! 202: AppendIdentifier(yylval_charP); ! 203: } ! 204: break; ! 205: ! 206: case T_seq_insert_file: ! 207: if (yylex() != T_string) ! 208: { ! 209: terror("Insert file is not a string"); ! 210: } ! 211: else ! 212: { ! 213: AppendInsertFile(yylval_charP); ! 214: } ! 215: break; ! 216: ! 217: case T_seq_integer: ! 218: if (yylex() != T_number) ! 219: { ! 220: terror("Integer is invalid"); ! 221: } ! 222: else ! 223: { ! 224: append_integer_sequence(yylval_long); ! 225: } ! 226: break; ! 227: ! 228: case T_seq_rational: ! 229: if (yylex() != T_number) ! 230: { ! 231: terror("Rational numerator is invalid"); ! 232: break; ! 233: } ! 234: longVal0 = yylval_long; ! 235: if (yylex() != T_character || (char) yylval_long != '/') ! 236: { ! 237: terror("Rational separator invalid"); ! 238: break; ! 239: } ! 240: if (yylex() != T_number) ! 241: { ! 242: terror("Rational denominator is invalid"); ! 243: break; ! 244: } ! 245: ! 246: AppendRational(longVal0, (long) yylval_long); ! 247: break; ! 248: ! 249: case T_seq_string: ! 250: if (yylex() != T_string) ! 251: { ! 252: terror("String is invalid"); ! 253: } ! 254: else ! 255: { ! 256: AppendString1(yylval_charP); ! 257: } ! 258: break; ! 259: ! 260: /* Pixel vector sequences */ ! 261: case T_seq_apv: ! 262: get_pixel_vector(sequenceAdaptivePixelVector); ! 263: break; ! 264: ! 265: case T_seq_cpv: ! 266: get_pixel_vector(sequenceCompressedPixelVector); ! 267: break; ! 268: ! 269: case T_seq_ppv: ! 270: get_pixel_vector(sequencePackedPixelVector); ! 271: break; ! 272: ! 273: case T_number: ! 274: AppendInteger(yylval_long); ! 275: break; ! 276: ! 277: case T_operator: ! 278: AppendOp((int) yylval_long); ! 279: break; ! 280: ! 281: case T_newline: ! 282: line_number++; ! 283: break; ! 284: ! 285: case T_string: ! 286: terror("Stray string"); ! 287: break; ! 288: ! 289: case T_identifier: ! 290: terror("Stray string"); ! 291: break; ! 292: ! 293: case T_character: ! 294: terror("Stray character"); ! 295: break; ! 296: } ! 297: } ! 298: } ! 299: ip_close(); ! 300: } ! 301: ! 302: char *sbrk(); ! 303: ! 304: get_pixel_vector(type) ! 305: ! 306: int type; ! 307: ! 308: { ! 309: register int len = 0; ! 310: int token; ! 311: unsigned char *buffer = NULL; ! 312: register unsigned char *ptr; ! 313: ! 314: if (yylex() != T_character || yylval_long != '[') ! 315: { ! 316: terror("Bad pixel vector, expected '['"); ! 317: return; ! 318: } ! 319: radix = 16; ! 320: ! 321: /* allocate space to hold the data */ ! 322: if (buffer == NULL) ! 323: { ! 324: ! 325: buffer = (unsigned char *) sbrk(300000); /* too large for PDP-11's */ ! 326: ! 327: if ( buffer == (unsigned char *)-1 ) ! 328: { ! 329: fprintf(stderr,"\ncannot allocate room for pixel array\n"); ! 330: exit(1); ! 331: } ! 332: } ! 333: ! 334: ptr = buffer; ! 335: while ((token = yylex()) != T_character) ! 336: { ! 337: if (token != T_newline) ! 338: { ! 339: *ptr++ = (unsigned char) (yylval_long >> 8); ! 340: *ptr++ = (unsigned char) yylval_long; ! 341: len += 2; ! 342: } ! 343: } ! 344: (void) yylex(); /* gobble trailing newline */ ! 345: ! 346: append_Sequence(type, len, buffer); ! 347: radix = 10; ! 348: } ! 349: ! 350: terror(string) ! 351: ! 352: char *string; ! 353: ! 354: { ! 355: fprintf(stderr, "\"%s\", line %d: %s\n", filename, line_number, string); ! 356: } ! 357: #ifdef vax11c ! 358: /* ! 359: * this is needed for the parsing software produced by lex ! 360: */ ! 361: ! 362: yywrap() ! 363: { ! 364: return(1); ! 365: } ! 366: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.