/* encodings.c * */ #include <iptokens.h> #include <stdio.h> FILE *fpout = stdout; AppendHeader(fp, string) FILE *fp; char *string; { fpout = fp; while (*string != (char) 0) append←byte(*string++); } AppendIdentifier(string) char *string; { append←sequence←descriptor(sequenceIdentifier, strlen(string)); while (*string != (char) 0) append←byte(*string++); } AppendString(string) char *string; { append←sequence←descriptor(sequenceString, strlen(string)); while (*string != (char) 0) append←byte(*string++); } AppendComment(string) char *string; { append←sequence←descriptor(sequenceComment, strlen(string)); while (*string != (char) 0) append←byte(*string++); } AppendOp(opcode) int opcode; { if (opcode > SHORT←OP←LIMIT) { /* has to be coded as a long op */ append←int((LONG←OP << 8) | opcode, 2); } else { /* small enough to be a short op */ append←byte(SHORT←OP | opcode); } } AppendInteger(number) int number; { if (number < INTEGER←MIN || number > INTEGER←MAX) { append←sequence←descriptor(sequenceInteger, bytes←in←int(number)); append←int(number, bytes←in←int(number)); } else { append←int(number+INTEGER←ZERO, 2); } } AppendRational(value, divisor) int value, divisor; { int len←value, len←divisor, len; len←value = bytes←in←int(value); len←divisor = bytes←in←int(divisor); len = len←value > len←divisor ? len←value : len←divisor; append←sequence←descriptor(sequenceRational, 2*len); append←int(value, len); append←int(divisor, len); } AppendPPV(length, bitsperPixel, scanlength) int length, bitsperPixel, scanlength; { append←sequence←descriptor(sequencePPV, length); append←int(bitsperPixel, 2); append←int(scanlength, 2); } AppendCPV(length, breaktable, nrange, scanlength) int length, breaktable, nrange, scanlength; { append←sequence←descriptor(sequenceCPV, length); append←int(breaktable, 2); append←int(nrange, 2); append←int(scanlength, 2); } /* * The remainder of this file contains lower level primitives: */ #define err0 "encoding: sequence type is out-of-range.\n" #define err1 "encoding: sequence length is out-of-range.\n" append←sequence←descriptor(type, length) int type; int length; { if (type < 0 || type > 31) error(err0); if (length < 0 || length > LONG←SEQUENCE←LIMIT) error(err1); if (length > SHORT←SEQUENCE←LIMIT) { /* too big to fit in a short sequence */ append←byte(LONG←SEQUENCE | type); append←int(length, 3); } else { append←byte(SHORT←SEQUENCE | type); append←byte(length); } } append←int(d, n) int d; int n; { switch (n) { case 4: append←byte((d >> 24) & 0xff); case 3: append←byte((d >> 16) & 0xff); case 2: append←byte((d >> 8) & 0xff); case 1: append←byte(d & 0xff); } } bytes←in←int(value) int value; { /* this routine assumes 4 bytes in an int and two's complement notation */ int mask, i; if (value < 0) { /* takes the same space as its one's complemented value */ value = ~value; } if (value == 0) { /* avoids infinite looping */ return(1); } for (i = 4, mask = 0xff800000; (value & mask) == 0; i--, mask >>= 8) ; return(i); } append←byte(value) int value; { unsigned char v; v = value & 0377; putc(v, fpout); } /* Change Log * * William LeFebvre, 24-May-1984 12:15:19, Created Interpress library version. * K. Knox, 17-Dec-84 16:44:03, Greatly modified for use with RES files. * K. Knox, 1-Oct-85 14:34:56, Add AppendCPV function. * K. Knox, 2-Oct-85 14:12:04, Changed from file descriptor to file stream. * * */