|
|
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: ! 388: depth = getdepth(from); ! 389: array = malloc((depth+1)*sizeof(unsigned char *)); ! 390: from += sizeof(struct vector); ! 391: ! 392: for (n=0; n < depth; n++) { ! 393: array[n] = from; ! 394: len = getlength(from); ! 395: from += len; ! 396: } ! 397: ! 398: array[depth] = (unsigned char *) 0; /* null terminated list */ ! 399: return(array); ! 400: } ! 401: ! 402: getdepth(pvector) ! 403: struct vector *pvector; ! 404: { ! 405: return(pvector->depth); ! 406: } ! 407: ! 408: ! 409: ! 410: /* ! 411: * Operators ! 412: * ! 413: */ ! 414: ! 415: unsigned char *makeoperator(array, subtype) ! 416: unsigned char **array; ! 417: int subtype; ! 418: { ! 419: unsigned char *ptr; ! 420: ptr = makevector(array, type_operator, subtype); ! 421: return(ptr); ! 422: } ! 423: ! 424: unsigned char **getoperator(ptr) ! 425: unsigned char *ptr; ! 426: { ! 427: unsigned char **array; ! 428: array = getvector(ptr); ! 429: return(array); ! 430: } ! 431: ! 432: ! 433: ! 434: ! 435: /* ! 436: * Pixel array ! 437: * ! 438: */ ! 439: ! 440: ! 441: unsigned char *makepixelarray(array) ! 442: unsigned char **array; ! 443: { ! 444: int depth; ! 445: unsigned char *ptr; ! 446: for (depth=0; array[depth] != (unsigned char *) 0; depth++) ; ! 447: if (depth != 8) error(err2, filepos, depth); ! 448: ptr = makevector(array, type_pixelarray, 0); ! 449: return(ptr); ! 450: } ! 451: ! 452: unsigned char *makeselect(max, samples) ! 453: int max, samples; ! 454: { ! 455: int n, mask, depth; ! 456: unsigned char *ptr, **array, value; ! 457: array = malloc((max+1)*sizeof(unsigned char *)); ! 458: depth = 0; ! 459: for (n=0; n < max; n++) ! 460: { ! 461: value = n; ! 462: mask = 1 << n; ! 463: if (samples & mask) ! 464: { ! 465: array[depth] = makenumber(1, &value, subtype_integer); ! 466: depth++; ! 467: } ! 468: } ! 469: array[depth] = (unsigned char *) 0; /* null terminated list */ ! 470: ptr = makevector(array, type_vector, subtype_general); ! 471: for (n=0; n < depth; n++) free(array[n]); ! 472: free(array); ! 473: return(ptr); ! 474: } ! 475: ! 476: unsigned char **getpixelarray(from) ! 477: unsigned char *from; ! 478: { ! 479: if (getdepth(from) != 8) error(err2, filepos, getdepth(from)); ! 480: return(getvector(from)); ! 481: } ! 482: ! 483: ! 484: /* ! 485: * Transformations ! 486: * ! 487: */ ! 488: ! 489: unsigned char *maketransformation(a, b, c, d, e, f) ! 490: double a, b, c, d, e, f; ! 491: { ! 492: unsigned char *ptr; ! 493: struct transformation *ptransformation; ! 494: ptr = makeitem(sizeof(struct transformation), type_transformation, 0); ! 495: ptransformation = (struct transformation *) ptr; ! 496: ptransformation->a = a; ! 497: ptransformation->b = b; ! 498: ptransformation->c = c; ! 499: ptransformation->d = d; ! 500: ptransformation->e = e; ! 501: ptransformation->f = f; ! 502: return(ptr); ! 503: } ! 504: ! 505: double *gettransformation(ptransformation) ! 506: struct transformation *ptransformation; ! 507: { ! 508: double *array; ! 509: checktype(ptransformation, type_transformation, 0); ! 510: array = (double *) malloc(6*sizeof(double)); ! 511: array[0] = ptransformation->a; ! 512: array[1] = ptransformation->b; ! 513: array[2] = ptransformation->c; ! 514: array[3] = ptransformation->d; ! 515: array[4] = ptransformation->e; ! 516: array[5] = ptransformation->f; ! 517: return(array); ! 518: } ! 519: ! 520: ! 521: /* ! 522: * Integers ! 523: * ! 524: */ ! 525: ! 526: unsigned char *makeintegers(bytesPerInteger, bytepos, bytelength) ! 527: int bytesPerInteger; ! 528: long bytepos, bytelength; ! 529: { ! 530: unsigned char *ptr; ! 531: struct integers *pintegers; ! 532: ptr = makeitem(sizeof(struct integers), type_integers, 0); ! 533: pintegers = (struct integers *) ptr; ! 534: pintegers->bytesPerInteger = bytesPerInteger; ! 535: pintegers->bytepos = bytepos; ! 536: pintegers->bytelength = bytelength; ! 537: return(ptr); ! 538: } ! 539: ! 540: getbytesPerInteger(pintegers) ! 541: struct integers *pintegers; ! 542: { ! 543: checktype(pintegers, type_integers, 0); ! 544: return(pintegers->bytesPerInteger); ! 545: } ! 546: ! 547: long getbytepos(pintegers) ! 548: struct integers *pintegers; ! 549: { ! 550: checktype(pintegers, type_integers, 0); ! 551: return(pintegers->bytepos); ! 552: } ! 553: ! 554: long getbytelength(pintegers) ! 555: struct integers *pintegers; ! 556: { ! 557: checktype(pintegers, type_integers, 0); ! 558: return(pintegers->bytelength); ! 559: } ! 560: ! 561: ! 562: ! 563: /* ! 564: * Private procedures to this module. ! 565: * ! 566: */ ! 567: ! 568: static unsigned char *makeitem(length, type, subtype) ! 569: int length, type, subtype; ! 570: { ! 571: unsigned char *ptr; ! 572: struct item *pitem; ! 573: length = (length+sizeof(int)-1)/sizeof(int); ! 574: length *= sizeof(int); ! 575: ptr = (unsigned char *) malloc(length); ! 576: pitem = (struct item *) ptr; ! 577: pitem->length = length; ! 578: pitem->type = type; ! 579: pitem->subtype = subtype; ! 580: return(ptr); ! 581: } ! 582: ! 583: static double readdouble(nbytes, array) ! 584: int nbytes; ! 585: unsigned char *array; ! 586: { ! 587: int n, negative, temp; ! 588: double result; ! 589: negative = 0; ! 590: if (array[0] > 127) ! 591: { ! 592: negative = 1; ! 593: for (n=0; n < nbytes; n++) array[n] = ~array[n]; ! 594: } ! 595: result = 0; ! 596: for (n=0; n < nbytes; n++) ! 597: { ! 598: temp = array[n]; ! 599: result = 256.*result+(double)temp; ! 600: } ! 601: if (negative) result = -result-1; ! 602: return(result); ! 603: } ! 604: ! 605: ! 606: ! 607: /* Change Log ! 608: * ! 609: * K. Knox, 29-Mar-85 18:20:18, Created first version. ! 610: * K. Knox, 13-May-85 9:50:52, Fixed negative number bug in readdouble(). ! 611: * ! 612: * ! 613: * ! 614: */ ! 615: ! 616: ! 617: ! 618:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.