diff options
author | rsc <devnull@localhost> | 2004-05-15 23:55:53 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-05-15 23:55:53 +0000 |
commit | 61f5c35c9465f0702739b41249a664d409f0482c (patch) | |
tree | 17546b7dcc76abd9ee74dc7543cc77121acfe39a /src/cmd/postscript/common/misc.c | |
parent | 173302913ebce353eadcbb12d71c3759cbe79e34 (diff) | |
download | plan9port-61f5c35c9465f0702739b41249a664d409f0482c.tar.gz plan9port-61f5c35c9465f0702739b41249a664d409f0482c.tar.bz2 plan9port-61f5c35c9465f0702739b41249a664d409f0482c.zip |
more files
Diffstat (limited to 'src/cmd/postscript/common/misc.c')
-rw-r--r-- | src/cmd/postscript/common/misc.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/src/cmd/postscript/common/misc.c b/src/cmd/postscript/common/misc.c new file mode 100644 index 00000000..25bd37aa --- /dev/null +++ b/src/cmd/postscript/common/misc.c @@ -0,0 +1,230 @@ +/* + * + * General purpose routines. + * + */ + +#include <stdio.h> +#include <ctype.h> +#include <sys/types.h> +#include <fcntl.h> + +#include "gen.h" +#include "ext.h" +#include "path.h" + +int nolist = 0; /* number of specified ranges */ +int olist[50]; /* processing range pairs */ + +/*****************************************************************************/ + +out_list(str) + + char *str; + +{ + + int start, stop; + +/* + * + * Grab page ranges from str, save them in olist[], and update the nolist + * count. Range syntax matches nroff/troff syntax. + * + */ + + while ( *str && nolist < sizeof(olist) - 2 ) { + start = stop = str_convert(&str, 0); + + if ( *str == '-' && *str++ ) + stop = str_convert(&str, 9999); + + if ( start > stop ) + error(FATAL, "illegal range %d-%d", start, stop); + + olist[nolist++] = start; + olist[nolist++] = stop; + + if ( *str != '\0' ) str++; + } /* End while */ + + olist[nolist] = 0; + +} /* End of out_list */ + +/*****************************************************************************/ + +in_olist(num) + + int num; + +{ + + int i; + +/* + * + * Return ON if num is in the current page range list. Print everything if + * there's no list. + * + */ + if ( nolist == 0 ) + return(ON); + + for ( i = 0; i < nolist; i += 2 ) + if ( num >= olist[i] && num <= olist[i+1] ) + return(ON); + + return(OFF); + +} /* End of in_olist */ + +/*****************************************************************************/ + +setencoding(name) + + char *name; + +{ + + char path[150]; + +/* + * + * Include the font encoding file selected by name. It's a full pathname if + * it begins with /, otherwise append suffix ".enc" and look for the file in + * ENCODINGDIR. Missing files are silently ignored. + * + */ + + if ( name == NULL ) + name = "Default"; + + if ( *name == '/' ) + strcpy(path, name); + else sprintf(path, "%s/%s.enc", ENCODINGDIR, name); + + if ( cat(path) == TRUE ) + writing = strncmp(name, "UTF", 3) == 0; + +} /* End of setencoding */ + +/*****************************************************************************/ + +cat(file) + + char *file; + +{ + + int fd_in; + int fd_out; + char buf[512]; + int count; + +/* + * + * Copy *file to stdout. Return FALSE is there was a problem. + * + */ + + fflush(stdout); + + if ( (fd_in = open(file, O_RDONLY)) == -1 ) + return(FALSE); + + fd_out = fileno(stdout); + while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) + write(fd_out, buf, count); + + close(fd_in); + + return(TRUE); + +} /* End of cat */ + +/*****************************************************************************/ + +str_convert(str, err) + + char **str; + int err; + +{ + + int i; + +/* + * + * Grab the next integer from **str and return its value or err if *str + * isn't an integer. *str is modified after each digit is read. + * + */ + + if ( ! isdigit(**str) ) + return(err); + + for ( i = 0; isdigit(**str); *str += 1 ) + i = 10 * i + **str - '0'; + + return(i); + +} /* End of str_convert */ + +/*****************************************************************************/ + +error(kind, mesg, a1, a2, a3) + + int kind; + char *mesg; + unsigned a1, a2, a3; + +{ + +/* + * + * Print an error message and quit if kind is FATAL. + * + */ + + if ( mesg != NULL && *mesg != '\0' ) { + fprintf(stderr, "%s: ", prog_name); + fprintf(stderr, mesg, a1, a2, a3); + if ( lineno > 0 ) + fprintf(stderr, " (line %d)", lineno); + if ( position > 0 ) + fprintf(stderr, " (near byte %d)", position); + putc('\n', stderr); + } /* End if */ + + if ( kind == FATAL && ignore == OFF ) { + if ( temp_file != NULL ) + unlink(temp_file); + exit(x_stat | 01); + } /* End if */ + +} /* End of error */ + +/*****************************************************************************/ + +void interrupt(sig) + + int sig; + +{ + +/* + * + * Signal handler for translators. + * + */ + + if ( temp_file != NULL ) + unlink(temp_file); + + exit(1); + +} /* End of interrupt */ + +/*****************************************************************************/ + |