summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/cpascal.h
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/web2c/cpascal.h
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/cpascal.h')
-rw-r--r--Build/source/texk/web2c/cpascal.h318
1 files changed, 318 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/cpascal.h b/Build/source/texk/web2c/cpascal.h
new file mode 100644
index 00000000000..ccebfc5f901
--- /dev/null
+++ b/Build/source/texk/web2c/cpascal.h
@@ -0,0 +1,318 @@
+/* cpascal.h: implement various bits of standard and other Pascal that
+ we use in the change files. Public domain.
+
+ This is the top-level include file for all the web2c-generated C
+ programs except TeX and Metafont themselves, which use texmf.h. It's
+ not included by the web2c programs, though. */
+
+#ifndef CPASCAL_H
+#define CPASCAL_H
+
+#ifdef WIN32
+#pragma warning( disable : 4018 4244 )
+#endif
+
+/* We must include this first, to resolve many C issues. */
+#include <w2c/config.h>
+
+/* We only use getopt in the applications, not in web2c itself. */
+#include <kpathsea/getopt.h>
+
+/* Almost everybody needs path searching. May as well always include
+ them and simplify the change files. */
+#include <kpathsea/progname.h>
+#include <kpathsea/proginit.h>
+#include <kpathsea/tex-file.h>
+#include <kpathsea/variable.h>
+
+/* Help messages. */
+#include "help.h"
+
+/* Allow translation files. */
+#define Xchr(x) xchr[x]
+
+/* Pieces of predefined Pascal web2c doesn't convert. */
+
+/* Absolute value. Without the casts to integer here, the Ultrix and
+ AIX compilers (at least) produce bad code (or maybe it's that I don't
+ understand all the casting rules in C) for tests on memory fields.
+ Specifically, a test in diag_round (in Metafont) on a quarterword
+ comes out differently without the cast, thus causing the trap test to
+ fail. (A path at line 86 is constructed slightly differently). */
+/* If the system had an abs #define already, get rid of it. */
+#undef abs
+#define abs(x) ((integer)(x) >= 0 ? (integer)(x) : (integer)-(x))
+
+#define chr(x) (x)
+#define ord(x) (x)
+#define odd(x) ((x) & 1)
+#define round(x) zround ((double) (x))
+#define trunc(x) ((integer) (x))
+#undef floor /* MacOSX */
+#define floor(x) ((integer)floor((double)(x)))
+#define input stdin
+#define output stdout
+#define maxint INTEGER_MAX
+#define nil NULL
+
+#define floorunscaled(i) ((i)>>16)
+#define floorscaled(i) ((i)&(-65536))
+#define roundunscaled(i) ((((i)>>15)+1)>>1)
+#define roundfraction(i) ((((i)>>11)+1)>>1)
+#ifndef TeX
+/* In TeX, the half routine is always applied to positive integers.
+ In MF and MP, it isn't; therefore, we can't portably use the C shift
+ operator -- whether zeros or the sign bit will be shifted in on
+ negative left operands is implementation-defined.
+
+ It might be worth going through MF and using halfp where possible, as
+ in MP. */
+#define half(i) ( ((i)<0) ? (((i)+1)>>1) : ((i)>>1) )
+#endif
+#define halfp(i) ((i) >> 1)
+
+/* Standard Pascal file routines. These are used for both binary and
+ text files, but binary is more common. If you want it 100% right,
+ fix the change files to pass the fopen mode to reset in all cases and
+ send me the changes; it doesn't matter for Unix, so I'm not going to
+ spend any more time on it. */
+#define reset(f,n) f = xfopen (n, FOPEN_R_MODE)
+#define rewrite(f,n) f = xfopen (n, FOPEN_W_MODE)
+#define resetbin(f,n) f = xfopen (n, FOPEN_RBIN_MODE)
+#define rewritebin(f,n) f = xfopen (n, FOPEN_WBIN_MODE)
+
+#if defined(read)
+#undef read
+#endif
+#define read(f,b) ((b) = getc (f))
+
+/* We hope this will be efficient than the `x = x - 1' that decr would
+ otherwise be translated to. Likewise for incr. */
+#define decr(x) --(x)
+#define incr(x) ++(x)
+
+/* `real' is used for noncritical floating-point stuff. */
+typedef double real;
+
+/* C doesn't need to distinguish between text files and other files. */
+typedef FILE *text;
+
+/* Extra stuff used in various change files for various reasons. */
+
+/* Pascal has no address-of operator, and we need pointers to integers
+ to set up the option table. */
+#define addressof(x) (&(x))
+
+/* So dvicopy can use stdin/stdout. */
+#if defined (__DJGPP__) || defined (WIN32)
+#include <io.h>
+/* Don't set console device to binary. */
+#define makebinaryfile(arg) ((void)(!isatty(fileno(arg)) && setmode(fileno(arg), O_BINARY)), arg)
+#else
+#define makebinaryfile(arg) (arg)
+#endif
+
+/* It's not worth fixing fixwrites to handle Pascal-style n:m write
+ specifiers for reals, so the change files call print_real instead. */
+#define printreal(r,n,m) fprintreal (stdout, r, n, m)
+
+/* Write the byte X to the file F. */
+#define putbyte(x,f) \
+ do { if (putc ((char) (x) & 255, f) == EOF) \
+ FATAL1 ("putbyte(%ld) failed", (long) x); } while (0)
+
+/* To work around casting problems. */
+#define ucharcast(x) ((unsigned char) (x))
+#define int64cast(x) ((integer64) (x))
+#define stringcast(x) ((string) (x))
+#define conststringcast(x) ((const_string) (x))
+#define ustringcast(x) ((unsigned char *) (x))
+
+/* For throwing away input from the file F. */
+#define vgetc(f) (void) getc (f)
+
+/* The fixwrites program outputs this, for diagnostics and such, that
+ aren't worth checking the return value on. */
+#define Fputs(f,s) (void) fputs (s, f)
+
+/* `aopenin' is used for all kinds of input text files, so it
+ needs to know what path to use. Used by BibTeX, MF, TeX. */
+#define aopenin(f,p) open_input (&(f), p, FOPEN_RBIN_MODE)
+#define aopenout(f) open_output (&(f), FOPEN_W_MODE)
+#define aclose close_file
+
+/* Used in BibTeX for subsidiary aux files. */
+#define aopeninwithdirname(f,p,s) open_input_with_dirname (&(f), p, s)
+
+/* How to output to the GF or DVI file. */
+#define WRITE_OUT(a, b) \
+ if ((size_t) fwrite ((char *) &OUT_BUF[a], sizeof (OUT_BUF[a]), \
+ (size_t) ((size_t)(b) - (size_t)(a) + 1), OUT_FILE) \
+ != (size_t) ((size_t) (b) - (size_t) (a) + 1)) \
+ FATAL_PERROR ("fwrite");
+
+#ifdef GFTODVI
+#define writedvi WRITE_OUT
+#define OUT_FILE dvifile
+#define OUT_BUF dvibuf
+#endif
+
+/* PatGen 2 uses this. */
+#define input2ints(a,b) zinput2ints (&a, &b)
+
+/* We need this only if TeX is being debugged. */
+#define input3ints(a,b,c) zinput3ints (&a, &b, &c)
+
+/* Allocate an array of a given type. Add 1 to size to account for the
+ fact that Pascal arrays are used from [1..size], unlike C arrays which
+ use [0..size). */
+#define xmallocarray(type,size) ((type*)xmalloc((size+1)*sizeof(type)))
+/* Same for reallocating an array. */
+#define xreallocarray(ptr,type,size) ((type*)xrealloc(ptr,(size+1)*sizeof(type)))
+/* Allocate and clear an array of a given type. Add 1 to nmemb and size. */
+#define xcallocarray(type,nmemb,size) ((type*)xcalloc(nmemb+1,(size+1)*sizeof(type)))
+
+/* BibTeX needs this to dynamically reallocate arrays. Too bad we can't
+ rely on stringification, or we could avoid the ARRAY_NAME arg.
+ Actually allocate one more than requests, so we can index the last
+ entry, as Pascal wants to do. */
+#define BIBXRETALLOCNOSET(array_name, array_var, type, size_var, new_size) \
+ fprintf (logfile, "Reallocated %s (elt_size=%ld) to %ld items from %ld.\n", \
+ array_name, (long) sizeof (type), (long) new_size, (long) size_var); \
+ XRETALLOC (array_var, new_size + 1, type)
+/* Same as above, but also increase SIZE_VAR when no more arrays
+ with the same size parameter will be resized. */
+#define BIBXRETALLOC(array_name, array_var, type, size_var, new_size) do { \
+ BIBXRETALLOCNOSET(array_name, array_var, type, size_var, new_size); \
+ size_var = new_size; \
+} while (0)
+/* Same as above, but for the pseudo-TYPE ASCII_code[LENGTH+1]. */
+#define BIBXRETALLOCSTRING(array_name, array_var, length, size_var, new_size) \
+ fprintf (logfile, "Reallocated %s (elt_size=%ld) to %ld items from %ld.\n", \
+ array_name, (long) (length + 1), (long) new_size, (long) size_var); \
+ XRETALLOC (array_var, (new_size) * (length + 1), ASCIIcode)
+
+/* Need precisely int for getopt, etc. */
+#define cinttype int
+
+/* Need this because web2c doesn't translate `var1,var2:^char' correctly
+ -- var2 lacks the *. */
+#define cstring string
+
+#define constcstring const_string
+
+/* For strings of unsigned chars, used as array indices. */
+#define constw2custring const_w2custring
+typedef unsigned char *w2custring;
+typedef const unsigned char *const_w2custring;
+
+/* Not all C libraries have fabs, so we'll roll our own. */
+#undef fabs
+#define fabs(x) ((x) >= 0.0 ? (x) : -(x))
+
+/* TeX et al. have a variable free, but we also need the C routine. */
+#define libcfree free
+
+/* We have a system-dependent prompt in tex.ch. We don't want it in the
+ string pool, since (now that the pools are compiled into the
+ binaries), that would make the .fmt unsharable. So go through this
+ circumlotion to print a C string. The lack of the closing ) is
+ intentional, since the code adds more text sometimes. Although the
+ eof character can be changed with stty or whatever, we're certainly
+ not going to try to extract the actual value from a terminal struct.
+ Anyone who is savvy enough to change it will not be confused. */
+#ifdef WIN32
+#define promptfilenamehelpmsg "(Press Enter to retry, or Control-Z to exit"
+#else
+#define promptfilenamehelpmsg "(Press Enter to retry, or Control-D to exit"
+#endif
+
+/* We use this rather than a simple fputs so that the string will end up
+ in the .log file, too. */
+#define printcstring(STR) \
+ do { \
+ const_string ch_ptr = (STR); \
+ while (*ch_ptr) \
+ printchar(*(ch_ptr++)); \
+ } while (0)
+
+
+/* Tangle removes underscores from names. Put them back for things that
+ are defined in C with _'s. */
+#define extendfilename extend_filename
+#define findsuffix find_suffix
+#define makesuffix make_suffix
+#define FOPENRBINMODE FOPEN_RBIN_MODE
+#define FOPENRMODE FOPEN_R_MODE
+#define getoptlongonly getopt_long_only
+#define hasarg has_arg
+#define ISDIRSEP IS_DIR_SEP
+#define kpsebibformat kpse_bib_format
+#define kpsebstformat kpse_bst_format
+#define kpsefindfile kpse_find_file
+#define kpsefindmf kpse_find_mf
+#define kpsefindmft kpse_find_mft
+#define kpsefindofm kpse_find_ofm
+#define kpsefindovf kpse_find_ovf
+#define kpsefindtex kpse_find_tex
+#define kpsefindtfm kpse_find_tfm
+#define kpsefindvf kpse_find_vf
+#define kpseinnameok kpse_in_name_ok
+#define kpseinitprog kpse_init_prog
+#define kpsesetprogramname kpse_set_program_name
+#define kpseresetprogramname kpse_reset_program_name
+#define kpsegfformat kpse_gf_format
+#define kpselastformat kpse_last_format
+#define kpsemaketexdiscarderrors kpse_make_tex_discard_errors
+#define kpsemfformat kpse_mf_format
+#define kpsemftformat kpse_mft_format
+#define kpsempformat kpse_mp_format
+#define kpseocpformat kpse_ocp_format
+#define kpseofmformat kpse_ofm_format
+#define kpseoplformat kpse_opl_format
+#define kpseotpformat kpse_otp_format
+#define kpseoutnameok kpse_out_name_ok
+#define kpseovpformat kpse_ovp_format
+#define kpseovfformat kpse_ovf_format
+#define kpseopenfile kpse_open_file
+#define kpsepkformat kpse_pk_format
+#define kpsetfmformat kpse_tfm_format
+#define kpsevfformat kpse_vf_format
+#define kpsewebformat kpse_web_format
+#define kpsevarvalue kpse_var_value
+#define kpsesetprogramenabled kpse_set_program_enabled
+#define kpsesrccmdline kpse_src_cmdline
+#define kpsesrccompile kpse_src_compile
+#define recorderchangefilename recorder_change_filename
+#define recorderenabled recorder_enabled
+#define texmfyesno texmf_yesno
+
+/* We need a new type for the argument parsing, too. */
+typedef struct option getoptstruct;
+
+/* We never need the `link' system call, which may be declared in
+ <unistd.h>, but we do have variables named `link' in the webs. */
+#undef link
+#define link link_var
+
+/* Throw away VMS' library routine `getname', as WEB uses that name. */
+#ifdef VMS
+#undef getname
+#define getname vms_getname
+#endif
+
+/* Apparently POSIX 2008 has getline and glibc 2.9.90 exports it.
+ tangle, weave, et al. use that symbol; try to define it away so
+ something that a standard won't usurp. */
+#ifdef getline
+#undef getline
+#endif
+#define getline web2c_getline
+
+
+/* Declarations for the routines we provide ourselves in lib/. */
+#include "lib/lib.h"
+
+extern int loadpoolstrings (integer);
+
+#endif /* not CPASCAL_H */