|
|
1.1 root 1: /* execute.c
2: *
3: * Copyright (c) 1984, 1985 Xerox Corp.
4: *
5: * Define the functions used in parse.c.
6: *
7: * Execute the RES file and leave the correct parameters on the stack.
8: *
9: */
10:
11: #include <math.h>
12: #include <stdio.h>
13: #include <iptokens.h>
14: #include "stack.h"
15:
16: #define err0 "(%d) execute: Bad RES header, got %s\n"
17: #define err1 "(%d) execute: roll moveFirst > depth, %d > %d!\n"
18: #define err2 "(%d) execute: unknown operator subtype, got %d!\n"
19: #define err3 "(%d) execute: unknown operator, type=%d!\n"
20: #define err4 "(%d) execute: unknown sequence, type=%d, length=%d!\n"
21: #define err5 "(%d) execute: sequenceInsertFile not implemented!\n"
22:
23:
24: /* Defined elsewhere. */
25: extern unsigned char **malloc();
26: extern long filepos;
27: extern FILE *fp;
28:
29: /* Defined in this module. */
30: extern unsigned char *decompressID();
31: extern unsigned char *decompressOP();
32: extern unsigned char *imagedata();
33: extern unsigned char *popidentifier();
34: extern double popdouble();
35:
36:
37: /*
38: * Public procedures defined for "parse" module.
39: *
40: */
41:
42: header(string)
43: char *string;
44: {
45: fprintf(stderr, "strings are '%s', '%s'\n", string, RES_Header);
46: if (strcmp(string, RES_Header) != 0) error(err0, filepos, string);
47: }
48:
49: op_makevec()
50: {
51: int n, depth;
52: unsigned char *ptr, **array;
53: depth = popint();
54: array = malloc((depth+1)*sizeof(unsigned char *)); /* null terminated array */
55: for (n=0; n < depth; n++) array[depth-n-1] = pop(0);
56: array[depth] = (unsigned char *) 0;
57: ptr = makevector(array, type_vector, subtype_general);
58: for (n=0; n < depth; n++) free(array[n]);
59: free(array);
60: push(ptr);
61: }
62:
63: op_pop()
64: {
65: free(pop(0));
66: }
67:
68: op_copy()
69: {
70: int n, depth;
71: unsigned char *ptr, **temp1, **temp2;
72: depth = popint();
73: temp1 = malloc(depth*sizeof(unsigned char *));
74: temp2 = malloc(depth*sizeof(unsigned char *));
75: for (n=0; n < depth; n++) temp1[depth-n-1] = pop(0);
76: for (n=0; n < depth; n++) temp2[n] = duplicate(temp1[n]);
77: for (n=0; n < depth; n++) push(temp1[n]);
78: for (n=0; n < depth; n++) push(temp2[n]);
79: free(temp1);
80: free(temp2);
81: }
82:
83: op_dup()
84: {
85: unsigned char *ptr, *newptr;
86: ptr = pop(0);
87: newptr = duplicate(ptr);
88: push(ptr);
89: push(newptr);
90: }
91:
92: op_roll()
93: {
94: int n, depth, moveFirst;
95: unsigned char *ptr, **temp;
96: moveFirst = popint();
97: depth = popint();
98: if (moveFirst > depth) error(err1, filepos, moveFirst, depth);
99: temp = malloc(depth*sizeof(unsigned char *));
100: for (n=0; n < depth; n++) temp[depth-n-1] = pop(0);
101: for (n=moveFirst; n < depth; n++) push(temp[n]);
102: for (n=0; n < moveFirst; n++) push(temp[n]);
103: free(temp);
104: }
105:
106: op_exch()
107: {
108: unsigned char *temp1, *temp2;
109: temp1 = pop(0);
110: temp2 = pop(0);
111: push(temp1);
112: push(temp2);
113: }
114:
115: op_nop()
116: {
117: }
118:
119: op_translate()
120: {
121: double x, y;
122: unsigned char *ptr;
123: y = popdouble();
124: x = popdouble();
125: ptr = maketransformation(1.0, 0.0, x, 0.0, 1.0, y);
126: push(ptr);
127: }
128:
129: op_rotate()
130: {
131: double angle, cosA, sinA, pi;
132: unsigned char *ptr;
133: angle = popdouble();
134: angle = 3.1415926*angle/180.;
135: cosA = cos(angle);
136: sinA = sin(angle);
137: ptr = maketransformation(cosA, -sinA, 0.0, sinA, cosA, 0.0);
138: push(ptr);
139: }
140:
141: op_scale()
142: {
143: unsigned char *ptr;
144: double s;
145: s = popdouble();
146: ptr = maketransformation(s, 0.0, 0.0, 0.0, s, 0.0);
147: push(ptr);
148: }
149:
150: op_scale2()
151: {
152: unsigned char *ptr;
153: double sx, sy;
154: sy = popdouble();
155: sx = popdouble();
156: ptr = maketransformation(sx, 0.0, 0.0, 0.0, sy, 0.0);
157: push(ptr);
158: }
159:
160: op_concat()
161: {
162: double a, b, c, d, e, f;
163: unsigned char *ptr, *nptr, *mptr;
164: double *m, *n;
165: nptr = pop(type_transformation, 0);
166: mptr = pop(type_transformation, 0);
167: n = gettransformation(nptr);
168: m = gettransformation(mptr);
169: a = m[0]*n[0]+m[3]*n[1];
170: b = m[1]*n[0]+m[4]*n[1];
171: c = m[2]*n[0]+m[5]*n[1]+n[2];
172: d = m[0]*n[3]+m[3]*n[4];
173: e = m[1]*n[3]+m[4]*n[4];
174: f = m[2]*n[3]+m[5]*n[4]+n[5];
175: ptr = maketransformation(a, b, c, d, e, f);
176: free(mptr);
177: free(nptr);
178: free(m);
179: free(n);
180: push(ptr);
181: }
182:
183: op_makepixelarray()
184: {
185: int n;
186: unsigned char *ptr, **array;
187: array = malloc(9*sizeof(unsigned char *));
188: array[6] = pop(type_vector, 0); /* samples */
189: array[5] = pop(type_transformation, 0); /* m */
190: array[4] = pop(type_number, 0); /* samplesInterleaved */
191: array[3] = pop(type_number | type_vector, 0); /* maxSampleValue */
192: array[2] = pop(type_number, 0); /* samplesPerPixel */
193: array[1] = pop(type_number, 0); /* yPixels */
194: array[0] = pop(type_number, 0); /* xPixels */
195: array[7] = makeselect(getint(array[2]), ~0); /* select == all samples */
196: array[8] = (unsigned char *) 0; /* null terminated list */
197: ptr = makepixelarray(array);
198: for (n=0; n < 9; n++) free(array[n]);
199: free(array);
200: push(ptr);
201: }
202:
203:
204: op_extractpixelarray()
205: {
206: int depth;
207: unsigned char *oldptr, *newptr, *select, **array;
208: select = pop(type_vector, 0);
209: oldptr = pop(type_pixelarray, 0);
210: array = getpixelarray(oldptr);
211: array[7] = select;
212: newptr = makepixelarray(array);
213: free(select);
214: free(oldptr);
215: free(array);
216: push(newptr);
217: }
218:
219: op_do()
220: {
221: unsigned char *ptr, **array;
222: int type, subtype;
223: array = malloc(3*sizeof(unsigned char *));
224: array[0] = pop(type_operator, 0); /* operator to do */
225: array[1] = pop(type_vector, 0); /* vector argument */
226: array[2] = (unsigned char *) 0;
227: switch (getsubtype(array[0]))
228: {
229: case subtype_decompressop:
230: type = type_vector;
231: subtype = subtype_samples;
232: break;
233: case subtype_colorop:
234: type = type_color;
235: subtype = subtype_operator;
236: break;
237: case subtype_colormodelop:
238: type = type_operator;
239: subtype = subtype_colorop;
240: break;
241: default:
242: error(err2, filepos, getsubtype(array[0]));
243: }
244: ptr = makevector(array, type, subtype);
245: free(array[0]);
246: free(array[1]);
247: free(array);
248: push(ptr);
249: }
250:
251: op_finddecompressor()
252: {
253: unsigned char *ptr, **array;
254: array = malloc(2*sizeof(unsigned char *));
255: array[0] = popidentifier("decompressionOps/");
256: array[1] = (unsigned char *) 0;
257: ptr = makeoperator(array, subtype_decompressop);
258: free(array[0]);
259: free(array);
260: push(ptr);
261: }
262:
263: op_makegray()
264: {
265: unsigned char *ptr, **array;
266: array = malloc(2*sizeof(unsigned char *));
267: array[0] = pop(type_number);
268: array[1] = (unsigned char *) 0;
269: ptr = makecolor(array, subtype_value);
270: push(ptr);
271: }
272:
273: op_findcolor()
274: {
275: unsigned char *ptr, **array;
276: array = malloc(2*sizeof(unsigned char *));
277: array[0] = popidentifier("colors/");
278: array[1] = (unsigned char *) 0;
279: ptr = makecolor(array, subtype_name);
280: free(array[0]);
281: free(array);
282: push(ptr);
283: }
284:
285: op_findcoloroperator()
286: {
287: unsigned char *ptr, **array;
288: array = malloc(2*sizeof(unsigned char *));
289: array[0] = popidentifier("colorOps/");
290: array[1] = (unsigned char *) 0;
291: ptr = makeoperator(array, subtype_colorop);
292: free(array[0]);
293: free(array);
294: push(ptr);
295: }
296:
297: op_findcolormodeloperator()
298: {
299: unsigned char *ptr, **array;
300: array = malloc(2*sizeof(unsigned char *));
301: array[0] = popidentifier("colorModelOps/");
302: array[1] = (unsigned char *) 0;
303: ptr = makeoperator(array, subtype_colormodelop);
304: free(array[0]);
305: free(array);
306: push(ptr);
307: }
308:
309: op_beginblock()
310: {
311: }
312:
313: op_endblock()
314: {
315: }
316:
317: op_unknown(op)
318: int op;
319: {
320: error(err3, filepos, op);
321: }
322:
323: seq_comment(nbytes)
324: int nbytes;
325: {
326: fseek(fp, (long) nbytes, 1);
327: }
328:
329: seq_continued(nbytes, last)
330: int nbytes, last;
331: {
332: switch (last)
333: {
334: case sequenceAdaptivePixelVector:
335: case sequenceCompressedPixelVector:
336: case sequencePackedPixelVector:
337: case sequenceLargeVector: extendpixel(nbytes); break;
338: case sequenceComment: fseek(fp, (long) nbytes, 1); break;
339: case sequenceInteger:
340: case sequenceRational: extendnumber(nbytes); break;
341: case sequenceString:
342: case sequenceIdentifier: extendstring(nbytes); break;
343: default: error(err4, filepos, last, nbytes);
344: }
345: }
346:
347: seq_insertfile(nbytes)
348: int nbytes;
349: {
350: error(err5, filepos);
351: }
352:
353: seq_largevector(nbytes)
354: int nbytes;
355: {
356: int b;
357: long bytepos, bytelength;
358: unsigned char *ptr, **array;
359: b = getc(fp) & 0377; /* read the number of bytes/integer. */
360: bytepos = ftell(fp);
361: bytelength = nbytes-1;
362: array = malloc(2*sizeof(unsigned char *));
363: array[0] = makeintegers(b, bytepos, bytelength);
364: array[1] = (unsigned char *) 0;
365: ptr = makevector(array, type_vector, subtype_integers);
366: fseek(fp, bytelength, 1);
367: free(array[0]);
368: free(array);
369: push(ptr);
370: }
371:
372:
373: seq_adaptivepixel(nbytes)
374: int nbytes;
375: {
376: pushpixel(nbytes, "adaptive");
377: }
378:
379: seq_compressedpixel(nbytes)
380: int nbytes;
381: {
382: pushpixel(nbytes, "compressed");
383: }
384:
385: seq_packedpixel(nbytes)
386: int nbytes;
387: {
388: pushpixel(nbytes, "packed");
389: }
390:
391: seq_identifier(nbytes)
392: int nbytes;
393: {
394: pushstring(nbytes, subtype_identifier);
395: }
396:
397: seq_string(nbytes)
398: int nbytes;
399: {
400: pushstring(nbytes, subtype_string);
401: }
402:
403: seq_unknown(type, nbytes)
404: int type, nbytes;
405: {
406: error(err4, filepos, type, nbytes);
407: }
408:
409: seq_integer(nbytes)
410: int nbytes;
411: {
412: pushinteger(nbytes, subtype_integer);
413: }
414:
415: seq_rational(nbytes)
416: int nbytes;
417: {
418: pushinteger(nbytes, subtype_rational);
419: }
420:
421: shortnum(number)
422: int number;
423: {
424: unsigned char value[2];
425: unsigned char *ptr;
426: value[0] = (number >> 8) & 0377;
427: value[1] = number & 0377;
428: ptr = makenumber(2, value, subtype_integer);
429: push(ptr);
430: }
431:
432:
433: /*
434: * Private procedures to this module.
435: *
436: */
437:
438: static pushinteger(nbytes, subtype)
439: int nbytes, subtype;
440: {
441: int n;
442: unsigned char *ptr;
443: unsigned char *array;
444: array = (unsigned char *) malloc(nbytes);
445: for (n=0; n < nbytes; n++) array[n] = getc(fp) & 0377;
446: ptr = makenumber(nbytes, array, subtype);
447: free(array);
448: push(ptr);
449: }
450:
451: static pushstring(nbytes, subtype)
452: int nbytes, subtype;
453: {
454: int n;
455: unsigned char *ptr;
456: char *string;
457: string = (char *) malloc(nbytes+1);
458: for (n=0; n < nbytes; n++) string[n] = getc(fp) & 0377;
459: string[nbytes] = (char) 0;
460: ptr = makestring(string, subtype);
461: free(string);
462: push(ptr);
463: }
464:
465: static pushpixel(nbytes, compression)
466: int nbytes;
467: char *compression;
468: {
469: extern unsigned char *decompressID();
470: extern unsigned char *decompressOP();
471: extern unsigned char *imagedata();
472: unsigned char *ptr, *idvec, **array;
473: idvec = decompressID(compression);
474: array = malloc(3*sizeof(unsigned char *));
475: array[0] = decompressOP(idvec);
476: array[1] = imagedata(nbytes);
477: array[2] = (unsigned char *) 0;
478: ptr = makevector(array, type_vector, subtype_samples);
479: free(idvec);
480: free(array[0]);
481: free(array[1]);
482: free(array);
483: push(ptr);
484: }
485:
486: static unsigned char *decompressID(compression)
487: char *compression;
488: {
489: unsigned char *ptr, **array;
490: array = malloc(3*sizeof(unsigned char *));
491: array[0] = makestring("xerox", subtype_identifier);
492: array[1] = makestring(compression, subtype_identifier);
493: array[2] = (unsigned char *) 0;
494: ptr = makevector(array, type_vector, subtype_general);
495: free(array[0]);
496: free(array[1]);
497: free(array);
498: return(ptr);
499: }
500:
501: static unsigned char *decompressOP(idvec)
502: unsigned char *idvec;
503: {
504: unsigned char *ptr, **array;
505: array = malloc(2*sizeof(unsigned char *));
506: array[0] = makeidentifier(idvec, "decompressionOps/");
507: array[1] = (unsigned char *) 0;
508: ptr = makeoperator(array, subtype_decompressop);
509: free(array[0]);
510: free(array);
511: return(ptr);
512: }
513:
514: static unsigned char *imagedata(nbytes)
515: int nbytes;
516: {
517: long bytepos, bytelength;
518: unsigned char *ptr, **array;
519: bytepos = ftell(fp);
520: bytelength = nbytes;
521: array = malloc(2*sizeof(unsigned char *));
522: array[0] = makeintegers(2, bytepos, bytelength);
523: array[1] = (unsigned char *) 0;
524: ptr = makevector(array, type_vector, subtype_integers);
525: fseek(fp, bytelength, 1);
526: free(array[0]);
527: free(array);
528: return(ptr);
529: }
530:
531: static popint()
532: {
533: int result;
534: unsigned char *ptr;
535: ptr = pop(type_number, 0);
536: result = getint(ptr);
537: free(ptr);
538: return(result);
539: }
540:
541: static double popdouble()
542: {
543: double result;
544: unsigned char *ptr;
545: ptr = pop(type_number, 0);
546: result = getdouble(ptr);
547: free(ptr);
548: return(result);
549: }
550:
551: static unsigned char *popidentifier(prefix)
552: char *prefix; /* should end with '/' character */
553: {
554: unsigned char *ptr, *composite;
555: ptr = pop(type_vector, subtype_general);
556: composite = makeidentifier(ptr, prefix);
557: free(ptr);
558: return(composite);
559: }
560:
561: static extendpixel(nbytes)
562: int nbytes;
563: {
564: int n, depth;
565: long bytepos, bytelength;
566: unsigned char *ptr, **samplesarray, **integersarray;
567: unsigned char *newptr, **newarray;
568: ptr = pop(type_vector, subtype_samples);
569: samplesarray = getvector(ptr);
570: depth = getdepth(samplesarray[1]);
571: integersarray = getvector(samplesarray[1]);
572: newarray = malloc((depth+2)*sizeof(unsigned char *));
573: for (n=0; n < depth; n++) newarray[n] = integersarray[n];
574: bytepos = ftell(fp);
575: bytelength = nbytes;
576: newarray[depth] = makeintegers(2, bytepos, bytelength);
577: newarray[depth+1] = (unsigned char *) 0;
578: samplesarray[1] = makevector(newarray, type_vector, subtype_integers);
579: newptr = makevector(samplesarray, type_vector, subtype_samples);
580: fseek(fp, bytelength, 1);
581: free(ptr);
582: free(newarray[depth]);
583: free(samplesarray[1]);
584: free(samplesarray);
585: free(integersarray);
586: free(newarray);
587: push(newptr);
588: }
589:
590: static extendnumber(nbytes)
591: int nbytes;
592: {
593: int n, len;
594: unsigned char *number, *newnumber;
595: unsigned char *ptr, *newptr;
596: ptr = pop(type_number, subtype_integer | subtype_rational);
597: number = getnumber(ptr);
598: len = getnumlen(ptr);
599: newnumber = (unsigned char *) malloc(len+nbytes);
600: for (n=0; n < len; n++) newnumber[n] = number[n];
601: for (n=0; n < nbytes; n++) newnumber[n+len] = getc(fp) & 0377;
602: newptr = makenumber(len+nbytes, newnumber, getsubtype(ptr));
603: free(ptr);
604: free(newnumber);
605: push(newptr);
606: }
607:
608: static extendstring(nbytes)
609: int nbytes;
610: {
611: int n, len;
612: char *string, *newstring;
613: unsigned char *ptr, *newptr;
614: ptr = pop(type_string, subtype_identifier | subtype_string);
615: string = getstring(ptr, 0);
616: len = strlen(string);
617: newstring = (char *) malloc(len+nbytes+1);
618: strcpy(newstring, string);
619: for (n=0; n < nbytes; n++) newstring[n+len] = getc(fp) & 0377;
620: newstring[len+nbytes] = (char) 0;
621: newptr = makestring(newstring, getsubtype(ptr));
622: free(ptr);
623: free(newstring);
624: push(newptr);
625: }
626:
627:
628:
629:
630:
631: /* Change Log
632: *
633: * K. Knox, 1-Apr-85 23:45:46, Created first version.
634: * K. Knox, 13-May-85 10:25:25, Fixed bugs in calls to maketransformation.
635: * K. Knox, 13-May-85 10:25:25, Fixed bug in angle calculation in op_rotate.
636: *
637: *
638: *
639: */
640:
641:
642:
643:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.