summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
diff options
context:
space:
mode:
authorAndreas Scherer <andreas_tex@freenet.de>2021-02-07 11:02:17 +0000
committerAndreas Scherer <andreas_tex@freenet.de>2021-02-07 11:02:17 +0000
commit3063cfbe5a32a13420a310bad225be72bcde4982 (patch)
tree01cdd5b69339785bc339eeaa5ec8e5e0dc7e29d0 /Build/source/texk/web2c/cwebdir/ctang-w2c.ch
parent1842aa2477fe04aa641c9332262e21b78c4e50ed (diff)
CWEB – release 4.0, 2021-02-07.
In the course of the "2021 TeX tuneup", Don Knuth kindly transferred the responsibility for CWEB to me; see the original CWEB home page (https://www-cs-faculty.stanford.edu/~knuth/cweb.html), section "CWEB 4.0" and the updated CWEB development project (https://github.com/ascherer/cweb). This first new release draws heavily on the multi-decade work collected in my "CWEBbin" project (https://github.com/ascherer/cwebbin). I moved (almost) all stuff from the "*-patch.*" changefiles into the new CWEB sources and applied all of the "*-ansi.*" changes as well. Moreover, I made "common.h" the full interface of "common.w" in order to avoid code redundancy. And I tried to fix as many of the bugs reported by email to DEK and/or tex-k@tug.org. In total, "make; make cautiously; make fullmanual" runs flawlessly with GCC on Linux and with LLVM on MacOS. After the release of "CWEB 4.0", also "CWEBbin 2021" has also been fully revised. Thousands of lines of changefiles could be purged. What's left are the clearcut extensions for CWEB and the additional stuff for integration in "TeX Live 2021". git-svn-id: svn://tug.org/texlive/trunk@57658 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/cwebdir/ctang-w2c.ch')
-rw-r--r--Build/source/texk/web2c/cwebdir/ctang-w2c.ch514
1 files changed, 42 insertions, 472 deletions
diff --git a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
index 29a525aaf39..f814b343351 100644
--- a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
+++ b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
@@ -1,30 +1,31 @@
-@q Changes for CWEB in TeX Live from numerous contributors. @>
-@q This file is in the Public Domain. @>
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
-@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
-@q were merged with the set of change files of the CWEBbin project; @>
-@q see https://github.com/ascherer/cwebbin for the original parts. @>
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
-@q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
-@q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
-@q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
-@q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
-@q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
-@q with the 'tie' processor and is used as a monolithic changefile for @>
-@q {common,ctangle,cweave}.w in TeX Live. @>
+@q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch @>
+@q has been created from the elaborate set of change files @>
+@q {comm,ctang,cweav,cwebman}-patch.ch, @>
+@q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch, @>
+@q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and @>
+@q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+@q and is used as a monolithic changefile for {common,ctangle,cweave}.w @>
+@q and cwebman.tex in TeX Live. @>
-@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
@x
-\def\title{CTANGLE (Version 3.64)}
+\def\title{CTANGLE (Version 4.0)}
@y
-\def\title{CTANGLE (Version 3.64 [\TeX~Live])}
+\def\title{CTANGLE (Version 4.0 [\TeX~Live])}
@z
@x
- \centerline{(Version 3.64)}
+ \centerline{(Version 4.0)}
@y
- \centerline{(Version 3.64 [\TeX~Live])}
+ \centerline{(Version 4.0 [\TeX~Live])}
@z
@x
@@ -36,244 +37,54 @@
@x
}
@y
-}}
-\datecontentspage
+}}\datecontentspage
@z
@x
-@s not_eq normal @q unreserve a C++ keyword @>
+@d banner "This is CTANGLE (Version 4.0)"
@y
-@z
-
-@x
-@d banner "This is CTANGLE (Version 3.64)\n"
-@y
-@d banner "This is CTANGLE, Version 3.64"
+@d banner "This is CTANGLE, Version 4.0"
/* will be extended by the \TeX~Live |versionstring| */
@z
@x
-@ We predeclare several standard system 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. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-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 */
-@y
-@ For string handling we include the {\mc ANSI C} system header file instead
-of predeclaring the standard system functions |@!strlen|, |@!strcmp|,
-|@!strcpy|, |@!strncmp|, and |@!strncpy|.
-@^system dependencies@>
-
-@<Include files@>=
-#include <string.h>
-@z
-
-@x
-int main (ac, av)
-int ac;
-char **av;
-@y
-int main (
-int ac,
-char **av)
-@z
-
-@x
- if (show_banner) printf(banner); /* print a ``banner line'' */
+ if (show_banner) puts(banner); /* print a ``banner line'' */
@y
if (show_banner) cb_show_banner(); /* print a ``banner line'' */
@z
@x
-@d max_bytes 90000 /* the number of bytes in identifiers,
-@y
-@d max_bytes 1000000 /* the number of bytes in identifiers,
-@z
-
-@x
-@d max_toks 270000 /* number of bytes in compressed \CEE/ code */
-@d max_names 4000 /* number of identifiers, strings, section names;
-@y
-@d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
-@d max_names 10239 /* number of identifiers, strings, section names;
-@z
-
-@x
-@d max_texts 2500 /* number of replacement texts, must be less than 10240 */
-@d hash_size 353 /* should be prime; used in |"common.w"| */
-@y
-@d max_texts 10239 /* number of replacement texts, must be less than 10240 */
-@d hash_size 8501 /* should be prime; used in |"common.w"| */
-@z
-
-@x
-@d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
-@y
-@d buf_size 1000 /* for \.{CWEAVE} and \.{CTANGLE} */
-@z
-
-@x
@i common.h
@y
@i comm-w2c.h
@z
@x
-the array |text_info|, and we use a |text_pointer| variable to refer
-@y
-the array |text_info|, and we use a \&{text\_pointer} variable to refer
-@z
-
-@x
-If your machine does not support |unsigned char| you should change
-the definition of \&{eight\_bits} to |unsigned short|.
-@^system dependencies@>
-@y
-@z
-
-@x
-name_dir->equiv=(char *)text_info; /* the undefined section has no replacement text */
-@y
-init_node(name_dir); /* the undefined section has no replacement text */
-@z
-
-@x
-int names_match(p,first,l)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-{
-@y
-boolean names_match(@t\1\1@>
-name_pointer p, /* points to the proposed match */
-const char *first, /* position of first character of string */
-size_t l, /* length of identifier */
-eight_bits t@t\2\2@>) /* not used by \.{TANGLE} */
-{@+(void)t;
-@z
-
-@x
-void
-init_node(node)
-name_pointer node;
-@y
-void
-init_node(
-name_pointer node)
-@z
-
-@x
- node->equiv=(char *)text_info;
-@y
- node->equiv=(void *)text_info;
-@z
-
-@x
-void
-init_p() {}
-@y
-void
-init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
-@z
-
-@x
-void
-store_two_bytes(x)
-sixteen_bits x;
-@y
-static void
-store_two_bytes(
-sixteen_bits x)
-@z
-
-@x
if (tok_ptr+2>tok_mem_end) overflow("token");
@y
if (tok_ptr+2>tok_mem_end) overflow(_("token"));
@z
@x
-void
-push_level(p) /* suspends the current level */
-name_pointer p;
-@y
-static void
-push_level(@t\1\1@> /* suspends the current level */
-name_pointer p@t\2\2@>)
-@z
-
-@x
if (stack_ptr==stack_end) overflow("stack");
@y
if (stack_ptr==stack_end) overflow(_("stack"));
@z
@x
-void
-pop_level(flag) /* do this when |cur_byte| reaches |cur_end| */
-int flag; /* |flag==0| means we are in |output_defs| */
-@y
-static void
-pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
-int flag@t\2\2@>) /* |flag==0| means we are in |output_defs| */
-@z
-
-@x
-void
-get_output() /* sends next token to |out_char| */
-@y
-static void
-get_output(void) /* sends next token to |out_char| */
-@z
-
-@x
- if ((a+name_dir)->equiv!=(char *)text_info) push_level(a+name_dir);
-@y
- if ((a+name_dir)->equiv!=(void *)text_info) push_level(a+name_dir);
-@z
-
-@x
- printf("\n! Not present: <");
+ fputs("\n! Not present: <",stdout);
@y
fputs(_("\n! Not present: <"),stdout);
@z
@x
-void
-flush_buffer() /* writes one line to output file */
-@y
-static void
-flush_buffer(void) /* writes one line to output file */
-@z
-
-@x
overflow("output files");
@y
overflow(_("output files"));
@z
@x
-void phase_two();
-@y
-static void phase_two(void);@/
-@z
-
-@x
-void
-phase_two () {
-@y
-static void
-phase_two (void) {
-@z
-
-@x
- printf("\n! No program text was specified."); mark_harmless;
+ fputs("\n! No program text was specified.",stdout); mark_harmless;
@y
fputs(_("\n! No program text was specified."),stdout); mark_harmless;
@z
@@ -285,18 +96,15 @@ phase_two (void) {
@z
@x
- printf("\nWriting the output files:");
+ fputs("\nWriting the output files:",stdout);
@y
fputs(_("\nWriting the output files:"),stdout);
@z
@x
- if(show_happiness) printf("\nDone.");
+ fputs("Done.",stdout);
@y
- if (show_happiness) {
- if (show_progress) new_line;
fputs(_("Done."),stdout);
- }
@z
@x
@@ -305,10 +113,10 @@ for (an_output_file=end_output_files; an_output_file>cur_out_file;) {
an_output_file--;
sprint_section_name(output_file_name,*an_output_file);
fclose(C_file);
- C_file=fopen(output_file_name,"w");
- if (C_file ==0) fatal("! Cannot open output file:",output_file_name);
+ C_file=fopen(output_file_name,"wb");
+ if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
@.Cannot open output file@>
- printf("\n(%s)",output_file_name); update_terminal;
+ if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
cur_line=1;
stack_ptr=stack+1;
cur_name= (*an_output_file);
@@ -346,98 +154,12 @@ strcpy(check_file_name,""); /* We want to get rid of the temporary file */
@z
@x
-void output_defs();
-@y
-static void output_defs(void);@/
-@z
-
-@x
-void
-output_defs()
-@y
-static void
-output_defs(void)
-@z
-
-@x
else if (a<050000) { confusion("macro defs have strange char");}
@y
else if (a<050000) { confusion(_("macro defs have strange char"));}
@z
@x
-static void out_char();
-@y
-static void out_char(eight_bits);@/
-@z
-
-@x
-static void
-out_char(cur_char)
-eight_bits cur_char;
-@y
-static void
-out_char(
-eight_bits cur_char)
-@z
-
-@x
-@ @<Cases like \.{!=}@>=
-case plus_plus: C_putc('+'); C_putc('+'); out_state=normal; break;
-case minus_minus: C_putc('-'); C_putc('-'); out_state=normal; break;
-case minus_gt: C_putc('-'); C_putc('>'); out_state=normal; break;
-case gt_gt: C_putc('>'); C_putc('>'); out_state=normal; break;
-case eq_eq: C_putc('='); C_putc('='); out_state=normal; break;
-case lt_lt: C_putc('<'); C_putc('<'); out_state=normal; break;
-case gt_eq: C_putc('>'); C_putc('='); out_state=normal; break;
-case lt_eq: C_putc('<'); C_putc('='); out_state=normal; break;
-case not_eq: C_putc('!'); C_putc('='); out_state=normal; break;
-case and_and: C_putc('&'); C_putc('&'); out_state=normal; break;
-case or_or: C_putc('|'); C_putc('|'); out_state=normal; break;
-case dot_dot_dot: C_putc('.'); C_putc('.'); C_putc('.'); out_state=normal;
- break;
-case colon_colon: C_putc(':'); C_putc(':'); out_state=normal; break;
-case period_ast: C_putc('.'); C_putc('*'); out_state=normal; break;
-case minus_gt_ast: C_putc('-'); C_putc('>'); C_putc('*'); out_state=normal;
- break;
-@y
-@ @<Cases like \.{!=}@>=
-case plus_plus: C_putc('+');@+C_putc('+'); out_state=normal; break;
-case minus_minus: C_putc('-');@+C_putc('-'); out_state=normal; break;
-case minus_gt: C_putc('-');@+C_putc('>'); out_state=normal; break;
-case gt_gt: C_putc('>');@+C_putc('>'); out_state=normal; break;
-case eq_eq: C_putc('=');@+C_putc('='); out_state=normal; break;
-case lt_lt: C_putc('<');@+C_putc('<'); out_state=normal; break;
-case gt_eq: C_putc('>');@+C_putc('='); out_state=normal; break;
-case lt_eq: C_putc('<');@+C_putc('='); out_state=normal; break;
-case non_eq: C_putc('!');@+C_putc('='); out_state=normal; break;
-case and_and: C_putc('&');@+C_putc('&'); out_state=normal; break;
-case or_or: C_putc('|');@+C_putc('|'); out_state=normal; break;
-case dot_dot_dot: C_putc('.');@+C_putc('.');@+C_putc('.'); out_state=normal;
- break;
-case colon_colon: C_putc(':');@+C_putc(':'); out_state=normal; break;
-case period_ast: C_putc('.');@+C_putc('*'); out_state=normal; break;
-case minus_gt_ast: C_putc('-');@+C_putc('>');@+C_putc('*'); out_state=normal;
- break;
-@z
-
-@x
-eight_bits
-skip_ahead() /* skip to next control code */
-@y
-static eight_bits
-skip_ahead(void) /* skip to next control code */
-@z
-
-@x
-int skip_comment(is_long_comment) /* skips over comments */
-boolean is_long_comment;
-@y
-static boolean skip_comment(@t\1\1@> /* skips over comments */
-boolean is_long_comment@t\2\2@>)
-@z
-
-@x
err_print("! Input ended in mid-comment");
@y
err_print(_("! Input ended in mid-comment"));
@@ -450,54 +172,6 @@ boolean is_long_comment@t\2\2@>)
@z
@x
-eight_bits
-get_next() /* produces the next input token */
-@y
-static eight_bits
-get_next(void) /* produces the next input token */
-@z
-
-@x
- else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"')))
-@y
- else if (c=='\'' || c=='"'@|
- || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
- || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"')))
-@z
-
-@x
- else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt); break;
-@y
- else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt); } } break;
-@z
-
-@x
- case '!': if (*loc=='=') compress(not_eq); break;
-@y
- case '!': if (*loc=='=') compress(non_eq); break;
-@z
-
-@x
- while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
-@y
- while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
- || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
-@z
-
-@x
- if (delim=='L') { /* wide character constant */
- delim=*loc++; *++id_loc=delim;
- }
-@y
- if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
- if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
- delim=*loc++; *++id_loc=delim;
- }
-@z
-
-@x
err_print("! String didn't end"); loc=limit; break;
@y
err_print(_("! String didn't end")); loc=limit; break;
@@ -510,7 +184,7 @@ get_next(void) /* produces the next input token */
@z
@x
- printf("\n! String too long: ");
+ fputs("\n! String too long: ",stdout);
@y
fputs(_("\n! String too long: "),stdout);
@z
@@ -546,7 +220,7 @@ get_next(void) /* produces the next input token */
@z
@x
- printf("\n! Section name too long: ");
+ fputs("\n! Section name too long: ",stdout);
@y
fputs(_("\n! Section name too long: "),stdout);
@z
@@ -576,30 +250,12 @@ get_next(void) /* produces the next input token */
@z
@x
-void
-scan_repl(t) /* creates a replacement text */
-eight_bits t;
-@y
-static void
-scan_repl(@t\1\1@> /* creates a replacement text */
-eight_bits t@t\2\2@>)
-@z
-
-@x
if (text_ptr>text_info_end) overflow("text");
@y
if (text_ptr>text_info_end) overflow(_("text"));
@z
@x
-{int a=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a / 0400)+0200);
- app_repl(a % 0400);}
-@y
-{int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
- app_repl(a_l % 0400);}
-@z
-
-@x
case output_defs_code: if (t!=section_name) err_print("! Misplaced @@h");
@y
case output_defs_code: if (t!=section_name) err_print(_("! Misplaced @@h"));
@@ -624,72 +280,18 @@ case output_defs_code: if (t!=section_name) err_print(_("! Misplaced @@h"));
@z
@x
- c=toupper(*id_first)-'A'+10;
-@y
- c=toupper((eight_bits)*id_first)-'A'+10;
-@z
-
-@x
- c=16*c+toupper(*id_first)-'A'+10;
-@y
- c=16*c+toupper((eight_bits)*id_first)-'A'+10;
-@z
-
-@x
default: err_print("! Unrecognized escape sequence");
@y
default: err_print(_("! Unrecognized escape sequence"));
@z
@x
-void
-scan_section()
-@y
-static void
-scan_section(void)
-@z
-
-@x
err_print("! Definition flushed, must start with identifier");
@y
err_print(_("! Definition flushed, must start with identifier"));
@z
@x
-else if (p->equiv==(char *)text_info) p->equiv=(char *)cur_text;
-@y
-else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;
-@z
-
-@x
-void phase_one();
-@y
-static void phase_one(void);@/
-@z
-
-@x
-void
-phase_one() {
-@y
-static void
-phase_one(void) {
-@z
-
-@x
-void skip_limbo();
-@y
-static void skip_limbo(void);@/
-@z
-
-@x
-void
-skip_limbo()
-@y
-static void
-skip_limbo(void)
-@z
-
-@x
err_print("! Double @@ should be used in control text");
@y
err_print(_("! Double @@ should be used in control text"));
@@ -714,66 +316,34 @@ skip_limbo(void)
@z
@x
- strncpy(translit[i-0200],beg,loc-beg);
-@y
- strncpy(translit[i-0200],beg,(size_t)(loc-beg));
-@z
-
-@x
-void
-print_stats() {
-@y
-void
-print_stats(void) {
-@z
-
-@x
- printf("\nMemory usage statistics:\n");
+ puts("\nMemory usage statistics:");
printf("%ld names (out of %ld)\n",
- (long)(name_ptr-name_dir),(long)max_names);
+ (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
printf("%ld replacement texts (out of %ld)\n",
- (long)(text_ptr-text_info),(long)max_texts);
+ (ptrdiff_t)(text_ptr-text_info),(long)max_texts);
printf("%ld bytes (out of %ld)\n",
- (long)(byte_ptr-byte_mem),(long)max_bytes);
+ (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
printf("%ld tokens (out of %ld)\n",
@y
puts(_("\nMemory usage statistics:"));
printf(_("%ld names (out of %ld)\n"),
- (long)(name_ptr-name_dir),(long)max_names);
+ (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
printf(_("%ld replacement texts (out of %ld)\n"),
- (long)(text_ptr-text_info),(long)max_texts);
+ (ptrdiff_t)(text_ptr-text_info),(long)max_texts);
printf(_("%ld bytes (out of %ld)\n"),
- (long)(byte_ptr-byte_mem),(long)max_bytes);
+ (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
printf(_("%ld tokens (out of %ld)\n"),
@z
@x
@** Index.
@y
-@** Extensions for modern \.{CWEB}. The following sections introduce changes
-and extensions to the code that have been created by numerous contributors over
-the course of a quarter century. They make \.{CWEB} adhere to modern coding
-standards and introduce new or improved features.
+@** Extensions to \.{CWEB}. The following sections introduce new or improved
+features that have been created by numerous contributors over the course of a
+quarter century.
Care has been taken to keep the original section numbering intact, so this new
-section should have the same number as the original ``\&{96.~Index},'' and
-additional material follows below.
-
-@* Function declarations. Here are declarations---conforming to
-{\mc ANSI~C}---of all functions in this code, as far as they are
-not already in |"common.h"|. These are private to \.{CTANGLE}.
-
-@<Predecl...@>=
-static eight_bits get_next(void);@/
-static eight_bits skip_ahead(void);@/
-static boolean skip_comment(boolean);@/
-static void flush_buffer(void);@/
-static void get_output(void);@/
-static void pop_level(int);@/
-static void push_level(name_pointer);@/
-static void scan_repl(eight_bits);@/
-static void scan_section(void);@/
-static void store_two_bytes(sixteen_bits);@/
+material should nicely integrate with the original ``\&{105.~Index}.''
@* Output file update. Most \CEE/ projects are controlled by a
\.{Makefile} that automatically takes care of the temporal dependecies