|
|
1.1 root 1: /* stack.c
2: *
3: * Copyright (c) 1984, 1985 Xerox Corp.
4: *
5: * This module manipulates the RES stack.
6: *
7: */
8:
9: #include "stack.h"
10:
11: extern long filepos;
12: extern unsigned char **malloc();
13:
14: /* Private procedures defined in this module. */
15: extern unsigned char *makeitem();
16: extern double readdouble();
17:
18: struct item
19: {
20: int length; /* total byte length of this stack item. */
21: struct item *next; /* next element on the stack. */
22: int type; /* stack element type. */
23: int subtype; /* subtype within this type. */
24: };
25:
26: struct number
27: {
28: int length;
29: struct item *next;
30: int type;
31: int subtype;
32: unsigned char nbytes;
33: unsigned char num[1];
34: };
35:
36: struct string
37: {
38: int length;
39: struct item *next;
40: int type;
41: int subtype;
42: char s[1];
43: /* the string follows here, above char gives room for terminating null */
44: };
45:
46: struct vector
47: {
48: int length;
49: struct item *next;
50: int type;
51: int subtype;
52: int depth;
53: };
54:
55: struct integers
56: {
57: int length;
58: struct item *next;
59: int type;
60: int subtype;
61: int bytesPerInteger;
62: long bytepos;
63: long bytelength;
64: };
65:
66:
67: struct transformation
68: {
69: int length;
70: struct item *next;
71: int type;
72: int subtype;
73: double a;
74: double b;
75: double c;
76: double d;
77: double e;
78: double f;
79: };
80:
81: static struct item *stack = (struct item *) 0;
82:
83: #define err0 "(%d) stack: pop called on an empty stack!\n"
84: #define err1 "(%d) stack: expecting type (%s, %s), got (%d, %d)!\n"
85: #define err2 "(%d) stack: should be 8 elements in pixelarray, got %d!\n"
86:
87:
88: /*
89: * Items on the stack.
90: *
91: */
92:
93: stackempty()
94: {
95: return(stack == (struct item *) 0);
96: }
97:
98: unsigned char *pop(type, subtype)
99: int type, subtype;
100: {
101: unsigned char *ptr;
102: struct item *pitem;
103: pitem = stack;
104: if (pitem == (struct item *) 0) error(err0, filepos);
105: stack = pitem->next;
106: ptr = (unsigned char *) pitem;
107: checktype(ptr, type, subtype);
108: return (ptr);
109: }
110:
111: push(pitem)
112: struct item *pitem;
113: {
114: pitem->next = stack;
115: stack = pitem;
116: }
117:
118: unsigned char *duplicate(from)
119: unsigned char *from;
120: {
121: int n;
122: unsigned char *to;
123: to = makeitem(getlength(from), gettype(from), getsubtype(from));
124: for (n=0; n < getlength(from); n++) to[n] = from[n];
125: return (to);
126: }
127:
128: gettype(pitem)
129: struct item *pitem;
130: {
131: return(pitem->type);
132: }
133:
134: getsubtype(pitem)
135: struct item *pitem;
136: {
137: return(pitem->subtype);
138: }
139:
140: getlength(pitem)
141: struct item *pitem;
142: {
143: return(pitem->length);
144: }
145:
146: checktype(ptr, type, subtype)
147: unsigned char *ptr;
148: int type, subtype;
149: {
150: int intype, insubtype, problem;
151: char *typename, *subtypename;
152: intype = gettype(ptr);
153: insubtype = getsubtype(ptr);
154: problem = 0;
155: if (type)
156: {
157: if ((type & intype) == 0) problem = 1;
158: if ((subtype != 0) && ((subtype & insubtype) == 0)) problem = 1;
159: }
160: if (problem)
161: {
162: typename = gettypename(type);
163: subtypename = getsubtypename(subtype);
164: error(err1, filepos, typename, subtypename, intype, insubtype);
165: }
166: }
167:
168: char *gettypename(type)
169: int type;
170: {
171: switch (type)
172: {
173: case 0: return("undefined");
174: case 1: return("number");
175: case 2: return("string");
176: case 4: return("vector");
177: case 8: return("operator");
178: case 16: return("color");
179: case 32: return("pixelarray");
180: case 64: return("transformation");
181: case 128: return("integers");
182: default: return("unknown");
183: };
184: }
185:
186: char *getsubtypename(subtype)
187: int subtype;
188: {
189: switch (subtype)
190: {
191: case 0: return("undefined");
192: case 1: return("integer");
193: case 2: return("rational");
194: case 4: return("identifier");
195: case 8: return("string");
196: case 16: return("general");
197: case 32: return("integers");
198: case 64: return("samples");
199: case 128: return("decompressop");
200: case 256: return("colorop");
201: case 512: return("colormodelop");
202: case 1024: return("value");
203: case 2048: return("name");
204: case 4096: return("operator");
205: default: return("unknown");
206: };
207: }
208:
209:
210: /*
211: * Numbers
212: *
213: */
214:
215: unsigned char *makenumber(nbytes, array, subtype)
216: int nbytes;
217: unsigned char *array;
218: {
219: int n;
220: unsigned char *ptr;
221: struct number *pnumber;
222: ptr = makeitem(sizeof(struct number)+nbytes, type_number, subtype);
223: pnumber = (struct number *) ptr;
224: pnumber->nbytes = nbytes;
225: for (n=0; n < nbytes; n++) pnumber->num[n] = array[n];
226: return(ptr);
227: }
228:
229: getnumlen(pnumber)
230: struct number *pnumber;
231: {
232: checktype(pnumber, type_number, 0);
233: return(pnumber->nbytes);
234: }
235:
236: unsigned char *getnumber(pnumber)
237: struct number *pnumber;
238: {
239: checktype(pnumber, type_number, 0);
240: return(pnumber->num);
241: }
242:
243: getint(ptr)
244: unsigned char *ptr;
245: {
246: int result;
247: result = getdouble(ptr);
248: return (result);
249: }
250:
251: double getdouble(pnumber)
252: struct number *pnumber;
253: {
254: int nbytes;
255: double result, numerator, denominator;
256: checktype(pnumber, type_number, subtype_integer | subtype_rational);
257: switch (getsubtype(pnumber))
258: {
259: case subtype_integer:
260: result = readdouble(pnumber->nbytes, pnumber->num);
261: break;
262: case subtype_rational:
263: nbytes = pnumber->nbytes/2;
264: numerator = readdouble(nbytes, pnumber->num);
265: denominator = readdouble(nbytes, pnumber->num+nbytes);
266: result = numerator/denominator;
267: break;
268: }
269: return (result);
270: }
271:
272: double getnumerator(pnumber)
273: unsigned char *pnumber;
274: {
275: int nbytes;
276: double numerator;
277: checktype(pnumber, type_number, subtype_rational);
278: nbytes = getnumlen(pnumber)/2;
279: numerator = readdouble(nbytes, getnumber(pnumber));
280: return (numerator);
281: }
282:
283: double getdenominator(pnumber)
284: unsigned char *pnumber;
285: {
286: int nbytes;
287: double denominator;
288: checktype(pnumber, type_number, subtype_rational);
289: nbytes = getnumlen(pnumber)/2;
290: denominator = readdouble(nbytes, getnumber(pnumber)+nbytes);
291: return (denominator);
292: }
293:
294:
295: /*
296: * Strings
297: *
298: */
299:
300: unsigned char *makestring(string, subtype)
301: char *string;
302: int subtype;
303: {
304: unsigned char *ptr;
305: struct string *pstring;
306: ptr = makeitem(sizeof(struct string)+strlen(string), type_string, subtype);
307: pstring = (struct string *) ptr;
308: strcpy(pstring->s, string);
309: return(ptr);
310: }
311:
312: unsigned char *makeidentifier(ptr, prefix)
313: unsigned char *ptr;
314: char *prefix;
315: {
316: char *string;
317: int n, len, depth;
318: unsigned char *composite, **array;
319: depth = getdepth(ptr);
320: array = getvector(ptr);
321: len = strlen(prefix);
322: for (n=0; n < depth; n++)
323: {
324: string = getstring(array[n], subtype_identifier);
325: len += strlen(string)+1; /* add one for '/' character */
326: } /* added one too many, gives extra space */
327: string = (char *) malloc(len+1); /* add one for null character */
328: strcpy(string, prefix);
329: for (n=0; n < depth; n++)
330: {
331: if (n) strcat(string, "/");
332: strcat(string, getstring(array[n], subtype_identifier));
333: }
334: free(array);
335: composite = makestring(string, subtype_identifier);
336: free(string);
337: return(composite);
338: }
339:
340: char *getstring(pstring, subtype)
341: struct string *pstring;
342: {
343: checktype(pstring, type_string, subtype);
344: return(pstring->s);
345: }
346:
347:
348: /*
349: * Vectors
350: *
351: */
352:
353: unsigned char *makevector(array, type, subtype)
354: unsigned char **array;
355: int type, subtype;
356: {
357: int n, m, len, depth;
358: unsigned char *ptr, *to, *from;
359: struct vector *pvector;
360: len = sizeof(struct vector);
361: for (depth=0; array[depth] != (unsigned char *) 0; depth++)
362: len += getlength(array[depth]);
363: ptr = makeitem(len, type, subtype);
364: pvector = (struct vector *) ptr;
365: pvector->depth = depth;
366: to = ptr;
367: to += sizeof(struct vector);
368: for (n=0; n < depth; n++)
369: {
370: from = array[n];
371: len = getlength(from);
372: for (m=0; m < len; m++) to[m] = from[m];
373: to += len;
374: }
375: return(ptr);
376: }
377:
378: unsigned char **getvector(from)
379: unsigned char *from;
380: {
381: int n, m, depth, len;
382: unsigned char *to, **array;
383: depth = getdepth(from);
384: array = malloc((depth+1)*sizeof(unsigned char *));
385: from += sizeof(struct vector);
386: for (n=0; n < depth; n++)
387: {
388: array[n] = from;
389: len = getlength(from);
390: from += len;
391: }
392: array[depth] = (unsigned char *) 0; /* null terminated list */
393: return(array);
394: }
395:
396: getdepth(pvector)
397: struct vector *pvector;
398: {
399: return(pvector->depth);
400: }
401:
402:
403:
404: /*
405: * Operators
406: *
407: */
408:
409: unsigned char *makeoperator(array, subtype)
410: unsigned char **array;
411: int subtype;
412: {
413: unsigned char *ptr;
414: ptr = makevector(array, type_operator, subtype);
415: return(ptr);
416: }
417:
418: unsigned char **getoperator(ptr)
419: unsigned char *ptr;
420: {
421: unsigned char **array;
422: array = getvector(ptr);
423: return(array);
424: }
425:
426:
427:
428: /*
429: * Colors
430: *
431: */
432:
433: unsigned char *makecolor(array, subtype)
434: unsigned char **array;
435: int subtype;
436: {
437: unsigned char *ptr;
438: ptr = makevector(array, type_color, subtype);
439: return(ptr);
440: }
441:
442: unsigned char **getcolor(ptr)
443: unsigned char *ptr;
444: {
445: unsigned char **array;
446: array = getvector(ptr);
447: return(array);
448: }
449:
450:
451:
452: /*
453: * Pixel array
454: *
455: */
456:
457:
458: unsigned char *makepixelarray(array)
459: unsigned char **array;
460: {
461: int depth;
462: unsigned char *ptr;
463: for (depth=0; array[depth] != (unsigned char *) 0; depth++) ;
464: if (depth != 8) error(err2, filepos, depth);
465: ptr = makevector(array, type_pixelarray, 0);
466: return(ptr);
467: }
468:
469: unsigned char *makeselect(max, samples)
470: int max, samples;
471: {
472: int n, mask, depth;
473: unsigned char *ptr, **array, value;
474: array = malloc((max+1)*sizeof(unsigned char *));
475: depth = 0;
476: for (n=0; n < max; n++)
477: {
478: value = n;
479: mask = 1 << n;
480: if (samples & mask)
481: {
482: array[depth] = makenumber(1, &value, subtype_integer);
483: depth++;
484: }
485: }
486: array[depth] = (unsigned char *) 0; /* null terminated list */
487: ptr = makevector(array, type_vector, subtype_general);
488: for (n=0; n < depth; n++) free(array[n]);
489: free(array);
490: return(ptr);
491: }
492:
493: unsigned char **getpixelarray(from)
494: unsigned char *from;
495: {
496: if (getdepth(from) != 8) error(err2, filepos, getdepth(from));
497: return(getvector(from));
498: }
499:
500:
501: /*
502: * Transformations
503: *
504: */
505:
506: unsigned char *maketransformation(a, b, c, d, e, f)
507: double a, b, c, d, e, f;
508: {
509: unsigned char *ptr;
510: struct transformation *ptransformation;
511: ptr = makeitem(sizeof(struct transformation), type_transformation, 0);
512: ptransformation = (struct transformation *) ptr;
513: ptransformation->a = a;
514: ptransformation->b = b;
515: ptransformation->c = c;
516: ptransformation->d = d;
517: ptransformation->e = e;
518: ptransformation->f = f;
519: return(ptr);
520: }
521:
522: double *gettransformation(ptransformation)
523: struct transformation *ptransformation;
524: {
525: double *array;
526: checktype(ptransformation, type_transformation, 0);
527: array = (double *) malloc(6*sizeof(double));
528: array[0] = ptransformation->a;
529: array[1] = ptransformation->b;
530: array[2] = ptransformation->c;
531: array[3] = ptransformation->d;
532: array[4] = ptransformation->e;
533: array[5] = ptransformation->f;
534: return(array);
535: }
536:
537:
538: /*
539: * Integers
540: *
541: */
542:
543: unsigned char *makeintegers(bytesPerInteger, bytepos, bytelength)
544: int bytesPerInteger;
545: long bytepos, bytelength;
546: {
547: unsigned char *ptr;
548: struct integers *pintegers;
549: ptr = makeitem(sizeof(struct integers), type_integers, 0);
550: pintegers = (struct integers *) ptr;
551: pintegers->bytesPerInteger = bytesPerInteger;
552: pintegers->bytepos = bytepos;
553: pintegers->bytelength = bytelength;
554: return(ptr);
555: }
556:
557: getbytesPerInteger(pintegers)
558: struct integers *pintegers;
559: {
560: checktype(pintegers, type_integers, 0);
561: return(pintegers->bytesPerInteger);
562: }
563:
564: long getbytepos(pintegers)
565: struct integers *pintegers;
566: {
567: checktype(pintegers, type_integers, 0);
568: return(pintegers->bytepos);
569: }
570:
571: long getbytelength(pintegers)
572: struct integers *pintegers;
573: {
574: checktype(pintegers, type_integers, 0);
575: return(pintegers->bytelength);
576: }
577:
578:
579:
580: /*
581: * Private procedures to this module.
582: *
583: */
584:
585: static unsigned char *makeitem(length, type, subtype)
586: int length, type, subtype;
587: {
588: unsigned char *ptr;
589: struct item *pitem;
590: length = (length+sizeof(int)-1)/sizeof(int);
591: length *= sizeof(int);
592: ptr = (unsigned char *) malloc(length);
593: pitem = (struct item *) ptr;
594: pitem->length = length;
595: pitem->type = type;
596: pitem->subtype = subtype;
597: return(ptr);
598: }
599:
600: static double readdouble(nbytes, array)
601: int nbytes;
602: unsigned char *array;
603: {
604: int n, negative, temp;
605: double result;
606: negative = 0;
607: if (array[0] > 127)
608: {
609: negative = 1;
610: for (n=0; n < nbytes; n++) array[n] = ~array[n];
611: }
612: result = 0;
613: for (n=0; n < nbytes; n++)
614: {
615: temp = array[n];
616: result = 256.*result+(double)temp;
617: }
618: if (negative) result = -result-1;
619: return(result);
620: }
621:
622:
623:
624: /* Change Log
625: *
626: * K. Knox, 29-Mar-85 18:20:18, Created first version.
627: * K. Knox, 13-May-85 9:50:52, Fixed negative number bug in readdouble().
628: *
629: *
630: *
631: */
632:
633:
634:
635:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.