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