📄 execute.c
字号:
/* execute.c * * Copyright (c) 1984, 1985 Xerox Corp. * * Define the functions used in parse.c. * * Execute the RES file and leave the correct parameters on the stack. * */#include <math.h>#include <stdio.h>#include <iptokens.h>#include "stack.h"#define err0 "(%d) execute: Bad RES header, got %s\n"#define err1 "(%d) execute: roll moveFirst > depth, %d > %d!\n"#define err2 "(%d) execute: unknown operator subtype, got %d!\n"#define err3 "(%d) execute: unknown operator, type=%d!\n"#define err4 "(%d) execute: unknown sequence, type=%d, length=%d!\n"#define err5 "(%d) execute: sequenceInsertFile not implemented!\n"/* Defined elsewhere. */extern unsigned char **malloc();extern long filepos;extern FILE *fp;/* Defined in this module. */extern unsigned char *decompressID();extern unsigned char *decompressOP();extern unsigned char *imagedata();extern unsigned char *popidentifier();extern double popdouble();/* * Public procedures defined for "parse" module. * */header(string)char *string; { fprintf(stderr, "strings are '%s', '%s'\n", string, RES_Header); if (strcmp(string, RES_Header) != 0) error(err0, filepos, string); }op_makevec() { int n, depth; unsigned char *ptr, **array; depth = popint(); array = malloc((depth+1)*sizeof(unsigned char *)); /* null terminated array */ for (n=0; n < depth; n++) array[depth-n-1] = pop(0); array[depth] = (unsigned char *) 0; ptr = makevector(array, type_vector, subtype_general); for (n=0; n < depth; n++) free(array[n]); free(array); push(ptr); }op_pop() { free(pop(0)); }op_copy() { int n, depth; unsigned char *ptr, **temp1, **temp2; depth = popint(); temp1 = malloc(depth*sizeof(unsigned char *)); temp2 = malloc(depth*sizeof(unsigned char *)); for (n=0; n < depth; n++) temp1[depth-n-1] = pop(0); for (n=0; n < depth; n++) temp2[n] = duplicate(temp1[n]); for (n=0; n < depth; n++) push(temp1[n]); for (n=0; n < depth; n++) push(temp2[n]); free(temp1); free(temp2); }op_dup() { unsigned char *ptr, *newptr; ptr = pop(0); newptr = duplicate(ptr); push(ptr); push(newptr); }op_roll() { int n, depth, moveFirst; unsigned char *ptr, **temp; moveFirst = popint(); depth = popint(); if (moveFirst > depth) error(err1, filepos, moveFirst, depth); temp = malloc(depth*sizeof(unsigned char *)); for (n=0; n < depth; n++) temp[depth-n-1] = pop(0); for (n=moveFirst; n < depth; n++) push(temp[n]); for (n=0; n < moveFirst; n++) push(temp[n]); free(temp); }op_exch() { unsigned char *temp1, *temp2; temp1 = pop(0); temp2 = pop(0); push(temp1); push(temp2); }op_nop() { }op_translate() { double x, y; unsigned char *ptr; y = popdouble(); x = popdouble(); ptr = maketransformation(1.0, 0.0, x, 0.0, 1.0, y); push(ptr); }op_rotate() { double angle, cosA, sinA, pi; unsigned char *ptr; angle = popdouble(); angle = 3.1415926*angle/180.; cosA = cos(angle); sinA = sin(angle); ptr = maketransformation(cosA, -sinA, 0.0, sinA, cosA, 0.0); push(ptr); }op_scale() { unsigned char *ptr; double s; s = popdouble(); ptr = maketransformation(s, 0.0, 0.0, 0.0, s, 0.0); push(ptr); }op_scale2() { unsigned char *ptr; double sx, sy; sy = popdouble(); sx = popdouble(); ptr = maketransformation(sx, 0.0, 0.0, 0.0, sy, 0.0); push(ptr); }op_concat() { double a, b, c, d, e, f; unsigned char *ptr, *nptr, *mptr; double *m, *n; nptr = pop(type_transformation, 0); mptr = pop(type_transformation, 0); n = gettransformation(nptr); m = gettransformation(mptr); a = m[0]*n[0]+m[3]*n[1]; b = m[1]*n[0]+m[4]*n[1]; c = m[2]*n[0]+m[5]*n[1]+n[2]; d = m[0]*n[3]+m[3]*n[4]; e = m[1]*n[3]+m[4]*n[4]; f = m[2]*n[3]+m[5]*n[4]+n[5]; ptr = maketransformation(a, b, c, d, e, f); free(mptr); free(nptr); free(m); free(n); push(ptr); }op_makepixelarray() { int n; unsigned char *ptr, **array; array = malloc(9*sizeof(unsigned char *)); array[6] = pop(type_vector, 0); /* samples */ array[5] = pop(type_transformation, 0); /* m */ array[4] = pop(type_number, 0); /* samplesInterleaved */ array[3] = pop(type_number | type_vector, 0); /* maxSampleValue */ array[2] = pop(type_number, 0); /* samplesPerPixel */ array[1] = pop(type_number, 0); /* yPixels */ array[0] = pop(type_number, 0); /* xPixels */ array[7] = makeselect(getint(array[2]), ~0); /* select == all samples */ array[8] = (unsigned char *) 0; /* null terminated list */ ptr = makepixelarray(array); for (n=0; n < 9; n++) free(array[n]); free(array); push(ptr); }op_extractpixelarray() { int depth; unsigned char *oldptr, *newptr, *select, **array; select = pop(type_vector, 0); oldptr = pop(type_pixelarray, 0); array = getpixelarray(oldptr); array[7] = select; newptr = makepixelarray(array); free(select); free(oldptr); free(array); push(newptr); }op_do() { unsigned char *ptr, **array; int type, subtype; array = malloc(3*sizeof(unsigned char *)); array[0] = pop(type_operator, 0); /* operator to do */ array[1] = pop(type_vector, 0); /* vector argument */ array[2] = (unsigned char *) 0; switch (getsubtype(array[0])) { case subtype_decompressop: type = type_vector; subtype = subtype_samples; break; case subtype_colorop: type = type_color; subtype = subtype_operator; break; case subtype_colormodelop: type = type_operator; subtype = subtype_colorop; break; default: error(err2, filepos, getsubtype(array[0])); } ptr = makevector(array, type, subtype); free(array[0]); free(array[1]); free(array); push(ptr); }op_finddecompressor() { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = popidentifier("decompressionOps/"); array[1] = (unsigned char *) 0; ptr = makeoperator(array, subtype_decompressop); free(array[0]); free(array); push(ptr); }op_makegray() { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = pop(type_number); array[1] = (unsigned char *) 0; ptr = makecolor(array, subtype_value); push(ptr); }op_findcolor() { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = popidentifier("colors/"); array[1] = (unsigned char *) 0; ptr = makecolor(array, subtype_name); free(array[0]); free(array); push(ptr); }op_findcoloroperator() { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = popidentifier("colorOps/"); array[1] = (unsigned char *) 0; ptr = makeoperator(array, subtype_colorop); free(array[0]); free(array); push(ptr); }op_findcolormodeloperator() { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = popidentifier("colorModelOps/"); array[1] = (unsigned char *) 0; ptr = makeoperator(array, subtype_colormodelop); free(array[0]); free(array); push(ptr); }op_beginblock() { }op_endblock() { }op_unknown(op) int op; { error(err3, filepos, op); }seq_comment(nbytes) int nbytes; { fseek(fp, (long) nbytes, 1); }seq_continued(nbytes, last) int nbytes, last; { switch (last) { case sequenceAdaptivePixelVector: case sequenceCompressedPixelVector: case sequencePackedPixelVector: case sequenceLargeVector: extendpixel(nbytes); break; case sequenceComment: fseek(fp, (long) nbytes, 1); break; case sequenceInteger: case sequenceRational: extendnumber(nbytes); break; case sequenceString: case sequenceIdentifier: extendstring(nbytes); break; default: error(err4, filepos, last, nbytes); } }seq_insertfile(nbytes) int nbytes; { error(err5, filepos); }seq_largevector(nbytes) int nbytes; { int b; long bytepos, bytelength; unsigned char *ptr, **array; b = getc(fp) & 0377; /* read the number of bytes/integer. */ bytepos = ftell(fp); bytelength = nbytes-1; array = malloc(2*sizeof(unsigned char *)); array[0] = makeintegers(b, bytepos, bytelength); array[1] = (unsigned char *) 0; ptr = makevector(array, type_vector, subtype_integers); fseek(fp, bytelength, 1); free(array[0]); free(array); push(ptr); }seq_adaptivepixel(nbytes) int nbytes; { pushpixel(nbytes, "adaptive"); }seq_compressedpixel(nbytes) int nbytes; { pushpixel(nbytes, "compressed"); }seq_packedpixel(nbytes) int nbytes; { pushpixel(nbytes, "packed"); }seq_identifier(nbytes) int nbytes; { pushstring(nbytes, subtype_identifier); }seq_string(nbytes) int nbytes; { pushstring(nbytes, subtype_string); }seq_unknown(type, nbytes) int type, nbytes; { error(err4, filepos, type, nbytes); } seq_integer(nbytes) int nbytes; { pushinteger(nbytes, subtype_integer); }seq_rational(nbytes) int nbytes; { pushinteger(nbytes, subtype_rational); }shortnum(number) int number; { unsigned char value[2]; unsigned char *ptr; value[0] = (number >> 8) & 0377; value[1] = number & 0377; ptr = makenumber(2, value, subtype_integer); push(ptr); }/* * Private procedures to this module. * */static pushinteger(nbytes, subtype) int nbytes, subtype; { int n; unsigned char *ptr; unsigned char *array; array = (unsigned char *) malloc(nbytes); for (n=0; n < nbytes; n++) array[n] = getc(fp) & 0377; ptr = makenumber(nbytes, array, subtype); free(array); push(ptr); }static pushstring(nbytes, subtype) int nbytes, subtype; { int n; unsigned char *ptr; char *string; string = (char *) malloc(nbytes+1); for (n=0; n < nbytes; n++) string[n] = getc(fp) & 0377; string[nbytes] = (char) 0; ptr = makestring(string, subtype); free(string); push(ptr); }static pushpixel(nbytes, compression) int nbytes; char *compression; { extern unsigned char *decompressID(); extern unsigned char *decompressOP(); extern unsigned char *imagedata(); unsigned char *ptr, *idvec, **array; idvec = decompressID(compression); array = malloc(3*sizeof(unsigned char *)); array[0] = decompressOP(idvec); array[1] = imagedata(nbytes); array[2] = (unsigned char *) 0; ptr = makevector(array, type_vector, subtype_samples); free(idvec); free(array[0]); free(array[1]); free(array); push(ptr); }static unsigned char *decompressID(compression) char *compression; { unsigned char *ptr, **array; array = malloc(3*sizeof(unsigned char *)); array[0] = makestring("xerox", subtype_identifier); array[1] = makestring(compression, subtype_identifier); array[2] = (unsigned char *) 0; ptr = makevector(array, type_vector, subtype_general); free(array[0]); free(array[1]); free(array); return(ptr); }static unsigned char *decompressOP(idvec) unsigned char *idvec; { unsigned char *ptr, **array; array = malloc(2*sizeof(unsigned char *)); array[0] = makeidentifier(idvec, "decompressionOps/"); array[1] = (unsigned char *) 0; ptr = makeoperator(array, subtype_decompressop); free(array[0]); free(array); return(ptr); }static unsigned char *imagedata(nbytes) int nbytes; { long bytepos, bytelength; unsigned char *ptr, **array; bytepos = ftell(fp); bytelength = nbytes; array = malloc(2*sizeof(unsigned char *)); array[0] = makeintegers(2, bytepos, bytelength); array[1] = (unsigned char *) 0; ptr = makevector(array, type_vector, subtype_integers); fseek(fp, bytelength, 1); free(array[0]); free(array); return(ptr); }static popint() { int result; unsigned char *ptr; ptr = pop(type_number, 0); result = getint(ptr); free(ptr); return(result); } static double popdouble() { double result; unsigned char *ptr; ptr = pop(type_number, 0); result = getdouble(ptr); free(ptr); return(result); } static unsigned char *popidentifier(prefix) char *prefix; /* should end with '/' character */ { unsigned char *ptr, *composite; ptr = pop(type_vector, subtype_general); composite = makeidentifier(ptr, prefix); free(ptr); return(composite); }static extendpixel(nbytes) int nbytes; { int n, depth; long bytepos, bytelength; unsigned char *ptr, **samplesarray, **integersarray; unsigned char *newptr, **newarray; ptr = pop(type_vector, subtype_samples); samplesarray = getvector(ptr); depth = getdepth(samplesarray[1]); integersarray = getvector(samplesarray[1]); newarray = malloc((depth+2)*sizeof(unsigned char *)); for (n=0; n < depth; n++) newarray[n] = integersarray[n]; bytepos = ftell(fp); bytelength = nbytes; newarray[depth] = makeintegers(2, bytepos, bytelength); newarray[depth+1] = (unsigned char *) 0; samplesarray[1] = makevector(newarray, type_vector, subtype_integers); newptr = makevector(samplesarray, type_vector, subtype_samples); fseek(fp, bytelength, 1); free(ptr); free(newarray[depth]); free(samplesarray[1]); free(samplesarray); free(integersarray); free(newarray); push(newptr); }static extendnumber(nbytes) int nbytes; { int n, len; unsigned char *number, *newnumber; unsigned char *ptr, *newptr; ptr = pop(type_number, subtype_integer | subtype_rational); number = getnumber(ptr); len = getnumlen(ptr); newnumber = (unsigned char *) malloc(len+nbytes); for (n=0; n < len; n++) newnumber[n] = number[n]; for (n=0; n < nbytes; n++) newnumber[n+len] = getc(fp) & 0377; newptr = makenumber(len+nbytes, newnumber, getsubtype(ptr)); free(ptr); free(newnumber); push(newptr); }static extendstring(nbytes) int nbytes; { int n, len; char *string, *newstring; unsigned char *ptr, *newptr; ptr = pop(type_string, subtype_identifier | subtype_string); string = getstring(ptr, 0); len = strlen(string); newstring = (char *) malloc(len+nbytes+1); strcpy(newstring, string); for (n=0; n < nbytes; n++) newstring[n+len] = getc(fp) & 0377; newstring[len+nbytes] = (char) 0; newptr = makestring(newstring, getsubtype(ptr)); free(ptr); free(newstring); push(newptr); }/* Change Log * * K. Knox, 1-Apr-85 23:45:46, Created first version. * K. Knox, 13-May-85 10:25:25, Fixed bugs in calls to maketransformation. * K. Knox, 13-May-85 10:25:25, Fixed bug in angle calculation in op_rotate. * * * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -