home *** CD-ROM | disk | FTP | other *** search
- /* Brute force ditroff to CAT width table converter 1.5 89/08/25
- Will generate ft* files that are compatible with troff (at least the
- Xenix version that is)
- */
-
- static char SCCSid[] = "@(#)dit2catwid.c 1.5 89/08/25";
-
- #include <stdio.h>
- #include "defs.h"
- #include <ctype.h>
- int res = 720;
- int unitwid = 10;
- int symfont = 0;
- int verbose = 0;
-
- #define TROFFUWID 6
-
- #ifdef DEBUG
- #undef DEBUG
- #endif
-
- FILE *mustopen();
-
- struct widths {
- char *name;
- unsigned char catwidth;
- };
-
- struct widths symbol[256-32] = {
- {NULL},{NULL}, /* ".=Sw+042-40" */
- {"\""},
- {"#"},
- {NULL},{NULL},{NULL},{NULL}, /* ".=Sw+074-40" */
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},
- {"<"},
- {NULL}, /* ".=Sw+076-40" */
- {">"},
- {NULL}, /* ".=Sw+100-40" */
- {"@"},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL}, /* ".=Sw+134-40" */
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},
- {"\\"},
- {NULL}, /* ".=Sw+136-40" */
- {"^"},
- {"_"},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},
- {"}"},
- {NULL}, /* ".=Sw+175-40" */
- {"}"},
- {"~"},
- {NULL}, /* ".=Sw+220-40" */
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {"sc"},
- {NULL}, /* ".=Sw+222-40" */
- {"aa"},
- {"ga"},
- {"ul"},
- {"sl"},
- {NULL}, /* "" */
- {NULL}, /* "" */
- {"*a"},
- {"*b"},
- {"*g"},
- {"*d"},
- {"*e"},
- {"*z"},
- {"*y"},
- {"*h"},
- {"*i"},
- {"*k"},
- {"*l"},
- {"*m"},
- {"*n"},
- {"*c"},
- {"*o"},
- {"*p"},
- {"*r"},
- {"*s"},
- {"*t"},
- {"*u"},
- {"*f"},
- {"*x"},
- {"*q"},
- {"*w"},
- {"*G"},
- {"*D"},
- {"*H"},
- {"*L"},
- {"*C"},
- {"*P"},
- {"*S"},
- {NULL}, /* "" */
- {"*U"},
- {"*F"},
- {"*Q"},
- {"*W"},
- {"sr"},
- {"ts"},
- {"rn"},
- {">="},
- {"<="},
- {"=="},
- {"mi"},
- {"~="},
- {"ap"},
- {"!="},
- {"->"},
- {"<-"},
- {"ua"},
- {"da"},
- {"eq"},
- {"mu"},
- {"di"},
- {"+-"},
- {"cu"},
- {"ca"},
- {"sb"},
- {"sp"},
- {"ib"},
- {"ip"},
- {"if"},
- {"pd"},
- {"gr"},
- {"no"},
- {"is"},
- {"pt"},
- {"es"},
- {"mo"},
- {"pl"},
- {NULL},
- {NULL},
- {NULL}, /* "box vert rule (was 2.)" */
- {NULL},
- {"dd"},
- {"rh"},
- {"lh"},
- {"**"},
- {"bs"},
- {"or"},
- {"ci"},
- {"lt"},
- {"lb"},
- {"rt"},
- {"rb"},
- {"lk"},
- {"rk"},
- {"bv"},
- {"lf"},
- {"rf"},
- {"lc"},
- {"rc"}
- };
-
- struct widths normal[256-32] = {
- {" "},
- {"!"},
- {NULL}, {NULL},
- {"$"},
- {"%"},
- {"&"},
- {"'"},
- {"("},
- {")"},
- {"*"},
- {"+"},
- {","},
- {"-"}, /* - hyphen - is this right? */
- {"."},
- {"/"},
- {"0"},
- {"1"},
- {"2"},
- {"3"},
- {"4"},
- {"5"},
- {"6"},
- {"7"},
- {"8"},
- {"9"},
- {":"},
- {";"},
- {NULL},
- {"="},
- {NULL},
- {"?"},
- {NULL},
- {"A"},
- {"B"},
- {"C"},
- {"D"},
- {"E"},
- {"F"},
- {"G"},
- {"H"},
- {"I"},
- {"J"},
- {"K"},
- {"L"},
- {"M"},
- {"N"},
- {"O"},
- {"P"},
- {"Q"},
- {"R"},
- {"S"},
- {"T"},
- {"U"},
- {"V"},
- {"W"},
- {"X"},
- {"Y"},
- {"Z"},
- {"["},
- {NULL},
- {"]"},
- {NULL},
- {NULL},
- {"`"},
- {"a"},
- {"b"},
- {"c"},
- {"d"},
- {"e"},
- {"f"},
- {"g"},
- {"h"},
- {"i"},
- {"j"},
- {"k"},
- {"l"},
- {"m"},
- {"n"},
- {"o"},
- {"p"},
- {"q"},
- {"r"},
- {"s"},
- {"t"},
- {"u"},
- {"v"},
- {"w"},
- {"x"},
- {"y"},
- {"z"},
- {NULL},
- {"|"},
- {NULL},
- {NULL},
- {"\\|"}, /* narrow space, not utterable in CAT troff? */
- {"hy"},
- {"bu"},
- {"sq"},
- {"em"},
- {"ru"},
- {"14"},
- {"12"},
- {"34"},
- {"-"}, /* - hyphen - is this right? */
- {"fi"},
- {"fl"},
- {"ff"},
- {"Fi"},
- {"Fl"},
- {"de"},
- {"dg"},
- {NULL},
- {"fm"},
- {NULL},
- {NULL},
- {NULL},
- {NULL},
- {"\\^"}, /* half narrow space, not utterable in troff? */
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},{NULL},
- {NULL},{NULL},{NULL},{NULL},{NULL},
- {"rg"},
- {"co"},
- {NULL},
- {"ct"},
- };
-
- char *progname;
-
- main(argc, argv)
- int argc; char **argv; {
- extern char *optarg;
- extern int optind;
- int c;
-
- FILE *in1, *in2, *out;
- char *fin1, *fin2, *fout;
-
- progname = argv[0];
-
- while ((c = getopt(argc, argv, "vsr:u:")) != EOF)
- switch(c) {
- case 's':
- symfont = 1;
- break;
- case 'r':
- res = atoi(optarg);
- break;
- case 'u':
- unitwid = atoi(optarg);
- break;
- case 'v':
- verbose = 1;
- break;
- default:
- usage();
- }
- if (optind != argc - 3) {
- usage();
- }
- in1 = mustopen(fin1 = argv[optind], "r");
- in2 = mustopen(fin2 = argv[optind+1], "r");
- out = mustopen(fout = argv[optind+2], "w");
- process(in1, fin1);
- process(in2, fin2);
- if (symfont)
- output(symbol, out, fout, "Symbol character set");
- else
- output(normal, out, fout, "Normal character set");
- fclose(in1);
- fclose(in2);
- fclose(out);
- exit(0);
- }
-
- output(symset, f, file, type)
- FILE *f;
- struct widths *symset;
- char *type, *file; {
- int i;
- for (i = 0; i < 224; i++) {
- if (symset[i].name && !symset[i].catwidth) {
- fprintf(stderr, "%s: No width for %s (file %s)\n",
- progname, symset[i].name, file);
- fputc(normal[0].catwidth, f);
- } else
- fputc(symset[i].catwidth, f);
- }
- if (verbose) {
- for (i = 0; i < 224; i++) {
- printf(" %d+%03o,",
- symset[i].catwidth & 077, symset[i].catwidth & 0300);
- if (symset[i].name)
- printf (" /* \"%s\" */\n", symset[i].name);
- else
- printf ("\n");
- }
- }
- }
-
- usage() {
- fprintf(stderr, "usage: %s [-rres] [-uunitwid] normfont symfont output\n",
- progname);
- exit(1);
- }
-
- FILE *
- mustopen(f, mode)
- char *f, *mode; {
- FILE *desc;
- if ((desc = fopen(f, mode)) == NULL) {
- fprintf(stderr, "%s: cannot open file %s mode %s\n", progname, f, mode);
- exit(1);
- } else
- return(desc);
- }
-
- char *gettoken();
-
- process(f, filename)
- FILE *f;
- char *filename; {
- char *sv;
- char buffer[512];
- char *tok;
- int commentsok = 1;
- int widval, oldwidval;
- while(fgets(buffer, sizeof(buffer), f) && buffer[0] == '#');
- while(fgets(buffer, sizeof(buffer), f)) {
- tok = gettoken(buffer, NULL);
-
- if (!tok)
- continue;
- if (0 == strcmp(tok, "charset"))
- break;
-
- if (0 == strcmp(tok, "spacewidth")) {
- if (!(tok = gettoken(buffer, 1))) {
- fprintf(stderr, "%s: bad spacewidth line in %s\n",
- progname, filename);
- exit(1);
- }
- widval = atoi(tok);
- widval = (TROFFUWID * TROFFRESOLUTION * widval / (unitwid * res));
- update(symbol, " ", widval);
- update(normal, " ", widval);
- update(symbol, "narrow space", widval / 2);
- update(normal, "narrow space", widval / 2);
- update(symbol, "half narrow space", widval / 4);
- update(normal, "half narrow space", widval / 4);
- }
- }
- if (strcmp(tok, "charset")) {
- fprintf(stderr, "%s: %s bad format - no charset line\n", progname,
- filename);
- exit(1);
- }
- while(fgets(buffer, sizeof(buffer), f)) {
- char str[3];
- if (commentsok && buffer[0] == '#')
- continue;
- commentsok = 0;
- #ifdef DEBUG
- printf("buffer: %s\n", buffer);
- #endif
- tok = gettoken(buffer, NULL);
- if (!tok)
- continue;
- if (strlen(tok) > 2) {
- fprintf(stderr, "%s: %s bad format on line %s\n",
- progname, filename, buffer);
- exit(1);
- }
- strcpy(str, tok);
- tok = gettoken(buffer, 1);
- if (!tok) {
- fprintf(stderr, "%s: %s bad format on line %s\n",
- progname, filename, buffer);
- exit(1);
- }
- #ifdef DEBUG
- printf("token: %s\n", tok);
- #endif
- if (0 == strcmp(tok, "\""))
- widval = oldwidval;
- else {
- widval = (TROFFUWID * TROFFRESOLUTION * atoi(tok) / (unitwid * res));
- tok = gettoken(buffer, 1);
- if (!tok) {
- fprintf(stderr, "%s: %s bad format on line %s\n",
- progname, filename, buffer);
- exit(1);
- }
- widval |= (atoi(tok) << 6);
- }
- update(symbol, str, widval);
- update(normal, str, widval);
- oldwidval = widval;
- }
- }
-
- update(table, str, val)
- struct widths *table;
- char *str;
- int val; {
- int i;
-
- #ifdef DEBUG
- printf("Inserting char %s, (%03o)\n", str, val);
- #endif
-
- for (i = 0; i < 224; i++)
- if (0 == strcmp(table[i].name, str))
- table[i].catwidth = val;
- }
-
- char *
- gettoken(buf, ptr)
- char *buf, *ptr; {
- static char *saveptr;
- static char savebuf[512];
- char *bp = savebuf;
- if (!ptr)
- saveptr = buf;
- while(*saveptr && isspace(*saveptr)) saveptr++;
- if (*saveptr)
- while(*saveptr && !isspace(*saveptr))
- *bp++ = *saveptr++;
- *bp = '\0';
- if (savebuf[0])
- return(savebuf);
- else
- return((char *) NULL);
- }
-