diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/vvcode/globals.h |
Initial commit
Diffstat (limited to 'support/vvcode/globals.h')
-rw-r--r-- | support/vvcode/globals.h | 1108 |
1 files changed, 1108 insertions, 0 deletions
diff --git a/support/vvcode/globals.h b/support/vvcode/globals.h new file mode 100644 index 0000000000..b5afedf6ac --- /dev/null +++ b/support/vvcode/globals.h @@ -0,0 +1,1108 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "globals.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** [tbs] +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +**============================================================================ +** +** SECTION 1 - VVCODE VERSION +** +**============================================================================ +*/ +#define VV_MAJOR_VERSION_NO 0 +#define VV_MINOR_VERSION_NO 9 +#define VV_VERSION_STR "0.97 beta" +#define VV_DATE "25 Nov 1992" + +/*- +**============================================================================ +** +** SECTION 2 - MACROS TO IMPROVE THE READABILITY OF THE SOURCE CODE +** +** +** Consider the macro definition: +** +** #define SHOW(num1, num2) printf("num1 = %d, num2 = %d", num1, num2) +** +** and the C code using the macro: +** +** SHOW (1234, 5678); +** +** The expected result is: +** +** printf ("num1 = %d, num2 = %d", 1234, 5678); +** +** since examples of the parameters should not be expanded within strings. +** A certain brain-dead compiler actually expands the parameters within the +** strings even though both editions of Kernighan & Ritchie and every C manual +** that I've read prohibit this behaviour. The result is: +** +** printf ("1234 = %d, 5678 = %d", 1234, 5678); +** +** which is of course silly. +** +** To avoid this misbehaviour, all macro parameters will begin with an +** underscore (_) and the parameter string must not appear in the macro +** definition, except where parameter expansion is desired. The above macro +** would have to be redefined as: +** +** #define SHOW(_n1, _n2) printf("num1 = %d, num2 = %d", _n1, _n2) +** +** +** Oh, the brain dead compiler is VAX/VMS C v3.1 +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Macros for ANSI function prototypes. If the compiler supports ANSI C, we +** take advantage of the new ANSI prototypes. If not, the ARGS macro will +** remove the prototype declarations. ANSI_SYNTAX will have been set +** appropriately in machine.h +**---------------------------------------------------------------------------- +*/ +#if (ANSI_SYNTAX) +# define ARGS(_plist) _plist +# define CONST const +# define SIZE_T size_t +# define TIME_T time_t +#else /* NOT (ANSI_SYNTAX) */ +# define ARGS(_plist) () +# define CONST +# define SIZE_T unsigned +# define TIME_T long +#endif /* (ANSI_SYNTAX) */ + + +/*- +**---------------------------------------------------------------------------- +** Useful macros to make the source code more readable. +**---------------------------------------------------------------------------- +*/ +#define PRINTF (void) printf +#define FPRINTF (void) fprintf +#define SPRINTF (void) sprintf +#define FSCANF (void) fscanf +#define NULLCHAR (char *) NULL + + +/*- +**---------------------------------------------------------------------------- +** Macros emulating functions. Different C compilers support the +** character/string functions below in different ways. Some of the functions +** are not supported at all (e.g. strncmpi). To be on the safe side, these +** functions have been defined by VVCODE. +**---------------------------------------------------------------------------- +*/ +#define MINIMUM(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) +#define MAXIMUM(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) + +#define STRCHR vstrchr +#define STRRCHR vstrrchr +#define STRSTR vstrstr +#define STRRSTR vstrrstr +#define STRCMP strcmp +#define STRCMPI vstricmp +#define STRNCMP vstrncmp +#define STRNCMPI vstrnicmp +#define STRDUP vstrdup +#define TOLOWER(_c) (isupper(_c) ? tolower(_c) : (_c)) +#define TOUPPER(_c) (islower(_c) ? toupper(_c) : (_c)) +#define LEAPYEAR(i) (((i)%4)==0) && ((((i)%100)!=0) || (((i)%400)==0)) +#define UPDATE_CRC32(_cc, _bb)\ + _cc = G_crc32_table[(Byte) (((Byte) _cc ^ (Byte) _bb) & 0xff)] ^ (_cc >> 8) + + + +/*- +**============================================================================ +** +** SECTION 3 - MACROS DEFINING LIMITS AND GENERAL CONSTANTS +** +**============================================================================ +*/ +#define MAX_ENCODED_BYTES 45 +#define MAX_IP_LINE_LEN 512 +#define IO_BUFFER_SIZE 4096 +#define MAX_VV_RECORD_LEN 65535L +#define DECODE_REC_LEN 0 +#define DECODE_DATA 1 +#define ENCODE_REC_LEN 0 +#define ENCODE_DATA 1 +#define MIN_SPLIT_SIZE 4L +#define OVERWRITE_NO 0 +#define OVERWRITE_YES 1 +#define OVERWRITE_ASK 2 +#define XLT_BUFFER_SIZE 4096 + +#define INFO_STATUS -1 +#define NORMAL_STATUS 0 +#define LOG_STATUS 1 +#define WARNING_STATUS 2 +#define ERROR_STATUS 3 +#define FATAL_STATUS 4 + +#define FS_PREAMBLE 8 +#define FS_NAME 2 +#define FS_EXTENSION 4 +#define FS_POSTAMBLE 1 +#define FS_NOTHING 0 + + +/* +**---------------------------------------------------------------------------- +** Macros used by lookup_key() defining whether the qualifier needs a +** value. +**---------------------------------------------------------------------------- +*/ +#define LOOKUP_UNKNOWN (-1) +#define LOOKUP_AMBIGUOUS (-2) + +#define NO_ABBREVIATIONS 0 +#define ALLOW_ABBREVIATIONS 1 + +#define CASE_INSENSITIVE 0 +#define CASE_SENSITIVE 1 + + +/* +**---------------------------------------------------------------------------- +** VV timestamp format +**---------------------------------------------------------------------------- +*/ +#define DUMMY_VV_TIMESTAMP "1991.02.15-16:12:32 GMT" +#define VV_TIMESTAMP_FORMAT "%04d.%02d.%02d-%02d:%02d:%02d" + + +/* +**---------------------------------------------------------------------------- +** CRC-32 constants +**---------------------------------------------------------------------------- +*/ +#define CRC32_TABLE_SIZE 256 +#define CRC32_MASK (Unsigned32) 0xFFFFFFFFL +#define CRC32_POLYNOMIAL (Unsigned32) 0xEDB88320L + + +#define INV_FORMAT ((Int16) -1) +#define INV_MODE ((Int16) -1) +#define INV_RECORD_LEN ((Int32) -1) +#define INV_TABLE_ENTRY ((Int16) -1) +#define INV_TIMESTAMP ((TIME_T) -2147483647L) + + +/*- +**============================================================================ +** +** SECTION 4 - ENCODING / DECODING +** +**============================================================================ +*/ + +#define UU_DECODING 1 +#define VV_DECODING 2 +#define XX_DECODING 3 + +/*- +**---------------------------------------------------------------------------- +** There are two commonly used UUcode tables, one with a space in it, and a +** later one with the space replaced by a tilde to avoid problems with some +** mail gateways removing trailing spaces. This UUcode table is the one that +** doesn't have a space in it. +**---------------------------------------------------------------------------- +*/ +#define UU_ENCODE_TABLE \ + "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +#define VV_ENCODE_TABLE \ + "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +#define XX_ENCODE_TABLE \ + "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + +#define ENCODE_TABLE_LEN (sizeof (VV_ENCODE_TABLE) - 1) +#define DECODE_TABLE_LEN 256 +#define XLT_TABLE_LEN 256 +#define ENCODE(c) G_encode_table[(c) & (ENCODE_TABLE_LEN - 1)] + + + +/*- +**============================================================================ +** +** SECTION 5 - STRUCTURES AND TYPEDEFS USED +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Typedefs +**---------------------------------------------------------------------------- +*/ +typedef char Boolean; +typedef unsigned char Byte; +typedef unsigned char Unsigned8; +typedef unsigned short Unsigned16; +typedef unsigned long Unsigned32; +typedef short Int16; +typedef long Int32; + +/*- +**---------------------------------------------------------------------------- +** Structures +**---------------------------------------------------------------------------- +*/ +typedef struct +{ + char *q_string; + Boolean val_needed; + Boolean present; + char *value; +} Qualifier_Struct; + +typedef struct +{ + char *h_string; + Boolean present; + char *value; +} Header_Struct; + +typedef struct +{ + char file_spec[MAX_PATH + 1]; + FILE *file_ptr; + Boolean pipe_flag; + Int32 line_no; + + Int16 mode; + Int16 format; + Int32 max_rec_len; + Int32 lng_rec_len; + TIME_T mod_time; + + Int32 bytecount; + Unsigned32 crc32; +} File_Info; + +typedef struct +{ + char *xlt_from; + char *xlt_to; + Int16 xlt_tbl[XLT_TABLE_LEN]; +} Xlt_Struct; + + + +/*- +**============================================================================ +** +** SECTION 6 - GLOBAL VARIABLES +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Declared by the VVcode main modules, but referenced as 'extern' by other +** modules. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + Unsigned32 G_crc32_table[CRC32_TABLE_SIZE]; + Int16 G_status; + Boolean G_debugging; + Int16 G_decode_table[DECODE_TABLE_LEN + 1]; + char G_encode_table[ENCODE_TABLE_LEN + 1]; + File_Info G_log_file; + Xlt_Struct G_xlt_table; +#else /* NOT VVCODE_MAIN */ + extern Unsigned32 G_crc32_table[CRC32_TABLE_SIZE]; + extern Int16 G_status; + extern Boolean G_debugging; + extern Int16 G_decode_table[DECODE_TABLE_LEN + 1]; + extern char G_encode_table[ENCODE_TABLE_LEN + 1]; + extern File_Info G_log_file; + extern Xlt_Struct G_xlt_table; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Global buffers allocated dynamically at startup. +** +** G_ip_buffer [IP_BUFFER_SIZE] temporary string buffer used for reading +** from files. +** G_op_buffer [OP_BUFFER_SIZE] temporary string buffer used for writing +** to files. +** G_tmp_msg [MAX_MSG_LEN] temporary string buffer for user messages +** +**---------------------------------------------------------------------------- +*/ +#define IP_BUFFER_SIZE 2048 +#define OP_BUFFER_SIZE 2048 +#define MAX_MSG_LEN 4096 + +#ifdef VVCODE_MAIN + char *G_ip_buffer; + char *G_op_buffer; + char *G_tmp_msg; +#else /* NOT VVCODE_MAIN */ + extern char *G_ip_buffer; + extern char *G_op_buffer; + extern char *G_tmp_msg; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Global variables used only by VVencode / VVdecode +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + char *G_hdrf_spec; + File_Info G_ip_file; + File_Info G_op_file; + File_Info G_vv_file; + Int32 G_ippart_bytes; + Int16 G_ippt_no; + Int32 G_oppart_bytes; + Int16 G_oppt_no; + Int16 G_overwrite_flag; + Int32 G_split_size; + +# ifdef VVDECODE + char G_op_padchar; + Int16 G_dec_type; + Int16 G_vv_decode_version; + char *G_vv_operating_system; + char *G_vv_character_set; +# endif /* VVDECODE */ +#endif /* VVCODE_MAIN */ + + + +/*- +**============================================================================ +** +** SECTION 7 - COMMAND LINE PARSING +** +** The command line qualifiers fall into three categories: +** +** a. those that do not take a value +** b. those that require a value +** c. those that take an optional value +** +** On systems such as MS-DOS and VAX/VMS, qualifiers are separated from each +** other by spaces and from their values by equals signs. For example: +** +** program /qI /qII=value paramI paramII +** program /qI /qII paramI paramII +** +** For this type of command syntax it is straightforward to detect whether an +** optional qualifier is present. +** +** On Unix, the convention is to separate qualifiers both from each other and +** from their values by spaces. Consider the command lines: +** +** program -qI -qII value paramI paramII +** program -qI -qII paramI paramII +** +** It is difficult if not impossible to determine whether the value following +** a qualifier is a qualifier value or a parameter unless the delimiting +** characters are different or strict rules on the ordering of parameters +** and qualifiers are imposed. We take the easy way out and specify in the +** machine.h file whether the implementation supports optional qualifier +** values. If these values are not supported, qualifiers which could take +** optional values become qualifiers which require values. +**============================================================================ +*/ +#define VALUE_NEEDED 0 +#define VALUE_NONE 1 +#define VALUE_OPTIONAL 2 + + +/*- +**---------------------------------------------------------------------------- +** +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + static Qualifier_Struct G_cmdqual[] = + { + {"debug", VALUE_NONE, FALSE, NULL}, + {"encoding_table", VALUE_NEEDED, FALSE, NULL}, + {"format", VALUE_NEEDED, FALSE, NULL}, + {"help", VALUE_NONE, FALSE, NULL}, + +# if (OPTIONAL_QUALIFIER_VALUES) + {"log", VALUE_OPTIONAL, FALSE, NULL}, +# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */ + {"log", VALUE_NONE, FALSE, NULL}, +# endif /* (OPTIONAL_QUALIFIER_VALUES) */ + + {"mode", VALUE_NEEDED, FALSE, NULL}, + {"overwrite", VALUE_NONE, FALSE, NULL}, + {"record_length", VALUE_NEEDED, FALSE, NULL}, + +# if (OPTIONAL_QUALIFIER_VALUES) + {"timestamp", VALUE_OPTIONAL, FALSE, NULL}, +# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */ + {"timestamp", VALUE_NEEDED, FALSE, NULL}, +# endif /* (OPTIONAL_QUALIFIER_VALUES) */ + + {"translation_file", VALUE_NEEDED, FALSE, NULL}, + +# ifdef VVENCODE + {"header_filespec", VALUE_NEEDED, FALSE, NULL}, + {"split_size", VALUE_NEEDED, FALSE, NULL}, +# endif /* VVENCODE */ + + +# ifdef VVDECODE + {"index_file", VALUE_NEEDED, FALSE, NULL}, + {"pad_character", VALUE_NEEDED, FALSE, NULL}, + {"uudecode", VALUE_NONE, FALSE, NULL}, + {"xxdecode", VALUE_NONE, FALSE, NULL}, +# endif /* VVDECODE */ + + {NULL, VALUE_NONE, FALSE, NULL} +}; + + + static Qualifier_Struct G_cmd_ipfile = + {"input_file", VALUE_NEEDED, FALSE, NULL}; + + static Qualifier_Struct G_cmd_opfile = + {"output_file", VALUE_NEEDED, FALSE, NULL}; + +#endif /* VVCODE_MAIN */ + + +#define CMDQ_DEBUG 0 +#define CMDQ_ENCODE 1 +#define CMDQ_FORMAT 2 +#define CMDQ_HELP 3 +#define CMDQ_LOG 4 +#define CMDQ_MODE 5 +#define CMDQ_OVERWRITE 6 +#define CMDQ_RECORDLEN 7 +#define CMDQ_TIMESTAMP 8 +#define CMDQ_TRANSLATE 9 + +#ifdef VVENCODE +# define CMDQ_HDRFILE 10 +# define CMDQ_SPLIT 11 +#endif /* VVENCODE */ + +#ifdef VVDECODE +# define CMDQ_INDEXFILE 10 +# define CMDQ_PADCHAR 11 +# define CMDQ_UUDECODE 12 +# define CMDQ_XXDECODE 13 +#endif /* VVDECODE */ + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain command line +** arguments and qualifiers are present. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN +# define Q_DEBUG (G_cmdqual[CMDQ_DEBUG].present == TRUE) +# define Q_ENCODE (G_cmdqual[CMDQ_ENCODE].present == TRUE) +# define Q_FORMAT (G_cmdqual[CMDQ_FORMAT].present == TRUE) +# define Q_INPUT_FILE (G_cmd_ipfile.present == TRUE) +# define Q_LOG (G_cmdqual[CMDQ_LOG].present == TRUE) +# define Q_HELP (G_cmdqual[CMDQ_HELP].present == TRUE) +# define Q_MODE (G_cmdqual[CMDQ_MODE].present == TRUE) +# define Q_OUTPUT_FILE (G_cmd_opfile.present == TRUE) +# define Q_OVERWRITE (G_cmdqual[CMDQ_OVERWRITE].present == TRUE) +# define Q_RECORDLEN (G_cmdqual[CMDQ_RECORDLEN].present == TRUE) +# define Q_TIMESTAMP (G_cmdqual[CMDQ_TIMESTAMP].present == TRUE) +# define Q_TRANSLATE (G_cmdqual[CMDQ_TRANSLATE].present == TRUE) + +# ifdef VVENCODE +# define Q_HEADER_FILE (G_cmdqual[CMDQ_HDRFILE].present == TRUE) +# define Q_SPLIT (G_cmdqual[CMDQ_SPLIT].present == TRUE) +# endif /* VVENCODE */ + +# ifdef VVDECODE +# define Q_INDEXFILE (G_cmdqual[CMDQ_INDEXFILE].present == TRUE) +# define Q_PADCHAR (G_cmdqual[CMDQ_PADCHAR].present == TRUE) +# define Q_UUDECODE (G_cmdqual[CMDQ_UUDECODE].present == TRUE) +# define Q_XXDECODE (G_cmdqual[CMDQ_XXDECODE].present == TRUE) +# endif /* VVDECODE */ + +#endif /* VVCODE_MAIN */ + + + +/*- +**---------------------------------------------------------------------------- +** The VVENCODE file mode strings are recorded in a global string +** array and indexed using the series of "MODE_" macros defined below. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + CONST char *G_mode_str[] = + { + "binary", + "text", + NULL + }; +#else /* NOT VVCODE_MAIN */ + extern CONST char *G_mode_str[]; +#endif /* VVCODE_MAIN */ + +#define MODE_BINARY 0 +#define MODE_TEXT 1 + + +/*- +**---------------------------------------------------------------------------- +** The VVENCODE file format strings are recorded in a global string +** array and indexed using the series of "FMT_" macros defined below. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + CONST char *G_fmt_str[] = + { + "default", + "stream", + "fixed", + "variable", + NULL + }; +#else /* NOT VVCODE_MAIN */ + extern CONST char *G_fmt_str[]; +#endif /* VVCODE_MAIN */ + + +#define FMT_DEFAULT 0 +#define FMT_STREAM 1 +#define FMT_FIXED 2 +#define FMT_VARIABLE 3 + + + +/*- +**============================================================================ +** +** SECTION 8 - VVE FILE DEFINITIONS AND PROCESSING +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Macros fundamental to the VVENCODEd file. +** +** VV_EOL_MARKER - the string appended to every line of VVENCODEd +** data to avoid the possibility of a line ending +** with a space character which may be +** subsequently stripped. +** VV_PREFIX - the string prepended to every line of +** VVENCODEd data to help VVDECODE ignore +** unwanted lines such as mail headers. +**---------------------------------------------------------------------------- +*/ +#define VV_EOL_MARKER "V" +#define VV_PREFIX "Vv" +#define VV_POSTAMBLE_LEN 60L + +#ifdef VVDECODE + char *G_vv_prefix; + char *G_eol_marker; +#endif /* VVDECODE */ + +#ifdef VVENCODE + static CONST char *G_vv_advert[] = + { + "**********************************************************************", + "** This is a VVencoded file. Implementations of VVDECODE and **", + "** VVENCODE are freely available for many different computers and **", + "** operating systems. The master portable C source is available **", + "** from the Aston University TeX archive - the home of VVCODE. **", + "** **", + "** If you want to find out more about VVCODE, send a message to **", + "** List_Server@TeX.Ac.Uk with the subject text 'HELP VVCODE' **", + "**********************************************************************", + NULL + }; +#endif /* VVENCODE */ + + +#ifdef VVCODE_MAIN + Header_Struct G_vvehdr[] = + { + {"attrbegin", FALSE, NULL}, + {"attrend", FALSE, NULL}, + {"begin", FALSE, NULL}, + {"bytecount", FALSE, NULL}, + {"characterset", FALSE, NULL}, + {"comment", FALSE, NULL}, + {"crc32", FALSE, NULL}, + {"decodeversion", FALSE, NULL}, + {"end", FALSE, NULL}, + {"format", FALSE, NULL}, + {"mode", FALSE, NULL}, + {"operatingsystem", FALSE, NULL}, + {"recordlength", FALSE, NULL}, + {"skipfrom", FALSE, NULL}, + {"skipto", FALSE, NULL}, + {"table", FALSE, NULL}, + {"timestamp", FALSE, NULL}, + {NULL, FALSE, NULL} + }; +#else /* NOT VVCODE_MAIN */ + extern Header_Struct G_vvehdr; +#endif /* VVCODE_MAIN */ + + +#define HDR_UNKNOWN (-1) +#define HDR_ATTRBEGIN 0 +#define HDR_ATTREND 1 +#define HDR_BEGIN 2 +#define HDR_BYTECOUNT 3 +#define HDR_CHARACTERSET 4 +#define HDR_COMMENT 5 +#define HDR_CRC32 6 +#define HDR_DECODEVERSION 7 +#define HDR_END 8 +#define HDR_FORMAT 9 +#define HDR_MODE 10 +#define HDR_OPERATINGSYSTEM 11 +#define HDR_RECORDLEN 12 +#define HDR_SKIPFROM 13 +#define HDR_SKIPTO 14 +#define HDR_TABLE 15 +#define HDR_TIMESTAMP 16 + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain VVE header lines +** and arguments have been read. +**---------------------------------------------------------------------------- +*/ +#ifdef VVDECODE + +# define VVEH_ATTRBEGIN (G_vvehdr[HDR_ATTRBEGIN].present == TRUE) +# define VVEH_ATTREND (G_vvehdr[HDR_ATTREND].present == TRUE) +# define VVEH_BEGIN (G_vvehdr[HDR_BEGIN].present == TRUE) +# define VVEH_BYTECOUNT (G_vvehdr[HDR_BYTECOUNT].present == TRUE) +# define VVEH_CHARACTERSET (G_vvehdr[HDR_CHARACTERSET].present == TRUE) +# define VVEH_COMMENT (G_vvehdr[HDR_COMMENT].present == TRUE) +# define VVEH_CRC32 (G_vvehdr[HDR_CRC32].present == TRUE) +# define VVEH_DECODEVERSION (G_vvehdr[HDR_DECODEVERSION].present == TRUE) +# define VVEH_END (G_vvehdr[HDR_END].present == TRUE) +# define VVEH_FORMAT (G_vvehdr[HDR_FORMAT].present == TRUE) +# define VVEH_MODE (G_vvehdr[HDR_MODE].present == TRUE) +# define VVEH_OPERATINGSYSTEM (G_vvehdr[HDR_OPERATINGSYSTEM].present == TRUE) +# define VVEH_RECORDLEN (G_vvehdr[HDR_RECORDLEN].present == TRUE) +# define VVEH_SKIPFROM (G_vvehdr[HDR_SKIPFROM].present == TRUE) +# define VVEH_SKIPTO (G_vvehdr[HDR_SKIPTO].present == TRUE) +# define VVEH_TABLE (G_vvehdr[HDR_TABLE].present == TRUE) +# define VVEH_TIMESTAMP (G_vvehdr[HDR_TIMESTAMP].present == TRUE) + +#endif /* VVDECODE */ + + + +/*- +**============================================================================ +** +** SECTION 9 - XLT FILE DEFINITIONS AND PROCESSING +** +**============================================================================ +*/ +#define XLT_COMMENT_CHAR '#' +#define IDX_COMMENT_CHAR '#' + +#ifdef VVCODE_MAIN + Header_Struct G_xlthdr[] = + { + {"xlt-from", FALSE, NULL}, + {"xlt-to", FALSE, NULL}, + {"xlt-substchar", FALSE, NULL}, + {NULL, FALSE, NULL} + }; +#else /* NOT VVCODE_MAIN */ + extern Header_Struct G_xlthdr[]; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain XLT header lines +** and arguments have been read. +**---------------------------------------------------------------------------- +*/ +#define HDR_XLT_UNKNOWN (-1) +#define HDR_XLT_FROM 0 +#define HDR_XLT_TO 1 +#define HDR_XLT_SUBSTCHAR 2 + + +/*- +**============================================================================ +** +** SECTION 10 - MACROS USED IN LIEU OF VARIABLE LENGTH ARGUMENT LISTS +** +**============================================================================ +*/ + + +/*- +**---------------------------------------------------------------------------- +** Internal error message +**---------------------------------------------------------------------------- +*/ +#define INTERNAL_ERROR(_caller)\ + SPRINTF (G_tmp_msg, "Internal error detected in %s()", _caller);\ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file); \ + vv_exit () + + +/*- +**---------------------------------------------------------------------------- +** Log file messages +**---------------------------------------------------------------------------- +*/ +#define LOGMSG(_fmt) \ + user_message (LOG_STATUS, _fmt, &G_log_file) + +#define LOGMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Explanatory messages +**---------------------------------------------------------------------------- +*/ +#define INFOMSG(_fmt) \ + user_message (INFO_STATUS, _fmt, &G_log_file) + +#define INFOMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Warning messages +**---------------------------------------------------------------------------- +*/ +#define WARNMSG(_fmt) \ + user_message (WARNING_STATUS, _fmt, &G_log_file) + +#define WARNMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Error messages +**---------------------------------------------------------------------------- +*/ +#define ERRORMSG(_fmt) \ + user_message (ERROR_STATUS, _fmt, &G_log_file) + +#define ERRORMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Fatal error messages +**---------------------------------------------------------------------------- +*/ +#define FATALMSG(_fmt) \ + user_message (FATAL_STATUS, _fmt, &G_log_file) + +#define FATALMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Usage error messages +**---------------------------------------------------------------------------- +*/ +#define USAGE(_fmt) \ + usage_error (_fmt) + +#define USAGE_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + usage_error (G_tmp_msg) + +#define USAGE_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + usage_error (G_tmp_msg) + +#define USAGE_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + usage_error (G_tmp_msg) + +#define USAGE_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + usage_error (G_tmp_msg) + + +/*- +**---------------------------------------------------------------------------- +** DEBUG messages +**---------------------------------------------------------------------------- +*/ +#if (VV_DEBUG_SUPPORT) + +# define DEBUG(_fmt) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_1(_fmt, _arg1) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_2(_fmt, _arg1, _arg2) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_3(_fmt, _arg1, _arg2, _arg3) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3, _arg4);\ + FPRINTF (stderr, "\n");\ + } + +#else /* NOT (VV_DEBUG_SUPPORT) */ + +# define DEBUG(_fmt) +# define DEBUG_1(_fmt, _arg1) +# define DEBUG_2(_fmt, _arg1, _arg2) +# define DEBUG_3(_fmt, _arg1, _arg2, _arg3) +# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4) + +#endif /* (VV_DEBUG_SUPPORT) */ + + + +/*- +**---------------------------------------------------------------------------- +** Writing to the VVE file +**---------------------------------------------------------------------------- +*/ +#ifdef VVENCODE + +# define VVEOUT(_fmt) \ + SPRINTF (G_op_buffer, _fmt); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_1(_fmt, _arg1) \ + SPRINTF (G_op_buffer, _fmt, _arg1); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +#endif /* VVENCODE */ + + + + +/*- +**============================================================================ +** +** SECTION 11 - MISCELLANEOUS BODGES +** +**============================================================================ +*/ +#ifndef VVCODE_MAIN + void usage_error ARGS ((CONST char *reason)); +#endif /* VVCODE_MAIN */ |