tafm2troff.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tafm2troff.c (1896B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 
            5 int didname;
            6 int didfontname;
            7 int offset;
            8 void run(char*, int);
            9 Biobuf bout;
           10 
           11 void
           12 usage(void)
           13 {
           14         fprint(2, "usage: afm2troff [-h] [-o offset] [file...]\n");
           15         exits("usage");
           16 }
           17 
           18 void
           19 main(int argc, char **argv)
           20 {
           21         int i, fd;
           22         
           23         ARGBEGIN{
           24         case 'h':
           25                 didname = 1;
           26                 didfontname = 1;
           27                 break;
           28         case 'o':
           29                 offset = atoi(EARGF(usage()));
           30                 break;
           31         default:
           32                 usage();
           33         }ARGEND
           34         
           35         Binit(&bout, 1, OWRITE);
           36         if(argc == 0)
           37                 run("<stdin>", 0);
           38         else{
           39                 for(i=0; i<argc; i++){
           40                         if((fd = open(argv[i], OREAD)) < 0)
           41                                 sysfatal("open %s: %r", argv[i]);
           42                         run(argv[i], fd);
           43                 }
           44         }
           45         Bflush(&bout);
           46 }
           47 
           48 void
           49 run(char *name, int fd)
           50 {
           51         char *p, *q, *f[100];
           52         int nf, code, wid, ad;
           53         Biobuf b;
           54         Fmt fmt;
           55         
           56         fmtstrinit(&fmt);
           57         Binit(&b, fd, OREAD);
           58         while((p = Brdline(&b, '\n')) != nil){
           59                 p[Blinelen(&b)-1] = 0;
           60                 q = strchr(p, ' ');
           61                 if(q == nil)
           62                         continue;
           63                 *q++ = 0;
           64                 while(*q == ' ' || *q == '\t')
           65                         q++;
           66                 if(*q == 0)
           67                         continue;
           68                 if(strcmp(p, "FontName") == 0 && didname++ == 0)
           69                          Bprint(&bout, "name %s\n", q);
           70                 if(strcmp(p, "FullName") == 0 && didfontname++ == 0)
           71                          Bprint(&bout, "fontname %s\n", q);
           72                 if(strcmp(p, "C") == 0){
           73                         nf = getfields(q, f, nelem(f), 1, "\t\r\n\v ");
           74                         if(nf < 5 || strcmp(f[1], ";") != 0 || strcmp(f[2], "WX") != 0)
           75                                 continue;
           76                         code = strtol(f[0], 0, 10);
           77                         wid = strtol(f[3], 0, 10);
           78                         wid = (wid+5)/10;
           79                         if(code == 0)
           80                                 continue;
           81                         code += offset;
           82                         ad = 0;
           83                         if(nf < 6 || strcmp(f[nf-6], "B") != 0)
           84                                 continue;
           85                         if(atoi(f[nf-4]) < -50)
           86                                 ad |= 1;
           87                         if(atoi(f[nf-2]) > 600)
           88                                 ad |= 2;
           89                         if(nf >= 7 && strcmp(f[5], "N") == 0 && strcmp(f[6], "space") == 0)
           90                                 code = ' ';
           91                         if(code == ' ')
           92                                 Bprint(&bout, "spacewidth %d\ncharset\n", wid);
           93                         else
           94                                 fmtprint(&fmt, "%C\t%d\t%d\t%d %04x\n",
           95                                         code, wid, ad, code, code);
           96                 }
           97         }
           98         Bprint(&bout, "%s", fmtstrflush(&fmt));
           99 }