|
|
1.1 ! root 1: /* ! 2: * ! 3: * General purpose routines. ! 4: * ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: #include <ctype.h> ! 9: #include <fcntl.h> ! 10: ! 11: #include "gen.h" ! 12: #include "ext.h" ! 13: #include "path.h" ! 14: ! 15: int nolist = 0; /* number of specified ranges */ ! 16: int olist[50]; /* processing range pairs */ ! 17: ! 18: /*****************************************************************************/ ! 19: ! 20: out_list(str) ! 21: ! 22: char *str; ! 23: ! 24: { ! 25: ! 26: int start, stop; ! 27: ! 28: /* ! 29: * ! 30: * Grab page ranges from str, save them in olist[], and update the nolist ! 31: * count. Range syntax matches nroff/troff syntax. ! 32: * ! 33: */ ! 34: ! 35: while ( *str && nolist < sizeof(olist) - 2 ) { ! 36: start = stop = str_convert(&str, 0); ! 37: ! 38: if ( *str == '-' && *str++ ) ! 39: stop = str_convert(&str, 9999); ! 40: ! 41: if ( start > stop ) ! 42: error(FATAL, "illegal range %d-%d", start, stop); ! 43: ! 44: olist[nolist++] = start; ! 45: olist[nolist++] = stop; ! 46: ! 47: if ( *str != '\0' ) str++; ! 48: } /* End while */ ! 49: ! 50: olist[nolist] = 0; ! 51: ! 52: } /* End of out_list */ ! 53: ! 54: /*****************************************************************************/ ! 55: ! 56: in_olist(num) ! 57: ! 58: int num; ! 59: ! 60: { ! 61: ! 62: int i; ! 63: ! 64: /* ! 65: * ! 66: * Return ON if num is in the current page range list. Print everything if ! 67: * there's no list. ! 68: * ! 69: */ ! 70: if ( nolist == 0 ) ! 71: return(ON); ! 72: ! 73: for ( i = 0; i < nolist; i += 2 ) ! 74: if ( num >= olist[i] && num <= olist[i+1] ) ! 75: return(ON); ! 76: ! 77: return(OFF); ! 78: ! 79: } /* End of in_olist */ ! 80: ! 81: /*****************************************************************************/ ! 82: ! 83: setencoding(name) ! 84: ! 85: char *name; ! 86: ! 87: { ! 88: ! 89: char path[150]; ! 90: ! 91: /* ! 92: * ! 93: * Include the font encoding file selected by name. It's a full pathname if ! 94: * it begins with /, otherwise append suffix ".enc" and look for the file in ! 95: * ENCODINGDIR. Missing files are silently ignored. ! 96: * ! 97: */ ! 98: ! 99: if ( name == NULL ) ! 100: name = "Default"; ! 101: ! 102: if ( *name == '/' ) ! 103: strcpy(path, name); ! 104: else sprintf(path, "%s/%s.enc", ENCODINGDIR, name); ! 105: ! 106: cat(path); ! 107: ! 108: } /* End of setencoding */ ! 109: ! 110: /*****************************************************************************/ ! 111: ! 112: cat(file) ! 113: ! 114: char *file; ! 115: ! 116: { ! 117: ! 118: int fd_in; ! 119: int fd_out; ! 120: char buf[512]; ! 121: int count; ! 122: ! 123: /* ! 124: * ! 125: * Copy *file to stdout. Return FALSE is there was a problem. ! 126: * ! 127: */ ! 128: ! 129: fflush(stdout); ! 130: ! 131: if ( (fd_in = open(file, O_RDONLY)) == -1 ) ! 132: return(FALSE); ! 133: ! 134: fd_out = fileno(stdout); ! 135: while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) ! 136: write(fd_out, buf, count); ! 137: ! 138: close(fd_in); ! 139: ! 140: return(TRUE); ! 141: ! 142: } /* End of cat */ ! 143: ! 144: /*****************************************************************************/ ! 145: ! 146: str_convert(str, err) ! 147: ! 148: char **str; ! 149: int err; ! 150: ! 151: { ! 152: ! 153: int i; ! 154: ! 155: /* ! 156: * ! 157: * Grab the next integer from **str and return its value or err if *str ! 158: * isn't an integer. *str is modified after each digit is read. ! 159: * ! 160: */ ! 161: ! 162: if ( ! isdigit(**str) ) ! 163: return(err); ! 164: ! 165: for ( i = 0; isdigit(**str); *str += 1 ) ! 166: i = 10 * i + **str - '0'; ! 167: ! 168: return(i); ! 169: ! 170: } /* End of str_convert */ ! 171: ! 172: /*****************************************************************************/ ! 173: ! 174: error(kind, mesg, a1, a2, a3) ! 175: ! 176: int kind; ! 177: char *mesg; ! 178: unsigned a1, a2, a3; ! 179: ! 180: { ! 181: ! 182: /* ! 183: * ! 184: * Print an error message and quit if kind is FATAL. ! 185: * ! 186: */ ! 187: ! 188: if ( mesg != NULL && *mesg != '\0' ) { ! 189: fprintf(stderr, "%s: ", prog_name); ! 190: fprintf(stderr, mesg, a1, a2, a3); ! 191: if ( lineno > 0 ) ! 192: fprintf(stderr, " (line %d)", lineno); ! 193: if ( position > 0 ) ! 194: fprintf(stderr, " (near byte %d)", position); ! 195: putc('\n', stderr); ! 196: } /* End if */ ! 197: ! 198: if ( kind == FATAL && ignore == OFF ) { ! 199: if ( temp_file != NULL ) ! 200: unlink(temp_file); ! 201: exit(x_stat | 01); ! 202: } /* End if */ ! 203: ! 204: } /* End of error */ ! 205: ! 206: /*****************************************************************************/ ! 207: ! 208: void interrupt(sig) ! 209: ! 210: int sig; ! 211: ! 212: { ! 213: ! 214: /* ! 215: * ! 216: * Signal handler for translators. ! 217: * ! 218: */ ! 219: ! 220: if ( temp_file != NULL ) ! 221: unlink(temp_file); ! 222: ! 223: exit(1); ! 224: ! 225: } /* End of interrupt */ ! 226: ! 227: /*****************************************************************************/ ! 228:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.