diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities/qdtexvpl |
Initial commit
Diffstat (limited to 'fonts/utilities/qdtexvpl')
-rw-r--r-- | fonts/utilities/qdtexvpl/distrib.cmd | 2 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/ibmpc437.bat | 9 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/ibmpc437.cmd | 9 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/ibmpc437.tex | 15 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/makefile | 38 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.c | 1271 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.def | 1 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.doc | 81 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.pl | 16 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.tex | 28 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/qdtexvpl.tfm | bin | 0 -> 148 bytes | |||
l--------- | fonts/utilities/qdtexvpl/qdtexvpl.txt | 1 | ||||
-rw-r--r-- | fonts/utilities/qdtexvpl/self.tex | 11 |
13 files changed, 1482 insertions, 0 deletions
diff --git a/fonts/utilities/qdtexvpl/distrib.cmd b/fonts/utilities/qdtexvpl/distrib.cmd new file mode 100644 index 0000000000..341ccf09b1 --- /dev/null +++ b/fonts/utilities/qdtexvpl/distrib.cmd @@ -0,0 +1,2 @@ +nmake distrib +pkzip -u qdtexvpl diff --git a/fonts/utilities/qdtexvpl/ibmpc437.bat b/fonts/utilities/qdtexvpl/ibmpc437.bat new file mode 100644 index 0000000000..af43abed26 --- /dev/null +++ b/fonts/utilities/qdtexvpl/ibmpc437.bat @@ -0,0 +1,9 @@ +@echo off +tex ibmpc437 +if errorlevel 1 goto end +tftopl \emtex\tfm\cmr10 cmr10 +if errorlevel 1 goto end +qdtexvpl -d10.0 -icmr10.pl ibmpc437.dvi ibmpc437.vpl +if errorlevel 1 goto end +vptovf ibmpc437 +:end diff --git a/fonts/utilities/qdtexvpl/ibmpc437.cmd b/fonts/utilities/qdtexvpl/ibmpc437.cmd new file mode 100644 index 0000000000..8b0732a50f --- /dev/null +++ b/fonts/utilities/qdtexvpl/ibmpc437.cmd @@ -0,0 +1,9 @@ +@echo off +texp ibmpc437 +if errorlevel 1 goto end +tftopl \emtex\tfm\cmr10 cmr10 +if errorlevel 1 goto end +qdtexvpl -d10.0 -icmr10.pl ibmpc437.dvi ibmpc437.vpl +if errorlevel 1 goto end +vptovf ibmpc437 +:end diff --git a/fonts/utilities/qdtexvpl/ibmpc437.tex b/fonts/utilities/qdtexvpl/ibmpc437.tex new file mode 100644 index 0000000000..39304eb7e1 --- /dev/null +++ b/fonts/utilities/qdtexvpl/ibmpc437.tex @@ -0,0 +1,15 @@ +% +% ibmpc437.tex +% +% Some extended characters for cmr10 +% +\font\f=cmr10 +\input qdtexvpl +\texvpl{}{\f\"a} +\texvpl{}{\f\"o} +\texvpl{}{\f\"u} +\texvpl{}{\f\"A} +\texvpl{}{\f\"O} +\texvpl{}{\f\"U} +\texvpl{}{\f\ss} +\bye diff --git a/fonts/utilities/qdtexvpl/makefile b/fonts/utilities/qdtexvpl/makefile new file mode 100644 index 0000000000..2f90ec5c51 --- /dev/null +++ b/fonts/utilities/qdtexvpl/makefile @@ -0,0 +1,38 @@ +# +# makefile for qdtexvpl +# +CC=cl -Ozax -Lp -Fb -W3 -AS + +default: qdtexvpl.exe qdtexvpl.tfm + +qdtexvpl.exe: qdtexvpl.obj qdtexvpl.def + $(CC) qdtexvpl.obj qdtexvpl.def + +qdtexvpl.obj: qdtexvpl.c + $(CC) -c qdtexvpl.c + +qdtexvpl.tfm: qdtexvpl.pl + pltotf qdtexvpl + +clean: + -del *.log + -del *.dvi + -del *.vf + -del cmr10.pl + -del *.vpl + -del *.tfm + -del *.obj + -del *.exe + -del out + +distrib: + -del *.log + -del *.dvi + -del *.vf + -del cmr10.pl + -del *.vpl + -del self.tfm + -del ibmpc437.tfm + -del *.obj + -del *.bak + -del out diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.c b/fonts/utilities/qdtexvpl/qdtexvpl.c new file mode 100644 index 0000000000..5da793661f --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.c @@ -0,0 +1,1271 @@ +/* qdtexvpl.c -- Version 1.0 -- Copyright (c) 1992 by Eberhard Mattes */ +/* + made to work with gcc. april 30 1993 S Rahtz CERN +*/ + +/* Written: ??-Apr-1990, modified 15-Feb-1992 for release */ + +/* Quick & dirty conversion of TeX code to VPL */ + +/* No warranty! */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#ifdef MSDOS +#else +#include <unistd.h> +#include <errno.h> +#endif + +#define FALSE 0 +#define TRUE 1 + +#define DVI_STACK_SIZE 50 + + +#define DVI_set_char_0 0 +#define DVI_set1 128 +#define DVI_set2 129 +#define DVI_set3 130 +#define DVI_set4 131 +#define DVI_set_rule 132 +#define DVI_put1 133 +#define DVI_put2 134 +#define DVI_put3 135 +#define DVI_put4 136 +#define DVI_put_rule 137 +#define DVI_nop 138 +#define DVI_bop 139 +#define DVI_eop 140 +#define DVI_push 141 +#define DVI_pop 142 +#define DVI_right1 143 +#define DVI_right2 144 +#define DVI_right3 145 +#define DVI_right4 146 +#define DVI_w0 147 +#define DVI_w1 148 +#define DVI_w2 149 +#define DVI_w3 150 +#define DVI_w4 151 +#define DVI_x0 152 +#define DVI_x1 153 +#define DVI_x2 154 +#define DVI_x3 155 +#define DVI_x4 156 +#define DVI_down1 157 +#define DVI_down2 158 +#define DVI_down3 159 +#define DVI_down4 160 +#define DVI_y0 161 +#define DVI_y1 162 +#define DVI_y2 163 +#define DVI_y3 164 +#define DVI_y4 165 +#define DVI_z0 166 +#define DVI_z1 167 +#define DVI_z2 168 +#define DVI_z3 169 +#define DVI_z4 170 +#define DVI_fnt_num_0 171 +#define DVI_fnt1 235 +#define DVI_fnt2 236 +#define DVI_fnt3 237 +#define DVI_fnt4 238 +#define DVI_xxx1 239 +#define DVI_xxx2 240 +#define DVI_xxx3 241 +#define DVI_xxx4 242 +#define DVI_fnt_def1 243 +#define DVI_fnt_def2 244 +#define DVI_fnt_def3 245 +#define DVI_fnt_def4 246 +#define DVI_pre 247 +#define DVI_post 248 +#define DVI_post_post 249 + +#define DVI_EOF 223 +#define DVI_id_byte 2 + + +typedef unsigned char u_byte; +typedef signed short s_word; +typedef unsigned short u_word; +typedef int boolean; + +struct mem + { + u_byte *ptr, *add; + int size; + int alloc; + + }; + +struct map + { + long code; /* Character code */ + long wd, ht, dp; + struct mem repl; + struct map *next; + }; + +struct font + { + struct mem dvi; + struct font *next; + }; + +struct dvi_stack + { + long h, v, w, x, y, z; + }; + +static FILE *dvi_file; +static FILE *ins_file; +static FILE *out_file; +static char *dvi_fname; +static char *ins_fname; +static char *out_fname; +static u_byte buffer[1000]; /* fnt_def: area+name */ +static u_byte *dst; +static struct map *map; +static struct dvi_stack position; +static struct dvi_stack dvi_stack[DVI_STACK_SIZE]; +static int dvi_sp; +static int out_sp; +static struct mem *mem; +static u_byte *hex = "0123456789abcdef"; +static struct map *map_head, **map_add; +static struct font *font_head, **font_add; +static double design_size; +static boolean opt_d; +static boolean opt_i; + + +#if defined (MSDOS) + +static char *read_binary = "rb"; +static char *read_text = "rt"; +static char *write_text = "wt"; + +#else + +static char *read_binary = "r"; +static char *read_text = "r"; +static char *write_text = "w"; + +#endif + + +static void usage (void); +static void out_of_mem (void); +static void dvi_eof (void); +static void dvi_seek (long pos); +static s_word dvi_get1u (void); +static s_word dvi_get1s (void); +static u_word dvi_get2u (void); +static s_word dvi_get2s (void); +static long dvi_get3u (void); +static long dvi_get3s (void); +static long dvi_get4 (void); +static long dvi_get_u (s_word l); +static long dvi_get_s (s_word l); +static void internal (int err_no); +static void dvi_preamble (void); +static void dvi_push (void); +static void dvi_pop (void); +static void dvi_char (long c, boolean move); +static void dvi_rule (boolean move); +static void dvi_fnt_num (long n); +static void dvi_fnt_def (s_word b); +static void dvi_right (long n); +static void dvi_down (long n); +static void dvi_special (long n); +static void dvi_bop (void); +static void init_pos (struct dvi_stack *dst); +static void dvi_main (void); +static void init_mem (struct mem *dst); +static void add_mem (struct mem *dst, u_byte src); +static void add1u (u_byte x); +static void add4 (long x); +static void copy (void); +static void out_prop (char *txt); +static void out_end (void); +static void out_fnt_def (s_word b); +static void out_fnt_num (long n); +static void out_down (long n); +static void out_right (long n); +static void out_set_char (long n, boolean move); +static void out_set_rule (boolean move); +static void out_special (long n); +static void out_real (double x); +static void out_scaled (long n); +static void out_dec (long n); +static void out_oct (long n); +static void out_char (long n); +static void out_str (char *txt, int len); +static void output (struct mem *src); +static void make_output (void); +long parse_pt (u_byte **pp, int *nn); +int main (int argc, char *argv[]); + + +#define OUTPUT (map != NULL && dvi_sp > out_sp) + +static void init_pos (struct dvi_stack *dst) + { + dst->h = 0; + dst->v = 0; + } + + +#define MEM_CHECK(n) {if (mem != NULL && (mem->size -= n) < 0) dvi_eof ();} +#define DVI_GET (mem != NULL ? *mem->ptr++ : (*dst++ = (u_byte)getc (dvi_file))) +#define DVI_EOF_CHECK {if (mem == NULL && feof (dvi_file)) dvi_eof ();} + +static void dvi_eof (void) + { + (void)fprintf (stderr, "*** Premature end of DVI file\n"); + exit (2); + } + + + +static void internal (int err_no) + { + (void)fprintf (stderr, "*** Internal error %.4d\n", err_no); + } + + +static void out_of_mem (void) + { + (void)fprintf (stderr, "*** Out of memory\n"); + } + + +static void dvi_seek (long n) + { + if (fseek (dvi_file, n, SEEK_SET) != 0) + { + (void)fprintf (stderr, "*** dvi_seek failed\n"); + exit (2); + } + } + + +/* ------------------------------------------------------------------------ */ +/* Read an unsigned byte from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static s_word dvi_get1u (void) + { + s_word x; + + MEM_CHECK (1); + x = DVI_GET; + DVI_EOF_CHECK; + return (x); + } + + +/* ------------------------------------------------------------------------ */ +/* Read a signed byte from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static s_word dvi_get1s (void) + { + s_word n; + + MEM_CHECK (1); + n = DVI_GET; + DVI_EOF_CHECK; + if (n >= 128) + return (n-256); + else + return (n); + } + + +/* ------------------------------------------------------------------------ */ +/* Read an unsigned word (2 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static u_word dvi_get2u (void) + { + u_word a, b; + + MEM_CHECK (2); + a = (u_word)DVI_GET; + b = (u_word)DVI_GET; + DVI_EOF_CHECK; + return (a*256+b); + } + + +/* ------------------------------------------------------------------------ */ +/* Read a signed word (2 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static s_word dvi_get2s (void) + { + s_word a, b; + + MEM_CHECK (2); + a = DVI_GET; + b = DVI_GET; + DVI_EOF_CHECK; + if (a >= 128) + return ((a-256)*256+b); + else + return (a*256+b); + } + + +/* ------------------------------------------------------------------------ */ +/* Read an unsigned word (3 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static long dvi_get3u (void) + { + s_word a, b, c; + + MEM_CHECK (3); + a = DVI_GET; + b = DVI_GET; + c = DVI_GET; + DVI_EOF_CHECK; + return (a*65536L+b*256L+c); + } + + +/* ------------------------------------------------------------------------ */ +/* Read a signed word (3 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static long dvi_get3s (void) + { + s_word a, b, c; + + MEM_CHECK (3); + a = DVI_GET; + b = DVI_GET; + c = DVI_GET; + DVI_EOF_CHECK; + if (a >= 128) + return ((a-256)*65536L+b*256L+c); + else + return (a*65536L+b*256L+c); + } + + +/* ------------------------------------------------------------------------ */ +/* Read a word (4 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static long dvi_get4 (void) + { + s_word a, b, c, d; + + MEM_CHECK (4); + a = DVI_GET; + b = DVI_GET; + c = DVI_GET; + d = DVI_GET; + DVI_EOF_CHECK; + if (a >= 128) + return ((a-256)*16777216L+b*65536L+c*256L+d); + else + return (a*16777216L+b*65536L+c*256L+d); + } + + +/* ------------------------------------------------------------------------ */ +/* Read an unsigned word (1 to 4 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static long dvi_get_u (s_word l) + { + switch (l) + { + case 0: + return ((long)dvi_get1u ()); + case 1: + return ((long)dvi_get2u ()); + case 2: + return (dvi_get3u ()); + case 3: + return (dvi_get4 ()); + default: + internal (3002); + } + } + + +/* ------------------------------------------------------------------------ */ +/* Read a signed word (1 to 4 bytes) from the DVI file. */ +/* ------------------------------------------------------------------------ */ + +static long dvi_get_s (s_word l) + { + switch (l) + { + case 0: + return ((long)dvi_get1s ()); + case 1: + return ((long)dvi_get2s ()); + case 2: + return (dvi_get3s ()); + case 3: + return (dvi_get4 ()); + default: + internal (3003); + } + } + + +static void dvi_preamble (void) + { + s_word b1, b2; + + dst = buffer; mem = NULL; + b1 = dvi_get1u (); + b2 = dvi_get1u (); + if (b1 != DVI_pre || b2 != DVI_id_byte) + { + (void)fprintf (stderr, "*** The input file is not a dvi file\n"); + exit (2); + } + (void)dvi_get4 (); /* num */ + (void)dvi_get4 (); /* den */ + (void)dvi_get4 (); /* mag */ + b1 = dvi_get1u (); + for (b2 = 0; b2 < b1; ++b2) + (void)dvi_get1u (); + } + + +static void init_mem (struct mem *dst) + { + dst->size = 0; dst->alloc = 0; + dst->ptr = NULL; dst->add = NULL; + } + + +static void add_mem (struct mem *dst, u_byte src) + { + if (dst->size >= dst->alloc) + { + dst->alloc += 10; + dst->ptr = realloc (dst->ptr, dst->alloc); + if (dst->ptr == NULL) + out_of_mem (); + dst->add = dst->ptr+dst->size; + } + *dst->add++ = src; + ++dst->size; + } + + +static void add1u (u_byte x) + { + add_mem (&map->repl, x); + } + + +static void add4 (long x) + { + add1u ((u_byte)((x >> 24) & 0xff)); + add1u ((u_byte)((x >> 16) & 0xff)); + add1u ((u_byte)((x >> 8) & 0xff)); + add1u ((u_byte)(x & 0xff)); + } + + +static void copy (void) + { + s_word i, n; + + if (OUTPUT) + { + n = dst-buffer; + for (i = 0; i < n; ++i) + add1u (buffer[i]); + dst = buffer; + } + } + + +static void dvi_char (long c, boolean move) + { + if (move) + { + position.h += 0; /*...to be implemented...*/ + } + copy (); + } + + +static void dvi_rule (boolean move) + { + long width, height; + + height = dvi_get4 (); + width = dvi_get4 (); + if (!OUTPUT) + { + fprintf (stderr, "*** Rule set outside \\texvpl macro\n"); + exit (2); + } + if (move) + position.h += width; + copy (); + } + + +/* Returns scaled points */ + +long parse_pt (u_byte **pp, int *nn) + { + double x; + u_byte *e, *p; + char buf[20]; + int i, n; + + i = 0; p = *pp; n = *nn; + while (n >= 1 && i < sizeof (buf)-1 && (isdigit (*p) || *p == '.')) + { + buf[i++] = *p++; + --n; + } + buf[i] = 0; + errno = 0; + x = strtod (buf, &e); + if (errno != 0 || *e != 0 || n < 2 || memcmp (p, "pt", 2) != 0) + { + (void)fprintf (stderr, "*** Invalid dimension in \\special{>...}\n"); + exit (2); + } + *pp = p+2; *nn = n-2; + return ((long)(x*65536.0)); + } + + +static void dvi_special (long n) + { + int i; + u_byte *p; + long code; + + p = dst; + if (n < 0 || (p-buffer)+n > sizeof (buffer)) + { + (void)fprintf (stderr, "*** Invalid size of \\special\n"); + exit (2); + } + for (i = 0; i < (s_word)n; ++i) + (void)dvi_get1u (); + if (n >= 1) + { + if (*p == '<') + { + if (map == NULL && n == 2) + code = (long)p[1]; + else if (map == NULL && n == 4 && p[1] == '^' && p[2] == '^' && p[3] < 128) + { + code = (long)p[3]; + if (code < 64) code += 64; else code -= 64; + } + else if (map == NULL && n == 5 && p[1] == '^' && p[2] == '^' && + strchr (hex, p[3]) && strchr (hex, p[4])) + { +#ifdef MSDOS + code = 16*(strchr (hex, p[3])-hex); + code += (strchr (hex, p[4])-hex); +#else + code = 16* (int)(strchr (hex, p[3])-(int)hex); + code += (strchr (hex, p[4])-(int)hex); +#endif + } + else + { + (void)fprintf (stderr, "*** Invalid \\special{<...}\n"); + exit (2); + } + map = (struct map *)malloc (sizeof (struct map)); + if (map == NULL) out_of_mem (); + map->code = code; + init_mem (&map->repl); + map->next = NULL; *map_add = map; map_add = &map->next; + out_sp = dvi_sp; + return; + } + else if (*p == '>') + { + if (map == NULL || n < 1) + { + (void)fprintf (stderr, "*** Invalid \\special{>...}\n"); + exit (2); + } + ++p; i = (int)(n-1); + map->wd = parse_pt (&p, &i); + map->ht = parse_pt (&p, &i); + map->dp = parse_pt (&p, &i); + map = NULL; + return; + } + } + if (map == NULL) + { + (void)fprintf (stderr, "*** \\special outside \\texvpl macro\n"); + exit (2); + } + copy (); + } + + +static void dvi_right (long n) + { + position.h += n; + copy (); + } + + +static void dvi_down (long n) + { + position.v += n; + copy (); + } + + +static void dvi_fnt_num (long n) + { + copy (); + } + + +static void dvi_fnt_def (s_word b) + { + s_word area_len, name_len; + int i; + struct font *fp; + + (void)dvi_get_u (b-DVI_fnt_def1); /* font number */ + (void)dvi_get4 (); /* check sum */ + (void)dvi_get4 (); /* scale factor */ + (void)dvi_get4 (); /* Design size */ + area_len = dvi_get1u (); + name_len = dvi_get1u (); + for (i = 0; i < area_len; ++i) + (void)dvi_get1u (); + for (i = 0; i < name_len; ++i) + (void)dvi_get1u (); + if (map != NULL) + { + fp = (struct font *)malloc (sizeof (struct font)); + if (fp == NULL) out_of_mem (); + init_mem (&fp->dvi); + i = dst-buffer; + fp->dvi.ptr = (u_byte *)malloc (i); + if (fp->dvi.ptr == NULL) out_of_mem (); + fp->dvi.size = i; fp->dvi.alloc = i; +#ifdef MSDOS + memmove (fp->dvi.ptr, buffer, i); +#else + memcpy (fp->dvi.ptr, buffer, i); +#endif + fp->next = NULL; *font_add = fp; font_add = &fp->next; + } + } + + +static void dvi_push () + { + copy (); /* Nota bene: call this before changing dvi_sp */ + if (dvi_sp >= DVI_STACK_SIZE) + { + (void)fprintf (stderr, "*** dvi stack overflow\n"); + exit (2); + } + dvi_stack[dvi_sp++] = position; + } + + +static void dvi_pop () + { + if (dvi_sp <= 0) + { + (void)fprintf (stderr, "*** dvi stack underflow\n"); + exit (2); + } + position = dvi_stack[--dvi_sp]; + copy (); /* Nota bene: call this after changing dvi_sp */ + } + + +static void dvi_bop (void) + { + s_word i; + + for (i = 0; i < 10; ++i) + (void)dvi_get4 (); /* \count0 to \count9 */ + (void)dvi_get4 (); /* Back pointer */ + } + + +static void dvi_main (void) + { + s_word b; + + map = NULL; dvi_sp = 0; + map_head = NULL; map_add = &map_head; + font_head = NULL; font_add = &font_head; + init_pos (&position); + position.w = 0; position.x = 0; position.y = 0; position.z = 0; + for (;;) + { + dst = buffer; + b = dvi_get1u (); + if (b >= DVI_set_char_0 && b < DVI_set_char_0+128) + dvi_char ((long)b-DVI_set_char_0, TRUE); + else if (b >= DVI_fnt_num_0 && b < DVI_fnt_num_0+64) + dvi_fnt_num ((long)(b-DVI_fnt_num_0)); + else + switch (b) + { + case DVI_set1: + case DVI_set2: + case DVI_set3: + case DVI_set4: + dvi_char (dvi_get_u (b-DVI_set1), TRUE); + break; + case DVI_put1: + case DVI_put2: + case DVI_put3: + case DVI_put4: + dvi_char (dvi_get_u (b-DVI_set1), FALSE); + break; + case DVI_set_rule: + dvi_rule (TRUE); + break; + case DVI_put_rule: + dvi_rule (FALSE); + break; + case DVI_nop: + break; + case DVI_bop: + dvi_bop (); + break; + case DVI_eop: + break; + case DVI_push: + dvi_push (); + break; + case DVI_pop: + dvi_pop (); + break; + case DVI_right1: + case DVI_right2: + case DVI_right3: + case DVI_right4: + dvi_right (dvi_get_s (b-DVI_right1)); + break; + case DVI_down1: + case DVI_down2: + case DVI_down3: + case DVI_down4: + dvi_down (dvi_get_s (b-DVI_down1)); + break; + case DVI_w0: + dvi_right (position.w); + break; + case DVI_w1: + case DVI_w2: + case DVI_w3: + case DVI_w4: + position.w = dvi_get_s (b-DVI_w1); + dvi_right (position.w); + break; + case DVI_x0: + dvi_right (position.x); + break; + case DVI_x1: + case DVI_x2: + case DVI_x3: + case DVI_x4: + position.x = dvi_get_s (b-DVI_x1); + dvi_right (position.x); + break; + case DVI_y0: + dvi_down (position.y); + break; + case DVI_y1: + case DVI_y2: + case DVI_y3: + case DVI_y4: + position.y = dvi_get_s (b-DVI_y1); + dvi_down (position.y); + break; + case DVI_z0: + dvi_down (position.z); + break; + case DVI_z1: + case DVI_z2: + case DVI_z3: + case DVI_z4: + position.z = dvi_get_s (b-DVI_z1); + dvi_down (position.z); + break; + case DVI_fnt1: + case DVI_fnt2: + case DVI_fnt3: + case DVI_fnt4: + dvi_fnt_num (dvi_get_s (b-DVI_fnt1)); + break; + case DVI_xxx1: + case DVI_xxx2: + case DVI_xxx3: + case DVI_xxx4: + dvi_special (dvi_get_u (b-DVI_xxx1)); + break; + case DVI_fnt_def1: + case DVI_fnt_def2: + case DVI_fnt_def3: + case DVI_fnt_def4: + dvi_fnt_def (b); + break; + case DVI_post: + goto done; + default: + (void)fprintf (stderr, "*** Bad dvi file\n"); + exit (2); + } + } +done:; + } + + +static int out_level; +static boolean out_in_line; + + +static void out_prop (char *txt) + { + int i; + + if (out_in_line) + { + (void)fputc ('\n', out_file); + out_in_line = FALSE; + } + for (i = 0; i < out_level; ++i) + (void)fputs (" ", out_file); + (void)fputc ('(', out_file); + (void)fputs (txt, out_file); + ++out_level; + out_in_line = TRUE; + } + + +static void out_end (void) + { + (void)fputc (')', out_file); + --out_level; + } + + +static void out_real (double x) + { + (void)fprintf (out_file, " R %lf", x); + } + + +static void out_scaled (long n) + { + out_real ((double)n/65536.0/design_size); + } + + +static void out_char (long n) + { + if (n >= 0 && n <= 127 && isalnum ((int)n)) + (void)fprintf (out_file, " C %c", (char)n); + else + (void)fprintf (out_file, " O %lo", n); + } + + +static void out_dec (long n) + { + (void)fprintf (out_file, " D %ld", n); + } + + +static void out_oct (long n) + { + (void)fprintf (out_file, " O %lo", n); + } + + + +static void out_str (char *txt, int len) + { + int i, level; + u_byte c; + + level = 0; + (void)fputc (' ', out_file); + for (i = 0; i < len; ++i) + { + c = txt[i]; + if (c == '(') ++level; + else if (c == ')') --level; + if (level < 0) + { + fprintf (stderr, "*** Unbalanced parentheses in string\n"); + exit (2); + } + (void)fputc (c, out_file); + } + if (level != 0) + { + fprintf (stderr, "*** Unbalanced parentheses in string\n"); + exit (2); + } + } + + +static void out_down (long n) + { + out_prop ("MOVEDOWN"); + out_scaled (n); + out_end (); + } + + +static void out_right (long n) + { + out_prop ("MOVERIGHT"); + out_scaled (n); + out_end (); + } + + +static void out_set_char (long n, boolean move) + { + if (!move) + { + out_prop ("PUSH"); out_end (); + } + out_prop ("SETCHAR"); + out_char (n); + out_end (); + if (!move) + { + out_prop ("POP"); out_end (); + } + } + + +static void out_set_rule (boolean move) + { + long n1, n2; + + n1 = dvi_get4 (); + n2 = dvi_get4 (); + if (!move) + { + out_prop ("PUSH"); out_end (); + } + out_prop ("SETRULE"); + out_scaled (n1); out_scaled (n2); + out_end (); + if (!move) + { + out_prop ("PUSH"); out_end (); + } + } + + +static void out_fnt_def (s_word b) + { + long font_number, check_sum, dsize; + s_word area_len, name_len; + u_byte name[256], area[256]; + s_word i; + + font_number = dvi_get_u (b-DVI_fnt_def1); + check_sum = dvi_get4 (); + (void)dvi_get4 (); /* scale factor */ + dsize = dvi_get4 (); + area_len = dvi_get1u (); + name_len = dvi_get1u (); + for (i = 0; i < area_len; ++i) + area[i] = (u_byte)dvi_get1u (); + for (i = 0; i < name_len; ++i) + name[i] = (u_byte)dvi_get1u (); + out_prop ("MAPFONT"); + out_dec (font_number); + out_prop ("FONTNAME"); out_str (name, name_len); out_end (); + if (area_len != 0) + { + out_prop ("FONTAREA"); out_str (area, area_len); out_end (); + } + if (check_sum != 0) + { + out_prop ("FONTCHECKSUM"); out_oct (check_sum); out_end (); + } + out_prop ("FONTDSIZE"); + out_real ((double)dsize/(double)0x10000); + out_end (); + out_end (); + } + + +static void out_fnt_num (long n) + { + out_prop ("SELECTFONT"); + out_dec (n); + out_end (); + } + + +static void out_special (long n) + { + out_prop ("SPECIAL"); + out_str (mem->ptr, (int)n); + out_end (); + mem->ptr += n; mem->size -= n; + } + + +static void output (struct mem *src) + { + s_word b; + + mem = src; dst = NULL; + while (mem->size > 0) + { + b = dvi_get1u (); + if (b >= DVI_set_char_0 && b < DVI_set_char_0+128) + out_set_char ((long)b, TRUE); + else if (b >= DVI_fnt_num_0 && b < DVI_fnt_num_0+64) + out_fnt_num ((long)(b-DVI_fnt_num_0)); + else + switch (b) + { + case DVI_set1: + case DVI_set2: + case DVI_set3: + case DVI_set4: + out_set_char (dvi_get_u (b-DVI_set1), TRUE); + break; + case DVI_put1: + case DVI_put2: + case DVI_put3: + case DVI_put4: + out_set_char (dvi_get_u (b-DVI_put1), FALSE); + break; + case DVI_set_rule: + out_set_rule (TRUE); + break; + case DVI_put_rule: + out_set_rule (FALSE); + break; + case DVI_push: + out_prop ("PUSH"); out_end (); + break; + case DVI_pop: + out_prop ("POP"); out_end (); + break; + case DVI_right1: + case DVI_right2: + case DVI_right3: + case DVI_right4: + out_right (dvi_get_s (b-DVI_right1)); + break; + case DVI_down1: + case DVI_down2: + case DVI_down3: + case DVI_down4: + out_down (dvi_get_s (b-DVI_down1)); + break; + case DVI_w0: + out_right (position.w); + break; + case DVI_w1: + case DVI_w2: + case DVI_w3: + case DVI_w4: + position.w = dvi_get_s (b-DVI_w1); + out_right (position.w); + break; + case DVI_x0: + out_right (position.x); + break; + case DVI_x1: + case DVI_x2: + case DVI_x3: + case DVI_x4: + position.x = dvi_get_s (b-DVI_x1); + out_right (position.x); + break; + case DVI_y0: + out_down (position.y); + break; + case DVI_y1: + case DVI_y2: + case DVI_y3: + case DVI_y4: + position.y = dvi_get_s (b-DVI_y1); + out_down (position.y); + break; + case DVI_z0: + out_down (position.z); + break; + case DVI_z1: + case DVI_z2: + case DVI_z3: + case DVI_z4: + position.z = dvi_get_s (b-DVI_z1); + out_down (position.z); + break; + case DVI_fnt1: + case DVI_fnt2: + case DVI_fnt3: + case DVI_fnt4: + out_fnt_num (dvi_get_s (b-DVI_fnt1)); + break; + case DVI_xxx1: + case DVI_xxx2: + case DVI_xxx3: + case DVI_xxx4: + out_special (dvi_get_u (b-DVI_xxx1)); + break; + case DVI_fnt_def1: + case DVI_fnt_def2: + case DVI_fnt_def3: + case DVI_fnt_def4: + out_fnt_def (b); + break; + default: + internal (3043); + exit (2); + } + } + mem = NULL; + } + + + +static void make_output (void) + { + struct map *mp; + struct font *fp; + char line[256]; + + out_in_line = FALSE; + out_level = 0; + for (fp = font_head; fp != NULL; fp = fp->next) + { + output (&fp->dvi); + } + if (opt_i) + { + while (fgets (line, sizeof (line), ins_file) != NULL) + fputs (line, out_file); + fclose (ins_file); + opt_i = FALSE; + } + for (mp = map_head; mp != NULL; mp = mp->next) + { + out_prop ("CHARACTER"); + out_char (mp->code); + out_prop ("CHARWD"); out_scaled (mp->wd); out_end (); + out_prop ("CHARHT"); out_scaled (mp->ht); out_end (); + out_prop ("CHARDP"); out_scaled (mp->dp); out_end (); + out_prop ("MAP"); + output (&mp->repl); + out_end (); + out_end (); + } + if (out_in_line) + (void)fputc ('\n', out_file); + } + + +static void usage (void) + { + (void)fputs ("Usage:\n", stderr); + (void)fputs (" qdtexvpl -d<design_size> [-i<insert.pl>] <input.dvi> <output.vpl>\n", + stderr); + exit (1); + } + + +int main (int argc, char *argv[]) + { + int i; + char *p; + + opt_d = FALSE; opt_i = FALSE; + ins_fname = NULL; + for (i = 1; i < argc; ++i) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'd': + opt_d = TRUE; + errno = 0; + design_size = strtod (argv[i]+2, &p); + if (errno != 0 || design_size <= 0.0 || *p != 0) + usage (); + break; + case 'i': + opt_i = TRUE; + ins_fname = argv[i]+2; + break; + default: + usage (); + } + else + break; + if (!opt_d) usage (); + if (argc - i != 2) usage (); + dvi_fname = argv[i+0]; + out_fname = argv[i+1]; + dvi_file = fopen (dvi_fname, read_binary); + if (dvi_file == NULL) + { + (void)fprintf (stderr, "*** Cannot open input file '%s'\n", dvi_fname); + exit (1); + } + if (opt_i) + { + ins_file = fopen (ins_fname, read_text); + if (dvi_file == NULL) + { + (void)fprintf (stderr, "*** Cannot open -i file '%s'\n", ins_fname); + exit (1); + } + } + out_file = fopen (out_fname, write_text); + if (out_file == NULL) + { + (void)fprintf (stderr, "*** Cannot open output file '%s'\n", out_fname); + exit (1); + } + dvi_preamble (); + dvi_main (); + make_output (); + (void)fflush (out_file); + if (ferror (out_file)) + { + (void)fprintf (stderr, "*** Cannot write to output file '%s'\n", + out_fname); + exit (1); + } + (void)fclose (out_file); + return (0); + } diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.def b/fonts/utilities/qdtexvpl/qdtexvpl.def new file mode 100644 index 0000000000..7bf431a2e2 --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.def @@ -0,0 +1 @@ +NAME qdtexvpl WINDOWCOMPAT diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.doc b/fonts/utilities/qdtexvpl/qdtexvpl.doc new file mode 100644 index 0000000000..d420be89f1 --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.doc @@ -0,0 +1,81 @@ +============================================================================== +qdtexvpl.doc for qdtexvpl 1.0 Copyright (c) 1992 by Eberhard Mattes +============================================================================== + +qdtexvpl is a tool for quick & dirty creation of virtual fonts. You have to +create a TeX file which contains the TeX code to be put into the virtual font. +Run TeX on the file. Then, feed the DVI file into qdtexvpl, which creates a +VPL file. Use VPtoVF to create a TFM file and a VF file from the VPL file. + +This is an example of an input file: + + % + % ibmpc437.tex + % + % Some extended characters for cmr10 + % + \font\f=cmr10 + \input qdtexvpl + \texvpl{^^84}{\f\"a} + \texvpl{^^94}{\f\"o} + \texvpl{^^81}{\f\"u} + \texvpl{^^8e}{\f\"A} + \texvpl{^^99}{\f\"O} + \texvpl{^^9a}{\f\"U} + \texvpl{^^e1}{\f\ss} + \bye + +You have to define the fonts referenced by your virtual font. If a font +references itself, you have to run the complete process twice. TeX will +complain about a missing TFM file on the first pass, you can ignore that +warning. + +\input qdtexvpl to load the \texvpl macro. + +Then, use \texvpl to define how a character of the virtual font is to be +constructed. The first argument of \texvpl is the character to be defined, the +second argument contains the TeX commands to construct the character. You can +use any TeX commands, including rules and plain TeX commands. Don't forget to +switch to the font from which you want to take characters! + +Your file should end with \bye. + +Compile your file by calling TeX (usage of the plain format is recommended). +This requires qdtexvpl.tfm. If you don't want to move that file to \emtex\tfm, +add . to the TEXTFM environment variable. + +Run qdtexvpl to convert the resulting DVI file into a VPL file. The calling +sequence of qdtexvpl is + + qdtexvpl -d<design_size> [-i<insert.pl>] <input.dvi> <output.vpl> + +You have to replace <design_size> with the design size (pt) of your font. If +you want to copy characters of another fonts into your font (for instance, if +you want to complement a 7-bit font by characters in the range 128-255), use +the -i option followed by the name of the PL file for that font (created by +TFtoPL). The next argument is the name of the DVI file created by the previous +step, the last argument is the output file name. There are no default +extensions, you have to enter all the extensions! Example: + + qdtexvpl -d10.0 myfont.dvi myfont.vpl + +Then, run VPtoVF to convert the VPL file into a TFM file and a VF file: + + vptovf myfont + +If your virtual font references itself, you have to do all this once again, +starting with compiling the TeX file by running TeX. + + +Problems +-------- + +- qdtexvpl uses floating point math which is machine-dependent. + +- I don't know whether the computations done by qdtexvpl are precise + enough. + +- Better use ^^X or ^^ff notation for characters with code > 127. + + + --- END OF QDTEXVPL.DOC --- diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.pl b/fonts/utilities/qdtexvpl/qdtexvpl.pl new file mode 100644 index 0000000000..2c6cd9890e --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.pl @@ -0,0 +1,16 @@ +(CODINGSCHEME Dummy font for qdtexvpl) +(DESIGNSIZE R 10.0) +(CHECKSUM O 0) +(FONTDIMEN + (SLANT R 0.0) + (SPACE R 0.0) + (STRETCH R 0.0) + (SHRINK R 0.0) + (XHEIGHT R 0.0) + (QUAD R 0.0) + (EXTRASPACE R 0.0) + ) +(CHARACTER C A + (CHARWD R 0.0) + (CHARHT R 0.0) + ) diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.tex b/fonts/utilities/qdtexvpl/qdtexvpl.tex new file mode 100644 index 0000000000..ec03bd435f --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.tex @@ -0,0 +1,28 @@ +% +% qdtexvpl.tex +% +% +% \texvpl{dst}{cmds} +% +% dst Destination character +% cmds Desired expansion of dst +% +% Example: +% +% \input qdtexvpl +% \font\f=cmr10 +% \texvpl{}{\f\"a} +% \texvpl{}{\f\"o} +% \texvpl{}{\f\"u} +% \texvpl{^^ff}{\f I\negthinspace R} +% \bye +% +% Limitations: +% +% - \unusedfont must not be used in `cmds'. +% - \unusedfont must contain an `A'. +% +\nopagenumbers +\font\unusedfont=qdtexvpl +\def\texvpl#1#2{{\noindent\unusedfont A \setbox0=\hbox{#2}% + \special{<#1}\copy0\special{>\the\wd0 \the\ht0 \the\dp0}\par}} diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.tfm b/fonts/utilities/qdtexvpl/qdtexvpl.tfm Binary files differnew file mode 100644 index 0000000000..cd5b2de83e --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.tfm diff --git a/fonts/utilities/qdtexvpl/qdtexvpl.txt b/fonts/utilities/qdtexvpl/qdtexvpl.txt new file mode 120000 index 0000000000..44441007ed --- /dev/null +++ b/fonts/utilities/qdtexvpl/qdtexvpl.txt @@ -0,0 +1 @@ +qdtexvpl.doc
\ No newline at end of file diff --git a/fonts/utilities/qdtexvpl/self.tex b/fonts/utilities/qdtexvpl/self.tex new file mode 100644 index 0000000000..76d2e04e30 --- /dev/null +++ b/fonts/utilities/qdtexvpl/self.tex @@ -0,0 +1,11 @@ +% +% self.tex +% +% A self-referencing virtual font +% +\font\f=cmr10 +\font\s=self +\input qdtexvpl +\texvpl{a}{\f a} +\texvpl{b}{\s a} +\bye |