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