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