summaryrefslogtreecommitdiff
path: root/Build/source/texk/dtl/dt2dv.c
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/texk/dtl/dt2dv.c
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dtl/dt2dv.c')
-rw-r--r--Build/source/texk/dtl/dt2dv.c2864
1 files changed, 0 insertions, 2864 deletions
diff --git a/Build/source/texk/dtl/dt2dv.c b/Build/source/texk/dtl/dt2dv.c
deleted file mode 100644
index 2e3be819144..00000000000
--- a/Build/source/texk/dtl/dt2dv.c
+++ /dev/null
@@ -1,2864 +0,0 @@
-/* dt2dv - convert human-readable "DTL" file to DVI format
- - this is intended to invert dv2dt version 0.6.0
-
- This file is public domain.
- Originally written 1995, Geoffrey Tobin.
- The author has expressed the hope that any modification will retain
- enough content to remain useful. He would also appreciate being
- acknowledged as the original author in the documentation.
- This declaration added 2008/11/14 by Clea F. Rees with the permission
- of Geoffrey Tobin.
-
- - version 0.6.1 - 14:38 GMT +11 Thu 9 March 1995
- - Geoffrey Tobin G.Tobin@ee.latrobe.edu.au
- - fixes: Michal Tomczak-Jaegermann ntomczak@vm.ucs.ualberta.ca
- Nelson H. F. Beebe beebe@math.utah.edu
- - Reference: "The DVI Driver Standard, Level 0",
- by The TUG DVI Driver Standards Committee.
- Appendix A, "Device-Independent File Format".
-*/
-
-/* unix version; read from stdin, write to stdout, by default. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef KPATHSEA
-#include <kpathsea/config.h>
-#include <kpathsea/c-fopen.h>
-#include <kpathsea/progname.h>
-#endif
-
-#include "dtl.h"
-
-/* by default, read and write regular files */
-int rd_stdin = 0;
-int wr_stdout = 0;
-
-/* maximum number of characters in a DTL input line */
-#define MAXLINE 8192
-
-/* input line */
-typedef struct
-{
- COUNT num; /* current line number */
- size_t max; /* capacity of buf */
- S4 wrote; /* number of characters written into buf */
- size_t read; /* position in buf of next character to read from buf */
- char * buf; /* line buffer */
-} Line;
-
-char linebuf[MAXLINE+1];
-
-Line dtl_line = {0, 0, 0, MAXLINE, linebuf};
-
-/* a DTL token either is:
- a quoted string (admitting an escape character),
- or BCOM (if that is a nonempty string),
- or ECOM (if that is a nonempty string),
- or a string _not_ including ECOM_CHAR or space.
-*/
-
-/* maximum expected length of a DTL token */
-#define MAXTOKLEN 255
-typedef char Token[MAXTOKLEN+2];
-
-typedef unsigned char Byte;
-typedef char Boolean;
-
-#ifndef true
-#define true 1
-#endif
-#ifndef false
-#define false 0
-#endif
-
-/* command prefixes */
-typedef struct
-{
- Byte first_code;
- const char * name;
- Boolean has_suffix;
- Byte first_suffix, last_suffix;
-} CmdPrefix;
-
-CmdPrefix cmd_prefixes [] =
-{
- {0, SETCHAR, true, 0, 127},
- {128, SET, true, 1, 4},
- {132, SETRULE, false, 0, 0},
- {133, PUT, true, 1, 4},
- {137, PUTRULE, false, 0, 0},
- {138, NOP, false, 0, 0},
- {139, BOP, false, 0, 0},
- {140, EOP, false, 0, 0},
- {141, PUSH, false, 0, 0},
- {142, POP, false, 0, 0},
- {143, RIGHT, true, 1, 4},
- {147, W, true, 0, 4},
- {152, X, true, 0, 4},
- {157, DOWN, true, 1, 4},
- {161, Y, true, 0, 4},
- {166, Z, true, 0, 4},
- {171, FONTNUM, true, 0, 63},
- {235, FONT, true, 1, 4},
- {239, SPECIAL, true, 1, 4},
- {243, FONTDEF, true, 1, 4},
- {247, PRE, false, 0, 0},
- {248, POST, false, 0, 0},
- {249, POSTPOST, false, 0, 0},
- {250, OPCODE, true, 250, 255}
-};
-/* cmd_prefixes[] */
-
-/* Number of DVI commands, including those officially undefined */
-#define NCMDS 256
-
-/* table of command name (string) pointers */
-typedef char * CmdTable [NCMDS];
-
-/* initially all command name pointers are NULL */
-CmdTable cmd_table;
-
-/* operation's opcode, name, number of args, string of arguments. */
-typedef struct
-{
- int code;
- const char * name;
- int nargs;
- const char * args;
-} op_info;
-
-/* name of table, first opcode, last opcode, pointer to opcode info. */
-typedef struct
-{
- const char * name;
- int first;
- int last;
- op_info * list;
-} op_table;
-
-/* Table for opcodes 128 to 170 inclusive. */
-
-op_info op_info_128_170 [] =
-{
- {128, SET1, 1, "1"},
- {129, SET2, 1, "2"},
- {130, SET3, 1, "3"},
- {131, SET4, 1, "-4"},
- {132, SETRULE, 2, "-4 -4"},
- {133, PUT1, 1, "1"},
- {134, PUT2, 1, "2"},
- {135, PUT3, 1, "3"},
- {136, PUT4, 1, "-4"},
- {137, PUTRULE, 2, "-4 -4"},
- {138, NOP, 0, ""},
- /* bop: not counting last argument, a signed address: */
- {139, BOP, 10, "-4 -4 -4 -4 -4 -4 -4 -4 -4 -4"},
- {140, EOP, 0, ""},
- {141, PUSH, 0, ""},
- {142, POP, 0, ""},
- {143, RIGHT1, 1, "-1"},
- {144, RIGHT2, 1, "-2"},
- {145, RIGHT3, 1, "-3"},
- {146, RIGHT4, 1, "-4"},
- {147, W0, 0, ""},
- {148, W1, 1, "-1"},
- {149, W2, 1, "-2"},
- {150, W3, 1, "-3"},
- {151, W4, 1, "-4"},
- {152, X0, 0, ""},
- {153, X1, 1, "-1"},
- {154, X2, 1, "-2"},
- {155, X3, 1, "-3"},
- {156, X4, 1, "-4"},
- {157, DOWN1, 1, "-1"},
- {158, DOWN2, 1, "-2"},
- {159, DOWN3, 1, "-3"},
- {160, DOWN4, 1, "-4"},
- {161, Y0, 0, ""},
- {162, Y1, 1, "-1"},
- {163, Y2, 1, "-2"},
- {164, Y3, 1, "-3"},
- {165, Y4, 1, "-4"},
- {166, Z0, 0, ""},
- {167, Z1, 1, "-1"},
- {168, Z2, 1, "-2"},
- {169, Z3, 1, "-3"},
- {170, Z4, 1, "-4"}
-};
-/* op_info op_info_128_170 [] */
-
-op_table op_128_170 = {"op_128_170", 128, 170, op_info_128_170};
-
-/* Table for fnt1 to fnt4 (opcodes 235 to 238) inclusive. */
-
-op_info fnt_n [] =
-{
- {235, FONT1, 1, "1"},
- {236, FONT2, 1, "2"},
- {237, FONT3, 1, "3"},
- {238, FONT4, 1, "-4"}
-};
-/* op_info fnt_n [] */
-
-op_table fnt = {FONT, 235, 238, fnt_n};
-
-
-/* Function prototypes */
-
-Void mem_viol ARGS((int sig));
-Void give_help (VOID);
-int parse ARGS((const char * s));
-Void process ARGS((const char * s));
-
-Void no_op (VOID);
-Void dtl_stdin (VOID);
-Void dvi_stdout (VOID);
-
-int open_dtl ARGS((const char * dtl_file, FILE ** pdtl));
-int open_dvi ARGS((const char * dvi_file, FILE ** pdvi));
-
-int dt2dv ARGS((FILE * dtl, FILE * dvi));
-
-Void * gmalloc ARGS((long int size));
-
-Void dinfo (VOID);
-Void dexit ARGS((int n));
-
-int cons_cmds ARGS((int nprefixes, CmdPrefix * prefix, CmdTable cmds));
-Void free_cmds ARGS((CmdTable cmds));
-
-int get_line ARGS((FILE * fp, Line * line, int max));
-int read_line_char ARGS((FILE * fp, int * ch));
-int read_char ARGS((FILE * fp, int * ch));
-int unread_char (VOID);
-int read_string_char ARGS((FILE * fp, int * ch));
-
-COUNT read_variety ARGS((FILE * dtl));
-COUNT read_token ARGS((FILE * dtl, char * token));
-COUNT skip_space ARGS((FILE * fp, int * ch));
-COUNT read_misc ARGS((FILE * fp, Token token));
-COUNT read_mes ARGS((FILE * fp, char * token));
-
-int find_command ARGS((char * command, int * opcode));
-int xfer_args ARGS((FILE * dtl, FILE * dvi, int opcode));
-
-int set_seq ARGS((FILE * dtl, FILE * dvi));
-
-int check_byte ARGS((int byte));
-int put_byte ARGS((int onebyte, FILE * dvi));
-
-U4 xfer_hex ARGS((int n, FILE * dtl, FILE * dvi));
-U4 xfer_oct ARGS((int n, FILE * dtl, FILE * dvi));
-U4 xfer_unsigned ARGS((int n, FILE * dtl, FILE * dvi));
-S4 xfer_signed ARGS((int n, FILE * dtl, FILE * dvi));
-
-int check_bmes ARGS((FILE * dtl));
-int check_emes ARGS((FILE * dtl));
-
-Void init_Lstring ARGS((Lstring * lsp, long int n));
-Void de_init_Lstring ARGS((Lstring * lsp));
-Lstring * alloc_Lstring ARGS((long int n));
-Void free_Lstring ARGS((Lstring * lstr));
-Void ls_putb ARGS((int ch, Lstring * lstr));
-
-S4 get_Lstring ARGS((FILE * dtl, Lstring * lstr));
-Void put_Lstring ARGS((const Lstring * lstr, FILE * dvi));
-U4 xfer_len_string ARGS((int n, FILE * dtl, FILE * dvi));
-
-U4 get_unsigned ARGS((FILE * dtl));
-S4 get_signed ARGS((FILE * dtl));
-
-int put_unsigned ARGS((int n, U4 unum, FILE * dvi));
-int put_signed ARGS((int n, S4 snum, FILE * dvi));
-
-S4 xfer_bop_address ARGS((FILE * dtl, FILE * dvi));
-S4 xfer_postamble_address ARGS((FILE * dtl, FILE * dvi));
-
-int put_table ARGS((op_table table, int opcode, FILE * dtl, FILE * dvi));
-
-U4 special ARGS((FILE * dtl, FILE * dvi, int n));
-int fontdef ARGS((FILE * dtl, FILE * dvi, int n));
-
-U4 preamble ARGS((FILE * dtl, FILE * dvi));
-int postamble ARGS((FILE * dtl, FILE * dvi));
-int post_post ARGS((FILE * dtl, FILE * dvi));
-
-
-typedef struct
-{
- const char * keyword; /* command line option keyword */
- int * p_var; /* pointer to option variable */
- const char * desc; /* description of keyword and value */
- Void (* p_fn) (VOID); /* pointer to function called when option is set */
-} Options;
-
-Options opts[] =
-{
- {"-debug", &debug, "detailed debugging", no_op},
- {"-group", &group, "each DTL command is in parentheses", no_op},
- {"-si", &rd_stdin, "read all DTL commands from standard input", dtl_stdin},
- {"-so", &wr_stdout, "write all DVI commands to standard output", dvi_stdout},
- {NULL, NULL, NULL, NULL}
-};
-/* opts[] */
-
-const char * progname; /* intended for name of this program */
-int nfile; /* number of filename arguments on the command line */
-
-#define PRINT_PROGNAME fprintf (stderr, "%s ", progname)
-
-/* Harbison & Steele (1991) warn that some C implementations */
-/* of free() do not treat NULL pointers correctly. */
-#define gfree(p) {if (p) free (p);}
-
-
-FILE * dtl_fp;
-FILE * dvi_fp;
-
-const char * dtl_filename;
-const char * dvi_filename;
-
-
-int
-main
-#ifdef STDC
- (int argc, char * argv[])
-#else
- (argc, argv)
- int argc;
- char * argv[];
-#endif
-{
- int i;
-
-#ifdef KPATHSEA
- kpse_set_program_name(argv[0], "dt2dv");
- progname = kpse_program_name;
-#else
- progname = argv[0]; /* name of this program */
-#endif
-
- /* memory violation signal handler */
- /* Not supported under Win32 */
-#ifndef WIN32
- signal (SIGSEGV, mem_viol);
-#endif
-
-#ifndef __DATE__
-#define __DATE__ ""
-#endif
-
-#ifndef __TIME__
-#define __TIME__ ""
-#endif
-
-#if STDC
-#define C_LEVEL ""
-#else /* NOT STDC */
-#define C_LEVEL "non-"
-#endif /* NOT STDC */
-
- /* message about program and compiler */
- /* NB: LTU EE's Sun/OS library is BSD, even though gcc 2.2.2 is ANSI */
-
- fprintf (stderr, "\n");
- fprintf (stderr,
- "Program \"%s\" version %s (%s) compiled in %sstandard C.\n",
- progname, VERSION, TL_VERSION, C_LEVEL);
-
- /* interpret command line arguments */
-
- nfile = 0;
- dtl_fp = dvi_fp = NULL;
- dtl_filename = dvi_filename = "";
-
- for (i=1; i < argc; i++)
- {
- /* parse options, followed by any explicit filenames */
- parse (argv[i]);
- }
-
- if (nfile != 2) /* not exactly two files specified, so give help */
- give_help();
- else
- /* the real works */
- dt2dv (dtl_fp, dvi_fp);
-
- return 0; /* OK */
-}
-/* end main */
-
-#ifndef WIN32
-Void
-mem_viol
-#ifdef STDC
- (int sig)
-#else
- (sig)
- int sig;
-#endif
-{
- signal (SIGSEGV, mem_viol);
- if (sig != SIGSEGV)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(mem_viol) : called with wrong signal!\n");
- }
- PRINT_PROGNAME;
- fprintf (stderr, "(mem_viol) : RUNTIME MEMORY ERROR : memory violation, ");
- fprintf (stderr, "dtl line >= ");
- fprintf (stderr, WF, dtl_line.num);
- fprintf (stderr, "\n");
- dexit (1);
-}
-/* mem_viol */
-#endif
-
-Void
-give_help (VOID)
-{
- int i;
- const char * keyword;
- fprintf (stderr, "usage: ");
- PRINT_PROGNAME;
- fprintf (stderr, "[options] dtl_file dvi_file");
- fprintf (stderr, "\n");
- for (i=0; (keyword = opts[i].keyword) != NULL; i++)
- {
- fprintf (stderr, " ");
- fprintf (stderr, "[%s]", keyword);
- fprintf (stderr, " ");
- fprintf (stderr, "%s", opts[i].desc);
- fprintf (stderr, "\n");
- }
- fprintf (stderr, "Messages, like this one, go to stderr.\n");
- fprintf (stderr, "\nEmail bug reports to %s.\n", PACKAGE_BUGREPORT);
-}
-/* give_help */
-
-
-Void no_op (VOID)
-/* do nothing */
-{
-}
-
-Void dtl_stdin (VOID)
-{
- dtl_fp = stdin;
- dtl_filename = "Standard Input";
- ++ nfile;
-}
-
-Void dvi_stdout (VOID)
-{
- /* ! Perilous to monitors! */
- dvi_fp = stdout;
- dvi_filename = "Standard Output";
- ++ nfile;
- if (!isatty(fileno(dvi_fp)))
- SET_BINARY(fileno(dvi_fp));
-}
-
-
-int
-parse
-#ifdef STDC
- (const char * s)
-#else
- (s)
- const char * s;
-#endif
-/* parse one command-line argument, `s' */
-{
- int i;
- const char * keyword;
- for (i=0; (keyword = opts[i].keyword) != NULL; i++)
- {
- if (strncmp (s, keyword, strlen (keyword)) == 0)
- {
- Void (*pfn) (VOID);
- (*(opts[i].p_var)) = 1; /* turn option on */
- if ((pfn = opts[i].p_fn) != NULL)
- (*pfn) (); /* call option function */
- return i;
- }
- }
- /* reached here, so not an option: assume it's a filename */
- process (s);
- return i;
-}
-/* parse */
-
-
-int
-open_dtl
-#ifdef STDC
- (const char * dtl_file, FILE ** pdtl)
-#else
- (dtl_file, pdtl)
- const char * dtl_file;
- FILE ** pdtl;
-#endif
-/* I: dtl_file; I: pdtl; O: *pdtl. */
-{
- dtl_filename = dtl_file;
-
- if (dtl_filename == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dtl) : INTERNAL ERROR : dtl file's name is NULL.\n");
- dexit (1);
- }
-
- if (pdtl == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dtl) : INTERNAL ERROR : address of dtl variable is NULL.\n");
- dexit (1);
- }
-
- *pdtl = fopen (dtl_file, "r");
-
- if (*pdtl == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dtl) : DTL FILE ERROR : Cannot open \"%s\" for text reading.\n",
- dtl_file);
- dexit (1);
- }
-
- return 1; /* OK */
-}
-/* open_dtl */
-
-
-int
-open_dvi
-#ifdef STDC
- (const char * dvi_file, FILE ** pdvi)
-#else
- (dvi_file, pdvi)
- const char * dvi_file;
- FILE ** pdvi;
-#endif
-/* I: dvi_file; I: pdvi; O: *pdvi. */
-{
- dvi_filename = dvi_file;
-
- if (dvi_filename == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dvi) : INTERNAL ERROR : dvi file's name is NULL.\n");
- dexit (1);
- }
-
- if (pdvi == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dvi) : INTERNAL ERROR : address of dvi variable is NULL.\n");
- dexit (1);
- }
-
- *pdvi = fopen (dvi_file, "wb");
-
- if (*pdvi == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(open_dvi) : DVI FILE ERROR : Cannot open \"%s\" for binary writing.\n",
- dvi_file);
- dexit (1);
- }
-
- return 1; /* OK */
-}
-/* open_dvi */
-
-
-Void
-process
-#ifdef STDC
- (const char * s)
-#else
- (s)
- const char * s;
-#endif
-{
- if (dtl_fp == NULL) /* first filename assumed to be DTL input */
- {
- open_dtl (s, &dtl_fp);
- }
- else if (dvi_fp == NULL) /* second filename assumed to be DVI output */
- {
- open_dvi (s, &dvi_fp);
- }
- else
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(process) : at most two filenames allowed.\n");
- exit (1);
- }
- ++ nfile;
-}
-/* process */
-
-
-COUNT dtl_read = 0; /* bytes read from dtl file */
-COUNT dvi_written = 0; /* bytes written to dvi file */
-word_t last_bop_address = -1; /* byte address of last bop; first bop uses -1 */
-word_t postamble_address = -1; /* byte address of postamble */
-COUNT ncom = 0; /* commands successfully read and interpreted from dtl file */
-COUNT com_read = 0; /* bytes read in current (command and arguments), */
- /* since and including the opening BCOM_CHAR, if any */
-
-
-int
-put_byte
-#ifdef STDC
- (int byte, FILE * dvi)
-#else
- (byte, dvi)
- int byte;
- FILE * dvi;
-#endif
-/* write byte into dvi file */
-{
- check_byte (byte);
-/* if (fprintf (dvi, "%c", byte) != 1) */
- if (fprintf (dvi, "%c", byte) < 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_byte) : DVI FILE ERROR (%s) : cannot write to dvi file.\n",
- dtl_filename);
- dexit (1);
- }
- ++ dvi_written;
- return 1; /* OK */
-}
-/* put_byte */
-
-
-int
-dt2dv
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-{
- int nprefixes = 0; /* number of prefixes in cmd_prefixes[] list. */
- static Token dtl_cmd = ""; /* DTL command name */
-
- nprefixes = sizeof (cmd_prefixes) / sizeof (CmdPrefix);
-
- /* Construct array of all NCMDS == 256 DTL commands */
-
- (Void) cons_cmds (nprefixes, cmd_prefixes, cmd_table);
-
- /* DTL commands have the form "[ ]*command arg ... arg[ ]*", */
- /* possibly enclosed in a BCOM, ECOM pair, */
- /* and are separated by optional whitespace, typically newlines. */
- /* That is, each command and its arguments are parenthesised, */
- /* with optional spaces after the BCOM and before the ECOM, if any. */
-
- /* dt2dv is now at the very start of the DTL file */
-
- dtl_line.num = 0;
- dtl_read = 0;
-
- /* The very first thing should be the "variety" signature */
-
- read_variety (dtl);
-
- /* while not end of dtl file or reading error, */
- /* read, interpret, and write commands */
-
- while (!feof (dtl))
- {
- int opcode;
-
- com_read = 0;
-
- if (group)
- {
- /* BCOM check */
- static Token token = ""; /* DTL token */
- read_token (dtl, token);
- /* test for end of input, or reading error */
- if (strlen (token) == 0)
- {
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(dt2dv) : end of input, or reading error.\n");
- }
- break;
- }
- /* test whether this command begins correctly */
- else if (strcmp (token, BCOM) != 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(dt2dv) : DTL FILE ERROR (%s) : ", dtl_filename);
- fprintf (stderr, "command must begin with \"%s\", ", BCOM);
- fprintf (stderr, "not `%c' (char %d).\n", token[0], token[0]);
- dexit (1);
- }
- /* end BCOM check */
- }
-
- /* read the command name */
- read_token (dtl, dtl_cmd);
- /* test for end of input, or reading error */
- if (strlen (dtl_cmd) == 0)
- {
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(dt2dv) : end of input, or reading error.\n");
- }
- break;
- }
- else
- {
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(dt2dv) : command ");
- fprintf (stderr, WF, ncom);
- fprintf (stderr, " = \"%s\".\n", dtl_cmd);
- }
-
- /* find opcode for this command */
- if (find_command (dtl_cmd, &opcode) == 1)
- {
- /* write the opcode, if we can */
- put_byte (opcode, dvi);
-
- /* treat the arguments, if any */
- xfer_args (dtl, dvi, opcode);
- }
- else if (dtl_cmd[0] == BSEQ_CHAR)
- {
- /* sequence of font characters for SETCHAR */
- set_seq (dtl, dvi);
- }
- else
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(dt2dv) : DTL FILE ERROR (%s) : unknown command \"%s\".\n",
- dtl_filename, dtl_cmd);
- dexit (1);
- }
- }
-
- if (group)
- {
- /* seek ECOM after command's last argument and optional whitespace */
- static Token token = ""; /* DTL token */
- read_token (dtl, token);
- /* test for end of input, or reading error */
- if (strlen (token) == 0)
- {
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(dt2dv) : end of input, or reading error.\n");
- }
- break;
- }
- if (strcmp (token, ECOM) != 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(dt2dv) : DTL FILE ERROR (%s) : ", dtl_filename);
- fprintf (stderr, "ECOM (\"%s\") expected, not `%c' (char %d).\n",
- ECOM, token[0], token[0]);
- dexit (1);
- }
- /* end ECOM check */
- }
-
- ++ ncom; /* one more command successfully read and interpreted */
- }
- /* end while */
-
- PRINT_PROGNAME;
- fprintf (stderr, "(dt2dv) :\n");
- fprintf (stderr, "Read (from file \"%s\") ", dtl_filename);
- fprintf (stderr, WF, dtl_read);
- fprintf (stderr, " DTL bytes (");
- fprintf (stderr, UF4, dtl_line.num);
- fprintf (stderr, " lines);\n");
- fprintf (stderr, "wrote (to file \"%s\") ", dvi_filename);
- fprintf (stderr, WF, dvi_written);
- fprintf (stderr, " DVI bytes;\n");
- fprintf (stderr, "completely interpreted ");
- fprintf (stderr, WF, ncom);
- fprintf (stderr, " DVI command%s.\n", (ncom == 1 ? "" : "s"));
- fprintf (stderr, "\n");
-
- (Void) free_cmds (cmd_table);
-
- return 1; /* OK */
-}
-/* dt2dv */
-
-
-Void *
-gmalloc
-#ifdef STDC
- (long int size)
-#else
- (size)
- long int size;
-#endif
-{
- Void * p = NULL;
- if (size < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(gmalloc) : INTERNAL ERROR : ");
- fprintf (stderr,
- "unreasonable request to malloc %ld bytes\n",
- size);
- dexit (1);
- }
- p = (Void *) malloc ((size_t) size);
- if (p == NULL)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(gmalloc) : MEMORY ALLOCATION ERROR : ");
- fprintf (stderr,
- "operating system failed to malloc %ld bytes\n",
- size);
- dexit (1);
- }
- return (p);
-}
-/* gmalloc */
-
-
-Void
-dinfo (VOID)
-{
- PRINT_PROGNAME;
- fprintf (stderr, "(dinfo) : ");
- fprintf (stderr, "Current DTL input line ");
- fprintf (stderr, UF4, dtl_line.num);
- fprintf (stderr, " :\n");
- fprintf (stderr, "\"%s\"\n", dtl_line.buf);
- fprintf (stderr, "Read ");
- fprintf (stderr, WF, dtl_read);
- fprintf (stderr, " DTL bytes (");
- fprintf (stderr, WF, com_read);
- fprintf (stderr, " in current command), wrote ");
- fprintf (stderr, WF, dvi_written);
- fprintf (stderr, " DVI bytes.\n");
- fprintf (stderr, "Successfully interpreted ");
- fprintf (stderr, WF, ncom);
- fprintf (stderr, " DVI command%s.\n", (ncom == 1 ? "" : "s"));
-}
-/* dinfo */
-
-
-Void
-dexit
-#ifdef STDC
- (int n)
-#else
- (n)
- int n;
-#endif
-{
- dinfo();
- PRINT_PROGNAME;
- fprintf (stderr, "(dexit) : exiting with status %d.\n", n);
- exit (n);
-}
-/* dexit */
-
-
-int
-cons_cmds
-#ifdef STDC
- (int nprefixes, CmdPrefix * prefix, CmdTable cmds)
-#else
- (nprefixes, prefix, cmds)
- int nprefixes;
- CmdPrefix * prefix;
- CmdTable cmds;
-#endif
-{
- int code; /* first opcode for a given command prefix */
- int opcode; /* command's opcode */
- int nsuffixes; /* number of commands with a given prefix */
- int isuffix; /**** integer suffix, of at most three digits ****/
- String suffix; /* suffix string generated from integer suffix */
- size_t plen = 0; /* prefix length */
- size_t slen; /* suffix length */
- size_t clen; /* whole command name length */
- int i, j; /* loop indices */
-
- for (i=0; i < nprefixes; prefix++, i++)
- {
- code = prefix->first_code;
- if (code < 0 || code > 255)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(cons_cmds) : INTERNAL ERROR : ");
- fprintf (stderr,
- "prefix listed internally with code = %d, must be 0 to 255\n",
- code);
- dexit (1);
- }
- if (prefix->has_suffix)
- {
- plen = strlen (prefix->name);
- /**** Suffixes in DTL are Integers, in Sequence */
- if (prefix->last_suffix < prefix->first_suffix)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(cons_cmds) : INTERNAL ERROR : ");
- fprintf (stderr,
- "prefix's last suffix %d < first suffix (%d)\n",
- prefix->last_suffix, prefix->first_suffix);
- dexit (1);
- }
- nsuffixes = prefix->last_suffix - prefix->first_suffix + 1;
- opcode = prefix->first_code;
- for (j=0; j < nsuffixes; j++, opcode++)
- {
- isuffix = prefix->first_suffix + j;
- if (0 <= code && code <= 127) /* SETCHAR */
- {
- /* SETCHAR's suffix is written in uppercase hexadecimal */
- sprintf (suffix, "%02X", isuffix);
- }
- else /* 128 <= code && code <= 255 */ /* other DTL commands */
- {
- /* other commands' suffices are written in decimal */
- sprintf (suffix, "%d", isuffix);
- }
- slen = strlen (suffix);
- clen = plen + slen;
- cmds[opcode] = (char *) gmalloc (clen+1);
- strcpy (cmds[opcode], prefix->name);
- strcat (cmds[opcode], suffix);
- }
- }
- else /* command name = prefix */
- {
- plen = strlen (prefix->name);
- clen = plen;
- opcode = prefix->first_code;
- cmds[opcode] = (char *) gmalloc (clen+1);
- strcpy (cmds[opcode], prefix->name);
- }
- }
-
- return 1; /* OK */
-}
-/* cons_cmds */
-
-
-Void
-free_cmds
-#ifdef STDC
- (CmdTable cmds)
-#else
- (cmds)
- CmdTable cmds;
-#endif
-{
- int i;
- for (i=0; i < NCMDS; i++)
- gfree (cmds[i]);
-}
-/* free_cmds */
-
-
-int
-get_line
-#ifdef STDC
- (FILE * fp, Line * line, int max)
-#else
- (fp, line, max)
- FILE * fp;
- Line * line;
- int max;
-#endif
-/* read a (Line *) line from fp, return length */
-/* adapted from K&R (second, alias ANSI C, edition, 1988), page 165 */
-{
- if (fgets (line->buf, max, fp) == NULL)
- return 0;
- else
- {
- ++ line->num;
- line->wrote = strlen (line->buf);
- line->read = 0;
- return 1;
- }
-}
-/* get_line */
-
-
-int
-read_line_char
-#ifdef STDC
- (FILE * fp, int * ch)
-#else
- (fp, ch)
- FILE * fp;
- int * ch;
-#endif
-/* read one character from dtl_line if possible, */
-/* otherwise read another dtl_line from fp */
-/* return 1 if a character is read, 0 if at end of fp file */
-{
- if (dtl_line.wrote == 0 || dtl_line.read >= dtl_line.wrote)
- {
- int line_status;
- /* refill line buffer */
- line_status = get_line (fp, &dtl_line, MAXLINE);
- if (line_status == 0)
- {
- /* at end of DTL file */
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_line_char) : end of DTL file\n");
- dinfo();
- }
- return 0;
- }
- else
- {
- /* new DTL line was read */
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_line_char) : new DTL input line:\n");
- fprintf (stderr, "\"%s\"\n", dtl_line.buf);
- }
- }
- }
- *ch = dtl_line.buf [dtl_line.read ++];
- ++ dtl_read;
- ++ com_read; /* count another DTL command character */
- return 1;
-}
-/* read_line_char */
-
-
-int
-read_char
-#ifdef STDC
- (FILE * fp, int * ch)
-#else
- (fp, ch)
- FILE * fp;
- int * ch;
-#endif
-/* Read next character, if any, from file fp. */
-/* Write it into *ch. */
-/* If no character is read, then *ch value < 0. */
-/* Return 1 if OK, 0 if EOF or error. */
-{
- int status = 1;
- int c; /* in case ch points awry, we still have something in c. */
-
- c = EOF;
- if (read_line_char (fp, &c) == 0)
- {
- /* end of fp file, or error reading it */
- status = 0;
- }
- else
- {
- if (c > 255)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(read_char) : character %d not in range 0 to 255\n",
- c);
- dinfo();
- status = 0;
- }
- else if ( ! isprint (c) && ! isspace (c)
-#ifdef WIN32
- && ! isknj (c) && ! isknj2 (c)
-#endif
- )
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(read_char) : character %d not printable and not white space.\n",
- c);
- dinfo();
- status = 0;
- }
- }
- *ch = c;
-
- return status;
-}
-/* read_char */
-
-
-COUNT
-read_variety
-#ifdef STDC
- (FILE * dtl)
-#else
- (dtl)
- FILE * dtl;
-#endif
-/* read and check DTL variety signature */
-/* return number of DTL bytes written */
-/* DTL variety is _NEVER_ grouped by BCOM and ECOM. */
-/* Uniformity here enables the program easily to modify its behavior. */
-{
- COUNT vread = 0; /* number of DTL bytes read by read_variety */
- static Token token = "";
-
- /* read the DTL VARIETY keyword */
- vread += read_token (dtl, token);
- /* test whether signature begins correctly */
- if (strcmp (token, "variety") != 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_variety) : DTL FILE ERROR (%s) : ", dtl_filename);
- fprintf (stderr, "DTL signature must begin with \"variety\", not \"%s\".\n",
- token);
- dexit (1);
- }
-
- /* read the DTL variety */
- vread += read_token (dtl, token);
- /* test whether variety is correct */
- if (strcmp (token, VARIETY) != 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_variety) : DTL FILE ERROR (%s) : ", dtl_filename);
- fprintf (stderr, "DTL variety must be \"%s\", not \"%s\".\n",
- VARIETY, token);
- dexit (1);
- }
-
- PRINT_PROGNAME;
- fprintf (stderr, "(read_variety) : DTL variety %s is OK.\n", VARIETY);
-
- return vread; /* OK */
-}
-/* read_variety */
-
-
-COUNT
-skip_space
-#ifdef STDC
- (FILE * fp, int * ch)
-#else
- (fp, ch)
- FILE * fp;
- int * ch;
-#endif
-/* Skip whitespace characters in file fp. */
-/* Write in *ch the last character read from fp, */
-/* or < 0 if fp could not be read. */
-/* Return number of characters read from fp. */
-{
- int c; /* character read (if any) */
- COUNT count; /* number (0 or more) of whitespace characters read */
- int nchar; /* number (0 or 1) of characters read by read_char */
-
- /* loop ends at: end of fp file, or reading error, or not a white space */
- for (count=0; ((nchar = read_char (fp, &c)) == 1 && isspace (c)); ++count)
- {
- /* otherwise, more white spaces to skip */
- if (debug)
- {
- /* report when each DTL end of line is reached */
- if (c == '\n')
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(skip_space) : ");
- fprintf (stderr, "end of DTL line (at least) ");
- fprintf (stderr, WF, dtl_line.num);
- fprintf (stderr, "\n");
- }
- }
- }
-
- if (nchar == 0)
- {
- c = -1;
- }
-
- *ch = c; /* c will be < 0 if read_char could not read fp */
- return (count + nchar);
-}
-/* skip_space */
-
-
-COUNT
-read_token
-#ifdef STDC
- (FILE * dtl, char * token)
-#else
- (dtl, token)
- FILE * dtl;
- char * token;
-#endif
-/* read next token from dtl file. */
-/* return number of DTL bytes read. */
-/* A token is one of:
- a string from BMES_CHAR to the next unescaped EMES_CHAR, inclusive;
- BCOM or ECOM, unless these are empty strings;
- BSEQ or ESEQ;
- any other sequence of non-whitespace characters.
-*/
-{
- COUNT nread; /* number of DTL bytes read by read_token */
- int ch; /* most recent character read */
-
- nread = 0;
-
- /* obtain first non-space character */
- /* add to nread the number of characters read from dtl by skip_space */
- nread += skip_space (dtl, &ch);
-
- if (ch < 0)
- {
- /* end of dtl file */
- /* write an empty token */
- strcpy (token, "");
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_token) : end of dtl file.\n");
- }
- }
- else if (group && ch == BCOM_CHAR)
- {
- strcpy (token, BCOM);
- }
- else if (group && ch == ECOM_CHAR)
- {
- strcpy (token, ECOM);
- }
- else
- {
- token[0] = ch;
- token[1] = '\0';
- if (ch == BMES_CHAR) /* string token; read until unescaped EMES_CHAR */
- {
- nread += read_mes (dtl, token+1);
- }
- else if (ch == BSEQ_CHAR || ch == ESEQ_CHAR)
- {
- /* token is complete */
- }
- else /* any other string not containing (ECOM_CHAR or) whitespace */
- {
- nread += read_misc (dtl, token+1);
- }
- }
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(read_token) : token = \"%s\"\n", token);
- }
-
- return (nread); /* number of bytes read from dtl file */
-}
-/* read_token */
-
-
-#define CHAR_OK 1
-#define CHAR_FAIL 0
-#define CHAR_EOS (-1)
-
-int
-read_string_char
-#ifdef STDC
- (FILE * fp, int * ch)
-#else
- (fp, ch)
- FILE * fp;
- int * ch;
-#endif
-{
- int status = CHAR_OK; /* OK so far */
- int c;
-
- if (read_char (fp, &c) == 0)
- status = CHAR_FAIL; /* fail */
-
- if (c == EMES_CHAR) /* end-of-string char */
- {
- status = CHAR_EOS; /* end of string */
- }
- else if (c == ESC_CHAR) /* escape character */
- {
- /* accept the next character literally, even ESC_CHAR and EMES_CHAR */
- if (read_char (fp, &c) == 0)
- status = CHAR_FAIL; /* fail */
- }
-
- *ch = c;
- return status;
-}
-/* read_string_char */
-
-
-COUNT
-read_misc
-#ifdef STDC
- (FILE * fp, Token token)
-#else
- (fp, token)
- FILE * fp;
- Token token;
-#endif
-{
- int c;
- int count;
- /* loop ends at: end of fp file, or reading error, or a space */
- for (count=0; count <= MAXTOKLEN; ++count)
- {
- if (read_char (fp, &c) == 0 || isspace (c))
- break;
- if (group && c == ECOM_CHAR)
- {
- (Void) unread_char ();
- break;
- }
-
- token[count] = c;
- }
- token[count] = '\0';
- return count;
-}
-/* read_misc */
-
-
-COUNT
-read_mes
-#ifdef STDC
- (FILE * fp, char * token)
-#else
- (fp, token)
- FILE * fp;
- char * token;
-#endif
-/* called **AFTER** a BMES_CHAR has been read */
-/* read file fp for characters up to next unescaped EMES_CHAR */
-/* this is called a "string token" */
-/* write string, including EMES_CHAR, into token[] */
-/* return number of characters read from fp */
-{
- COUNT dtl_count; /* number of DTL characters read by read_mes from fp */
- int more; /* flag more == 0 to terminate loop */
- int escape; /* flag escape == 1 if previous character was ESC_CHAR */
- int ch; /* current DTL character */
-
- escape = 0;
- more = 1;
- dtl_count = 0;
- while (more)
- {
- if (read_char (fp, &ch) == 0)
- {
- /* end of fp file, or reading error */
- more = 0;
- }
- else /* error checking passed */
- {
- ++ dtl_count;
- if (ch == EMES_CHAR && escape == 0) /* end of string */
- {
- /* include final EMES_CHAR */
- * token ++ = ch;
- more = 0;
- }
- else if (ch == ESC_CHAR && escape == 0)
- {
- /* next character is not end of string */
- escape = 1;
- }
- else
- {
- /* store any other character, */
- /* including escaped EMES_CHAR and ESC_CHAR*/
- * token ++ = ch;
- escape = 0;
- }
- }
- }
- * token = '\0';
- return dtl_count;
-}
-/* read_mes */
-
-
-int
-unread_char (VOID)
-/* wind input back, to allow rereading of one character */
-/* return 1 if this works, 0 on error */
-{
- int status;
- if (dtl_line.read > 0)
- {
- -- dtl_line.read; /* back up one character in dtl_line */
- -- dtl_read; /* correct the count of DTL characters */
- -- com_read; /* count another DTL command character */
- status = 1; /* OK */
- }
- else /* current DTL line is empty */
- {
- status = 0; /* error */
- }
- return status;
-}
-/* unread_char */
-
-
-int
-find_command
-#ifdef STDC
- (char * command, int * opcode)
-#else
- (command, opcode)
- char * command;
- int * opcode;
-#endif
-{
- int found;
- int i;
-
- found = 0;
- for (i=0; i < NCMDS; i++)
- {
- if ((cmd_table[i] != 0) && (strcmp (command, cmd_table[i]) == 0))
- {
- found = 1;
- break;
- }
- }
-
- *opcode = i;
-
- return found;
-}
-/* find_command */
-
-
-int
-check_byte
-#ifdef STDC
- (int byte)
-#else
- (byte)
- int byte;
-#endif
-{
- if (byte < 0 || byte > 255)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(check_byte) : INTERNAL ERROR : ");
- fprintf (stderr, "byte %d not in the range of 0 to 255.\n", byte);
- dexit (1);
- }
- return 1; /* OK */
-}
-/* check_byte */
-
-
-int
-xfer_args
-#ifdef STDC
- (FILE * dtl, FILE * dvi, int opcode)
-#else
- (dtl, dvi, opcode)
- FILE * dtl;
- FILE * dvi;
- int opcode;
-#endif
-{
- int n;
-
- if (opcode >= 0 && opcode <= 127)
- ; /* SETCHAR uses no data */
- else if (opcode >= 128 && opcode <= 170)
- {
- word_t this_bop_address = last_bop_address;
-
- if (opcode == 139) /* BOP */
- {
- this_bop_address = dvi_written - 1;
- }
- put_table (op_128_170, opcode, dtl, dvi);
- if (opcode == 139) /* BOP */
- {
- xfer_bop_address (dtl, dvi);
- last_bop_address = this_bop_address;
- }
- }
- else if (opcode >= 171 && opcode <= 234)
- ; /* FONTNUM uses no data */
- else if (opcode >= 235 && opcode <= 238)
- put_table (fnt, opcode, dtl, dvi);
- else if (opcode >= 239 && opcode <= 242)
- {
- n = opcode - 238;
- special (dtl, dvi, n);
- }
- else if (opcode >= 243 && opcode <= 246)
- {
- n = opcode - 242;
- fontdef (dtl, dvi, n);
- }
- else if (opcode == 247)
- preamble (dtl, dvi);
- else if (opcode == 248)
- postamble (dtl, dvi);
- else if (opcode == 249)
- post_post (dtl, dvi);
- else if (opcode >= 250 && opcode <= 255)
- ; /* these, undefined, opcodes use no data */
- else
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(xfer_args) : opcode %d not handled.\n",
- opcode);
- }
-
- return 1; /* OK */
-}
-/* xfer_args */
-
-
-int
-set_seq
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* Called _after_ a BSEQ_CHAR command */
-/* Read bytes from dtl file, */
-/* writing corresponding SETCHAR or SET1 commands to DVI file, */
-/* _until_ unescaped ESEQ_CHAR is found */
-/* Return 1 if OK, 0 on error */
-/**** dt2dv assumes 8 bit characters, ****/
-/**** but some day one might change that. ****/
-{
- int status = 1; /* status = 1 if OK, 0 if error */
- int more; /* sequence of font characters continuing? */
- int escape = 0; /* flag set if previous character was an escape */
- int ch; /* character read from DTL file */
- more = 1;
- while (more)
- {
- /* ignore read_char status, to allow unprintable characters */
- (Void) read_char (dtl, &ch);
- /* but check for end of dtl file, or serious file reading error */
- if (ch < 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(set_seq) : ");
- fprintf (stderr, "end of dtl file, ");
- fprintf (stderr, "or serious dtl file reading error\n");
- dinfo();
- more = 0;
- status = 0; /* bad news */
- }
- else /* read dtl file, okay */
- {
- if (ch == ESC_CHAR && escape == 0) /* escape next character */
- {
- escape = 1;
- }
- else
- {
- if (ch == ESEQ_CHAR && escape == 0) /* end of sequence */
- {
- more = 0;
- }
- else if (ch <= 127) /* can use SETCHAR */
- {
- put_byte (ch, dvi);
- }
- else if (ch <= 255) /* can use SET1 */
- {
- put_byte (128, dvi); /* SET1 opcode */
- put_unsigned (1, (U4) ch, dvi);
- }
- else
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(set_seq) : ");
- fprintf (stderr,
- "ERROR : DTL character %d is not in range 0 to 255\n",
- ch);
- dexit (1);
- more = 0;
- status = 0; /* Error, because dt2dv assumes 8 bit characters */
- }
- escape = 0; /* current ch is not an escape character */
- }
- }
- }
- return status;
-}
-/* set_seq */
-
-
-U4
-xfer_hex
-#ifdef STDC
- (int n, FILE * dtl, FILE * dvi)
-#else
- (n, dtl, dvi)
- int n;
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate unsigned n-byte hexadecimal number from dtl to dvi file. */
-/* return value of hexadecimal number */
-{
- U4 unum = 0; /* at most this space needed */
- int nconv = 0; /* number of arguments converted by sscanf */
- static Token token = ""; /* DTL token */
-
- if (n < 1 || n > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(xfer_hex) : INTERNAL ERROR : asked for %d bytes. Must be 1 to 4.\n",
- n);
- dexit (1);
- }
-
- read_token (dtl, token);
-
- nconv = sscanf (token, XF4, &unum);
-
- if (nconv < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_hex) : DTL FILE ERROR (%s) : %s \"%s\".\n",
- dtl_filename, "hexadecimal number expected, not", token);
- dexit (1);
- }
-
- put_unsigned (n, unum, dvi);
-
- return unum;
-}
-/* xfer_hex */
-
-
-U4
-xfer_oct
-#ifdef STDC
- (int n, FILE * dtl, FILE * dvi)
-#else
- (n, dtl, dvi)
- int n;
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate unsigned n-byte octal number from dtl to dvi file. */
-/* return value of octal number */
-{
- U4 unum = 0; /* at most this space needed */
- int nconv = 0; /* number of arguments converted by sscanf */
- static Token token = ""; /* DTL token */
-
- if (n < 1 || n > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(xfer_oct) : INTERNAL ERROR : asked for %d bytes. Must be 1 to 4.\n",
- n);
- dexit (1);
- }
-
- read_token (dtl, token);
-
- nconv = sscanf (token, OF4, &unum);
-
- if (nconv < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_oct) : DTL FILE ERROR (%s) : %s \"%s\".\n",
- dtl_filename, "octal number expected, not", token);
- dexit (1);
- }
-
- put_unsigned (n, unum, dvi);
-
- return unum;
-}
-/* xfer_oct */
-
-
-U4
-xfer_unsigned
-#ifdef STDC
- (int n, FILE * dtl, FILE * dvi)
-#else
- (n, dtl, dvi)
- int n;
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate unsigned n-byte number from dtl to dvi file. */
-/* return value of unsigned number */
-{
- U4 unum = 0; /* at most this space needed */
-
- unum = get_unsigned (dtl);
- put_unsigned (n, unum, dvi);
-
- return unum;
-}
-/* xfer_unsigned */
-
-
-S4
-xfer_signed
-#ifdef STDC
- (int n, FILE * dtl, FILE * dvi)
-#else
- (n, dtl, dvi)
- int n;
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate signed n-byte number from dtl to dvi file. */
-/* return value of signed number */
-{
- S4 snum = 0;
-
- snum = get_signed (dtl);
- put_signed (n, snum, dvi);
-
- return snum;
-}
-/* xfer_signed */
-
-
-U4
-get_unsigned
-#ifdef STDC
- (FILE * dtl)
-#else
- (dtl)
- FILE * dtl;
-#endif
-/* read unsigned number from dtl file. */
-/* return value of unsigned number */
-{
- U4 unum = 0; /* at most this space needed */
- int nconv = 0; /* number of arguments converted by sscanf */
- static Token token = ""; /* DTL token */
-
- read_token (dtl, token);
-
- nconv = sscanf (token, UF4, &unum);
-
- if (nconv < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_unsigned) : DTL FILE ERROR (%s) : %s \"%s\".\n",
- dtl_filename, "unsigned number expected, not", token);
- dexit (1);
- }
-
- return unum;
-}
-/* get_unsigned */
-
-
-S4
-get_signed
-#ifdef STDC
- (FILE * dtl)
-#else
- (dtl)
- FILE * dtl;
-#endif
-/* read signed number from dtl file. */
-/* return value of signed number */
-{
- S4 snum = 0;
- int nconv = 0; /* number of sscanf arguments converted and assigned */
- static Token token = "";
-
- read_token (dtl, token);
-
- nconv = sscanf (token, SF4, &snum);
-
- if (nconv < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_signed) : DTL FILE ERROR (%s) : %s \"%s\".\n",
- dtl_filename, "signed number expected, not", token);
- dexit (1);
- }
-
- return snum;
-}
-/* get_signed */
-
-
-int
-put_unsigned
-#ifdef STDC
- (int n, U4 unum, FILE * dvi)
-#else
- (n, unum, dvi)
- int n;
- U4 unum;
- FILE * dvi;
-#endif
-/* put unsigned in-byte integer to dvi file */
-/* DVI format uses Big-endian storage of numbers: */
-/* most significant byte is first. */
-/* return number of bytes written. */
-{
- Byte ubyte[4]; /* at most 4 bytes needed in DVI format */
- int i;
-
- if (n < 1 || n > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_unsigned) : INTERNAL ERROR : asked for %d bytes. Must be 1 to 4.\n",
- n);
- dexit (1);
- }
-
- /* Big-endian storage. */
- for (i = 0; i < n; i++)
- {
- ubyte[i] = (Byte) (unum % 256);
- unum /= 256;
- }
- /* Reverse order for big-endian representation. */
- for (i = n-1; i >= 0; i--)
- {
- put_byte ((int) ubyte[i], dvi);
- }
-
- return n;
-}
-/* put_unsigned */
-
-
-int
-put_signed
-#ifdef STDC
- (int n, S4 snum, FILE * dvi)
-#else
- (n, snum, dvi)
- int n;
- S4 snum;
- FILE * dvi;
-#endif
-/* put signed in-byte integer to dvi file */
-/* DVI format uses 2's complement Big-endian storage of signed numbers: */
-/* most significant byte is first. */
-/* return number of bytes written. */
-{
- /* Will this deal properly with the sign? */
-
- if (n < 1 || n > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_signed) : INTERNAL ERROR : asked for %d bytes. Must be 1 to 4.\n",
- n);
- dexit (1);
- }
-
- /* How do we ensure 2's complement representation? */
- /* Here's a trick that I hope is portable, given ANSI C. */
- /* See K&R (2nd edition), Appendix A6.2 "Integral Conversions". */
-
- /* Convert snum to U4 data type */
- put_unsigned (n, (U4) snum, dvi);
-
- return n;
-}
-/* put_signed */
-
-
-int
-check_bmes
-#ifdef STDC
- (FILE * dtl)
-#else
- (dtl)
- FILE * dtl;
-#endif
-/* check that a BMES_CHAR is the next non-whitespace character in dtl */
-{
- int ch; /* next non-whitespace character in dtl */
-
- /* `(Void)' because we ignore the number of spaces skipped */
- (Void) skip_space (dtl, &ch);
-
- if (ch < 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(check_bmes) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "end of dtl file, or reading error\n");
- dexit (1);
- }
-
- if (ch != BMES_CHAR)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(check_bmes) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "BMES_CHAR (`%c') expected before string, not `%c' (char %d).\n",
- BMES_CHAR, ch, ch);
- dexit (1);
- }
-
- return 1; /* OK */
-}
-/* check_bmes */
-
-
-int
-check_emes
-#ifdef STDC
- (FILE * dtl)
-#else
- (dtl)
- FILE * dtl;
-#endif
-/* check that an EMES_CHAR is the next character in dtl */
-{
- int ch; /* dtl character */
-
- if (read_char (dtl, &ch) == 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(check_emes) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "end of dtl file, or reading error\n");
- dexit (1);
- }
-
- if (ch != EMES_CHAR)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(check_emes) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "EMES_CHAR (`%c') expected to follow string, not `%c' (char %d).\n",
- EMES_CHAR, ch, ch);
- dexit (1);
- }
-
- return 1; /* OK */
-}
-/* check_emes */
-
-
-/* Size typically used in this program for Lstring variables */
-#define LSIZE 16384
-
-
-Void
-init_Lstring
-#ifdef STDC
- (Lstring * lsp, long int n)
-#else
- (lsp, n)
- Lstring * lsp;
- long int n;
-#endif
-{
- lsp->l = 0;
- lsp->m = n;
- lsp->s = (char *) gmalloc (n);
-}
-/* init_Lstring */
-
-
-Void
-de_init_Lstring
-#ifdef STDC
- (Lstring * lsp)
-#else
- (lsp)
- Lstring * lsp;
-#endif
-{
- lsp->l = 0;
- lsp->m = 0;
- free (lsp->s);
- lsp->s = NULL; /* to be sure */
-}
-/* de_init_Lstring */
-
-
-Lstring *
-alloc_Lstring
-#ifdef STDC
- (long int n)
-#else
- (n)
- long int n;
-#endif
-{
- Lstring * lsp;
- lsp = (Lstring *) gmalloc (sizeof (Lstring));
- init_Lstring (lsp, n);
- return (lsp);
-}
-/* alloc_Lstring */
-
-
-Void
-free_Lstring
-#ifdef STDC
- (Lstring * lstr)
-#else
- (lstr)
- Lstring * lstr;
-#endif
-{
- free (lstr->s);
- free (lstr);
-}
-/* free_Lstring */
-
-
-Void
-ls_putb
-#ifdef STDC
- (int ch, Lstring * lstr)
-#else
- (ch, lstr)
- int ch;
- Lstring * lstr;
-#endif
-/* write byte ch into Lstring *lstr */
-{
- if (lstr->l >= lstr->m)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(ls_putb) : ERROR : No more room in Lstring.\n");
- dexit (1);
- }
- else
- {
- lstr->s [(lstr->l)++] = ch;
- }
-}
-/* ls_putb */
-
-
-long int
-get_Lstring
-#ifdef STDC
- (FILE * dtl, Lstring * lstr)
-#else
- (dtl, lstr)
- FILE * dtl;
- Lstring * lstr;
-#endif
-/* get a string from dtl file, store as an Lstring in *lstr. */
-/* lstr must already be allocated and initialised. */
-/* return length of Lstring *lstr */
-{
- U4 nch;
- int char_status = CHAR_OK; /* OK so far */
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_Lstring) : entering get_Lstring.\n");
- }
-
- check_bmes (dtl);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(get_Lstring) : string is: \"");
- }
-
- for (nch=0; ; nch++)
- {
- int ch;
-
- char_status = read_string_char (dtl, &ch);
-
- if (char_status == CHAR_FAIL)
- {
- /* end of dtl file, or reading error */
- fprintf (stderr, "\n");
- PRINT_PROGNAME;
- fprintf (stderr, "(get_Lstring) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "cannot read string[");
- fprintf (stderr, UF4, nch);
- fprintf (stderr, "] from dtl file.\n");
- dexit (1);
- }
-
- if (debug)
- {
- fprintf (stderr, "%c", ch);
- }
-
- if (char_status == CHAR_EOS)
- {
- if (ch != EMES_CHAR)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_Lstring) : INTERNAL ERROR : ");
- fprintf (stderr, "char_status = CHAR_FAIL,\n");
- fprintf (stderr,
- "but ch = %c (char %d) is not EMES_CHAR = %c (char %d)\n",
- ch, ch, EMES_CHAR, EMES_CHAR);
- dexit (1);
- }
- (Void) unread_char ();
- break; /* end of string */
- }
- else if (char_status == CHAR_OK)
- {
- ls_putb (ch, lstr);
- }
- else
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_Lstring) : INTERNAL ERROR : ");
- fprintf (stderr, "char_status = %d is unfamiliar!\n", char_status);
- dexit (1);
- }
- }
- /* end for */
-
- if (debug)
- {
- fprintf (stderr, "\".\n");
- }
-
- check_emes (dtl);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(get_Lstring) : leaving get_Lstring.\n");
- }
-
- return (lstr->l);
-}
-/* get_Lstring */
-
-
-Void
-put_Lstring
-#ifdef STDC
- (const Lstring * lstr, FILE * dvi)
-#else
- (str, dvi)
- Lstring lstr;
- FILE * dvi;
-#endif
-{
- size_t fwret;
- fwret = fwrite ((lstr->s), sizeof (char), (size_t) (lstr->l), dvi);
-
- dvi_written += fwret;
-
- if (fwret < lstr->l)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_Lstring) : DVI File ERROR : not all bytes written ");
- fprintf (stderr, "(%ld of %ld).\n",
- (long int) fwret, (long int) (lstr->l));
- dexit (1);
- }
-}
-/* put_Lstring */
-
-
-U4
-xfer_len_string
-#ifdef STDC
- (int n, FILE * dtl, FILE * dvi)
-#else
- (n, dtl, dvi)
- int n;
- FILE * dtl;
- FILE * dvi;
-#endif
-/* transfer (length and) quoted string from dtl to dvi file, */
-/* return number of bytes written to dvi file. */
-{
- U4 k, k2;
- Lstring lstr;
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_len_string) : entering xfer_len_string.\n");
- }
-
- init_Lstring (&lstr, LSIZE);
-
- /* k[n] : length of special string */
-
- k = get_unsigned (dtl);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_len_string) : string's nominal length k = ");
- fprintf (stderr, UF4, k);
- fprintf (stderr, " characters.\n");
- }
-
- k2 = get_Lstring (dtl, &lstr);
-
- if (k2 != k)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_len_string) : WARNING : string length (");
- fprintf (stderr, UF4, k);
- fprintf (stderr, ") in DTL file is wrong\n");
- fprintf (stderr, "Writing correct value (");
- fprintf (stderr, UF4, k2);
- fprintf (stderr, ") to DVI file\n");
- }
-
- put_unsigned (n, k2, dvi);
-
- put_Lstring (&lstr, dvi);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_len_string) : leaving xfer_len_string.\n");
- }
-
- de_init_Lstring (&lstr);
-
- return (n + k2);
-}
-/* xfer_len_string */
-
-
-S4
-xfer_bop_address
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate signed 4-byte bop address from dtl to dvi file. */
-/* return value of bop address written to DVI file */
-{
- S4 snum = 0; /* at most this space needed for byte address */
- int nconv = 0; /* number of arguments converted by sscanf */
- static Token token = ""; /* DTL token */
-
- read_token (dtl, token);
-
- nconv = sscanf (token, SF4, &snum);
-
- if (nconv != 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_bop_address) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "signed number expected, not \"%s\".\n", token);
- dexit (1);
- }
-
- if (snum != last_bop_address)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_bop_address) : WARNING : byte address (");
- fprintf (stderr, WF, snum);
- fprintf (stderr, ")\n");
- fprintf (stderr, "for previous bop in DTL file is wrong\n");
- fprintf (stderr, "Writing correct value (");
- fprintf (stderr, WF, last_bop_address);
- fprintf (stderr, ") to DVI file\n");
- }
-
- put_signed (4, last_bop_address, dvi);
-
- return last_bop_address;
-}
-/* xfer_bop_address */
-
-
-S4
-xfer_postamble_address
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* translate signed 4-byte postamble address from dtl to dvi file. */
-/* return value of postamble address written to DVI file */
-{
- S4 snum = 0; /* at most this space needed for byte address */
- int nconv = 0; /* number of arguments converted by sscanf */
- static Token token = ""; /* DTL token */
-
- read_token (dtl, token);
-
- nconv = sscanf (token, SF4, &snum);
-
- if (nconv != 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_postamble_address) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "signed number expected, not \"%s\".\n", token);
- dexit (1);
- }
-
- if (snum != postamble_address)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(xfer_postamble_address) : WARNING : byte address (");
- fprintf (stderr, WF, snum);
- fprintf (stderr, ")\n");
- fprintf (stderr, "for postamble in DTL file is wrong\n");
- fprintf (stderr, "Writing correct value (");
- fprintf (stderr, WF, postamble_address);
- fprintf (stderr, ") to DVI file\n");
- }
-
- put_signed (4, postamble_address, dvi);
-
- return postamble_address;
-}
-/* xfer_postamble_address */
-
-
-int
-put_table
-#ifdef STDC
- (op_table table, int opcode, FILE * dtl, FILE * dvi)
-#else
- (table, opcode, dtl, dvi)
- op_table table;
- int opcode;
- FILE * dtl;
- FILE * dvi;
-#endif
-{
- /* table: {char * name; int first, last; op_info * list; }; */
- /* op_info: {int code; char * name; int nargs; char * args; }; */
-
- op_info op; /* entry in table */
- int i;
- int pos; /* current position in string being scanned */
- static String args = "";
-
- /* Defensive programming. */
- if (opcode < table.first || opcode > table.last)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_table) : DTL FILE (OR INTERNAL) ERROR : opcode %d ", opcode);
- fprintf (stderr, "is outside table %s [ %d to %d ] !\n",
- table.name, table.first, table.last);
- dexit (1);
- }
-
- op = table.list [ opcode - table.first ];
-
- /* More defensive programming. */
- if (opcode != op.code)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_table) : INTERNAL ERROR : opcode %d for command \"%s\"",
- opcode, op.name);
- fprintf (stderr, " faulty in table \"%s\".\n", table.name);
- dexit (1);
- }
-
- /* process all the arguments, according to size and sign */
-
- strncpy (args, op.args, MAXSTRLEN);
-
- pos = 0;
- for (i=0; i < op.nargs; i++)
- {
- int argtype = 0;
- int nscan = 0; /* number of bytes read by sscanf */
- int nconv = 0; /* number of sscanf arguments converted & assigned */
-
- /* sscanf() does NOT advance over its input: */
- /* C strings lack internal state information, which C files have. */
- /* On Sun/OS, sscanf calls ungetc on the string it reads, */
- /* which therefore has to be writable. */
-
- nconv = sscanf (args + pos, "%d%n", &argtype, &nscan);
-
- if (nconv < 1 || nscan < 1)
- {
- PRINT_PROGNAME;
- fprintf (stderr,
- "(put_table) : INTERNAL ERROR : internal read of table %s failed!\n",
- table.name);
- dexit (1);
- }
-
- pos += nscan;
-
- if (argtype < 0)
- xfer_signed (-argtype, dtl, dvi);
- else
- xfer_unsigned (argtype, dtl, dvi);
- }
- /* end for */
-
- return 1; /* OK */
-}
-/* put_table */
-
-
-/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
-
-
-U4
-special
-#ifdef STDC
- (FILE * dtl, FILE * dvi, int n)
-#else
- (dtl, dvi, n)
- FILE * dtl;
- FILE * dvi;
- int n;
-#endif
-/* read special (1 <= n <= 4 byte) data from dtl, and write in dvi */
-/* return number of bytes written */
-{
- U4 nk;
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(special) : entering special.\n");
- }
-
- if (n < 1 || n > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(special) : DTL FILE ERROR (%s) : special %d, ",
- dtl_filename, n);
- fprintf (stderr, "range is 1 to 4.\n");
- dexit (1);
- }
-
- /* k[n] : length of special string */
- /* x[k] : special string */
- /* nk = n + k */
- nk = xfer_len_string (n, dtl, dvi);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(special) : leaving special.\n");
- }
-
- return (nk);
-}
-/* special */
-
-
-int
-fontdef
-#ifdef STDC
- (FILE * dtl, FILE * dvi, int suffix)
-#else
- (dtl, dvi, suffix)
- FILE * dtl;
- FILE * dvi;
- int suffix;
-#endif
-/* read fontdef fnt_def1 .. fnt_def4 from dtl, and write in dvi */
-/* suffix is the fontdef suffix : 1 to 4 */
-/* return number of bytes written */
-{
- U4 a, l, a2, l2;
- U4 k;
- Lstring lstr1, lstr2;
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : entering fontdef.\n");
- }
-
- if (suffix < 1 || suffix > 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "font def %d, but range is 1 to 4.\n", suffix);
- dexit (1);
- }
-
- init_Lstring (&lstr1, LSIZE);
- init_Lstring (&lstr2, LSIZE);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : about to read font number.\n");
- }
-
- /* k[suffix] : font number */
- if (suffix == 4)
- k = xfer_signed (suffix, dtl, dvi);
- else
- k = xfer_unsigned (suffix, dtl, dvi);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : font ");
- fprintf (stderr, UF4, k);
- fprintf (stderr, ".\n");
- }
-
-#ifdef HEX_CHECKSUM
- /* c[4] : (hexadecimal) checksum : I (gt) would prefer this */
- xfer_hex (4, dtl, dvi);
-#else /* NOT HEX_CHECKSUM */
- /* c[4] : checksum (octal, for comparison with tftopl's .pl file) */
- xfer_oct (4, dtl, dvi);
-#endif
-
- /* s[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* d[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* If DTL file's edited, a and l may be wrong. */
-
- /* a[1] : length of font `area' (directory) portion of pathname string */
- a = get_unsigned (dtl);
-
- /* l[1] : length of font portion of pathname string */
- l = get_unsigned (dtl);
-
- /* n[a+l] : font pathname string <= area + font */
-
- a2 = get_Lstring (dtl, &lstr1);
-
- if (a2 != a)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : WARNING : font area string's length (");
- fprintf (stderr, UF4, a);
- fprintf (stderr, ") in DTL file is wrong\n");
- fprintf (stderr, "Writing correct value (");
- fprintf (stderr, UF4, a2);
- fprintf (stderr, ") to DVI file\n");
- }
-
- put_unsigned (1, a2, dvi);
-
- l2 = get_Lstring (dtl, &lstr2);
-
- if (l2 != l)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : WARNING : font string's length (");
- fprintf (stderr, UF4, l);
- fprintf (stderr, ") in DTL file is wrong\n");
- fprintf (stderr, "Writing correct value (");
- fprintf (stderr, UF4, l2);
- fprintf (stderr, ") to DVI file\n");
- }
-
- put_unsigned (1, l2, dvi);
-
- put_Lstring (&lstr1, dvi);
- put_Lstring (&lstr2, dvi);
-
- de_init_Lstring (&lstr2);
- de_init_Lstring (&lstr1);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(fontdef) : leaving fontdef.\n");
- }
-
- return (suffix + 4*4 + 2*1 + a2 + l2);
-}
-/* fontdef */
-
-
-U4
-preamble
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* read preamble from dtl, and write in dvi */
-/* return number of bytes written */
-{
- U4 k1;
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(preamble) : entering preamble.\n");
- }
-
- /* i[1] */
- xfer_unsigned (1, dtl, dvi);
-
- /* num[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* den[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* mag[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* k[1] : length of comment */
- /* x[k] : comment string */
- /* k1 = 1 + k */
- k1 = xfer_len_string (1, dtl, dvi);
-
- if (debug)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(preamble) : leaving preamble.\n");
- }
-
- return (1 + 3*4 + k1);
-}
-/* preamble */
-
-
-int
-postamble
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* read postamble from dtl, and write in dvi */
-/* return number of bytes written */
-{
- postamble_address = dvi_written - 1;
-
- /* p[4] : DVI address of previous bop command */
- /* --- unsigned? --- or signed, as I assume? */
- /* For, surely p should be -1 if the DVI file has NO bop? */
- xfer_bop_address (dtl, dvi);
-
- /* num[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* den[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* mag[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* l[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* u[4] */
- xfer_unsigned (4, dtl, dvi);
-
- /* s[2] */
- xfer_unsigned (2, dtl, dvi);
-
- /* t[2] */
- xfer_unsigned (2, dtl, dvi);
-
- return (6*4 + 2*2);
-}
-/* postamble */
-
-
-int
-post_post
-#ifdef STDC
- (FILE * dtl, FILE * dvi)
-#else
- (dtl, dvi)
- FILE * dtl;
- FILE * dvi;
-#endif
-/* read post_post from dtl, and write in dvi */
-/* return number of bytes written */
-{
- /* hope I'm writing the "223" bytes in an 8-bit clean way */
- int n223 = 0; /* number of "223" bytes in final padding */
-
- /* q[4] : DVI address of post command */
- /* --- unsigned? --- or signed, as I assume? */
- /* what happens if there is NO postamble command? */
- /* shouldn't q be -1 then? */
-
- xfer_postamble_address (dtl, dvi);
-
- /* i[1] : DVI identification byte = 2 */
- xfer_unsigned (1, dtl, dvi);
-
- for (n223 = 0; true; n223++)
- {
- COUNT nread = 0; /* number of DTL bytes read by read_token */
- static Token token;
-
- strcpy (token, "");
-
- nread = read_token (dtl, token);
-
- /* check whether end of dtl file */
- if (nread == 0)
- {
- if (group)
- {
- /* dtl file shouldn't end before an ECOM */
- PRINT_PROGNAME;
- fprintf (stderr, "(post_post) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "premature end of DTL file!\n");
- fprintf (stderr,
- "%d complete iterations of \"padding byte\" loop;\n", n223);
- fprintf (stderr, "troublesome token = \"%s\"\n", token);
- dexit (1);
- }
- /* leave the "223" loop */
- break;
- }
- else if (strcmp (token, "223") == 0)
- {
- /* token is a "223" padding byte */
- /* loop again */
- }
- else
- {
- /* read a non-empty token that wasn't "223" */
- (Void) unread_char ();
- if (group)
- {
- if (strcmp (token, ECOM) == 0)
- {
- /* end of DTL's post_post command */
- }
- else
- {
- /* error : expected end of post_post */
- PRINT_PROGNAME;
- fprintf (stderr, "(post_post) : DTL FILE ERROR (%s) : ",
- dtl_filename);
- fprintf (stderr, "token \"%s\" should be ECOM (\"%s\")\n",
- token, ECOM);
- dexit (1);
- }
- }
- /* leave the "223" loop */
- break;
- }
- }
- /* end for */
-
- if (n223 < 4)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(post_post) : DTL FILE ERROR (%s) : \n",
- dtl_filename);
- fprintf (stderr, "fewer than four `223' padding bytes.\n");
- fprintf (stderr, "Will write at least four `223' padding bytes.\n");
- }
-
- /* check whether the DVI file size is a multiple of 4 bytes */
- if ((dvi_written + n223) % 4 != 0)
- {
- PRINT_PROGNAME;
- fprintf (stderr, "(post_post) : WARNING : \n");
- fprintf (stderr, "DVI size ");
- fprintf (stderr, WF, dvi_written);
- fprintf (stderr, " (bytes) wouldn't be a multiple of 4 !\n");
- fprintf (stderr,
- "Will write (at least four) `223' padding bytes until it is.\n");
- }
-
- /* final padding of DVI file by "223" bytes to a multiple of 4 bytes, */
- /* with at least 4 bytes */
-
- for (n223 = 0; (n223 < 4) || (dvi_written % 4 != 0); n223++)
- {
- /* add a "223" padding byte */
- put_byte (223, dvi);
- }
-
- return (4 + 1 + n223);
-}
-/* post_post */
-
-
-/* end of dt2dv.c */