diff options
Diffstat (limited to 'Build/source/texk/web2c/ctiedir/ctie-k.ch')
-rw-r--r-- | Build/source/texk/web2c/ctiedir/ctie-k.ch | 727 |
1 files changed, 727 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/ctiedir/ctie-k.ch b/Build/source/texk/web2c/ctiedir/ctie-k.ch new file mode 100644 index 00000000000..ccd8f157b59 --- /dev/null +++ b/Build/source/texk/web2c/ctiedir/ctie-k.ch @@ -0,0 +1,727 @@ +% Changes to adapt CTIE to web2c. +% Copyright 2002,2003 Julian Gilbey +% All rights reserved. +% +% This file is distributed WITHOUT ANY WARRANTY, express or implied. +% +% Permission is granted to make and distribute verbatim copies of this +% file provided that the copyright notice and this permission notice +% are preserved on all copies. +% +% Permission is granted to copy and distribute modified versions of this +% file under the conditions for verbatim copying, provided that the +% entire resulting derived work is distributed under the terms of a +% permission notice identical to this one. +% +% This file is based heavily on tie.ch by Olaf Weber to adapt tie.w to +% the web2c system and on comm-w2c.ch from the Web2C 7.4.5 distribution +% by Wlodek Bzyl and Olaf Weber. + +@x l.19 Add macro definitions +\def\title{The CTIE processor} +\def\botofcontents{% +\vfill +$\copyright$ 2002,2003 Julian Gilbey + +All rights reserved. + +This program is distributed WITHOUT ANY WARRANTY, express or implied. + +Permission is granted to make and distribute verbatim copies of this +program provided that the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +program under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +} +@y +\def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}} +\let\maybe=\iftrue +\def\title{The CTIE processor} +\def\topofcontents{\null\vfill + \centerline{\titlefont The {\ttitlefont CTIE} processor} + \vskip 15pt + \centerline{(Version 1.1 [\TeX~Live])} + \vfill} +\def\covernote{\vbox{\ninerm\noindent +Copyright \copyright\ 2002, 2003 Julian Gilbey +\smallskip\noindent +All rights reserved. +\bigskip\noindent +This program is distributed WITHOUT ANY WARRANTY, express or implied. +\smallskip\noindent +Permission is granted to make and distribute verbatim copies of this +program provided that the copyright notice and this permission notice +are preserved on all copies. +\smallskip\noindent +Permission is granted to copy and distribute modified versions of this +program under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +}} +\datecontentspage +@z + +@x l.81 +@d copyright + "Copyright 2002,2003 Julian Gilbey. All rights reserved. There is no warranty.\n\ +Run with the --version option for other important information." +@y +@d copyright + "Copyright 2002,2003 Julian Gilbey."@| + " All rights reserved. There is no warranty.\n"@| + "Run with the --version option for other important information." +@z + +@x l.102 +main(argc, argv) + int argc; string *argv; +@y +int main (int argc, string *argv) +@z + +@x l.105 Set up kpathsea stuff + @<Initialise parameters@>; +@y + @<Set up |PROGNAME| feature and initialise the search path mechanism@>@; + @<Initialise parameters@>@; +@z + +@x l.107 + @<Print the banners@>; +@y + @<Print the banners@>@; +@z + +boolean and string are defined by kpathsea. +@x l.116 +@ We include the additional types |boolean| and |string|. \.{CTIE} +replaces the complex \.{TIE} character set handling (based on that of +the original \.{WEB} system) with the standard \.{CWEB} behaviour, and +so uses the |char| type for input and output. + +@d false 0 +@d true 1 + +@<Global types@>= +typedef int boolean; +typedef char* string; +@y +@ We include the additional types |boolean| and |string|. \.{CTIE} +replaces the complex \.{TIE} character set handling (based on that of +the original \.{WEB} system) with the standard \.{CWEB} behaviour, and +so uses the |char| type for input and output. + +The \.{kpathsea} library (version 3.4.5 and higher) defines the |@!boolean| +(with the values |@!true| and |@!false|) and |@!string| (and |@!const_string|) +types in \.{<kpathsea/simpletypes.h>}, so we do not actually need to define +them here. + +@s boolean int +@s string int +@s const_string int +@z + +@x l.129 The kpathsea include files find the right header file for these. +@ We predeclare some standard string-handling functions here instead of +including their system header files, because the names of the header files +are not as standard as the names of the functions. (There's confusion +between \.{<string.h>} and \.{<strings.h>}.) + +@<Predecl...@>= +extern int strlen(); /* length of string */ +extern char* strcpy(); /* copy one string to another */ +extern int strncmp(); /* compare up to $n$ string characters */ +extern char* strncpy(); /* copy up to $n$ string characters */ +extern char *strerror(); +@y +@ We don't need to predeclare any string handling functions here, as +the \.{kpathsea} headers do the right thing by including \.{<string.h>} +behind the scenes. +@z + +@x l.149 +@d xisupper(c) (isupper(c)&&((unsigned char)c<0200)) +@y +@d xisupper(c) (isupper((unsigned char)c)&&((unsigned char)c<0200)) +@z + +@x l.155 +This variable must be initialized. +@y +This variable must be initialised. +@z + +@x l.158 +@d spotless 0 +@d troublesome 1 +@d fatal 2 + +@<Global variables@>= +int history=spotless; +@y +@<Global variables@>= +typedef enum { + @!spotless, + @!troublesome, + @!fatal } return_code; +static return_code history=spotless; +@z + +@x l.170 The kpathsea include files must be first. +predefined as we include the \.{stdio.h} definitions. + +@<Global \&{\#include}s@>= +#include <stdio.h> +@y +predefined as we include the \.{<stdio.h>} definitions +through the \.{kpathsea} interface. + +@<Global \&{\#include}s@>= +#include <kpathsea/kpathsea.h> +@z + +@x l.176 And this. +@ And we need dynamic memory allocation. +This should cause no trouble in any \CEE/ program. +@^system dependencies@> + +@<Global \&{\#include}s@>= +#ifdef __STDC__ +#include <stdlib.h> +#else +#include <malloc.h> +#endif +@y +@ And we need dynamic memory allocation. +This should cause no trouble in any \CEE/ program. +The \.{kpathsea} include files handle the definition of |@!malloc|, too. +@^system dependencies@> +@z + +@x l.190 +files) are treated the same way. To organize the +@y +files) are treated the same way. To organise the +@z + +Sections 10 and 11: use enum as requested in ctie.w + +@x l.204 +\leavevmode |file_types| is used to describe whether a file +@y +\leavevmode \&{file\_types} is used to describe whether a file +@z + +@x l.208 +the kind of output. (this would even be necessary if we +@y +the kind of output. (This would even be necessary if we +@z + +@x l.212 +#define search 0 +#define test 1 +#define reading 2 +#define ignore 3 +typedef int in_file_modes; /* should be |enum(search, test, reading, ignore)| */ +#define unknown 0 +#define master 1 +#define chf 2 +typedef int file_types; /* should be |enum(unknown, master, chf)| */ +@y +typedef enum { + @!search, + @!test, + @!reading, + @!ignore } in_file_modes; +typedef enum { + @!unknown, + @!master, + @!chf } file_types; +@z + +@x l.223 +@ A variable of type |out_md_type| will tell us in what state the output +@y +@ A variable of type \&{out\_md\_type} will tell us in what state the output +@z + +@x l.230 dito +#define normal 0 +#define pre 1 +#define post 2 +typedef int out_md_type; /* should be |enum(normal, pre, post)| */ +@y +typedef enum { + @!normal, + @!pre, + @!post } out_md_type; +@z + +@x l.284 way too short! +@d max_file_name_length 60 +@y +@d max_file_name_length 1024 +@z + +@x l.329 +boolean get_line(i, do_includes) + file_index i; boolean do_includes; +@y +static boolean +get_line (file_index i, boolean do_includes) +@z + +@x l.361 +replacement part of a change file, or in an incomplerte check if the +@y +replacement part of a change file, or in an incomplete check if the +@z + +Handle input lines with CRLF + +@x l.376 + if ((*(k++) = c) != ' ') inp_desc->limit = k; +@y + if ((*(k++) = c) != ' ' && c != '\r') inp_desc->limit = k; +@z + +@x l.386 + @<Increment the line number and print a progess report at +@y + @<Increment the line number and print a progress report at +@z + +@x l.436 + if ((*(k++) = c) != ' ') inp_desc->limit = k; +@y + if ((*(k++) = c) != ' ' && c != '\r') inp_desc->limit = k; +@z + +The next piece is simplified using the kpathsea kpse_find_file +function. + +@x l.497 +If the environment variable \.{CWEBINPUTS} is set, or if the compiler flag +of the same name was defined at compile time, +\.{CWEB} will look for include files in the directory thus named, if +it cannot find them in the current directory. +(Colon-separated paths are not supported.) +@y +We use the \Kpathsea/ library (in particular, the \.{CWEBINPUTS} +variable) to search for this file.@.CWEBINPUTS@> +@z + +@x l.510 Don't need the same variables any longer + char temp_file_name[max_file_name_length]; + char *file_name_end; + char *k, *kk; + int l; /* length of file name */ +@y + char *file_name_end; + string fullname; + char *k; +@z + +@x l.534 Replace with kpse_find_file + if ((new_inc->the_file=fopen(new_inc->file_name, "r"))!=NULL) { +@y + fullname=kpse_find_cweb(new_inc->file_name); + if (fullname) + new_inc->the_file=fopen(fullname, "r"); + if (fullname!=NULL && new_inc->the_file!=NULL) { + free(fullname); +@z + +@x l.539 And this part is replaced by kpse_find_file + kk=getenv("CWEBINPUTS"); + if (kk!=NULL) { + if ((l=strlen(kk))>max_file_name_length-2) too_long(); + strcpy(temp_file_name, kk); + } + else { +#ifdef CWEBINPUTS + if ((l=strlen(CWEBINPUTS))>max_file_name_length-2) too_long(); + strcpy(temp_file_name, CWEBINPUTS); +#else + l=0; +#endif /* |CWEBINPUTS| */ + } + if (l>0) { + if (k+l+2>=file_name_end) too_long(); + for (; k>= new_inc->file_name; k--) *(k+l+1)=*k; + strcpy(new_inc->file_name, temp_file_name); + new_inc->file_name[l]='/'; /* \UNIX/ pathname separator */ + if ((new_inc->the_file=fopen(new_inc->file_name, "r"))!=NULL) { + new_inc->parent=inp_desc->current_include; /* link it in */ + inp_desc->current_include=new_inc; + goto restart; /* success */ + } + } +@y +@z + +@x l.565 slightly more useful error message + err_print(i, "! Cannot open include file"); +@y + if (fullname) { + free(fullname); + err_print(i, "! Cannot open include file"); + } else + err_print(i, "! Cannot find include file"); +@z + + +@x l.585 +void err_print(); +@y +void err_print (file_index, const char *); +@z + +@x l.590 +void err_print(i, s) /* prints `\..' and location of error message */ +file_index i; char *s; +@y +void err_print (file_index i, const char *s) +/* prints `\..' and location of error message */ +@z + +@x l.664 +int wrap_up() +@y +int wrap_up (void) +@z + +@x l.667 + if (history > spotless) return 1; + else return 0; +@y + if (history > spotless) return EXIT_FAILURE; + else return EXIT_SUCCESS; +@z + +@x l.674 +int wrap_up(); +@y +int wrap_up (void); +@z + +@x l.697 +void pfatal_error(); +@y +void pfatal_error (const char *, const char *); +@z + +@x l.700 +void pfatal_error(s, t) +char *s, *t; +@y +void pfatal_error (const char *s, const char *t) +@z + +@x l.713 +@ We need an include file for the above. + +@<Global \&{\#include}s@>= +#include <errno.h> +@y +@ The \.{<errno.h>} include file for the above comes via the \.{kpathsea} +interface. +@z + +@x l.731 Use binary mode for output files + out_file=fopen(out_name, "w"); +@y + out_file=fopen(out_name, "wb"); +@z + +@x l.739 +@ The name of the file and the file desciptor are stored in +@y +@ The name of the file and the file descriptor are stored in +@z + +@x l.747 Use the kpathsea library to do this +@ For the master file we start by reading its first line into the +buffer, if we could open it. + +@<Get the master file started@>= +{ + input_organisation[0]->the_file= + fopen(input_organisation[0]->file_name, "r"); + + if (input_organisation[0]->the_file==NULL) + pfatal_error("! Cannot open master file ", + input_organisation[0]->file_name); +@.Cannot open master file@> +@y +@ For the master file we start by reading its first line into the +buffer, if we could open it. We use the \.{kpathsea} library to find +the file. + +@<Get the master file started@>= +{ + string fullname; + + fullname = kpse_find_cweb(input_organisation[0]->file_name); + if (fullname) + input_organisation[0]->the_file = fopen(fullname, "r"); + + if (fullname==NULL || input_organisation[0]->the_file==NULL) { + if (fullname) { + pfatal_error("! Cannot open master file ", + input_organisation[0]->file_name); + } else { + fatal_error(-1, "! Cannot find master file ", + input_organisation[0]->file_name); + } + } + else free(fullname); +@.Cannot open master file@> +@.Cannot find master file@> +@z + +@x l.768 And this +@<Prepare the change files@>= +{ + file_index i; + + i=1; + while (i<no_ch) { + input_organisation[i]->the_file= + fopen(input_organisation[i]->file_name, "r"); + if (input_organisation[i]->the_file==NULL) + pfatal_error("! Cannot open change file ", + input_organisation[i]->file_name); +@.Cannot open change file@> +@y +@<Prepare the change files@>= +{ + file_index i; + string fullname; + + i=1; + while (i<no_ch) { + fullname = kpse_find_cweb(input_organisation[i]->file_name); + if (fullname) + input_organisation[i]->the_file = fopen(fullname, "r"); + + if (fullname==NULL || input_organisation[i]->the_file==NULL) { + if (fullname) { + pfatal_error("! Cannot open change file ", + input_organisation[i]->file_name); + } else { + fatal_error(-1, "! Cannot find change file ", + input_organisation[i]->file_name); + } + } + else free(fullname); +@.Cannot open change file@> +@.Cannot find change file@> +@z + +@x l.792 +boolean lines_dont_match(i, j) + file_index i, j; +@y +static boolean +lines_dont_match (file_index i, file_index j) +@z + +@x l.809 +void init_change_file(i) + file_index i; +@y +static void +init_change_file (file_index i) +@z + +@x l.833 + if (xisupper(ccode)) ccode=tolower(ccode); +@y + if (xisupper(ccode)) ccode=tolower((unsigned char)ccode); +@z + +@x l.858 +void put_line(j) + file_index j; +@y +static void +put_line (file_index j) +@z + +@x l.873 +boolean e_of_ch_module(i) + file_index i; +@y +static boolean +e_of_ch_module (file_index i) +@z + +@x l.894 +boolean e_of_ch_preamble(i) + file_index i; +@y +static boolean +e_of_ch_preamble (file_index i) +@z + +@x l.1106 +void usage_error() +{ + @<Print the banners@>; + fprintf(stderr, "Usage: ctie -[mc] outfile master changefile(s)\n"); +@y +static void +usage_error (void) +{ + @<Print the banners@>; + fprintf(stderr, "Usage: ctie -m|-c outfile master changefile(s)\n"); +@z + +@x l.1111 + exit(1); +@y + exit(EXIT_FAILURE); +@z + +@x l.1119 Add Web2C version to banner string +printf("%s\n", banner); /* print a ``banner line'' */ +@y +printf("%s (%s)\n", banner, kpathsea_version_string); /* print a ``banner line'' */ +@z + +Section 63: use 'none' more than once. + +@x l.1169 +(which is the case if |no_ch==(-1)|) or if the next element of +@y +(which is the case if |no_ch==none|) or if the next element of +@z + +@x l.1174 + if (no_ch==(-1)) { +@y + if (no_ch==none) { +@z + +@x l.1218 +string CTIEHELP[] = { + "Usage: ctie -[mc] outfile master changefile(s)", +@y +const_string CTIEHELP[] = { + "Usage: ctie -m|-c outfile master changefile(s)", +@z + +@x l.1233 +void usage_help(); +void print_version_and_exit(); +@y +static void usage_help (void); +static void print_version_and_exit (const_string, const_string); +@z + +@x l.1238 +void usage_help() +{ + string *message=CTIEHELP; +@y +static void +usage_help (void) +{ + const_string *message=CTIEHELP; +@z + +@x l.1248 + exit(0); +@y + exit(EXIT_SUCCESS); +@z + +@x l.1253 +void print_version_and_exit(name, version) + string name, version; +{ + printf ("%s %s\n", name, version); + + puts ("Copyright (C) 2002,2003 Julian Gilbey."); + + puts ("There is NO warranty. This is free software. See the source"); + puts ("code of CTIE for redistribution conditions."); + + exit (0); +} +@y +static void +print_version_and_exit (const_string name, const_string version) +{ + printf ("%s %s\n", name, version); + puts (kpathsea_version_string); + + puts ("Copyright (C) 2002,2003 Julian Gilbey."); + puts ("Kpathsea is copyright (C) 1999 Free Software Foundation, Inc."); + + puts ("There is NO warranty. This is free software."); + puts ("Redistribution of this software is covered by the terms of"); + puts ("both the CTIE copyright and the GNU General Public Licence."); + puts ("For more information about these matters, see the files"); + puts ("named COPYING and the CTIE source."); + puts ("Primary author of CTIE: Julian Gilbey."); + puts ("Kpathsea written by Karl Berry and others."); + + exit (EXIT_SUCCESS); +} +@z + +We use the path-searching initialisation code +taken almost verbatim from comm-w2c.ch. + +@x l.1267 +@* System-dependent changes. +This section should be replaced, if necessary, by +changes to the program that are necessary to make \.{CTIE} +work at a particular installation. It is usually best to +design your change file so that all changes to previous +modules preserve the module numbering; then everybody's +version will be consistent with the printed program. More +extensive changes, which introduce new modules, can be +inserted here; then only the index itself will get a new +module number. +@^system dependencies@> +@y +@* System-dependent changes.@^system dependencies@>@.CWEBINPUTS@> +The \.{ctie} program from the original \.{CTIE} package uses the +compile-time default directory or the value of the environment +variable \.{CWEBINPUTS} as an alternative place to be searched for +files, if they could not be found in the current directory. + +This version uses the \Kpathsea/ mechanism for searching files. +The directories to be searched for come from three sources: +\smallskip +{\parindent5em +\item{(a)} a user-set environment variable \.{CWEBINPUTS} + (overridden by \.{CWEBINPUTS\_ctie}); +\item{(b)} a line in \Kpathsea/ configuration file \.{texmf.cnf},\hfil\break + e.g., \.{CWEBINPUTS=\$TEXMFDOTDIR:\$TEXMF/texmf/cweb//}\hfil\break + or \.{CWEBINPUTS.ctie=\$TEXMFDOTDIR:\$TEXMF/texmf/cweb//}; +\item{(c)} compile-time default directories (specified in + \.{texmf.in}),\hfil\break + i.e., \.{\$TEXMFDOTDIR:\$TEXMF/texmf/cweb//}.\par} + +@d kpse_find_cweb(name) kpse_find_file(name, kpse_cweb_format, true) + +@ The simple file searching is replaced by the `path searching' +mechanism that the \Kpathsea/ library provides. + +We set |kpse_program_name| to `\.{ctie}'. This means if the variable +\.{CWEBINPUTS.ctie} is present in \.{texmf.cnf} (or \.{CWEBINPUTS\_ctie} +in the environment) its value will be used as the search path for +filenames. This allows different flavors of \.{CTIE} to have +different search paths.@.CWEBINPUTS@> + +@<Set up |PROGNAME| feature...@>= +kpse_set_program_name(argv[0], "ctie"); +@z |