|
|
BSD 4.3
/* parse.c
*
* Copyright (c) 1984, 1985 Xerox Corp.
*
* Eight items are left on the stack when execution finishes.
* See the RES manual.
*
*
* pop() can be used to remove items from the stack.
* Please remember to free() any item you pop off the stack.
*
*
*
*/
#include <stdio.h>
#include <iptokens.h>
FILE *fp;
long filepos = 0;
#define RES_header "Interpress/Xerox/2.1/RasterEncoding/1.0 "
#define len_RES_header 40
#define token_id 0340
#define token_mask 0037
#define token_short_op 0200
#define token_long_op 0240
#define token_short_seq 0300
#define token_long_seq 0340
parse(fpin)
FILE *fpin;
{
/* variables */
int c, len;
char string[len_RES_header+1];
int last = 0;
int seq;
/* Get the header. */
fp = fpin;
fgets(string, len_RES_header+1, fp);
header(string, RES_header);
/* Analyze every token in the file. */
while ((c = getc(fp)) != EOF)
{
filepos = ftell(fp)-1;
switch (c & token_id)
{
case token_short_op: /* Only allowed short op is "nop". */
len = c & token_mask;
operator(len);
last = 0;
break;
case token_long_op:
len = getc(fp)+((c & token_mask) << 8);
if (operator(len)) return; /* Quit when you hit endBlock. */
last = 0;
break;
case token_short_seq:
len = getc(fp);
seq = c & token_mask;
sequence(seq, len, last);
if (seq != sequenceContinued) last = seq;
break;
case token_long_seq:
len = getc(fp) << 16;
len = len+(getc(fp) << 8);
len = len+getc(fp);
seq = c & token_mask;
sequence(seq, len, last);
if (seq != sequenceContinued) last = seq;
break;
default:
shortnum((c << 8)+getc(fp)-INTEGER_ZERO);
last = 0;
break;
}
}
/* Shouldn't get here if file ends properly! */
fprintf(stderr, "(%d) Unexpected EOF\n", filepos);
exit(2);
}
#ifndef debug
operator(op)
int op;
{
switch (op)
{
case OP_makevec: op_makevec(); break;
case OP_do: op_do(); break;
case OP_pop: op_pop(); break;
case OP_copy: op_copy(); break;
case OP_dup: op_dup(); break;
case OP_roll: op_roll(); break;
case OP_exch: op_exch(); break;
case OP_nop: op_nop(); break;
case OP_translate: op_translate(); break;
case OP_rotate: op_rotate(); break;
case OP_scale: op_scale(); break;
case OP_scale2: op_scale2(); break;
case OP_concat: op_concat(); break;
case OP_makepixelarray: op_makepixelarray(); break;
case OP_extractpixelarray: op_extractpixelarray(); break;
case OP_finddecompressor: op_finddecompressor(); break;
case OP_makegray: op_makegray(); break;
case OP_findcolor: op_findcolor(); break;
case OP_findcoloroperator: op_findcoloroperator(); break;
case OP_findcolormodeloperator: op_findcolormodeloperator(); break;
case OP_beginBlock: op_beginblock(); break;
case OP_endBlock: op_endblock(); return(1);
default: op_unknown(op); break;
}
return (0);
}
sequence(type, len, last)
int type, len, last;
{
switch (type)
{
case sequenceAdaptivePixelVector: seq_adaptivepixel(len); break;
case sequenceComment: seq_comment(len); break;
case sequenceCompressedPixelVector: seq_compressedpixel(len); break;
case sequenceContinued: seq_continued(len, last); break;
case sequenceIdentifier: seq_identifier(len); break;
case sequenceInsertFile: seq_insertfile(len); break;
case sequenceInteger: seq_integer(len); break;
case sequenceLargeVector: seq_largevector(len); break;
case sequencePackedPixelVector: seq_packedpixel(len); break;
case sequenceRational: seq_rational(len); break;
case sequenceString: seq_string(len); break;
default: seq_unknown(type, len); break;
}
}
#else
operator(op)
int op;
{
switch (op)
{
case OP_makevec:
fprintf(stderr, "op_makevec\n");
op_makevec();
break;
case OP_do:
fprintf(stderr, "op_do\n");
op_do();
break;
case OP_pop:
fprintf(stderr, "op_pop\n");
op_pop();
break;
case OP_copy:
fprintf(stderr, "op_copy\n");
op_copy();
break;
case OP_dup:
fprintf(stderr, "op_dup\n");
op_dup();
break;
case OP_roll:
fprintf(stderr, "op_roll\n");
op_roll();
break;
case OP_exch:
fprintf(stderr, "op_exch\n");
op_exch();
break;
case OP_nop:
fprintf(stderr, "op_nop\n");
op_nop();
break;
case OP_translate:
fprintf(stderr, "op_translate\n");
op_translate();
break;
case OP_rotate:
fprintf(stderr, "op_rotate\n");
op_rotate();
break;
case OP_scale:
fprintf(stderr, "op_scale\n");
op_scale();
break;
case OP_scale2:
fprintf(stderr, "op_scale2\n");
op_scale2();
break;
case OP_concat:
fprintf(stderr, "op_concat\n");
op_concat();
break;
case OP_makepixelarray:
fprintf(stderr, "op_makepixelarray\n");
op_makepixelarray();
break;
case OP_extractpixelarray:
fprintf(stderr, "op_extractpixelarray\n");
op_extractpixelarray();
break;
case OP_finddecompressor:
fprintf(stderr, "op_finddecompressor\n");
op_finddecompressor();
break;
case OP_makegray:
fprintf(stderr, "op_makegray\n");
op_makegray();
break;
case OP_findcolor:
fprintf(stderr, "op_findcolor\n");
op_findcolor();
break;
case OP_findcoloroperator:
fprintf(stderr, "op_findcoloroperator\n");
op_findcoloroperator();
break;
case OP_findcolormodeloperator:
fprintf(stderr, "op_findcolormodeloperator\n");
op_findcolormodeloperator();
break;
case OP_beginBlock:
fprintf(stderr, "op_beginblock\n");
op_beginblock();
break;
case OP_endBlock:
fprintf(stderr, "op_endblock\n");
op_endblock();
return(1);
default:
fprintf(stderr, "op_unknown\n");
op_unknown(op);
break;
}
return (0);
}
sequence(type, len, last)
int type, len, last;
{
switch (type)
{
case sequenceAdaptivePixelVector:
fprintf(stderr, "seq_adaptivepixel\n");
seq_adaptivepixel(len);
break;
case sequenceComment:
fprintf(stderr, "seq_comment\n");
seq_comment(len);
break;
case sequenceCompressedPixelVector:
fprintf(stderr, "seq_compressedpixel\n");
seq_compressedpixel(len);
break;
case sequenceContinued:
fprintf(stderr, "seq_continued\n");
seq_continued(len, last);
break;
case sequenceIdentifier:
fprintf(stderr, "seq_identifier\n");
seq_identifier(len);
break;
case sequenceInsertFile:
fprintf(stderr, "seq_insertfile\n");
seq_insertfile(len);
break;
case sequenceInteger:
fprintf(stderr, "seq_integer\n");
seq_integer(len);
break;
case sequenceLargeVector:
fprintf(stderr, "seq_largevector\n");
seq_largevector(len);
break;
case sequencePackedPixelVector:
fprintf(stderr, "seq_packedpixel\n");
seq_packedpixel(len);
break;
case sequenceRational:
fprintf(stderr, "seq_rational\n");
seq_rational(len);
break;
case sequenceString:
fprintf(stderr, "seq_string\n");
seq_string(len);
break;
default:
fprintf(stderr, "seq_unknown\n");
seq_unknown(type, len);
break;
}
}
#endif
/* Change Log
*
* K. Knox, 28-Mar-85 18:26:50, Created first version.
*
*
*
*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.