/* 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 /* We must include this first, to resolve many C issues. */ #include "config.h" /* We only use getopt in the applications, not in web2c itself. */ #include /* Almost everybody needs path searching. May as well always include them and simplify the change files. */ #include #include #include /* Help messages. */ #include "help.h" /* NONASCII is #defined by default now, so we can do character translation. */ #define NONASCII /* Allow translation files. */ #ifdef NONASCII #define Xchr(x) xchr[x] #else #define Xchr(x) ((char) (x)) #endif /* 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)) #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)) #define readln(f) { register c; while ((c = getc (f)) != '\n' && c != EOF); } /* 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 /* Don't set console device to binary. */ #define makebinaryfile(arg) ((!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 toint(x) ((integer) (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_R_MODE) #define aopenout(f) open_output (&(f), FOPEN_W_MODE) /* For faking arrays in tftopl. */ typedef unsigned char *pointertobyte; #define casttobytepointer(e) ((pointertobyte) e) /* Write out elements START through END of BUF to the file F. For gftodvi. */ #define writechunk(f, buf, start, end) \ (void) fwrite (&buf[start], sizeof (buf[start]), end - start + 1, f) /* 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) /* 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 BIBXRETALLOC(array_name, array_var, type, size_var, new_size) do { \ fprintf (logfile, "Reallocated %s (elt_size=%d) to %ld items from %ld.\n", \ array_name, (int) sizeof (type), new_size, size_var); \ XRETALLOC (array_var, new_size + 1, type); \ size_var = new_size; \ } while (0) /* 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 /* 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 /* 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 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 kpseinitprog kpse_init_prog #define kpsesetprogname kpse_set_progname #define kpsegfformat kpse_gf_format #define kpsemaketexdiscarderrors kpse_make_tex_discard_errors #define kpsemfformat kpse_mf_format #define kpsemftformat kpse_mft_format #define kpseocpformat kpse_ocp_format #define kpseofmformat kpse_ofm_format #define kpseoplformat kpse_opl_format #define kpseotpformat kpse_otp_format #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 makesuffix make_suffix #define removesuffix remove_suffix /* 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 , 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 /* Declarations for the routines we provide ourselves in lib/. */ extern string basenamechangesuffix P3H(const_string,const_string,const_string); extern string chartostring P1H(char); extern boolean eof P1H(FILE *); extern boolean eoln P1H(FILE *); extern void fprintreal P4H(FILE *, double, int, int); extern integer inputint P1H(FILE *); extern void printversionandexit P3H(const_string, const_string, const_string); extern void zinput2ints P2H(integer *, integer *); extern void zinput3ints P3H(integer *, integer *, integer *); extern integer zround P1H(double); /* main.c */ extern int argc; extern string *argv; extern string cmdline P1H(int); extern void mainbody P1H(void); /* generated by web2c */ /* openclose.c */ extern boolean open_input P3H(FILE **, int, const_string fopen_mode); extern boolean open_output P2H(FILE **, const_string fopen_mode); extern void aclose P1H(FILE *); /* version.c */ extern string versionstring; #endif /* not CPASCAL_H */