mackenzi@thor.acc.stolaf.edu (David MacKenzie) (08/04/89)
This is in response to several postings requesting a roff to WordPerfect translator. I don't have one of those, but on 16 June an unfinished WordPerfect to roff translator called `wpc' was posted to comp.sources.d. I cleaned it up a lot and changed the name to `wp2roff', but it still implements only basic functions. Still, it contains fairly good documentation of the WP file format and could be used as the basis of programs translating either way. I don't know if I'll have much time to devote to it, though, so here is what I have at the moment . . . . #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: Makefile wp2roff.c codes.c wp.h # Wrapped by dave@edfdc on Fri Aug 4 01:22:57 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(316 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X# Makefile for wp2roff X# David MacKenzie <edf@rocky2.rockefeller.edu> X# Latest revision: 08/04/89 X XCFLAGS = -O X Xwpc: wp2roff.o codes.o X $(CC) wp2roff.o codes.o -o wp2roff X Xwp2roff.o codes.o: wp.h X Xshar: wp2roff.shar X Xwp2roff.shar: Makefile wp2roff.c codes.c wp.h X shar Makefile wp2roff.c codes.c wp.h > wp2roff.shar END_OF_FILE if test 316 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'wp2roff.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'wp2roff.c'\" else echo shar: Extracting \"'wp2roff.c'\" \(3330 characters\) sed "s/^X//" >'wp2roff.c' <<'END_OF_FILE' X/* wp2roff X Convert from WordPerfect 4.2 to troff -me X X Usage: wp2roff inputfile... X Writes to `inputfile.me'. X X By Hans Varkevisser <hans@let.vu.nl> X Modified by David MacKenzie <edf@rocky2.rockefeller.edu> X X Latest revision: 08/04/89 X X Not finished X Public domain */ X X#include <stdio.h> X#include "wp.h" X X/* The length of `convert_buffer'. X This is arbitrary -- what is a reasonable maximum? */ X#define CONVERT_LENGTH 1000 X X/* The input stream. */ XFILE *in; X X/* The output stream. */ XFILE *out; X X/* The current code character read from the input. */ Xint code; X X/* If nonzero, the current code uses a newline at the end. */ Xint uses_end_nl; X X/* Current index in `convert_buffer'. */ Xint i; X X/* If true, read the next `code' from `convert_buffer', otherwise from `in'. */ Xboolean use_buffer; X X/* If true, the end of the input file has been reached. */ Xboolean input_exhausted; X X/* Temporary storage for long WordPerfect code sequences, which are X always terminated with another instance of the code that initiated X them. */ Xint convert_buffer[CONVERT_LENGTH]; X Xvoid Xread_code () X{ X if (use_buffer) X code = convert_buffer[i++]; X else X { X code = getc (in); X if (code == EOF) X input_exhausted = true; X } X} X Xvoid Xwrite_special_code () X{ X int savecode; X X if (uses_end_nl == 0 && codes[code].uses_start_nl) X putc ('\n', out); X X switch (code) X { X case EXT_CHAR: X read_code (); X fputs (extchars[code], out); X read_code (); X break; X default: X if (use_buffer) X { X fputs (codes[code].troff_e, out); X use_buffer = false; X } X else X { X fputs (codes[code].troff_b, out); X /* Copy until a matching code is found to terminate the sequence. */ X savecode = code; X i = 0; X do X { X read_code (); X convert_buffer[i++] = code; X } X while (code != savecode); X i = 0; X use_buffer = true; X } X break; X } X} X Xvoid Xwrite_normal_code () X{ X int savecode; X X if (uses_end_nl == 0 && codes[code].uses_start_nl) X putc ('\n', out); X X if (codes[code].number) X { X savecode = code; X do X read_code (); X while (code != savecode); X fputs (codes[code].troff_b, out); X } X else X fputs (codes[code].troff_b, out); X} X Xvoid Xconvert_stream () X{ X use_buffer = false; X input_exhausted = false; X X while (input_exhausted == false) X { X read_code (); X uses_end_nl = codes[code].uses_end_nl; X switch (codes[code].translation) X { X case 0: /* No translation. */ X putc (code, out); X break; X case 1: /* Normal translation. */ X write_normal_code (); X break; X case 2: /* Special translation. */ X write_special_code (); X break; X } X } X} X Xvoid Xconvert_file (file) X char *file; X{ X char out_name[1024]; X X in = fopen (file, "r"); X if (in == NULL) X { X perror (file); X exit (1); X } X X strcpy (out_name, file); X strcat (out_name, ".me"); X out = fopen (out_name, "w"); X if (out == NULL) X { X perror (out_name); X exit (1); X } X X convert_stream (); X fclose (in); X fclose (out); X} X Xint Xmain (argc, argv) X int argc; X char *argv[]; X{ X int optind; X X if (argc == 1) X { X fprintf (stderr, "Usage: %s inputfile...\n", argv[0]); X exit (1); X } X X for (optind = 1; optind < argc; optind++) X convert_file (argv[optind]); X X exit (0); X} END_OF_FILE if test 3330 -ne `wc -c <'wp2roff.c'`; then echo shar: \"'wp2roff.c'\" unpacked with wrong size! fi # end of 'wp2roff.c' fi if test -f 'codes.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'codes.c'\" else echo shar: Extracting \"'codes.c'\" \(28041 characters\) sed "s/^X//" >'codes.c' <<'END_OF_FILE' X/* codes.c */ X X#include "wp.h" X X/* Table describing what to do with each character from the WP file. */ X Xstruct wp_code codes[256] = X { X /* 000 */ {0, 0, " 0000", "e000", 0, 0, 0}, /* special */ X /* 001 */ {1, 0, " 0001", "e000", 0, 0, 0}, /* special */ X /* 002 */ {1, 0, "", "e000", 0, 0, 0}, /* PAGE NUMBER 4.2 */ X /* 003 */ {0, 0, " 0003", "e000", 0, 0, 0}, /* special */ X /* 004 */ {0, 0, " 0004", "e000", 0, 0, 0}, /* special */ X /* 005 */ {0, 0, " 0005", "e000", 0, 0, 0}, /* special */ X /* 006 */ {0, 0, " 0006", "e000", 0, 0, 0}, /* special */ X /* 007 */ {0, 0, " 0007", "e000", 0, 0, 0}, /* special */ X /* 008 */ {0, 0, " 0008", "e000", 0, 0, 0}, /* special */ X /* 009 */ {1, 0, "\t", "e000", 1, 1, 0}, /* TAB */ X /* 010 */ {1, 0, ".br\n", ".sp\n", 1, 1, 1}, /* HARD NEW LINE */ X /* 011 */ {1, 0, "", "e000", 1, 1, 0}, /* SOFT NEW PAGE */ X /* 012 */ {1, 0, ".bp\n", "e000", 1, 1, 1}, /* HARD NEW PAGE */ X /* 013 */ {1, 0, "\n", "e000", 1, 1, 0}, /* SOFT NEW LINE */ X /* 014 */ {1, 0, " 0014", "e000", 1, 1, 0}, /* special code */ X /* 015 */ {1, 0, " 0015", "e000", 1, 1, 0}, /* special code */ X /* 016 */ {0, 0, " 0016", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 017 */ {0, 0, " 0017", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 018 */ {0, 0, " 0018", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 019 */ {0, 0, " 0019", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 020 */ {0, 0, " 0020", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 021 */ {0, 0, " 0021", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 022 */ {0, 0, " 0022", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 023 */ {0, 0, " 0023", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 024 */ {0, 0, " 0024", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 025 */ {0, 0, " 0025", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 026 */ {0, 0, " 0026", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 027 */ {0, 0, " 0027", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 028 */ {0, 0, " 0028", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 029 */ {0, 0, " 0029", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 030 */ {0, 0, " 0030", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 031 */ {0, 0, " 0031", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 032 */ {1, 0, " ", "e000", 1, 0, 0}, /* ASCII CODE */ X /* 033 */ {0, 0, " 0033", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 034 */ {0, 0, " 0034", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 035 */ {0, 0, " 0035", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 036 */ {0, 0, " 0036", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 037 */ {0, 0, " 0037", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 038 */ {0, 0, " 0038", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 039 */ {0, 0, " 0039", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 040 */ {0, 0, " 0040", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 041 */ {0, 0, " 0041", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 042 */ {0, 0, " 0042", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 043 */ {0, 0, " 0043", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 044 */ {0, 0, " 0044", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 045 */ {0, 0, " 0045", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 046 */ {1, 0, "\\(md", "e000", 1, 0, 0}, /* ASCII CODE */ X /* 047 */ {0, 0, " 0047", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 048 */ {0, 0, " 0048", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 049 */ {0, 0, " 049", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 050 */ {0, 0, " 0050", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 051 */ {0, 0, " 0051", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 052 */ {0, 0, " 0052", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 053 */ {0, 0, " 0053", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 054 */ {0, 0, " 0054", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 055 */ {0, 0, " 0055", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 056 */ {0, 0, " 0056", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 057 */ {0, 0, " 0057", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 058 */ {0, 0, " 0058", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 059 */ {0, 0, " 0059", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 060 */ {0, 0, " 0060", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 061 */ {0, 0, " 0061", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 062 */ {0, 0, " 0062", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 063 */ {0, 0, " 0063", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 064 */ {0, 0, " 0064", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 065 */ {0, 0, " 0065", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 066 */ {0, 0, " 0066", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 067 */ {0, 0, " 0067", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 068 */ {0, 0, " 0068", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 069 */ {0, 0, " 0069", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 070 */ {0, 0, " 0070", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 071 */ {0, 0, " 0071", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 072 */ {0, 0, " 0072", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 073 */ {0, 0, " 0073", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 074 */ {0, 0, " 0074", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 075 */ {0, 0, " 0075", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 076 */ {0, 0, " 0076", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 077 */ {0, 0, " 0077", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 078 */ {0, 0, " 0078", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 079 */ {0, 0, " 0079", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 080 */ {0, 0, " 0080", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 081 */ {0, 0, " 0081", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 082 */ {0, 0, " 0082", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 083 */ {0, 0, " 0083", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 084 */ {0, 0, " 0084", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 085 */ {0, 0, " 0085", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 086 */ {0, 0, " 0086", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 087 */ {0, 0, " 0087", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 088 */ {0, 0, " 0088", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 089 */ {0, 0, " 0089", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 090 */ {0, 0, " 0090", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 091 */ {0, 0, " 0091", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 092 */ {0, 0, " 0092", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 093 */ {0, 0, " 0093", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 094 */ {0, 0, " 0094", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 095 */ {0, 0, " 0095", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 096 */ {0, 0, " 0096", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 097 */ {0, 0, " 0097", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 098 */ {0, 0, " 0098", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 099 */ {0, 0, " 0099", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 100 */ {0, 0, " 0100", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 101 */ {0, 0, " 0101", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 102 */ {0, 0, " 0102", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 103 */ {0, 0, " 0103", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 104 */ {0, 0, " 0104", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 105 */ {0, 0, " 0105", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 106 */ {0, 0, " 0106", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 107 */ {0, 0, " 0107", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 108 */ {0, 0, " 0108", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 109 */ {0, 0, " 0109", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 110 */ {0, 0, " 0110", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 111 */ {0, 0, " 0111", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 112 */ {0, 0, " 0112", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 113 */ {0, 0, " 0113", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 114 */ {0, 0, " 0114", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 115 */ {0, 0, " 0115", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 116 */ {0, 0, " 0116", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 117 */ {0, 0, " 0117", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 118 */ {0, 0, " 0118", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 119 */ {0, 0, " 0119", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 120 */ {0, 0, " 0120", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 121 */ {0, 0, " 0121", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 122 */ {0, 0, " 0122", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 123 */ {0, 0, " 0123", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 124 */ {0, 0, " 0124", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 125 */ {0, 0, " 0125", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 126 */ {0, 0, " 0126", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 127 */ {0, 0, " 0127", "e000", 0, 0, 0}, /* ASCII CODE */ X /* 128 */ {1, 0, " 0128", "e000", 0, 0, 0}, /* NO_OP */ X /* 129 */ {1, 0, " 0129", "e000", 0, 0, 0}, /* RIGHT JUST ON */ X /* 130 */ {1, 0, " 0130", "e000", 0, 0, 0}, /* RIGHT JUST OFF */ X /* 131 */ {1, 0, "\n", "e000", 0, 1, 0}, /* END CENTERED TEXT */ X /* 132 */ {1, 0, "", "e000", 0, 0, 0}, /* END ALIGNED TEXT */ X /* 133 */ {1, 0, " 0133", "e000", 0, 0, 0}, /* TEMP START MATH CALC */ X /* 134 */ {1, 0, " 0134", "e000", 0, 0, 0}, /* CENTER PAGE */ X /* 135 */ {1, 0, " 0135", "e000", 0, 0, 0}, /* BEGIN COLUMN MODE */ X /* 136 */ {1, 0, " 0136", "e000", 0, 0, 0}, /* END COLUMN MODE */ X /* 137 */ {1, 0, " 0137", "e000", 0, 0, 0}, /* TAB AFTER RIGHT MARGIN */ X /* 138 */ {1, 0, " 0138", "e000", 0, 0, 0}, /* WIDOW CONTROL ON */ X /* 139 */ {1, 0, " 0139", "e000", 0, 0, 0}, /* WIDOW CONTROL OFF */ X /* 140 */ {1, 0, "", "e000", 0, 0, 0}, /* HARD EOL AND SOFT EOP */ X /* 141 */ {1, 0, " 0141", "e000", 0, 0, 0}, /* FOOTNOTE NUMBER */ X /* 142 */ {1, 0, " 0142", "e000", 0, 0, 0}, /* RESERVED */ X /* 143 */ {1, 0, " 0143", "e000", 0, 0, 0}, /* RESERVED */ X /* 144 */ {1, 0, " 0144", "e000", 0, 0, 0}, /* RED LINE ON */ X /* 145 */ {1, 0, " 0145", "e000", 0, 0, 0}, /* RED LINE OFF */ X /* 146 */ {1, 0, " 0146", "e000", 0, 0, 0}, /* STRIKE OUT ON */ X /* 147 */ {1, 0, " 0147", "e000", 0, 0, 0}, /* STRIKE OUT OFF */ X /* 148 */ {1, 0, ".ft I\n", "e000", 0, 1, 1}, /* UNDERLINE ON */ X /* 149 */ {1, 0, ".ft R\n", "e000", 0, 1, 1}, /* UNDERLINE OFF */ X /* 150 */ {1, 0, " 0150", "e000", 0, 0, 0}, /* REVERSE VIDEO ON */ X /* 151 */ {1, 0, " 0151", "e000", 0, 0, 0}, /* REVERSE VIDEO OFF */ X /* 152 */ {1, 0, " 0152", "e000", 0, 0, 0}, /* TABLE OF PLACEHOLDER */ X /* 153 */ {1, 0, " 0153", "e000", 0, 0, 0}, /* OVERSTRIKE */ X /* 154 */ {1, 0, " 0154", "e000", 0, 0, 0}, /* CANCEL HYPH WORD */ X /* 155 */ {1, 0, " 0155", "e000", 0, 0, 0}, /* END OF GEN. TEXT */ X /* 156 */ {1, 0, ".ft R\n", "e000", 0, 1, 1}, /* BOLD OFF */ X /* 157 */ {1, 0, ".ft B\n", "e000", 0, 1, 1}, /* BOLD ON */ X /* 158 */ {1, 0, " 0158", "e000", 0, 0, 0}, /* HYPHENATION OFF */ X /* 159 */ {1, 0, " 0159", "e000", 0, 0, 0}, /* HYPHENATION ON */ X /* 160 */ {1, 0, " ", "e000", 0, 0, 0}, /* HARD SPACE */ X /* 161 */ {1, 0, "", "e000", 0, 0, 0}, /* DO SUBTOTAL */ X /* 162 */ {1, 0, "", "e000", 0, 0, 0}, /* SUBTOTAL ENTRY */ X /* 163 */ {1, 0, "", "e000", 0, 0, 0}, /* DO TOTAL */ X /* 164 */ {1, 0, " 0164", "e000", 0, 0, 0}, /* TOTAL ENTRY */ X /* 165 */ {1, 0, " 0165", "e000", 0, 0, 0}, /* DO GRAND TOTAL */ X /* 166 */ {1, 0, " 0166", "e000", 0, 0, 0}, /* MATH CALC COLUMN */ X /* 167 */ {1, 0, " 0167", "e000", 0, 0, 0}, /* BEGIN MATH MODE */ X /* 168 */ {1, 0, " 0168", "e000", 0, 0, 0}, /* END MATH MODE */ X /* 169 */ {1, 0, "-", "e000", 0, 0, 0}, /* HARD HYPHEN IN LINE */ X /* 170 */ {1, 0, "-", "e000", 0, 0, 0}, /* HARD HYPHEN AT EOL */ X /* 171 */ {1, 0, "-", "e000", 0, 0, 0}, /* HARD HYPHEN AT EOP */ X /* 172 */ {1, 0, "", "e000", 0, 0, 0}, /* SOFT HYPHEN */ X /* 173 */ {1, 0, "", "e000", 0, 0, 0}, /* SOFT HYPHEN AT EOL */ X /* 174 */ {0, 0, "", "e000", 0, 0, 0}, /* SOFT HYPHEN AT EOP */ X /* 175 */ {1, 0, " 0175", "e000", 0, 0, 0}, /* EOT COLUMNS AND EOL */ X /* 176 */ {1, 0, " 0176", "e000", 0, 0, 0}, /* EOT COLUMNS AND EOP */ X /* 177 */ {1, 0, " 0177", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 178 */ {1, 0, " 0178", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 179 */ {1, 0, " 0179", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 180 */ {1, 0, " 0180", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 181 */ {1, 0, " 0181", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 182 */ {1, 0, " 0182", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 183 */ {1, 0, " 0183", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 184 */ {1, 0, " 0184", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 185 */ {1, 0, " 0185", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 186 */ {1, 0, " 0186", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 187 */ {1, 0, " 0187", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 188 */ {1, 0, " 0188", "e000", 0, 0, 0}, /* SUPERSCRIPT */ X /* 189 */ {1, 0, " 0189", "e000", 0, 0, 0}, /* SUBSCRIPT */ X /* 190 */ {1, 0, " 0190", "e000", 0, 0, 0}, /* ADV. PRINTER 1/2 L UP */ X /* 191 */ {1, 0, " 0191", "e000", 0, 0, 0}, /* ADV. PRINTER 1/2 L DOWN */ X X /** The next codes are multi-byte formatting codes X The codes are in hex (<C0> = 192) */ X X /* 192 */ {1, 1, "", "e000", 0, 0, 0}, /* MARGIN RESET */ X /* <C0><old left><old right><new left><new right><C0> */ X X /* 193 */ {1, 1, " 0193", "e000", 0, 0, 0}, /* SPACING RESET */ X /* <C1><old spacing><new spacing><C1> */ X X /* 194 */ {1, 1, " 0194", "e000", 0, 0, 0}, /* LEFT MARGIN RELEASE */ X /* <C2><# spaces to go left><C2> */ X X /* 195 */ {1, 1, ".ce\n", "e000", 1, 1, 1}, /* CENTER FOLLOWING TEXT */ X /** <C3><type><center col#><start col#><C3><text><83> X type=0 for centering between margins X type=1 for centering around current column X <83> is the code for ending centered text */ X X /* 196 */ {1, 1, " 0196", "e000", 0, 0, 0}, /* ALIGN OR FLUSH RIGHT */ X /** <C4><align char><align col#><start col#><C4><text><84> X If align char=12 (newline), this is a flush right command and the align X col# is the right margin; otherwise, the align col# is the next tab stop. X If the high bit of the align char is set, then this is a dot leader align X or dot leader flush right. X <84> is the code for ending aligned or flushed right */ X X /* 197 */ {1, 1, " 0197", "e000", 0, 0, 0}, /* RESET HYPH ZONE */ X /* <C5><old left><old right><new left><new right><C5> */ X X /* 198 */ {1, 1, " 0198", "e000", 0, 0, 0}, /* SET PAGE NO POSITION */ X /** <C6><old pos code><new pos code><C6> X code: 0=none, 1=top left, 2=top center, 3=top right 4=top L&R, 5=bot left, X 6=bot center, 7=bot right, 8=bot L&R */ X X /* 199 */ {1, 1, " 0199", "e000", 0, 0, 0}, /* SET PAGE NUMBER */ X /** <C7><old# high ord><old# low ord><new# high ord><new# low ord><C7> X Only the low order 15 bits determine the page number. X If high bit is set the numbers are Roman numerals; X if not, Arabic numbers. */ X X /* 200 */ {1, 1, " 0200", "e000", 0, 0, 0}, /* SET PAGE NU COLUMN */ X /** <C8><old left><old center><old right><new left> X <new center><new right><C8> */ X X /* 201 */ {1, 1, " 0201", "e000", 0, 0, 0}, /* SET TABS */ X /** <C9><old tab table(20 bytes)><new tab table(20 bytes)> <C9> X Each bit represents one character position from bit 0 to bit 159. X There are a maximum of 160 characters allowed in a WordPerfect line. */ X X /* 202 */ {1, 1, " 0202", "e000", 0, 0, 0}, /* CONDITIONAL EOP */ X /* <CA><number of single spaced lines not to be broken> <CA> */ X X /* 203 */ {1, 1, "", "e000", 0, 0, 0}, /* SET PITCH OR FONT */ X /** <CB><old pitch><old font><new pitch><new font><CB> X If the pitch is a negative value, then the font is proportional. */ X X /* 204 */ {1, 1, "", "e000", 0, 0, 0}, /* SET TEMP. MARGIN */ X /* <CC><old tmpmargin><new tmpmargin><CC> */ X X /* 205 */ {1, 1, " 0205", "e000", 0, 0, 0}, /* OLD END OF TEMP. MARGIN */ X /* no longer used <CD><tmpmargin><CD> */ X X /* 206 */ {1, 1, " 0206", "e000", 0, 0, 0}, /* SET TOP MARGIN */ X /* <CE><old top margin><new top margin><CE> */ X X /* 207 */ {1, 1, "", "e000", 0, 0, 0},/* SUPPRESS PAGE CHARACTERISTICS */ X /** <CF><suppress codes><CF> X Codes (any or all bits may be inclusive or'd together): X 1=all suppressed X 2=page number suppressed X 4=page numbers moved to bottom X 10=all headers suppressed X 20=header a suppressed X 40=header b suppressed X 100=footer a suppressed X 200=footer b suppressed */ X X /* 208 */ {1, 1, " 0208", "e000", 0, 0, 0}, /* SET FORM LENGTH */ X /** <D0><old form len><old # text lines><new form len> X <new # text lines><D0> */ X X /* 209 */ {2, 1, "[H//F]\n", "'\n", 1, 1, 1}, /* HEADER/FOOTER */ X /** <D1><old def byte<# half-lines use by header/footer> X <FF><FF><lmargin><rmargin><text><FF> X <#half-lines used by new header/footer><new def byte><D1> X Def byte contents are type (two low-order bits> and X occurence (six high bits). The low-order 2 bits of the X Def byte MUST be correct X Type Occurence X 0 = header a 0 = never X 1 = header b 1 = all pages X 2 = footer a 2 = odd pages X 3 = footer b 4 = even pages */ X X /* 210 */ {1, 1, " 0210", "e000", 0, 0, 0}, /* FOOTNOTE */ X /** Not used in version 4.0 and above (see 343/E4) X <D2><fn#><# half-lines><FF><lmargin><rmargin><text><D2> */ X X /* 211 */ {1, 1, " 0211", "e000", 0, 0, 0}, /* SET FOOTNOTE NUMBER */ X /** not used in version 4.0 and above X <D3><old line #><new line #><D3> */ X X /* 212 */ {1, 1, " 0212", "e000", 0, 0, 0}, /* ADVANCE TO HALF LINE # */ X /** stored in half-line units X <D4><old line #><advance to half line #><D4> */ X X /* 213 */ {1, 1, " 0213", "e000", 0, 0, 0}, /* SET LINES PER INCH */ X /** 6 or 8 lpi are the only valid values X <D5><old lpi code><new lpi code><D5> */ X X /* 214 */ {1, 1, " 0214", "e000", 0, 0, 0}, /* SET EXTENDED TABS */ X /* <D6><old start><old increment><new start><new increment <D6> */ X X /* 215 */ {1, 1, " 0215", "e000", 0, 0, 0}, /* DEFINE MATH COLUMNS */ X /** <D7><old column def (24 bytes)>[<old calc 0>]<0> [<old calc 1>]<0> X [<old calc 2>]<0>[<old calc 3>] <0><D7><new column def (24 bytes)> X [<new calc 0>] <0>[<new calc 1>]<0>[<new calc 2>]<0>[<new calc 3>] X <0><D7> X See "define columns"(code <DD>) for the 24 byte column definition */ X X /* 216 */ {1, 1, " 0216", "e000", 0, 0, 0}, /* SET ALIGNMENT CHAR */ X /* <D8><old char><new char><D8> */ X X /* 217 */ {1, 1, " 0217", "e000", 0, 0, 0}, /* SET LEFT MARGIN RELEASE */ X /** columns to go left -- not used in version 4.0 and above X <D9><old #><new #><D9> */ X X /* 218 */ {1, 1, " 0218", "e000", 0, 0, 0}, /* SET UNDERLINE MODE */ X /** <DA><old mode><new mode><DA> X 0=normal underlining(breaks at word spaces) X 1=double underlining(breaks) X 2=single underlining(continuous) X 3=double underlining(continuous) */ X X /* 219 */ {1, 1, " 0219", "e000", 0, 0, 0}, /* SHEETFEED BIN NUMBER */ X /** <DB><old #><new #><DB> X WordPerfect stores the number as one less than the bin number X (bin #1 =0) */ X X /* 220 */ {1, 1, "", "e000", 0, 0, 0}, /* EOP FUNCTION */ X /* <DC><# of half-lines at EOP, low 7 bits><high 7 bits> <# of half-lines X used for footnotes> <# pages used for footnotes> <# footnotes on this X page> <ceop flag><suppress code><DC> */ X X /* 221 */ {1, 1, " 0221", "e000", 0, 0, 0}, /* DEFINE COLUMNS */ X /** <DD><old # cols><l1><r1><l2><r2><l3><r3><l4><r4> <l5><r5> X <new # cols><l1><r1><l2><r2><l3><r3><l4><r4> <l5><r5> <DD> X # cols: X low-order 7 bits = the number X high-order 1 bit = 1 if parallel colums */ X X /* 222 */ {1, 1, "", "e000", 0, 0, 0}, /* END OF TEMP.MARGIN */ X /* <DE><old left tmp margin><old right tmp margin><DE> */ X X /* 223 */ {1, 1, " 0223", "e000", 0, 0, 0}, /* INVISIBLE CHARS */ X /** <DF><text in 7-bit characters><DF> X If a character has an ASCII code >= <6F> (ASCII 191) the text portion of X this function represents it as <6F><(char-6F)>. For example, the X character ASCII 232(E8) would appear as: <6F><(E8-6F)> or <6F><79>. */ X X /* 224 */ {1, 1, "", "e000", 0, 0, 0}, /* LEFT/RIGHT TEMP.MARGIN */ X /** pre 4.0 format: X <E0><new rt tmp margin><new lt tmp margin><E0> X 4.0 and later format: X <E0><0><difference between old and new left margin><E0> */ X X /* 225 */ {2, 1, " 0225", "e000", 1, 0, 0}, /* EXTENDED CHAR */ X /* <E1><character><E1> */ X X /* 226 */ {2, 1, ".f(\n", ".f)\n", 1, 1, 1}, /* NEW FOOTNOTE/ENDNOTE */ X /** <E2><def><a><b><c><d><old ftnote line><# lines page 1><# lines page 2> X <# lines page n><# pages><FF> <l margin><r margin><text><E2> X where: X def: X bit 0: 0= use numbers,1= use characters X bit 1: 0= footnote, 1= endnote X a,b: if def bit 0 is a 0 then a,b are footnote and X endnote numbers. X if def bit 0 is a 1 then a= # characters and X b = a character X c,d: numbers of lines in footnote/endnote X NOTE: a,b and c,d are 14 bits numbers split into two X 7 bit bytes, high-order byte first. For endnotes, there X is only a null between <d> and <FF> */ X X /* 227 */ {1, 1, " 0227", "e000", 0, 0, 0}, /* FOOTNOTE OPTIONS */ X /** <E3><old values 74 bytes><new values 74 bytes><E3> X Byte Meaning X 1 spacing in footnotes X 2 spacing between footnotes X 3 number of lines to keep together X 4 flag byte (bits: b ln en ft n) X n: 1 if numbering starts on each page X en,ft 0= use numbers X 1= use characters X 2= use letters X ln: 0= no line separator X 1= 2 inch line X 2= line from left to right margin X b: 0= footnotes after text X 1= footnotes at bottom of page X 5 # of characters used in place of footnotenumbers X 6-10 "numbering" characters (null terminated if <5) X 11 # displayable chars in string for footnote(text) X 12-26 string for footnote (text) X 27 # displayable chars in string for endnote(text) X 28-42 string for endnote (text) X 43 # of displayable characters in string for X footnote (note) X 44-58 string for footnote (note) X 59 # of displayable characters in string for X endnote (note) X 60-74 string for endnote (note) */ X X /* 228 */ {1, 1, " 0228", "e000", 0, 0, 0}, /* NEW SET FOOTNOTE */ X /** <E4><old # high> old # low><new # high><new # low><E4> X Footnote numbers are 14-bit numbers split into two 7-bits bytes, X high-order byte first */ X X /* 229 */ {1, 1, " 0229", "e000", 0, 0, 0}, /* PARAGRAPH NUMBER DEF */ X /** <E5><old 7 level numbers><old 7 def bytes> X <new 7 level numbers><new 7 def bytes> <E5> X A def byte is two nibbles: X Style Punctuation X (low nibble) (high nibble) X 0 = caps Roman 0 = nothing X 1 = lcase Roman 1 = "." after number X 2 = caps letter 2 = ")" after number X 3 = lcase letter 3 = "(" before ")" after X 4 = Arabic X 5 = Arabic with previous levels X separated by "." (Ex.: 3.4.1) */ X X /* 230 */ {1, 1, " 0230", "e000", 0, 0, 0}, /* PARAGRAPH NUMBER */ X /** <E6><new level #><def byte><old 7 numbers><E6> X Level number is 0 for first level, 1 second etc. */ X X /* 231 */ {1, 1, " 0231", "e000", 0, 0, 0}, /* BEGIN MARKED TEXT */ X /** <E9><def, info><5 byte definition><E9> X The def, info byte is the same as the mark and end mark except that the X low nibble is significant only for lists. X For the table contents, the five definition bytes represents five levels. X For index and lists only, the first definition byte is significant. X Definition bytes: X 0 = no page numbers X 1 = page # after text, preceded by two spaces X 2 = page # after text, in parentheses preceded by 1 space X 3 = page # flush right X 4 = page # flush right with dot leader */ X X /* 232 */ {1, 1, " 0232", "e000", 0, 0, 0}, /* END MARKED TEXT */ X /* <EA>< 30 byte, null terminated format string><EA> */ X X /* 233 */ {1, 1, " 0233", "e000", 0, 0, 0}, /* DEFINE MARKED TEXT */ X /* <EB>< 30 byte, null terminated format string><EB> */ X X /* 234 */ {1, 1, " 0234", "e000", 0, 0, 0}, /* DEFINE INDEX MARK */ X /** <EC><def><# of half lines in block><EC> X Def: 0 for block protect on 1 for block protect off */ X X /* 235 */ {1, 1, " 0235", "e000", 0, 0, 0}, /* DATE/TIME FUNTION */ X X /* 236 */ {1, 1, " 0236", "e000", 0, 0, 0}, /* BLOCK PROTECT */ X X /* 237 */ {0, 0, " 0237", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X X /* 238 */ {0, 0, " 0238", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X X /* 239 */ {0, 0, " 0239", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 240 */ {0, 0, " 0240", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 241 */ {0, 0, " 0241", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 242 */ {0, 0, " 0242", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 243 */ {0, 0, " 0243", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 244 */ {0, 0, " 0244", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 245 */ {0, 0, " 0245", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 246 */ {0, 0, " 0246", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 247 */ {0, 0, " 0247", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 248 */ {0, 0, " 0248", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 249 */ {0, 0, " 0249", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 250 */ {0, 0, " 0250", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 251 */ {0, 0, " 0251", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 252 */ {0, 0, " 0252", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 253 */ {0, 0, " 0253", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 254 */ {0, 0, " 0254", "e000", 0, 0, 0}, /* NOT KNOWN YET */ X /* 255 */ {0, 0, " 0255", "e000", 0, 0, 0} /* NOT KNOWN YET */ X}; X X/* Table to convert extended characters to troff codes */ X Xchar *extchars[256] = X { X "\\000", "\\001", "\\002", "\\003", "\\004", "\\005", "\\006", "\\007", X "\\008", "\\009", "\\010", "\\011", "\\012", "\\013", "\\014", "\\015", X "\\016", "\\017", "\\018", "\\019", "\\020", "\\021", "\\022", "\\023", X "\\024", "\\025", "\\026", "\\027", "\\028", "\\029", "\\030", "\\031", X "\\032", "\\033", "\\034", "\\035", "\\036", "\\037", "\\038", "\\039", X "\\040", "\\041", "\\042", "\\043", "\\044", "\\045", "\\046", "\\047", X "\\048", "\\049", "\\050", "\\051", "\\052", "\\053", "\\054", "\\055", X "\\056", "\\057", "\\058", "\\059", "\\060", "\\061", "\\062", "\\063", X "\\064", "\\065", "\\066", "\\067", "\\068", "\\069", "\\070", "\\071", X "\\072", "\\073", "\\074", "\\075", "\\076", "\\077", "\\078", "\\079", X "\\080", "\\081", "\\082", "\\083", "\\084", "\\085", "\\086", "\\087", X "\\088", "\\089", "\\090", "\\091", "\\092", "\\093", "\\094", "\\095", X "\\096", "\\097", "\\098", "\\099", "\\100", "\\101", "\\102", "\\103", X "\\104", "\\105", "\\106", "\\107", "\\108", "\\109", "\\110", "\\111", X "\\112", "\\113", "\\114", "\\115", "\\116", "\\117", "\\118", "\\119", X "\\120", "\\121", "\\122", "\\123", "\\124", "\\125", "\\126", "\\127", X /* 128 */ X "\\(,C", "\\(:u", "\\('e", "\\(^a", "\\(:a", "\\(`a", "\\(oa", "\\(,c", X /* 136 */ X "\\(^e", "\\(:e", "\\(`e", "\\(:i", "\\(^i", "\\(`i", "\\(:A", "\\(oA", X /* 144 */ X "\\('E", "\\(ae", "\\(AE", "\\(^o", "\\(:o", "\\(`o", "\\(^u", "\\(`u", X /* 152 */ X "\\(:y", "\\(:O", "\\(:U", "\\(xx", "\\(Po", "\\(Ye", "\\(Pt", "\\(xx", X /* 160 */ X "\\('a", "\\('i", "\\('o", "\\('u", "\\(~n", "\\(~N", "\\(of", "\\(Om", X /* 168 */ X "\\(r?", "\\(xx", "\\(no", "\\(12", "\\(14", "\\(r!", "\\(Fo", "\\(Fc", X /* 176 */ X "\\(bx", "\\(bx", "\\(bx", "\\179", "\\180", "\\181", "\\182", "\\183", X /* 184 */ X "\\184", "\\185", "\\186", "\\187", "\\188", "\\189", "\\190", "\\191", X /* 192 */ X "\\192", "\\193", "\\194", "\\195", "\\196", "\\197", "\\198", "\\199", X /* 200 */ X "\\200", "\\201", "\\202", "\\203", "\\204", "\\205", "\\206", "\\207", X /* 208 */ X "\\208", "\\209", "\\210", "\\211", "\\212", "\\213", "\\214", "\\215", X /* 216 */ X "\\216", "\\217", "\\218", "\\219", "\\220", "\\221", "\\222", "\\223", X /* 224 */ X "\\(*a", "\\(ss", "\\(*G", "\\(*p", "\\(*S", "\\(*s", "\\(*m", "\\(*t", X /* 232 */ X "\\(*f", "\\(*T", "\\(*W", "\\(*d", "\\(if", "\\(/o", "\\(*e", "\\(ca", X /* 240 */ X "\\(==", "\\(+-", "\\(>=", "\\(<=", "\\(is", "\\(rb", "\\(dv", "\\(~~", X /* 248 */ X "\\(de", "\\(bu", "\\(md", "\\(sr", "\\(*y", "\\(ps", "\\(xx", "\\255" X }; END_OF_FILE if test 28041 -ne `wc -c <'codes.c'`; then echo shar: \"'codes.c'\" unpacked with wrong size! fi # end of 'codes.c' fi if test -f 'wp.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'wp.h'\" else echo shar: Extracting \"'wp.h'\" \(805 characters\) sed "s/^X//" >'wp.h' <<'END_OF_FILE' X/* wp.h X The definitions are WordPerfect 4.1 codes but work with 4.2. */ X X/* Maximum length of a troff code string. */ X#define MAX_STRING 25 X X/* Special types of characters. */ X#define HEADER_FOOTER 209 X#define EXT_CHAR 225 X#define FOOTNOTE 226 X Xtypedef enum { false = 0, true = 1 } boolean; X Xstruct wp_code X { X int translation; /* 0= no translation, 1= translation, 2= special */ X int number; /* 0= 1 code, 1= long code */ X char troff_b[MAX_STRING]; /* begin code for troff -me macro */ X char troff_e[MAX_STRING]; /* end code for troff -me macro */ X int special; /* 1= special, 0= normal */ X int uses_end_nl; /* code uses a newline at end of code */ X int uses_start_nl; /* code needs a newline at beginning of code */ X }; X Xextern struct wp_code codes[]; Xextern char *extchars[]; END_OF_FILE if test 805 -ne `wc -c <'wp.h'`; then echo shar: \"'wp.h'\" unpacked with wrong size! fi # end of 'wp.h' fi echo shar: End of shell archive. exit 0 -- David MacKenzie mackenzi@thor.stolaf.edu or edf@rocky2.rockefeller.edu