|
|
1.1 ! root 1: ! 2: /* ! 3: * ! 4: * A few general purpose routines that can be used with any of the built ! 5: * from these files. ! 6: * ! 7: */ ! 8: ! 9: ! 10: #include <stdio.h> ! 11: #include <ctype.h> ! 12: ! 13: #include "gen.h" /* a few general purpose definitions */ ! 14: #include "ext.h" /* external variable declarations */ ! 15: ! 16: ! 17: int nolist = 0; /* number of specified ranges */ ! 18: int olist[30]; /* processing range pairs */ ! 19: ! 20: ! 21: /*****************************************************************************/ ! 22: ! 23: ! 24: putint(n, fp) ! 25: ! 26: ! 27: int n; /* number we want written out */ ! 28: FILE *fp; /* as next two bytes in this file */ ! 29: ! 30: ! 31: { ! 32: ! 33: ! 34: /* ! 35: * ! 36: * Makes sure the value stored in the lower 16 bits of integer n is written ! 37: * as the next two bytes in file *fp. Used to write Impress commands that ! 38: * have 'word' values. ! 39: * ! 40: */ ! 41: ! 42: ! 43: putc(n >> BYTE, fp); ! 44: putc(n & BMASK, fp); ! 45: ! 46: } /* End of putint */ ! 47: ! 48: ! 49: /*****************************************************************************/ ! 50: ! 51: ! 52: out_list(str) ! 53: ! 54: ! 55: char *str; /* process ranges in this string */ ! 56: ! 57: ! 58: { ! 59: ! 60: ! 61: int start, stop; /* range end points */ ! 62: ! 63: ! 64: /* ! 65: * ! 66: * Called to get the processing ranges that were specified by using the ! 67: * -o option. Hopefully the range syntax is identical to the one used in ! 68: * troff and nroff. Depending on the program the ranges may be used to ! 69: * select pages we want printed or possibly glyphs that we want to display. ! 70: * ! 71: */ ! 72: ! 73: ! 74: while ( *str && nolist < sizeof(olist) - 2 ) { ! 75: start = stop = str_convert(&str, 0); ! 76: ! 77: if ( *str == '-' && *str++ ) ! 78: stop = str_convert(&str, 9999); ! 79: ! 80: if ( start > stop ) ! 81: error(FATAL, "illegal range %d-%d", start, stop); ! 82: ! 83: olist[nolist++] = start; ! 84: olist[nolist++] = stop; ! 85: ! 86: if ( *str != '\0' ) str++; ! 87: ! 88: } /* End while */ ! 89: ! 90: olist[nolist] = 0; ! 91: ! 92: } /* End of out_list */ ! 93: ! 94: ! 95: /*****************************************************************************/ ! 96: ! 97: ! 98: in_olist(num) ! 99: ! 100: ! 101: int num; /* should we process this guy? */ ! 102: ! 103: ! 104: { ! 105: ! 106: ! 107: int i; /* just a loop index */ ! 108: ! 109: ! 110: /* ! 111: * ! 112: * If num (may be a page or glyph) should be processed ON will be returned, ! 113: * otherwise OFF is returned. If no ranges were initially selected nolist ! 114: * will be zero and we'll assume everything is supposed to be processed. ! 115: * ! 116: */ ! 117: ! 118: ! 119: if ( nolist == 0 ) /* everything's included */ ! 120: return(ON); ! 121: ! 122: for ( i = 0; i < nolist; i += 2 ) ! 123: if ( num >= olist[i] && num <= olist[i+1] ) ! 124: return(ON); ! 125: ! 126: return(OFF); ! 127: ! 128: } /* End of in_olist */ ! 129: ! 130: ! 131: /*****************************************************************************/ ! 132: ! 133: ! 134: str_convert(str, err) ! 135: ! 136: ! 137: char **str; /* get next number from this string */ ! 138: int err; /* value returned on error */ ! 139: ! 140: ! 141: { ! 142: ! 143: ! 144: int i; /* just a loop index */ ! 145: ! 146: ! 147: /* ! 148: * ! 149: * Gets the next integer from **str and returns its value to the caller. ! 150: * If **str isn't an integer err is returned. *str is updated after each ! 151: * digit is processed. ! 152: * ! 153: */ ! 154: ! 155: ! 156: if ( ! isdigit(**str) ) /* something's wrong */ ! 157: return(err); ! 158: ! 159: for ( i = 0; isdigit(**str); *str += 1 ) ! 160: i = 10 * i + **str - '0'; ! 161: ! 162: return(i); ! 163: ! 164: } /* End of str_convert */ ! 165: ! 166: ! 167: /*****************************************************************************/ ! 168: ! 169: ! 170: error(kind, mesg, a1, a2, a3) ! 171: ! 172: ! 173: int kind; /* FATAL or NON_FATAL error */ ! 174: char *mesg; /* error message control string */ ! 175: unsigned a1, a2, a3; /* control string arguments */ ! 176: ! 177: ! 178: { ! 179: ! 180: ! 181: /* ! 182: * ! 183: * Called when we've run into some kind of program error. First *mesg is ! 184: * printed using the control string arguments a?. Then if kind is FATAL ! 185: * and we're not ignoring errors the program will be terminated. Probably ! 186: * should call a routine to clean things up for whatever program is using ! 187: * this routine. Could use signal() to figure out who, if anyone, should ! 188: * be called. ! 189: * ! 190: * If mesg is NULL or *mesg is the NULL string nothing will be printed. ! 191: * ! 192: */ ! 193: ! 194: ! 195: if ( mesg != NULL && *mesg != '\0' ) { ! 196: fprintf(stderr, "%s: ", prog_name); ! 197: fprintf(stderr, mesg, a1, a2, a3); ! 198: if ( lineno > 0 ) ! 199: fprintf(stderr, " (line %d)", lineno); ! 200: putc('\n', stderr); ! 201: } /* End if */ ! 202: ! 203: if ( kind == FATAL && ignore == OFF ) ! 204: exit(x_stat == 0 ? 01 : x_stat); ! 205: ! 206: } /* End of error */ ! 207: ! 208: ! 209: /*****************************************************************************/ ! 210: ! 211:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.