home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume20 / psroff / part03 / dit2catwid.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-17  |  8.6 KB  |  503 lines

  1. /* Brute force ditroff to CAT width table converter 1.5 89/08/25
  2.    Will generate ft* files that are compatible with troff (at least the
  3.    Xenix version that is)
  4. */
  5.  
  6. static char SCCSid[] = "@(#)dit2catwid.c 1.5 89/08/25";
  7.  
  8. #include <stdio.h>
  9. #include "defs.h"
  10. #include <ctype.h>
  11. int res = 720;
  12. int unitwid = 10;
  13. int symfont = 0;
  14. int verbose = 0;
  15.  
  16. #define    TROFFUWID    6
  17.  
  18. #ifdef    DEBUG
  19. #undef    DEBUG
  20. #endif
  21.  
  22. FILE *mustopen();
  23.  
  24. struct widths {
  25.     char *name;
  26.     unsigned char catwidth;
  27. };
  28.  
  29. struct widths symbol[256-32] = {
  30.     {NULL},{NULL},             /* ".=Sw+042-40" */
  31.     {"\""},
  32.     {"#"},
  33.     {NULL},{NULL},{NULL},{NULL},             /* ".=Sw+074-40" */
  34.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  35.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  36.     {NULL},{NULL},{NULL},{NULL},
  37.     {"<"},
  38.     {NULL},             /* ".=Sw+076-40" */
  39.     {">"},
  40.     {NULL},             /* ".=Sw+100-40" */
  41.     {"@"},
  42.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},        /* ".=Sw+134-40" */
  43.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  44.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  45.     {NULL},{NULL},{NULL},{NULL},
  46.     {"\\"},
  47.     {NULL},             /* ".=Sw+136-40" */
  48.     {"^"},
  49.     {"_"},
  50.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  51.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  52.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  53.     {NULL},{NULL},{NULL},
  54.     {"}"},
  55.     {NULL},             /* ".=Sw+175-40" */
  56.     {"}"},
  57.     {"~"},
  58.     {NULL},             /* ".=Sw+220-40" */
  59.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  60.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  61.     {"sc"},
  62.     {NULL},            /* ".=Sw+222-40" */
  63.     {"aa"},
  64.     {"ga"},
  65.     {"ul"},
  66.     {"sl"},
  67.     {NULL},         /* "" */
  68.     {NULL},         /* "" */
  69.     {"*a"},
  70.     {"*b"},
  71.     {"*g"},
  72.     {"*d"},
  73.     {"*e"},
  74.     {"*z"},
  75.     {"*y"},
  76.     {"*h"},
  77.     {"*i"},
  78.     {"*k"},
  79.     {"*l"},
  80.     {"*m"},
  81.     {"*n"},
  82.     {"*c"},
  83.     {"*o"},
  84.     {"*p"},
  85.     {"*r"},
  86.     {"*s"},
  87.     {"*t"},
  88.     {"*u"},
  89.     {"*f"},
  90.     {"*x"},
  91.     {"*q"},
  92.     {"*w"},
  93.     {"*G"},
  94.     {"*D"},
  95.     {"*H"},
  96.     {"*L"},
  97.     {"*C"},
  98.     {"*P"},
  99.     {"*S"},
  100.     {NULL},         /* "" */
  101.     {"*U"},
  102.     {"*F"},
  103.     {"*Q"},
  104.     {"*W"},
  105.     {"sr"},
  106.     {"ts"},
  107.     {"rn"},
  108.     {">="},
  109.     {"<="},
  110.     {"=="},
  111.     {"mi"},
  112.     {"~="},
  113.     {"ap"},
  114.     {"!="},
  115.     {"->"},
  116.     {"<-"},
  117.     {"ua"},
  118.     {"da"},
  119.     {"eq"},
  120.     {"mu"},
  121.     {"di"},
  122.     {"+-"},
  123.     {"cu"},
  124.     {"ca"},
  125.     {"sb"},
  126.     {"sp"},
  127.     {"ib"},
  128.     {"ip"},
  129.     {"if"},
  130.     {"pd"},
  131.     {"gr"},
  132.     {"no"},
  133.     {"is"},
  134.     {"pt"},
  135.     {"es"},
  136.     {"mo"},
  137.     {"pl"},
  138.     {NULL},
  139.     {NULL},
  140.     {NULL},         /* "box vert rule (was 2.)" */
  141.     {NULL},
  142.     {"dd"},
  143.     {"rh"},
  144.     {"lh"},
  145.     {"**"},
  146.     {"bs"},
  147.     {"or"},
  148.     {"ci"},
  149.     {"lt"},
  150.     {"lb"},
  151.     {"rt"},
  152.     {"rb"},
  153.     {"lk"},
  154.     {"rk"},
  155.     {"bv"},
  156.     {"lf"},
  157.     {"rf"},
  158.     {"lc"},
  159.     {"rc"}
  160. };
  161.  
  162. struct widths normal[256-32] = {
  163.     {" "},
  164.     {"!"},
  165.     {NULL}, {NULL},
  166.     {"$"},
  167.     {"%"},
  168.     {"&"},
  169.     {"'"},
  170.     {"("},
  171.     {")"},
  172.     {"*"},
  173.     {"+"},
  174.     {","},
  175.     {"-"},        /* - hyphen - is this right? */
  176.     {"."},
  177.     {"/"},
  178.     {"0"},
  179.     {"1"},
  180.     {"2"},
  181.     {"3"},
  182.     {"4"},
  183.     {"5"},
  184.     {"6"},
  185.     {"7"},
  186.     {"8"},
  187.     {"9"},
  188.     {":"},
  189.     {";"},
  190.     {NULL},
  191.     {"="},
  192.     {NULL},
  193.     {"?"},
  194.     {NULL},
  195.     {"A"},
  196.     {"B"},
  197.     {"C"},
  198.     {"D"},
  199.     {"E"},
  200.     {"F"},
  201.     {"G"},
  202.     {"H"},
  203.     {"I"},
  204.     {"J"},
  205.     {"K"},
  206.     {"L"},
  207.     {"M"},
  208.     {"N"},
  209.     {"O"},
  210.     {"P"},
  211.     {"Q"},
  212.     {"R"},
  213.     {"S"},
  214.     {"T"},
  215.     {"U"},
  216.     {"V"},
  217.     {"W"},
  218.     {"X"},
  219.     {"Y"},
  220.     {"Z"},
  221.     {"["},
  222.     {NULL},
  223.     {"]"},
  224.     {NULL},
  225.     {NULL},
  226.     {"`"},
  227.     {"a"},
  228.     {"b"},
  229.     {"c"},
  230.     {"d"},
  231.     {"e"},
  232.     {"f"},
  233.     {"g"},
  234.     {"h"},
  235.     {"i"},
  236.     {"j"},
  237.     {"k"},
  238.     {"l"},
  239.     {"m"},
  240.     {"n"},
  241.     {"o"},
  242.     {"p"},
  243.     {"q"},
  244.     {"r"},
  245.     {"s"},
  246.     {"t"},
  247.     {"u"},
  248.     {"v"},
  249.     {"w"},
  250.     {"x"},
  251.     {"y"},
  252.     {"z"},
  253.     {NULL},
  254.     {"|"},
  255.     {NULL},
  256.     {NULL},
  257.     {"\\|"},    /* narrow space, not utterable in CAT troff? */
  258.     {"hy"},
  259.     {"bu"},
  260.     {"sq"},
  261.     {"em"},
  262.     {"ru"},
  263.     {"14"},
  264.     {"12"},
  265.     {"34"},
  266.     {"-"},        /* - hyphen - is this right? */
  267.     {"fi"},
  268.     {"fl"},
  269.     {"ff"},
  270.     {"Fi"},
  271.     {"Fl"},
  272.     {"de"},
  273.     {"dg"},
  274.     {NULL},
  275.     {"fm"},
  276.     {NULL},
  277.     {NULL},
  278.     {NULL},
  279.     {NULL},
  280.     {"\\^"},    /* half narrow space, not utterable in troff? */
  281.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  282.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  283.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  284.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  285.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  286.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  287.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  288.     {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
  289.     {NULL},{NULL},{NULL},{NULL},{NULL},
  290.     {"rg"},
  291.     {"co"},
  292.     {NULL},
  293.     {"ct"},
  294. };
  295.  
  296. char *progname;
  297.  
  298. main(argc, argv)
  299. int argc; char **argv; {
  300.     extern char *optarg;
  301.     extern int optind;
  302.     int c;
  303.  
  304.     FILE *in1, *in2, *out;
  305.     char *fin1, *fin2, *fout;
  306.  
  307.     progname = argv[0];
  308.  
  309.     while ((c = getopt(argc, argv, "vsr:u:")) != EOF)
  310.     switch(c) {
  311.         case 's':
  312.         symfont = 1;
  313.         break;
  314.         case 'r':
  315.         res = atoi(optarg);
  316.         break;
  317.         case 'u':
  318.         unitwid = atoi(optarg);
  319.         break;
  320.         case 'v':
  321.         verbose = 1;
  322.         break;
  323.         default:
  324.         usage();
  325.     }
  326.     if (optind != argc - 3) {
  327.     usage();
  328.     }
  329.     in1 = mustopen(fin1 = argv[optind], "r");
  330.     in2 = mustopen(fin2 = argv[optind+1], "r");
  331.     out = mustopen(fout = argv[optind+2], "w");
  332.     process(in1, fin1);
  333.     process(in2, fin2);
  334.     if (symfont)
  335.     output(symbol, out, fout, "Symbol character set");
  336.     else
  337.     output(normal, out, fout, "Normal character set");
  338.     fclose(in1);
  339.     fclose(in2);
  340.     fclose(out);
  341.     exit(0);
  342. }
  343.  
  344. output(symset, f, file, type)
  345. FILE *f;
  346. struct widths *symset;
  347. char *type, *file; {
  348.     int i;
  349.     for (i = 0; i < 224; i++) {
  350.     if (symset[i].name && !symset[i].catwidth) {
  351.         fprintf(stderr, "%s: No width for %s (file %s)\n",
  352.         progname, symset[i].name, file);
  353.         fputc(normal[0].catwidth, f);
  354.     } else
  355.         fputc(symset[i].catwidth, f);
  356.     }
  357.     if (verbose) {
  358.     for (i = 0; i < 224; i++) {
  359.         printf("    %d+%03o,",
  360.         symset[i].catwidth & 077, symset[i].catwidth & 0300);
  361.         if (symset[i].name)
  362.         printf ("    /* \"%s\" */\n", symset[i].name);
  363.         else
  364.         printf ("\n");
  365.     }
  366.     }
  367. }
  368.  
  369. usage() {
  370.     fprintf(stderr, "usage: %s [-rres] [-uunitwid] normfont symfont output\n",
  371.     progname);
  372.     exit(1);
  373. }
  374.  
  375. FILE *
  376. mustopen(f, mode)
  377. char *f, *mode; {
  378.     FILE *desc;
  379.     if ((desc = fopen(f, mode)) == NULL) {
  380.     fprintf(stderr, "%s: cannot open file %s mode %s\n", progname, f, mode);
  381.     exit(1);
  382.     } else
  383.     return(desc);
  384. }
  385.  
  386. char *gettoken();
  387.  
  388. process(f, filename)
  389. FILE *f;
  390. char *filename; {
  391.     char *sv;
  392.     char buffer[512];
  393.     char *tok;
  394.     int commentsok = 1;
  395.     int widval, oldwidval;
  396.     while(fgets(buffer, sizeof(buffer), f) && buffer[0] == '#');
  397.     while(fgets(buffer, sizeof(buffer), f)) {
  398.     tok = gettoken(buffer, NULL);
  399.  
  400.     if (!tok)
  401.         continue;
  402.     if (0 == strcmp(tok, "charset"))
  403.         break;
  404.  
  405.     if (0 == strcmp(tok, "spacewidth")) {
  406.         if (!(tok = gettoken(buffer, 1))) {
  407.         fprintf(stderr, "%s: bad spacewidth line in %s\n",
  408.             progname, filename);
  409.         exit(1);
  410.         }
  411.         widval = atoi(tok);
  412.         widval = (TROFFUWID * TROFFRESOLUTION * widval / (unitwid * res));
  413.         update(symbol, " ", widval);
  414.         update(normal, " ", widval);
  415.         update(symbol, "narrow space", widval / 2);
  416.         update(normal, "narrow space", widval / 2);
  417.         update(symbol, "half narrow space", widval / 4);
  418.         update(normal, "half narrow space", widval / 4);
  419.     }
  420.     }
  421.     if (strcmp(tok, "charset")) {
  422.     fprintf(stderr, "%s: %s bad format - no charset line\n", progname,
  423.         filename);
  424.     exit(1);
  425.     }
  426.     while(fgets(buffer, sizeof(buffer), f)) {
  427.     char str[3];
  428.     if (commentsok && buffer[0] == '#')
  429.         continue;
  430.     commentsok = 0;
  431. #ifdef    DEBUG
  432.     printf("buffer: %s\n", buffer);
  433. #endif
  434.     tok = gettoken(buffer, NULL);
  435.     if (!tok)
  436.         continue;
  437.     if (strlen(tok) > 2) {
  438.         fprintf(stderr, "%s: %s bad format on line %s\n",
  439.         progname, filename, buffer);
  440.         exit(1);
  441.     }
  442.     strcpy(str, tok);
  443.     tok = gettoken(buffer, 1);
  444.     if (!tok) {
  445.         fprintf(stderr, "%s: %s bad format on line %s\n",
  446.         progname, filename, buffer);
  447.         exit(1);
  448.     }
  449. #ifdef    DEBUG
  450.     printf("token: %s\n", tok);
  451. #endif
  452.     if (0 == strcmp(tok, "\""))
  453.         widval = oldwidval;
  454.     else {
  455.         widval = (TROFFUWID * TROFFRESOLUTION * atoi(tok) / (unitwid * res));
  456.         tok = gettoken(buffer, 1);
  457.         if (!tok) {
  458.         fprintf(stderr, "%s: %s bad format on line %s\n",
  459.             progname, filename, buffer);
  460.         exit(1);
  461.         }
  462.         widval |= (atoi(tok) << 6);
  463.     }
  464.     update(symbol, str, widval);
  465.     update(normal, str, widval);
  466.     oldwidval = widval;
  467.     }
  468. }
  469.  
  470. update(table, str, val)
  471. struct widths *table;
  472. char *str;
  473. int val; {
  474.     int i;
  475.  
  476. #ifdef    DEBUG
  477.     printf("Inserting char %s, (%03o)\n", str, val);
  478. #endif
  479.  
  480.     for (i = 0; i < 224; i++)
  481.     if (0 == strcmp(table[i].name, str))
  482.         table[i].catwidth = val;
  483. }
  484.  
  485. char *
  486. gettoken(buf, ptr)
  487. char *buf, *ptr; {
  488.     static char *saveptr;
  489.     static char savebuf[512];
  490.     char *bp = savebuf;
  491.     if (!ptr)
  492.     saveptr = buf;
  493.     while(*saveptr && isspace(*saveptr)) saveptr++;
  494.     if (*saveptr)
  495.     while(*saveptr && !isspace(*saveptr))
  496.         *bp++ = *saveptr++;
  497.     *bp = '\0';
  498.     if (savebuf[0])
  499.     return(savebuf);
  500.     else
  501.     return((char *) NULL);
  502. }
  503.