texlive[58884] Build/source/texk/web2c: [CWEB] New release 4.3.

commits+ascherer at tug.org commits+ascherer at tug.org
Fri Apr 16 14:49:28 CEST 2021


Revision: 58884
          http://tug.org/svn/texlive?view=revision&revision=58884
Author:   ascherer
Date:     2021-04-16 14:49:28 +0200 (Fri, 16 Apr 2021)
Log Message:
-----------
[CWEB] New release 4.3.

This release introduces new features to CWEB 4:

* Former option '-t' is now called '-c'.
  - New option '-t' for CWEAVE when dealing with 'typename' in
    C++ templates.
  - New option '-k' for CTANGLE to keep '-separators in numeric
    literals.
* Support for "variadic macros" along "variadic functions".
* @d is printed similar to #define (and vice versa):
  - '#' is no longer printed in boldface.
  - Spacing is similar in most cases.
* Support for extended C99/C++ numeric literals:
  - hexadecimal, octal, and -- new! -- binary numbers.
  - NOTE: 'cwebmac.tex 4.3' is NOT compatible with CWEAVE 4.2 and older
    and vice versa.
* Long parameter lists in ANSI function definitions are indented similar
  to old-style function parameters.
  - Option '-i' works similar for old-style and modern function headers.
* Additional C99/C++ keywords -- from 'alignas' to 'thread_local' -- are
  supported internally.
* '@i'nclude file 'iso_types.w' for numeric types (in addition to
  'c++lib.w').
* Countless code modifications, including some corrections amd
  improvements.

Thanks and cudos to Github user "@texdraft" for numerous contributions
to this feature release!

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/ChangeLog
    trunk/Build/source/texk/web2c/Makefile.in
    trunk/Build/source/texk/web2c/am/cweb.am
    trunk/Build/source/texk/web2c/ctangleboot.cin
    trunk/Build/source/texk/web2c/cwebboot.cin
    trunk/Build/source/texk/web2c/cwebdir/ChangeLog
    trunk/Build/source/texk/web2c/cwebdir/Makefile
    trunk/Build/source/texk/web2c/cwebdir/README
    trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch
    trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h
    trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch
    trunk/Build/source/texk/web2c/cwebdir/common.c
    trunk/Build/source/texk/web2c/cwebdir/common.h
    trunk/Build/source/texk/web2c/cwebdir/common.w
    trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
    trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch
    trunk/Build/source/texk/web2c/cwebdir/ctangle.c
    trunk/Build/source/texk/web2c/cwebdir/ctangle.w
    trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex
    trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
    trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch
    trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
    trunk/Build/source/texk/web2c/cwebdir/ctwill.bux
    trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex
    trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
    trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch
    trunk/Build/source/texk/web2c/cwebdir/cweave.w
    trunk/Build/source/texk/web2c/cwebdir/cweb.1
    trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
    trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch
    trunk/Build/source/texk/web2c/cwebdir/cwebman.tex
    trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
    trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot
    trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
    trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po
    trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
    trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po
    trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
    trunk/Build/source/texk/web2c/cwebdir/prod-twill.w
    trunk/Build/source/texk/web2c/cwebdir/prod.w
    trunk/Build/source/texk/web2c/cwebdir/refsort.w
    trunk/Build/source/texk/web2c/cwebdir/system.bux
    trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
    trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex
    trunk/Build/source/texk/web2c/cwebdir/twinx.w
    trunk/Build/source/texk/web2c/help.h
    trunk/Build/source/texk/web2c/man/ChangeLog
    trunk/Build/source/texk/web2c/man/ctwill.man
    trunk/Build/source/texk/web2c/man/cweb.man

Added Paths:
-----------
    trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
    trunk/Build/source/texk/web2c/cwebdir/common.bux
    trunk/Build/source/texk/web2c/cwebdir/iso_types.w
    trunk/Build/source/texk/web2c/cwebdir/refsort.ch
    trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
    trunk/Build/source/texk/web2c/cwebdir/twinx.ch

Modified: trunk/Build/source/texk/web2c/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/ChangeLog	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/ChangeLog	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,13 @@
+2021-04-16  Andreas Scherer  <https://ascherer.github.io>
+
+	* ctangleboot.cin,
+	* cwebboot.cin,
+	* help.h: CWEB release 4.3.
+
+2021-03-24  Andreas Scherer  <https://ascherer.github.io>
+
+	* help.h: New options for CTANGLE, CWEAVE and CTWILL.
+
 2021-03-23  Karl Berry  <karl at tug.org>
 
 	* TL'21.
@@ -8,6 +18,11 @@
 	* doc/webman.tex: add these Knuth files here, since nowhere
 	else seems better. PDF output for them is in the knuth-pdf package.
 
+2021-03-06  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile.in,
+	* am/cweb.am: Patch refsort and twinx with changefiles.
+
 2021-02-25  Andreas Scherer  <https://ascherer.github.io>
 
 	* ctangleboot.cin,

Modified: trunk/Build/source/texk/web2c/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/Makefile.in	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/Makefile.in	2021-04-16 12:49:28 UTC (rev 58884)
@@ -21196,10 +21196,10 @@
 	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave cweav-w2c
 ctwill.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod-twill.w cwebdir/ctwill-w2c.ch
 	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave ctwill-w2c ctwill.c
-ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
-	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
-ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
-	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w cwebdir/refsort.ch
+	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort refsort ctwill-refsort.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w cwebdir/twinx.ch
+	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx twinx ctwill-twinx.c
 tie.c: ctangle$(EXEEXT) tiedir/tie.w tiedir/tie-w2c.ch
 	$(ctangle_silent)CWEBINPUTS=$(srcdir)/tiedir $(ctangle) tie.w tie-w2c.ch
 ctiedir/ctie.log: ctie$(EXEEXT)

Modified: trunk/Build/source/texk/web2c/am/cweb.am
===================================================================
--- trunk/Build/source/texk/web2c/am/cweb.am	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/am/cweb.am	2021-04-16 12:49:28 UTC (rev 58884)
@@ -25,13 +25,13 @@
 DISTCLEANFILES += ctwill.c
 
 nodist_ctwill_refsort_SOURCES = ctwill-refsort.c
-ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
-	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w cwebdir/refsort.ch
+	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort refsort ctwill-refsort.c
 DISTCLEANFILES += ctwill-refsort.c
 
 nodist_ctwill_twinx_SOURCES = ctwill-twinx.c
-ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
-	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w cwebdir/twinx.ch
+	$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx twinx ctwill-twinx.c
 DISTCLEANFILES += ctwill-twinx.c
 
 nodist_tie_SOURCES = tie.c

Modified: trunk/Build/source/texk/web2c/ctangleboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/ctangleboot.cin	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/ctangleboot.cin	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 #line 66 "cwebdir/ctangle.w"
 
 /*4:*/
-#line 53 "cwebdir/comm-w2c.h"
+#line 51 "cwebdir/comm-w2c.h"
 
 #ifndef HAVE_GETTEXT
 #define HAVE_GETTEXT 0
@@ -25,7 +25,7 @@
 /*:4*/
 #line 67 "cwebdir/ctangle.w"
 
-#define banner "This is CTANGLE, Version 4.2" \
+#define banner "This is CTANGLE, Version 4.3" \
  \
 
 #define _(S) gettext(S)  \
@@ -46,13 +46,19 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) )  \
+#define compress(c) if(loc++<=limit) return c \
 
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
+ \
+
 #define max_include_depth 10 \
 
 #define max_file_name_length 1024
@@ -82,15 +88,12 @@
 #define show_progress flags['p']
 #define show_stats flags['s']
 #define show_happiness flags['h']
-#define temporary_output flags['t']
-#define make_xrefs flags['x'] \
+#define make_xrefs flags['x']
+#define check_for_change flags['c'] \
 
 #define update_terminal fflush(stdout) 
 #define new_line putchar('\n') 
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
-#define C_printf(c,a) fprintf(C_file,c,a) 
-#define C_putc(c) putc(c,C_file)  \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)  \
 
 #define max_bytes 1000000 \
 
@@ -106,9 +109,11 @@
 
 #define equiv equiv_or_xref \
 
+#define macro 0
 #define section_flag max_texts \
 
 #define string 02
+#define constant 03
 #define join 0177
 #define output_defs_flag (2*024000-1)  \
 
@@ -128,9 +133,12 @@
 #define verbatim 4 \
 
 #define max_files 256
+#define C_printf(c,a) fprintf(C_file,c,a) 
+#define C_putc(c) putc(c,C_file)  \
+
 #define translit_length 10 \
 
-#define ignore 0
+#define ignore 00
 #define ord 0302
 #define control_text 0303
 #define translit_code 0304
@@ -141,18 +149,10 @@
 #define section_name 0311
 #define new_section 0312 \
 
-#define constant 03 \
+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow(_("token") ) ;*tok_ptr++= c;} \
 
-#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+#define keep_digit_separators flags['k'] \
 
-#define ishigh(c) ((eight_bits) (c) > 0177)  \
- \
-
-#define compress(c) if(loc++<=limit) return c \
-
-#define macro 0
-#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow(_("token") ) ;*tok_ptr++= c;} \
-
 #define max_banner 50 \
 
 
@@ -159,7 +159,7 @@
 #line 68 "cwebdir/ctangle.w"
 
 /*3:*/
-#line 35 "cwebdir/comm-w2c.h"
+#line 33 "cwebdir/comm-w2c.h"
 
 typedef bool boolean;
 typedef uint8_t eight_bits;
@@ -179,7 +179,7 @@
 extern char*id_loc;
 
 /*:5*//*6:*/
-#line 105 "cwebdir/comm-w2c.h"
+#line 109 "cwebdir/comm-w2c.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -187,7 +187,7 @@
 extern char*limit;
 
 /*:6*//*7:*/
-#line 122 "cwebdir/comm-w2c.h"
+#line 126 "cwebdir/comm-w2c.h"
 
 extern int include_depth;
 extern FILE*file[];
@@ -204,7 +204,7 @@
 extern boolean web_file_open;
 
 /*:7*//*9:*/
-#line 143 "cwebdir/comm-w2c.h"
+#line 147 "cwebdir/comm-w2c.h"
 
 extern sixteen_bits section_count;
 extern boolean changed_section[];
@@ -212,7 +212,7 @@
 extern boolean print_where;
 
 /*:9*//*10:*/
-#line 157 "cwebdir/comm-w2c.h"
+#line 161 "cwebdir/comm-w2c.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -237,12 +237,12 @@
 extern hash_pointer h;
 
 /*:10*//*12:*/
-#line 201 "cwebdir/comm-w2c.h"
+#line 205 "cwebdir/comm-w2c.h"
 
 extern int history;
 
 /*:12*//*14:*/
-#line 218 "cwebdir/comm-w2c.h"
+#line 222 "cwebdir/comm-w2c.h"
 
 extern int argc;
 extern char**argv;
@@ -254,7 +254,7 @@
 extern const char*use_language;
 
 /*:14*//*15:*/
-#line 235 "cwebdir/comm-w2c.h"
+#line 237 "cwebdir/comm-w2c.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
@@ -281,7 +281,7 @@
 typedef text*text_pointer;
 
 /*:19*//*31:*/
-#line 269 "cwebdir/ctangle.w"
+#line 273 "cwebdir/ctangle.w"
 
 typedef struct{
 eight_bits*end_field;
@@ -306,12 +306,12 @@
 static eight_bits*tok_ptr;
 
 /*:20*//*26:*/
-#line 198 "cwebdir/ctangle.w"
+#line 199 "cwebdir/ctangle.w"
 
 static text_pointer last_unnamed;
 
 /*:26*//*32:*/
-#line 285 "cwebdir/ctangle.w"
+#line 289 "cwebdir/ctangle.w"
 
 static output_state cur_state;
 
@@ -320,18 +320,18 @@
 static stack_pointer stack_ptr;
 
 /*:32*//*37:*/
-#line 361 "cwebdir/ctangle.w"
+#line 365 "cwebdir/ctangle.w"
 
 static int cur_val;
 
 /*:37*//*42:*/
-#line 452 "cwebdir/ctangle.w"
+#line 456 "cwebdir/ctangle.w"
 
 static eight_bits out_state;
 static boolean protect;
 
 /*:42*//*45:*/
-#line 483 "cwebdir/ctangle.w"
+#line 487 "cwebdir/ctangle.w"
 
 static name_pointer output_files[max_files];
 static name_pointer*cur_out_file,*end_output_files,*an_output_file;
@@ -339,33 +339,33 @@
 static char output_file_name[longest_name+1];
 
 /*:45*//*52:*/
-#line 582 "cwebdir/ctangle.w"
+#line 584 "cwebdir/ctangle.w"
 
 static boolean output_defs_seen= false;
 
 /*:52*//*57:*/
-#line 691 "cwebdir/ctangle.w"
+#line 696 "cwebdir/ctangle.w"
 
 static char translit[128][translit_length];
 
 /*:57*//*62:*/
-#line 770 "cwebdir/ctangle.w"
+#line 775 "cwebdir/ctangle.w"
 
 static eight_bits ccode[256];
 
 /*:62*//*66:*/
-#line 830 "cwebdir/ctangle.w"
+#line 835 "cwebdir/ctangle.w"
 
 static boolean comment_continues= false;
 
 /*:66*//*68:*/
-#line 869 "cwebdir/ctangle.w"
+#line 872 "cwebdir/ctangle.w"
 
 static name_pointer cur_section_name;
 static boolean no_where;
 
 /*:68*//*82:*/
-#line 1182 "cwebdir/ctangle.w"
+#line 1189 "cwebdir/ctangle.w"
 
 static text_pointer cur_text;
 static eight_bits next_control;
@@ -374,7 +374,7 @@
 #line 71 "cwebdir/ctangle.w"
 
 /*8:*/
-#line 137 "cwebdir/comm-w2c.h"
+#line 141 "cwebdir/comm-w2c.h"
 
 extern boolean get_line(void);
 extern void check_complete(void);
@@ -381,12 +381,12 @@
 extern void reset_input(void);
 
 /*:8*//*11:*/
-#line 180 "cwebdir/comm-w2c.h"
+#line 184 "cwebdir/comm-w2c.h"
 
 extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
 extern name_pointer id_lookup(const char*,const char*,char);
 
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
 extern void init_node(name_pointer);
 extern void init_p(name_pointer,eight_bits);
 extern void print_prefix_name(name_pointer);
@@ -394,7 +394,7 @@
 extern void sprint_section_name(char*,name_pointer);
 
 /*:11*//*13:*/
-#line 204 "cwebdir/comm-w2c.h"
+#line 208 "cwebdir/comm-w2c.h"
 
 extern int wrap_up(void);
 extern void err_print(const char*);
@@ -402,7 +402,7 @@
 extern void overflow(const char*);
 
 /*:13*//*16:*/
-#line 244 "cwebdir/comm-w2c.h"
+#line 246 "cwebdir/comm-w2c.h"
 
 extern void common_init(void);
 extern void print_stats(void);
@@ -409,57 +409,57 @@
 extern void cb_show_banner(void);
 
 /*:16*//*30:*/
-#line 241 "cwebdir/ctangle.w"
+#line 245 "cwebdir/ctangle.w"
 static void store_two_bytes(sixteen_bits);
 
 /*:30*//*35:*/
-#line 324 "cwebdir/ctangle.w"
+#line 328 "cwebdir/ctangle.w"
 
 static void push_level(name_pointer);
 static void pop_level(boolean);
 
 /*:35*//*39:*/
-#line 397 "cwebdir/ctangle.w"
+#line 401 "cwebdir/ctangle.w"
 static void get_output(void);
 
 /*:39*//*44:*/
-#line 473 "cwebdir/ctangle.w"
+#line 477 "cwebdir/ctangle.w"
 static void flush_buffer(void);
 
 /*:44*//*49:*/
-#line 549 "cwebdir/ctangle.w"
+#line 551 "cwebdir/ctangle.w"
 static void phase_two(void);
 
 /*:49*//*53:*/
-#line 585 "cwebdir/ctangle.w"
+#line 587 "cwebdir/ctangle.w"
 
 static void output_defs(void);
 static void out_char(eight_bits);
 
 /*:53*//*65:*/
-#line 810 "cwebdir/ctangle.w"
+#line 815 "cwebdir/ctangle.w"
 
 static eight_bits skip_ahead(void);
 static boolean skip_comment(boolean);
 
 /*:65*//*70:*/
-#line 924 "cwebdir/ctangle.w"
+#line 922 "cwebdir/ctangle.w"
 static eight_bits get_next(void);
 
 /*:70*//*84:*/
-#line 1208 "cwebdir/ctangle.w"
+#line 1215 "cwebdir/ctangle.w"
 static void scan_repl(eight_bits);
 
 /*:84*//*91:*/
-#line 1379 "cwebdir/ctangle.w"
+#line 1396 "cwebdir/ctangle.w"
 static void scan_section(void);
 
 /*:91*//*99:*/
-#line 1460 "cwebdir/ctangle.w"
+#line 1477 "cwebdir/ctangle.w"
 static void phase_one(void);
 
 /*:99*//*101:*/
-#line 1494 "cwebdir/ctangle.w"
+#line 1511 "cwebdir/ctangle.w"
 static void skip_limbo(void);
 
 /*:101*/
@@ -488,16 +488,16 @@
 init_node(name_dir);
 
 /*:23*//*27:*/
-#line 201 "cwebdir/ctangle.w"
-last_unnamed= text_info;text_info->text_link= 0;
+#line 202 "cwebdir/ctangle.w"
+last_unnamed= text_info;text_info->text_link= macro;
 
 /*:27*//*46:*/
-#line 493 "cwebdir/ctangle.w"
+#line 497 "cwebdir/ctangle.w"
 
 cur_out_file= end_output_files= output_files+max_files;
 
 /*:46*//*58:*/
-#line 694 "cwebdir/ctangle.w"
+#line 699 "cwebdir/ctangle.w"
 
 {
 int i;
@@ -505,7 +505,7 @@
 }
 
 /*:58*//*63:*/
-#line 773 "cwebdir/ctangle.w"
+#line 778 "cwebdir/ctangle.w"
 {
 int c;
 for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -525,7 +525,7 @@
 }
 
 /*:63*//*78:*/
-#line 1103 "cwebdir/ctangle.w"
+#line 1111 "cwebdir/ctangle.w"
 section_text[0]= ' ';
 
 /*:78*//*116:*/
@@ -571,7 +571,7 @@
 init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
 
 /*:25*//*29:*/
-#line 231 "cwebdir/ctangle.w"
+#line 235 "cwebdir/ctangle.w"
 
 static void
 store_two_bytes(
@@ -579,13 +579,13 @@
 {
 #line 65 "cwebdir/ctang-w2c.ch"
 if(tok_ptr+2> tok_mem_end)overflow(_("token"));
-#line 237 "cwebdir/ctangle.w"
+#line 241 "cwebdir/ctangle.w"
 *tok_ptr++= x>>8;
 *tok_ptr++= x&0377;
 }
 
 /*:29*//*34:*/
-#line 309 "cwebdir/ctangle.w"
+#line 313 "cwebdir/ctangle.w"
 
 static void
 push_level(
@@ -593,7 +593,7 @@
 {
 #line 71 "cwebdir/ctang-w2c.ch"
 if(stack_ptr==stack_end)overflow(_("stack"));
-#line 315 "cwebdir/ctangle.w"
+#line 319 "cwebdir/ctangle.w"
 *stack_ptr= cur_state;
 stack_ptr++;
 if(p!=NULL){
@@ -604,7 +604,7 @@
 }
 
 /*:34*//*36:*/
-#line 332 "cwebdir/ctangle.w"
+#line 336 "cwebdir/ctangle.w"
 
 static void
 pop_level(
@@ -620,7 +620,7 @@
 }
 
 /*:36*//*38:*/
-#line 368 "cwebdir/ctangle.w"
+#line 372 "cwebdir/ctangle.w"
 
 static void
 get_output(void)
@@ -643,7 +643,7 @@
 case 0:cur_val= a;out_char(identifier);break;
 case 1:if(a==output_defs_flag)output_defs();
 else/*40:*/
-#line 402 "cwebdir/ctangle.w"
+#line 406 "cwebdir/ctangle.w"
 
 {
 a-= 024000;
@@ -651,7 +651,7 @@
 else if(a!=0){
 #line 77 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! Not present: <"),stdout);
-#line 408 "cwebdir/ctangle.w"
+#line 412 "cwebdir/ctangle.w"
 print_section_name(a+name_dir);err_print(">");
 
 }
@@ -659,7 +659,7 @@
 }
 
 /*:40*/
-#line 389 "cwebdir/ctangle.w"
+#line 393 "cwebdir/ctangle.w"
 
 break;
 default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
@@ -669,7 +669,7 @@
 }
 
 /*:38*//*43:*/
-#line 460 "cwebdir/ctangle.w"
+#line 464 "cwebdir/ctangle.w"
 
 static void
 flush_buffer(void)
@@ -676,7 +676,7 @@
 {
 C_putc('\n');
 if(cur_line%100==0&&show_progress){
-printf(".");
+putchar('.');
 if(cur_line%500==0)printf("%d",cur_line);
 update_terminal;
 }
@@ -684,7 +684,7 @@
 }
 
 /*:43*//*48:*/
-#line 514 "cwebdir/ctangle.w"
+#line 516 "cwebdir/ctangle.w"
 
 static void
 phase_two(void){
@@ -691,27 +691,27 @@
 web_file_open= false;
 cur_line= 1;
 /*33:*/
-#line 298 "cwebdir/ctangle.w"
+#line 302 "cwebdir/ctangle.w"
 
 stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
 cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
 
 /*:33*/
-#line 519 "cwebdir/ctangle.w"
+#line 521 "cwebdir/ctangle.w"
 
 /*51:*/
-#line 578 "cwebdir/ctangle.w"
+#line 580 "cwebdir/ctangle.w"
 
 if(!output_defs_seen)
 output_defs();
 
 /*:51*/
-#line 520 "cwebdir/ctangle.w"
+#line 522 "cwebdir/ctangle.w"
 
-if(text_info->text_link==0&&cur_out_file==end_output_files){
+if(text_info->text_link==macro&&cur_out_file==end_output_files){
 #line 89 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! No program text was specified."),stdout);mark_harmless;
-#line 523 "cwebdir/ctangle.w"
+#line 525 "cwebdir/ctangle.w"
 
 }
 else{
@@ -719,18 +719,18 @@
 if(show_progress)
 #line 95 "cwebdir/ctang-w2c.ch"
 printf(_("\nWriting the output file (%s):"),C_file_name);
-#line 529 "cwebdir/ctangle.w"
+#line 531 "cwebdir/ctangle.w"
 }
 else{
 if(show_progress){
 #line 101 "cwebdir/ctang-w2c.ch"
 fputs(_("\nWriting the output files:"),stdout);
-#line 533 "cwebdir/ctangle.w"
+#line 535 "cwebdir/ctangle.w"
 
 printf(" (%s)",C_file_name);
 update_terminal;
 }
-if(text_info->text_link==0)goto writeloop;
+if(text_info->text_link==macro)goto writeloop;
 }
 while(stack_ptr> stack)get_output();
 flush_buffer();
@@ -752,7 +752,7 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-if(temporary_output)/*107:*/
+if(check_for_change)/*107:*/
 #line 378 "cwebdir/ctang-w2c.ch"
 
 do{
@@ -927,7 +927,7 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-if(temporary_output)/*107:*/
+if(check_for_change)/*107:*/
 #line 378 "cwebdir/ctang-w2c.ch"
 
 do{
@@ -969,22 +969,22 @@
 
 }
 strcpy(check_file_name,"");
-#line 573 "cwebdir/ctangle.w"
+#line 575 "cwebdir/ctangle.w"
 
 /*:50*/
-#line 541 "cwebdir/ctangle.w"
+#line 543 "cwebdir/ctangle.w"
 
 if(show_happiness){
 if(show_progress)new_line;
 #line 107 "cwebdir/ctang-w2c.ch"
 fputs(_("Done."),stdout);
-#line 545 "cwebdir/ctangle.w"
+#line 547 "cwebdir/ctangle.w"
 }
 }
 }
 
 /*:48*//*54:*/
-#line 589 "cwebdir/ctangle.w"
+#line 594 "cwebdir/ctangle.w"
 
 static void
 output_defs(void)
@@ -992,7 +992,7 @@
 sixteen_bits a;
 push_level(NULL);
 for(cur_text= text_info+1;cur_text<text_ptr;cur_text++)
-if(cur_text->text_link==0){
+if(cur_text->text_link==macro){
 cur_byte= cur_text->tok_start;
 cur_end= (cur_text+1)->tok_start;
 C_printf("%s","#define ");
@@ -1011,8 +1011,8 @@
 cur_val= a;out_char(identifier);
 }
 #line 159 "cwebdir/ctang-w2c.ch"
-else if(a<050000){confusion(_("macro defs have strange char"));}
-#line 615 "cwebdir/ctangle.w"
+else if(a<050000)confusion(_("macro defs have strange char"));
+#line 620 "cwebdir/ctangle.w"
 else{
 cur_val= a-050000;cur_section= cur_val;out_char(section_number);
 }
@@ -1026,7 +1026,7 @@
 }
 
 /*:54*//*55:*/
-#line 632 "cwebdir/ctangle.w"
+#line 637 "cwebdir/ctangle.w"
 
 static void
 out_char(
@@ -1039,7 +1039,7 @@
 if(protect||out_state==verbatim)C_putc('\\');
 flush_buffer();if(out_state!=verbatim)out_state= normal;break;
 /*59:*/
-#line 700 "cwebdir/ctangle.w"
+#line 705 "cwebdir/ctangle.w"
 
 case identifier:
 if(out_state==num_or_id)C_putc(' ');
@@ -1054,10 +1054,10 @@
 out_state= num_or_id;break;
 
 /*:59*/
-#line 643 "cwebdir/ctangle.w"
+#line 648 "cwebdir/ctangle.w"
 
 /*60:*/
-#line 713 "cwebdir/ctangle.w"
+#line 718 "cwebdir/ctangle.w"
 
 case section_number:
 if(cur_val> 0)C_printf("/*%d:*/",cur_val);
@@ -1079,15 +1079,15 @@
 if(*j=='\\'||*j=='"')C_putc('\\');
 C_putc(*j);
 }
-C_printf("%s","\"\n");
+C_putc('"');C_putc('\n');
 }
 break;
 
 /*:60*/
-#line 644 "cwebdir/ctangle.w"
+#line 649 "cwebdir/ctangle.w"
 
 /*56:*/
-#line 662 "cwebdir/ctangle.w"
+#line 667 "cwebdir/ctangle.w"
 
 case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
 case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
@@ -1108,7 +1108,7 @@
 break;
 
 /*:56*/
-#line 645 "cwebdir/ctangle.w"
+#line 650 "cwebdir/ctangle.w"
 
 case'=':case'>':C_putc(cur_char);C_putc(' ');
 out_state= normal;break;
@@ -1127,7 +1127,7 @@
 }
 
 /*:55*//*64:*/
-#line 794 "cwebdir/ctangle.w"
+#line 799 "cwebdir/ctangle.w"
 
 static eight_bits
 skip_ahead(void)
@@ -1145,7 +1145,7 @@
 }
 
 /*:64*//*67:*/
-#line 833 "cwebdir/ctangle.w"
+#line 838 "cwebdir/ctangle.w"
 
 static boolean skip_comment(
 boolean is_long_comment)
@@ -1158,7 +1158,7 @@
 else{
 #line 165 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in mid-comment"));
-#line 844 "cwebdir/ctangle.w"
+#line 849 "cwebdir/ctangle.w"
 
 return comment_continues= false;
 }
@@ -1173,7 +1173,7 @@
 if(ccode[(eight_bits)*loc]==new_section){
 #line 171 "cwebdir/ctang-w2c.ch"
 err_print(_("! Section name ended in mid-comment"));loc--;
-#line 857 "cwebdir/ctangle.w"
+#line 862 "cwebdir/ctangle.w"
 
 return comment_continues= false;
 }
@@ -1183,22 +1183,23 @@
 }
 
 /*:67*//*69:*/
-#line 881 "cwebdir/ctangle.w"
+#line 879 "cwebdir/ctangle.w"
 
 static eight_bits
 get_next(void)
 {
-static int preprocessing= 0;
+static boolean preprocessing= false;
 eight_bits c;
 while(true){
 if(loc> limit){
-if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
+if(preprocessing&&*(limit-1)!='\\')preprocessing= false;
 if(get_line()==false)return new_section;
 else if(print_where&&!no_where){
 print_where= false;
 /*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1210,9 +1211,10 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 893 "cwebdir/ctangle.w"
+#line 891 "cwebdir/ctangle.w"
 
 }
 else return'\n';
@@ -1226,24 +1228,33 @@
 }
 loc++;
 if(xisdigit(c)||c=='.')/*73:*/
-#line 964 "cwebdir/ctangle.w"
+#line 963 "cwebdir/ctangle.w"
 {
+boolean hex_flag= false;
 id_first= loc-1;
 if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
 if(*id_first=='0'){
 if(*loc=='x'||*loc=='X'){
-loc++;while(xisxdigit(*loc))loc++;goto found;
+hex_flag= true;
+loc++;while(xisxdigit(*loc)||*loc=='\'')loc++;
 }
+else if(*loc=='b'||*loc=='B'){
+loc++;while(*loc=='0'||*loc=='1'||*loc=='\'')loc++;goto found;
 }
-while(xisdigit(*loc))loc++;
+}
+while(xisdigit(*loc)||*loc=='\'')loc++;
 if(*loc=='.'){
 loc++;
-while(xisdigit(*loc))loc++;
+while((hex_flag&&xisxdigit(*loc))||xisdigit(*loc)||*loc=='\'')loc++;
 }
 if(*loc=='e'||*loc=='E'){
 if(*++loc=='+'||*loc=='-')loc++;
-while(xisdigit(*loc))loc++;
+while(xisdigit(*loc)||*loc=='\'')loc++;
 }
+else if(hex_flag&&(*loc=='p'||*loc=='P')){
+if(*++loc=='+'||*loc=='-')loc++;
+while(xisxdigit(*loc)||*loc=='\'')loc++;
+}
 found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'
 ||*loc=='f'||*loc=='F')loc++;
 id_loc= loc;
@@ -1251,19 +1262,19 @@
 }
 
 /*:73*/
-#line 905 "cwebdir/ctangle.w"
+#line 903 "cwebdir/ctangle.w"
 
 else if(c=='\''||c=='"'
 ||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
 ||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
 /*74:*/
-#line 992 "cwebdir/ctangle.w"
+#line 1000 "cwebdir/ctangle.w"
 {
 char delim= c;
 id_first= section_text+1;
 id_loc= section_text;*++id_loc= delim;
 if(delim=='L'||delim=='u'||delim=='U'){
-if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
+if(delim=='u'&&*loc=='8')*++id_loc= *loc++;
 delim= *loc++;*++id_loc= delim;
 }
 while(true){
@@ -1271,13 +1282,13 @@
 if(*(limit-1)!='\\'){
 #line 177 "cwebdir/ctang-w2c.ch"
 err_print(_("! String didn't end"));loc= limit;break;
-#line 1004 "cwebdir/ctangle.w"
+#line 1012 "cwebdir/ctangle.w"
 
 }
 if(get_line()==false){
 #line 183 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in middle of string"));loc= buffer;break;
-#line 1008 "cwebdir/ctangle.w"
+#line 1016 "cwebdir/ctangle.w"
 
 }
 else if(++id_loc<=section_text_end)*id_loc= '\n';
@@ -1297,7 +1308,7 @@
 if(id_loc>=section_text_end){
 #line 189 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! String too long: "),stdout);
-#line 1026 "cwebdir/ctangle.w"
+#line 1034 "cwebdir/ctangle.w"
 
 term_write(section_text+1,25);
 err_print("...");
@@ -1307,30 +1318,31 @@
 }
 
 /*:74*/
-#line 909 "cwebdir/ctangle.w"
+#line 907 "cwebdir/ctangle.w"
 
 else if(isalpha(c)||isxalpha(c)||ishigh(c))
 /*72:*/
-#line 957 "cwebdir/ctangle.w"
+#line 954 "cwebdir/ctangle.w"
 {
 id_first= --loc;
-while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+do{
+++loc;
+}while(isalpha((eight_bits)*loc)||isdigit((eight_bits)*loc)
 ||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
 id_loc= loc;return identifier;
 }
 
 /*:72*/
-#line 911 "cwebdir/ctangle.w"
+#line 909 "cwebdir/ctangle.w"
 
 else if(c=='@')/*75:*/
-#line 1037 "cwebdir/ctangle.w"
+#line 1045 "cwebdir/ctangle.w"
 {
-c= ccode[(eight_bits)*loc++];
-switch(c){
+switch(c= ccode[(eight_bits)*loc++]){
 case ignore:continue;
 #line 195 "cwebdir/ctang-w2c.ch"
 case translit_code:err_print(_("! Use @l in limbo only"));continue;
-#line 1042 "cwebdir/ctangle.w"
+#line 1049 "cwebdir/ctangle.w"
 
 case control_text:while((c= skip_ahead())=='@');
 
@@ -1337,17 +1349,17 @@
 if(*(loc-1)!='>')
 #line 201 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in control text"));
-#line 1047 "cwebdir/ctangle.w"
+#line 1054 "cwebdir/ctangle.w"
 
 continue;
 case section_name:
 cur_section_name_char= *(loc-1);
 /*77:*/
-#line 1085 "cwebdir/ctangle.w"
+#line 1091 "cwebdir/ctangle.w"
 {
 char*k;
 /*79:*/
-#line 1105 "cwebdir/ctangle.w"
+#line 1113 "cwebdir/ctangle.w"
 
 k= section_text;
 while(true){
@@ -1354,13 +1366,13 @@
 if(loc> limit&&get_line()==false){
 #line 219 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in section name"));
-#line 1110 "cwebdir/ctangle.w"
+#line 1118 "cwebdir/ctangle.w"
 
 loc= buffer+1;break;
 }
 c= *loc;
 /*80:*/
-#line 1129 "cwebdir/ctangle.w"
+#line 1137 "cwebdir/ctangle.w"
 
 if(c=='@'){
 c= *(loc+1);
@@ -1370,13 +1382,13 @@
 if(ccode[(eight_bits)c]==new_section){
 #line 231 "cwebdir/ctang-w2c.ch"
 err_print(_("! Section name didn't end"));break;
-#line 1137 "cwebdir/ctangle.w"
+#line 1145 "cwebdir/ctangle.w"
 
 }
 if(ccode[(eight_bits)c]==section_name){
 #line 237 "cwebdir/ctang-w2c.ch"
 err_print(_("! Nesting of section names not allowed"));break;
-#line 1141 "cwebdir/ctangle.w"
+#line 1149 "cwebdir/ctangle.w"
 
 }
 *(++k)= '@';loc++;
@@ -1383,7 +1395,7 @@
 }
 
 /*:80*/
-#line 1114 "cwebdir/ctangle.w"
+#line 1122 "cwebdir/ctangle.w"
 
 loc++;if(k<section_text_end)k++;
 if(xisspace(c)){
@@ -1394,7 +1406,7 @@
 if(k>=section_text_end){
 #line 225 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! Section name too long: "),stdout);
-#line 1123 "cwebdir/ctangle.w"
+#line 1131 "cwebdir/ctangle.w"
 
 term_write(section_text+1,25);
 printf("...");mark_harmless;
@@ -1402,14 +1414,16 @@
 if(*k==' '&&k> section_text)k--;
 
 /*:79*/
-#line 1087 "cwebdir/ctangle.w"
+#line 1093 "cwebdir/ctangle.w"
 
 if(k-section_text> 3&&strncmp(k-2,"...",3)==0)
-cur_section_name= section_lookup(section_text+1,k-3,1);
-else cur_section_name= section_lookup(section_text+1,k,0);
+cur_section_name= section_lookup(section_text+1,k-3,true);
+
+else cur_section_name= section_lookup(section_text+1,k,false);
+
 if(cur_section_name_char=='(')
 /*47:*/
-#line 497 "cwebdir/ctangle.w"
+#line 501 "cwebdir/ctangle.w"
 
 {
 for(an_output_file= cur_out_file;
@@ -1418,31 +1432,29 @@
 if(an_output_file==end_output_files){
 if(cur_out_file> output_files)
 *--cur_out_file= cur_section_name;
-else{
 #line 83 "cwebdir/ctang-w2c.ch"
-overflow(_("output files"));
-#line 507 "cwebdir/ctangle.w"
+else overflow(_("output files"));
+#line 510 "cwebdir/ctangle.w"
 }
 }
-}
 
 /*:47*/
-#line 1093 "cwebdir/ctangle.w"
+#line 1101 "cwebdir/ctangle.w"
 
 return section_name;
 }
 
 /*:77*/
-#line 1051 "cwebdir/ctangle.w"
+#line 1058 "cwebdir/ctangle.w"
 
 case string:/*81:*/
-#line 1151 "cwebdir/ctangle.w"
+#line 1159 "cwebdir/ctangle.w"
 {
 id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
 while(*loc!='@'||*(loc+1)!='>')loc++;
 #line 243 "cwebdir/ctang-w2c.ch"
 if(loc>=limit)err_print(_("! Verbatim string didn't end"));
-#line 1155 "cwebdir/ctangle.w"
+#line 1163 "cwebdir/ctangle.w"
 
 id_loc= loc;loc+= 2;
 return string;
@@ -1449,21 +1461,20 @@
 }
 
 /*:81*/
-#line 1052 "cwebdir/ctangle.w"
+#line 1059 "cwebdir/ctangle.w"
 
 case ord:/*76:*/
-#line 1064 "cwebdir/ctangle.w"
+#line 1071 "cwebdir/ctangle.w"
 
 id_first= loc;
-if(*loc=='\\'){
+if(*loc=='\\')
 if(*++loc=='\'')loc++;
-}
 while(*loc!='\''){
 if(*loc=='@'){
 if(*(loc+1)!='@')
 #line 207 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in ASCII constant"));
-#line 1073 "cwebdir/ctangle.w"
+#line 1079 "cwebdir/ctangle.w"
 
 else loc++;
 }
@@ -1471,7 +1482,7 @@
 if(loc> limit){
 #line 213 "cwebdir/ctang-w2c.ch"
 err_print(_("! String didn't end"));loc= limit-1;break;
-#line 1079 "cwebdir/ctangle.w"
+#line 1085 "cwebdir/ctangle.w"
 
 }
 }
@@ -1479,7 +1490,7 @@
 return ord;
 
 /*:76*/
-#line 1053 "cwebdir/ctangle.w"
+#line 1060 "cwebdir/ctangle.w"
 
 default:return c;
 }
@@ -1486,7 +1497,7 @@
 }
 
 /*:75*/
-#line 912 "cwebdir/ctangle.w"
+#line 910 "cwebdir/ctangle.w"
 
 else if(xisspace(c)){
 if(!preprocessing||loc> limit)continue;
@@ -1493,20 +1504,21 @@
 
 else return' ';
 }
-else if(c=='#'&&loc==buffer+1)preprocessing= 1;
+else if(c=='#'&&loc==buffer+1)preprocessing= true;
 mistake:/*71:*/
-#line 935 "cwebdir/ctangle.w"
+#line 931 "cwebdir/ctangle.w"
 
 switch(c){
 case'+':if(*loc=='+')compress(plus_plus);break;
 case'-':if(*loc=='-'){compress(minus_minus);}
-else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
-else compress(minus_gt);}}break;
+else if(*loc=='>'){
+if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
+else compress(minus_gt);
+}break;
 case'.':if(*loc=='*'){compress(period_ast);}
 else if(*loc=='.'&&*(loc+1)=='.'){
 loc++;compress(dot_dot_dot);
-}
-break;
+}break;
 case':':if(*loc==':')compress(colon_colon);break;
 case'=':if(*loc=='=')compress(eq_eq);break;
 case'>':if(*loc=='='){compress(gt_eq);}
@@ -1519,7 +1531,7 @@
 }
 
 /*:71*/
-#line 919 "cwebdir/ctangle.w"
+#line 917 "cwebdir/ctangle.w"
 
 return c;
 }
@@ -1526,7 +1538,7 @@
 }
 
 /*:69*//*83:*/
-#line 1186 "cwebdir/ctangle.w"
+#line 1193 "cwebdir/ctangle.w"
 
 static void
 scan_repl(
@@ -1533,9 +1545,10 @@
 eight_bits t)
 {
 sixteen_bits a;
-if(t==section_name){/*85:*/
-#line 1214 "cwebdir/ctangle.w"
+if(t==section_name)/*85:*/
+#line 1221 "cwebdir/ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1547,13 +1560,14 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1192 "cwebdir/ctangle.w"
-}
+#line 1199 "cwebdir/ctangle.w"
+
 while(true)switch(a= get_next()){
 /*86:*/
-#line 1227 "cwebdir/ctangle.w"
+#line 1236 "cwebdir/ctangle.w"
 
 case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
 app_repl((a/0400)+0200);
@@ -1561,7 +1575,7 @@
 case section_name:if(t!=section_name)goto done;
 else{
 /*87:*/
-#line 1260 "cwebdir/ctangle.w"
+#line 1269 "cwebdir/ctangle.w"
 {
 char*try_loc= loc;
 while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1569,7 +1583,7 @@
 while(*try_loc==' '&&try_loc<limit)try_loc++;
 #line 273 "cwebdir/ctang-w2c.ch"
 if(*try_loc=='=')err_print(_("! Missing `@ ' before a named section"));
-#line 1266 "cwebdir/ctangle.w"
+#line 1275 "cwebdir/ctangle.w"
 
 
 
@@ -1576,14 +1590,15 @@
 }
 
 /*:87*/
-#line 1233 "cwebdir/ctangle.w"
+#line 1242 "cwebdir/ctangle.w"
 
 a= cur_section_name-name_dir;
 app_repl((a/0400)+0250);
 app_repl(a%0400);
 /*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1595,14 +1610,15 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1237 "cwebdir/ctangle.w"
+#line 1246 "cwebdir/ctangle.w"
 break;
 }
 #line 261 "cwebdir/ctang-w2c.ch"
 case output_defs_code:if(t!=section_name)err_print(_("! Misplaced @h"));
-#line 1240 "cwebdir/ctangle.w"
+#line 1249 "cwebdir/ctangle.w"
 
 else{
 output_defs_seen= true;
@@ -1610,8 +1626,9 @@
 app_repl((a/0400)+0200);
 app_repl(a%0400);
 /*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1623,15 +1640,16 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1246 "cwebdir/ctangle.w"
+#line 1255 "cwebdir/ctangle.w"
 
 }
 break;
 case constant:case string:
 /*88:*/
-#line 1271 "cwebdir/ctangle.w"
+#line 1286 "cwebdir/ctangle.w"
 
 app_repl(a);
 while(id_first<id_loc){
@@ -1639,19 +1657,21 @@
 if(*(id_first+1)=='@')id_first++;
 #line 279 "cwebdir/ctang-w2c.ch"
 else err_print(_("! Double @ should be used in string"));
-#line 1277 "cwebdir/ctangle.w"
+#line 1292 "cwebdir/ctangle.w"
 
 }
+else if(a==constant&&*id_first=='\''&&!keep_digit_separators)
+id_first++;
 app_repl(*id_first++);
 }
 app_repl(a);break;
 
 /*:88*/
-#line 1250 "cwebdir/ctangle.w"
+#line 1259 "cwebdir/ctangle.w"
 
 case ord:
 /*89:*/
-#line 1287 "cwebdir/ctangle.w"
+#line 1304 "cwebdir/ctangle.w"
 {
 int c= (eight_bits)*id_first;
 if(c=='\\'){
@@ -1690,7 +1710,7 @@
 case'\"':c= '\"';break;
 #line 285 "cwebdir/ctang-w2c.ch"
 default:err_print(_("! Unrecognized escape sequence"));
-#line 1324 "cwebdir/ctangle.w"
+#line 1341 "cwebdir/ctangle.w"
 
 }
 }
@@ -1704,19 +1724,19 @@
 break;
 
 /*:89*/
-#line 1252 "cwebdir/ctangle.w"
+#line 1261 "cwebdir/ctangle.w"
 
 case definition:case format_code:case begin_C:if(t!=section_name)goto done;
 else{
 #line 267 "cwebdir/ctang-w2c.ch"
 err_print(_("! @d, @f and @c are ignored in C text"));continue;
-#line 1256 "cwebdir/ctangle.w"
+#line 1265 "cwebdir/ctangle.w"
 
 }
 case new_section:goto done;
 
 /*:86*/
-#line 1197 "cwebdir/ctangle.w"
+#line 1204 "cwebdir/ctangle.w"
 
 case')':app_repl(a);
 if(t==macro)app_repl(' ');
@@ -1726,12 +1746,12 @@
 done:next_control= (eight_bits)a;
 #line 255 "cwebdir/ctang-w2c.ch"
 if(text_ptr> text_info_end)overflow(_("text"));
-#line 1205 "cwebdir/ctangle.w"
+#line 1212 "cwebdir/ctangle.w"
 cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
 }
 
 /*:83*//*90:*/
-#line 1346 "cwebdir/ctangle.w"
+#line 1363 "cwebdir/ctangle.w"
 
 static void
 scan_section(void)
@@ -1743,10 +1763,10 @@
 if(*(loc-1)=='*'&&show_progress){
 printf("*%d",section_count);update_terminal;
 }
-next_control= 0;
+next_control= ignore;
 while(true){
 /*92:*/
-#line 1387 "cwebdir/ctangle.w"
+#line 1404 "cwebdir/ctangle.w"
 
 while(next_control<definition)
 
@@ -1755,17 +1775,17 @@
 }
 
 /*:92*/
-#line 1360 "cwebdir/ctangle.w"
+#line 1377 "cwebdir/ctangle.w"
 
 if(next_control==definition){
 /*93:*/
-#line 1394 "cwebdir/ctangle.w"
+#line 1411 "cwebdir/ctangle.w"
 {
 while((next_control= get_next())=='\n');
 if(next_control!=identifier){
 #line 291 "cwebdir/ctang-w2c.ch"
 err_print(_("! Definition flushed, must start with identifier"));
-#line 1398 "cwebdir/ctangle.w"
+#line 1415 "cwebdir/ctangle.w"
 
 continue;
 }
@@ -1780,7 +1800,7 @@
 }
 
 /*:93*/
-#line 1362 "cwebdir/ctangle.w"
+#line 1379 "cwebdir/ctangle.w"
 
 continue;
 }
@@ -1790,7 +1810,7 @@
 if(next_control==section_name){
 p= cur_section_name;
 /*94:*/
-#line 1419 "cwebdir/ctangle.w"
+#line 1436 "cwebdir/ctangle.w"
 
 while((next_control= get_next())=='+');
 if(next_control!='='&&next_control!=eq_eq)
@@ -1797,7 +1817,7 @@
 continue;
 
 /*:94*/
-#line 1370 "cwebdir/ctangle.w"
+#line 1387 "cwebdir/ctangle.w"
 
 break;
 }
@@ -1805,22 +1825,22 @@
 }
 no_where= print_where= false;
 /*95:*/
-#line 1424 "cwebdir/ctangle.w"
+#line 1441 "cwebdir/ctangle.w"
 
 /*96:*/
-#line 1429 "cwebdir/ctangle.w"
+#line 1446 "cwebdir/ctangle.w"
 
 store_two_bytes((sixteen_bits)(0150000+section_count));
 
 
 /*:96*/
-#line 1425 "cwebdir/ctangle.w"
+#line 1442 "cwebdir/ctangle.w"
 
 scan_repl(section_name);
 /*97:*/
-#line 1433 "cwebdir/ctangle.w"
+#line 1450 "cwebdir/ctangle.w"
 
-if(p==name_dir||p==0){
+if(p==name_dir||p==NULL){
 (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
 }
 else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
@@ -1835,16 +1855,16 @@
 
 
 /*:97*/
-#line 1427 "cwebdir/ctangle.w"
+#line 1444 "cwebdir/ctangle.w"
 
 
 /*:95*/
-#line 1376 "cwebdir/ctangle.w"
+#line 1393 "cwebdir/ctangle.w"
 
 }
 
 /*:90*//*98:*/
-#line 1448 "cwebdir/ctangle.w"
+#line 1465 "cwebdir/ctangle.w"
 
 static void
 phase_one(void){
@@ -1858,7 +1878,7 @@
 }
 
 /*:98*//*100:*/
-#line 1465 "cwebdir/ctangle.w"
+#line 1482 "cwebdir/ctangle.w"
 
 static void
 skip_limbo(void)
@@ -1873,7 +1893,7 @@
 if(ccode[(eight_bits)c]==new_section)break;
 switch(ccode[(eight_bits)c]){
 case translit_code:/*102:*/
-#line 1496 "cwebdir/ctangle.w"
+#line 1513 "cwebdir/ctangle.w"
 
 while(xisspace(*loc)&&loc<limit)loc++;
 loc+= 3;
@@ -1881,7 +1901,7 @@
 ||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))
 #line 309 "cwebdir/ctang-w2c.ch"
 err_print(_("! Improper hex number following @l"));
-#line 1502 "cwebdir/ctangle.w"
+#line 1519 "cwebdir/ctangle.w"
 
 else{
 unsigned int i;
@@ -1893,7 +1913,7 @@
 if(loc-beg>=translit_length)
 #line 315 "cwebdir/ctang-w2c.ch"
 err_print(_("! Replacement string in @l too long"));
-#line 1512 "cwebdir/ctangle.w"
+#line 1529 "cwebdir/ctangle.w"
 
 else{
 strncpy(translit[i-0200],beg,(size_t)(loc-beg));
@@ -1902,7 +1922,7 @@
 }
 
 /*:102*/
-#line 1478 "cwebdir/ctangle.w"
+#line 1495 "cwebdir/ctangle.w"
 break;
 case format_code:case'@':break;
 case control_text:if(c=='q'||c=='Q'){
@@ -1910,13 +1930,13 @@
 if(*(loc-1)!='>')
 #line 297 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in control text"));
-#line 1484 "cwebdir/ctangle.w"
+#line 1501 "cwebdir/ctangle.w"
 
 break;
 }
 #line 303 "cwebdir/ctang-w2c.ch"
 default:err_print(_("! Double @ should be used in limbo"));
-#line 1488 "cwebdir/ctangle.w"
+#line 1505 "cwebdir/ctangle.w"
 
 }
 }
@@ -1924,7 +1944,7 @@
 }
 
 /*:100*//*103:*/
-#line 1522 "cwebdir/ctangle.w"
+#line 1539 "cwebdir/ctangle.w"
 
 void
 print_stats(void){
@@ -1937,7 +1957,7 @@
 printf(_("%ld bytes (out of %ld)\n"),
 (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
 printf(_("%ld tokens (out of %ld)\n"),
-#line 1533 "cwebdir/ctangle.w"
+#line 1550 "cwebdir/ctangle.w"
 (ptrdiff_t)(tok_ptr-tok_mem),(long)max_toks);
 }
 

Modified: trunk/Build/source/texk/web2c/cwebboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/cwebboot.cin	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebboot.cin	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
 /*1:*/
-#line 66 "cwebdir/common.w"
+#line 62 "cwebdir/common.w"
 
 /*3:*/
-#line 53 "cwebdir/comm-w2c.h"
+#line 51 "cwebdir/comm-w2c.h"
 
 #ifndef HAVE_GETTEXT
 #define HAVE_GETTEXT 0
@@ -23,7 +23,7 @@
 #include <string.h>  
 
 /*:3*//*89:*/
-#line 709 "cwebdir/comm-w2c.ch"
+#line 712 "cwebdir/comm-w2c.ch"
 
 #if HAVE_GETTEXT
 #include <locale.h>  
@@ -34,7 +34,7 @@
 #endif
 
 /*:89*//*91:*/
-#line 756 "cwebdir/comm-w2c.ch"
+#line 759 "cwebdir/comm-w2c.ch"
 
 typedef bool boolean;
 #define HAVE_BOOLEAN
@@ -44,13 +44,13 @@
 #include <lib/lib.h>  
 
 /*:91*//*94:*/
-#line 795 "cwebdir/comm-w2c.ch"
+#line 798 "cwebdir/comm-w2c.ch"
 
 #define CWEB
 #include "help.h" 
 
 /*:94*/
-#line 67 "cwebdir/common.w"
+#line 63 "cwebdir/common.w"
 
 #define _(S) gettext(S)  \
 
@@ -70,13 +70,19 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) )  \
+#define compress(c) if(loc++<=limit) return c \
 
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
+ \
+
 #define max_include_depth 10 \
 
 #define max_file_name_length 1024
@@ -106,15 +112,12 @@
 #define show_progress flags['p']
 #define show_stats flags['s']
 #define show_happiness flags['h']
-#define temporary_output flags['t']
-#define make_xrefs flags['x'] \
+#define make_xrefs flags['x']
+#define check_for_change flags['c'] \
 
 #define update_terminal fflush(stdout) 
 #define new_line putchar('\n') 
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
-#define C_printf(c,a) fprintf(C_file,c,a) 
-#define C_putc(c) putc(c,C_file)  \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)  \
 
 #define max_bytes 1000000 \
 
@@ -131,7 +134,8 @@
 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
 strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) )  \
 
-#define if_section_start_make_pending(b) {*limit= '!'; \
+#define if_section_start_make_pending(b) { \
+*limit= '!'; \
 for(loc= buffer;xisspace(*loc) ;loc++) ; \
 *limit= ' '; \
 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
@@ -171,10 +175,10 @@
 #define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true)  \
 
 
-#line 68 "cwebdir/common.w"
+#line 64 "cwebdir/common.w"
 
 /*2:*/
-#line 35 "cwebdir/comm-w2c.h"
+#line 33 "cwebdir/comm-w2c.h"
 
 typedef bool boolean;
 typedef uint8_t eight_bits;
@@ -194,7 +198,7 @@
 extern char*id_loc;
 
 /*:4*//*5:*/
-#line 105 "cwebdir/comm-w2c.h"
+#line 109 "cwebdir/comm-w2c.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -202,7 +206,7 @@
 extern char*limit;
 
 /*:5*//*6:*/
-#line 122 "cwebdir/comm-w2c.h"
+#line 126 "cwebdir/comm-w2c.h"
 
 extern int include_depth;
 extern FILE*file[];
@@ -219,7 +223,7 @@
 extern boolean web_file_open;
 
 /*:6*//*8:*/
-#line 143 "cwebdir/comm-w2c.h"
+#line 147 "cwebdir/comm-w2c.h"
 
 extern sixteen_bits section_count;
 extern boolean changed_section[];
@@ -227,7 +231,7 @@
 extern boolean print_where;
 
 /*:8*//*9:*/
-#line 157 "cwebdir/comm-w2c.h"
+#line 161 "cwebdir/comm-w2c.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -252,12 +256,12 @@
 extern hash_pointer h;
 
 /*:9*//*11:*/
-#line 201 "cwebdir/comm-w2c.h"
+#line 205 "cwebdir/comm-w2c.h"
 
 extern int history;
 
 /*:11*//*13:*/
-#line 218 "cwebdir/comm-w2c.h"
+#line 222 "cwebdir/comm-w2c.h"
 
 extern int argc;
 extern char**argv;
@@ -269,7 +273,7 @@
 extern const char*use_language;
 
 /*:13*//*14:*/
-#line 235 "cwebdir/comm-w2c.h"
+#line 237 "cwebdir/comm-w2c.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
@@ -279,22 +283,22 @@
 extern FILE*check_file;
 
 /*:14*/
-#line 69 "cwebdir/common.w"
+#line 65 "cwebdir/common.w"
 
 /*18:*/
-#line 83 "cwebdir/common.w"
+#line 79 "cwebdir/common.w"
 
 #line 72 "cwebdir/comm-w2c.ch"
 cweb program;
-#line 85 "cwebdir/common.w"
+#line 81 "cwebdir/common.w"
 
 /*:18*//*19:*/
-#line 92 "cwebdir/common.w"
+#line 88 "cwebdir/common.w"
 
 int phase;
 
 /*:19*//*21:*/
-#line 130 "cwebdir/common.w"
+#line 126 "cwebdir/common.w"
 
 char section_text[longest_name+1];
 char*section_text_end= section_text+longest_name;
@@ -302,7 +306,7 @@
 char*id_loc;
 
 /*:21*//*22:*/
-#line 150 "cwebdir/common.w"
+#line 146 "cwebdir/common.w"
 
 char buffer[long_buf_size];
 char*buffer_end= buffer+buf_size-2;
@@ -310,7 +314,7 @@
 char*limit= buffer;
 
 /*:22*//*25:*/
-#line 194 "cwebdir/common.w"
+#line 190 "cwebdir/common.w"
 
 int include_depth;
 FILE*file[max_include_depth];
@@ -318,7 +322,7 @@
 char file_name[max_include_depth][max_file_name_length];
 
 char change_file_name[max_file_name_length];
-#line 202 "cwebdir/common.w"
+#line 198 "cwebdir/common.w"
 int line[max_include_depth];
 int change_line;
 int change_depth;
@@ -327,13 +331,13 @@
 boolean web_file_open= false;
 
 /*:25*//*26:*/
-#line 220 "cwebdir/common.w"
+#line 216 "cwebdir/common.w"
 
 static char change_buffer[buf_size];
 static char*change_limit;
 
 /*:26*//*37:*/
-#line 399 "cwebdir/common.w"
+#line 396 "cwebdir/common.w"
 
 sixteen_bits section_count;
 boolean changed_section[max_sections];
@@ -342,7 +346,7 @@
 boolean print_where= false;
 
 /*:37*//*43:*/
-#line 596 "cwebdir/common.w"
+#line 593 "cwebdir/common.w"
 
 char byte_mem[max_bytes];
 char*byte_mem_end= byte_mem+max_bytes-1;
@@ -350,13 +354,13 @@
 name_pointer name_dir_end= name_dir+max_names-1;
 
 /*:43*//*44:*/
-#line 607 "cwebdir/common.w"
+#line 604 "cwebdir/common.w"
 
 char*byte_ptr;
 name_pointer name_ptr;
 
 /*:44*//*46:*/
-#line 627 "cwebdir/common.w"
+#line 624 "cwebdir/common.w"
 
 name_pointer hash[hash_size];
 hash_pointer hash_end= hash+hash_size-1;
@@ -363,12 +367,12 @@
 hash_pointer h;
 
 /*:46*//*65:*/
-#line 1014 "cwebdir/common.w"
+#line 1006 "cwebdir/common.w"
 
 int history= spotless;
 
 /*:65*//*73:*/
-#line 1135 "cwebdir/common.w"
+#line 1129 "cwebdir/common.w"
 
 int argc;
 char**argv;
@@ -375,35 +379,35 @@
 char C_file_name[max_file_name_length];
 char tex_file_name[max_file_name_length];
 char idx_file_name[max_file_name_length];
-#line 431 "cwebdir/comm-w2c.ch"
+#line 441 "cwebdir/comm-w2c.ch"
 char scn_file_name[max_file_name_length];
 char check_file_name[max_file_name_length];
-#line 1142 "cwebdir/common.w"
+#line 1136 "cwebdir/common.w"
 boolean flags[128];
 
 /*:73*//*83:*/
-#line 1282 "cwebdir/common.w"
+#line 1273 "cwebdir/common.w"
 
 FILE*C_file;
 FILE*tex_file;
 FILE*idx_file;
-#line 569 "cwebdir/comm-w2c.ch"
+#line 572 "cwebdir/comm-w2c.ch"
 FILE*scn_file;
 FILE*check_file;
-#line 576 "cwebdir/comm-w2c.ch"
+#line 579 "cwebdir/comm-w2c.ch"
 FILE*active_file;
 char*found_filename;
-#line 1288 "cwebdir/common.w"
+#line 1279 "cwebdir/common.w"
 
-#line 593 "cwebdir/comm-w2c.ch"
+#line 596 "cwebdir/comm-w2c.ch"
 /*:83*//*86:*/
-#line 638 "cwebdir/comm-w2c.ch"
+#line 641 "cwebdir/comm-w2c.ch"
 
 const char*use_language= "";
 
 
 /*:86*//*87:*/
-#line 651 "cwebdir/comm-w2c.ch"
+#line 654 "cwebdir/comm-w2c.ch"
 
 char cb_banner[max_banner];
 string texmf_locale;
@@ -413,10 +417,10 @@
 char separators[]= SEPARATORS;
 
 /*:87*/
-#line 70 "cwebdir/common.w"
+#line 66 "cwebdir/common.w"
 
 /*7:*/
-#line 137 "cwebdir/comm-w2c.h"
+#line 141 "cwebdir/comm-w2c.h"
 
 extern boolean get_line(void);
 extern void check_complete(void);
@@ -423,12 +427,12 @@
 extern void reset_input(void);
 
 /*:7*//*10:*/
-#line 180 "cwebdir/comm-w2c.h"
+#line 184 "cwebdir/comm-w2c.h"
 
 extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
 extern name_pointer id_lookup(const char*,const char*,char);
 
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
 extern void init_node(name_pointer);
 extern void init_p(name_pointer,eight_bits);
 extern void print_prefix_name(name_pointer);
@@ -436,7 +440,7 @@
 extern void sprint_section_name(char*,name_pointer);
 
 /*:10*//*12:*/
-#line 204 "cwebdir/comm-w2c.h"
+#line 208 "cwebdir/comm-w2c.h"
 
 extern int wrap_up(void);
 extern void err_print(const char*);
@@ -444,7 +448,7 @@
 extern void overflow(const char*);
 
 /*:12*//*15:*/
-#line 244 "cwebdir/comm-w2c.h"
+#line 246 "cwebdir/comm-w2c.h"
 
 extern void common_init(void);
 extern void print_stats(void);
@@ -451,45 +455,45 @@
 extern void cb_show_banner(void);
 
 /*:15*//*24:*/
-#line 180 "cwebdir/common.w"
+#line 176 "cwebdir/common.w"
 static boolean input_ln(FILE*);
 
 /*:24*//*28:*/
-#line 241 "cwebdir/common.w"
+#line 237 "cwebdir/common.w"
 static void prime_the_change_buffer(void);
 
 /*:28*//*33:*/
-#line 340 "cwebdir/common.w"
+#line 337 "cwebdir/common.w"
 static void check_change(void);
 
 /*:33*//*55:*/
-#line 774 "cwebdir/common.w"
+#line 767 "cwebdir/common.w"
 
 static int web_strcmp(char*,int,char*,int);
-static name_pointer add_section_name(name_pointer,int,char*,char*,int);
-static void extend_section_name(name_pointer,char*,char*,int);
+static name_pointer add_section_name(name_pointer,int,char*,char*,boolean);
+static void extend_section_name(name_pointer,char*,char*,boolean);
 
 /*:55*//*64:*/
-#line 1002 "cwebdir/common.w"
+#line 994 "cwebdir/common.w"
 static int section_name_cmp(char**,int,name_pointer);
 
 /*:64*//*76:*/
-#line 1197 "cwebdir/common.w"
+#line 1190 "cwebdir/common.w"
 static void scan_args(void);
 
-#line 496 "cwebdir/comm-w2c.ch"
+#line 502 "cwebdir/comm-w2c.ch"
 /*:76*//*96:*/
-#line 808 "cwebdir/comm-w2c.ch"
+#line 811 "cwebdir/comm-w2c.ch"
 
 static void cb_usage(const_string str);
 static void cb_usagehelp(const_string*message,const_string bug_email);
 
 /*:96*/
-#line 71 "cwebdir/common.w"
+#line 67 "cwebdir/common.w"
 
 
 /*:1*//*20:*/
-#line 99 "cwebdir/common.w"
+#line 95 "cwebdir/common.w"
 
 void
 common_init(void)
@@ -496,7 +500,7 @@
 {
 #line 78 "cwebdir/comm-w2c.ch"
 /*45:*/
-#line 611 "cwebdir/common.w"
+#line 608 "cwebdir/common.w"
 
 name_dir->byte_start= byte_ptr= byte_mem;
 name_ptr= name_dir+1;
@@ -504,7 +508,7 @@
 root= NULL;
 
 /*:45*//*47:*/
-#line 634 "cwebdir/common.w"
+#line 631 "cwebdir/common.w"
 
 for(h= hash;h<=hash_end;*h++= NULL);
 
@@ -512,7 +516,7 @@
 #line 78 "cwebdir/comm-w2c.ch"
 
 /*92:*/
-#line 770 "cwebdir/comm-w2c.ch"
+#line 773 "cwebdir/comm-w2c.ch"
 
 kpse_set_program_name(argv[0],"cweb");
 
@@ -521,7 +525,7 @@
 
 #line 85 "cwebdir/comm-w2c.ch"
 /*90:*/
-#line 718 "cwebdir/comm-w2c.ch"
+#line 721 "cwebdir/comm-w2c.ch"
 
 setlocale(LC_MESSAGES,setlocale(LC_CTYPE,""));
 texmf_locale= kpse_var_expand("${TEXMFLOCALEDIR}");
@@ -540,20 +544,20 @@
 #line 85 "cwebdir/comm-w2c.ch"
 
 /*74:*/
-#line 1148 "cwebdir/common.w"
+#line 1142 "cwebdir/common.w"
 
-#line 438 "cwebdir/comm-w2c.ch"
+#line 448 "cwebdir/comm-w2c.ch"
 make_xrefs= true;
-temporary_output= true;
-#line 1150 "cwebdir/common.w"
+check_for_change= true;
+#line 1144 "cwebdir/common.w"
 show_stats= false;
 
 /*:74*/
 #line 86 "cwebdir/comm-w2c.ch"
 
-#line 105 "cwebdir/common.w"
+#line 101 "cwebdir/common.w"
 /*84:*/
-#line 593 "cwebdir/comm-w2c.ch"
+#line 596 "cwebdir/comm-w2c.ch"
 
 scan_args();
 if(program==ctangle){
@@ -584,16 +588,16 @@
 if((tex_file= fopen(check_file_name,"wb"))==NULL)
 fatal(_("! Cannot open output file "),check_file_name);
 }
-#line 1300 "cwebdir/common.w"
+#line 1291 "cwebdir/common.w"
 
-#line 628 "cwebdir/comm-w2c.ch"
+#line 631 "cwebdir/comm-w2c.ch"
 /*:84*/
-#line 105 "cwebdir/common.w"
+#line 101 "cwebdir/common.w"
 
 }
 
 /*:20*//*23:*/
-#line 160 "cwebdir/common.w"
+#line 156 "cwebdir/common.w"
 
 static boolean input_ln(
 FILE*fp)
@@ -605,12 +609,12 @@
 while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
 #line 92 "cwebdir/comm-w2c.ch"
 if((*(k++)= c)!=' '&&c!='\r')limit= k;
-#line 170 "cwebdir/common.w"
+#line 166 "cwebdir/common.w"
 if(k> buffer_end)
 if((c= getc(fp))!=EOF&&c!='\n'){
 #line 98 "cwebdir/comm-w2c.ch"
 ungetc(c,fp);loc= buffer;err_print(_("! Input line too long"));
-#line 173 "cwebdir/common.w"
+#line 169 "cwebdir/common.w"
 
 }
 if(c==EOF&&limit==buffer)return false;
@@ -619,7 +623,7 @@
 }
 
 /*:23*//*27:*/
-#line 231 "cwebdir/common.w"
+#line 227 "cwebdir/common.w"
 
 static void
 prime_the_change_buffer(void)
@@ -626,7 +630,7 @@
 {
 change_limit= change_buffer;
 /*29:*/
-#line 247 "cwebdir/common.w"
+#line 243 "cwebdir/common.w"
 
 while(true){
 change_line++;
@@ -639,16 +643,16 @@
 loc= buffer+2;
 #line 109 "cwebdir/comm-w2c.ch"
 err_print(_("! Missing @x in change file"));
-#line 258 "cwebdir/common.w"
+#line 254 "cwebdir/common.w"
 
 }
 }
 
 /*:29*/
-#line 236 "cwebdir/common.w"
+#line 232 "cwebdir/common.w"
 
 /*30:*/
-#line 264 "cwebdir/common.w"
+#line 260 "cwebdir/common.w"
 
 do{
 change_line++;
@@ -655,7 +659,7 @@
 if(!input_ln(change_file)){
 #line 115 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended after @x"));
-#line 269 "cwebdir/common.w"
+#line 265 "cwebdir/common.w"
 
 return;
 }
@@ -662,10 +666,10 @@
 }while(limit==buffer);
 
 /*:30*/
-#line 237 "cwebdir/common.w"
+#line 233 "cwebdir/common.w"
 
 /*31:*/
-#line 274 "cwebdir/common.w"
+#line 270 "cwebdir/common.w"
 
 {
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -673,12 +677,12 @@
 }
 
 /*:31*/
-#line 238 "cwebdir/common.w"
+#line 234 "cwebdir/common.w"
 
 }
 
 /*:27*//*32:*/
-#line 302 "cwebdir/common.w"
+#line 299 "cwebdir/common.w"
 
 static void
 check_change(void)
@@ -691,11 +695,11 @@
 if(!change_pending)changed_section[section_count]= true;
 }
 while(true){
-changing= true;print_where= true;change_line++;
+changing= print_where= true;change_line++;
 if(!input_ln(change_file)){
 #line 121 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended before @y"));
-#line 317 "cwebdir/common.w"
+#line 314 "cwebdir/common.w"
 
 change_limit= change_buffer;changing= false;
 return;
@@ -703,12 +707,12 @@
 if(limit> buffer+1&&buffer[0]=='@'){
 char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
 /*34:*/
-#line 342 "cwebdir/common.w"
+#line 339 "cwebdir/common.w"
 
 if(xyz_code=='x'||xyz_code=='z'){
 #line 133 "cwebdir/comm-w2c.ch"
 loc= buffer+2;err_print(_("! Where is the matching @y?"));
-#line 345 "cwebdir/common.w"
+#line 342 "cwebdir/common.w"
 
 }
 else if(xyz_code=='y'){
@@ -717,7 +721,7 @@
 printf("\n! Hmm... %d ",n);
 #line 139 "cwebdir/comm-w2c.ch"
 err_print(_("of the preceding lines failed to match"));
-#line 352 "cwebdir/common.w"
+#line 349 "cwebdir/common.w"
 
 }
 change_depth= include_depth;
@@ -725,11 +729,11 @@
 }
 
 /*:34*/
-#line 324 "cwebdir/common.w"
+#line 321 "cwebdir/common.w"
 
 }
 /*31:*/
-#line 274 "cwebdir/common.w"
+#line 270 "cwebdir/common.w"
 
 {
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -737,7 +741,7 @@
 }
 
 /*:31*/
-#line 326 "cwebdir/common.w"
+#line 323 "cwebdir/common.w"
 
 changing= false;cur_line++;
 while(!input_ln(cur_file)){
@@ -744,7 +748,7 @@
 if(include_depth==0){
 #line 127 "cwebdir/comm-w2c.ch"
 err_print(_("! CWEB file ended during a change"));
-#line 331 "cwebdir/common.w"
+#line 328 "cwebdir/common.w"
 
 input_has_ended= true;return;
 }
@@ -755,7 +759,7 @@
 }
 
 /*:32*//*35:*/
-#line 362 "cwebdir/common.w"
+#line 359 "cwebdir/common.w"
 
 void
 reset_input(void)
@@ -762,13 +766,13 @@
 {
 limit= buffer;loc= buffer+1;buffer[0]= ' ';
 /*36:*/
-#line 377 "cwebdir/common.w"
+#line 374 "cwebdir/common.w"
 
 #line 149 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(web_file_name))==NULL||
-(web_file= fopen(found_filename,"r"))==NULL){
+if((found_filename= kpse_find_cweb(web_file_name))==NULL
+||(web_file= fopen(found_filename,"r"))==NULL)
 fatal(_("! Cannot open input file "),web_file_name);
-}else if(strlen(found_filename)<max_file_name_length){
+else if(strlen(found_filename)<max_file_name_length){
 
 if(strcmp(web_file_name,found_filename))
 strcpy(web_file_name,found_filename+
@@ -775,15 +779,15 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 383 "cwebdir/common.w"
+#line 380 "cwebdir/common.w"
 
 
 web_file_open= true;
 #line 165 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(change_file_name))==NULL||
-(change_file= fopen(found_filename,"r"))==NULL){
+if((found_filename= kpse_find_cweb(change_file_name))==NULL
+||(change_file= fopen(found_filename,"r"))==NULL)
 fatal(_("! Cannot open change file "),change_file_name);
-}else if(strlen(found_filename)<max_file_name_length){
+else if(strlen(found_filename)<max_file_name_length){
 
 if(strcmp(change_file_name,found_filename))
 strcpy(change_file_name,found_filename+
@@ -790,19 +794,19 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 388 "cwebdir/common.w"
+#line 385 "cwebdir/common.w"
 
 /*:36*/
-#line 367 "cwebdir/common.w"
+#line 364 "cwebdir/common.w"
 
-include_depth= 0;cur_line= 0;change_line= 0;
+include_depth= cur_line= change_line= 0;
 change_depth= include_depth;
-changing= 1;prime_the_change_buffer();changing= !changing;
+changing= true;prime_the_change_buffer();changing= !changing;
 limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= false;
 }
 
 /*:35*//*38:*/
-#line 406 "cwebdir/common.w"
+#line 403 "cwebdir/common.w"
 
 boolean get_line(void)
 {
@@ -809,13 +813,13 @@
 restart:
 if(changing&&include_depth==change_depth)
 /*41:*/
-#line 514 "cwebdir/common.w"
+#line 511 "cwebdir/common.w"
 {
 change_line++;
 if(!input_ln(change_file)){
 #line 274 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended without @z"));
-#line 518 "cwebdir/common.w"
+#line 515 "cwebdir/common.w"
 
 buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
 }
@@ -833,7 +837,7 @@
 loc= buffer+2;
 #line 280 "cwebdir/comm-w2c.ch"
 err_print(_("! Where is the matching @z?"));
-#line 534 "cwebdir/common.w"
+#line 531 "cwebdir/common.w"
 
 }
 else if(buffer[1]=='z'){
@@ -844,11 +848,11 @@
 }
 
 /*:41*/
-#line 411 "cwebdir/common.w"
+#line 408 "cwebdir/common.w"
 
 if(!changing||include_depth> change_depth){
 /*40:*/
-#line 497 "cwebdir/common.w"
+#line 494 "cwebdir/common.w"
 {
 cur_line++;
 while(!input_ln(cur_file)){
@@ -867,7 +871,7 @@
 }
 
 /*:40*/
-#line 413 "cwebdir/common.w"
+#line 410 "cwebdir/common.w"
 
 if(changing&&include_depth==change_depth)goto restart;
 }
@@ -879,7 +883,7 @@
 if(loc>=limit){
 #line 180 "cwebdir/comm-w2c.ch"
 err_print(_("! Include file name not given"));
-#line 423 "cwebdir/common.w"
+#line 420 "cwebdir/common.w"
 
 goto restart;
 }
@@ -886,18 +890,18 @@
 if(include_depth>=max_include_depth-1){
 #line 186 "cwebdir/comm-w2c.ch"
 err_print(_("! Too many nested includes"));
-#line 428 "cwebdir/common.w"
+#line 425 "cwebdir/common.w"
 
 goto restart;
 }
 include_depth++;
 /*39:*/
-#line 451 "cwebdir/common.w"
+#line 448 "cwebdir/common.w"
 {
 #line 223 "cwebdir/comm-w2c.ch"
 char*cur_file_name_end= cur_file_name+max_file_name_length-1;
 char*k= cur_file_name;
-#line 456 "cwebdir/common.w"
+#line 453 "cwebdir/common.w"
 
 if(*loc=='"'){
 loc++;
@@ -909,8 +913,8 @@
 
 *k= '\0';
 #line 230 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(cur_file_name))!=NULL&&
-(cur_file= fopen(found_filename,"r"))!=NULL){
+if((found_filename= kpse_find_cweb(cur_file_name))!=NULL
+&&(cur_file= fopen(found_filename,"r"))!=NULL){
 
 if(strlen(found_filename)<max_file_name_length){
 if(strcmp(cur_file_name,found_filename))
@@ -918,17 +922,17 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 467 "cwebdir/common.w"
+#line 464 "cwebdir/common.w"
 cur_line= 0;print_where= true;
 goto restart;
 }
 #line 268 "cwebdir/comm-w2c.ch"
 include_depth--;err_print(_("! Cannot open include file"));goto restart;
-#line 495 "cwebdir/common.w"
+#line 492 "cwebdir/common.w"
 }
 
 /*:39*/
-#line 432 "cwebdir/common.w"
+#line 429 "cwebdir/common.w"
 
 }
 return true;
@@ -936,7 +940,7 @@
 
 #line 201 "cwebdir/comm-w2c.ch"
 /*:38*//*42:*/
-#line 546 "cwebdir/common.w"
+#line 543 "cwebdir/common.w"
 
 void
 check_complete(void){
@@ -946,13 +950,13 @@
 changing= true;change_depth= include_depth;loc= buffer;
 #line 286 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file entry did not match"));
-#line 554 "cwebdir/common.w"
+#line 551 "cwebdir/common.w"
 
 }
 }
 
 /*:42*//*48:*/
-#line 639 "cwebdir/common.w"
+#line 636 "cwebdir/common.w"
 
 name_pointer
 id_lookup(
@@ -967,7 +971,7 @@
 if(last==NULL)for(last= first;*last!='\0';last++);
 l= (int)(last-first);
 /*49:*/
-#line 662 "cwebdir/common.w"
+#line 659 "cwebdir/common.w"
 
 h= (eight_bits)*i;
 while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
@@ -974,10 +978,10 @@
 
 
 /*:49*/
-#line 652 "cwebdir/common.w"
+#line 649 "cwebdir/common.w"
 
 /*50:*/
-#line 670 "cwebdir/common.w"
+#line 667 "cwebdir/common.w"
 
 p= hash[h];
 while(p&&!names_match(p,first,l,t))p= p->link;
@@ -987,15 +991,15 @@
 }
 
 /*:50*/
-#line 653 "cwebdir/common.w"
+#line 650 "cwebdir/common.w"
 
 if(p==name_ptr)/*51:*/
-#line 681 "cwebdir/common.w"
+#line 679 "cwebdir/common.w"
 {
 #line 293 "cwebdir/comm-w2c.ch"
 if(byte_ptr+l> byte_mem_end)overflow(_("byte memory"));
 if(name_ptr>=name_dir_end)overflow(_("name"));
-#line 684 "cwebdir/common.w"
+#line 682 "cwebdir/common.w"
 strncpy(byte_ptr,first,l);
 (++name_ptr)->byte_start= byte_ptr+= l;
 init_p(p,t);
@@ -1002,13 +1006,13 @@
 }
 
 /*:51*/
-#line 654 "cwebdir/common.w"
+#line 651 "cwebdir/common.w"
 
 return p;
 }
 
 /*:48*//*52:*/
-#line 713 "cwebdir/common.w"
+#line 711 "cwebdir/common.w"
 
 void
 print_section_name(
@@ -1018,11 +1022,9 @@
 name_pointer q= p+1;
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-term_write(s,(size_t)(ss-s));p= q->link;q= p;
-}else{
-term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir,q= NULL;
+term_write(s,(size_t)(ss-s));
 s= p->byte_start;
 }
 if(q)term_write("...",3);
@@ -1029,7 +1031,7 @@
 }
 
 /*:52*//*53:*/
-#line 732 "cwebdir/common.w"
+#line 728 "cwebdir/common.w"
 
 void
 sprint_section_name(
@@ -1040,11 +1042,8 @@
 name_pointer q= p+1;
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-p= q->link;q= p;
-}else{
-ss++;p= name_dir;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir;
 strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
 s= p->byte_start;
 }
@@ -1052,7 +1051,7 @@
 }
 
 /*:53*//*54:*/
-#line 753 "cwebdir/common.w"
+#line 746 "cwebdir/common.w"
 
 void
 print_prefix_name(
@@ -1065,7 +1064,7 @@
 }
 
 /*:54*//*56:*/
-#line 779 "cwebdir/common.w"
+#line 772 "cwebdir/common.w"
 
 static int web_strcmp(
 char*j,
@@ -1083,7 +1082,7 @@
 }
 
 /*:56*//*57:*/
-#line 808 "cwebdir/common.w"
+#line 801 "cwebdir/common.w"
 
 static name_pointer
 add_section_name(
@@ -1091,7 +1090,7 @@
 int c,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
@@ -1099,7 +1098,7 @@
 #line 301 "cwebdir/comm-w2c.ch"
 if(s+name_len> byte_mem_end)overflow(_("byte memory"));
 if(name_ptr+1>=name_dir_end)overflow(_("name"));
-#line 822 "cwebdir/common.w"
+#line 815 "cwebdir/common.w"
 (++name_ptr)->byte_start= byte_ptr= s+name_len;
 if(ispref){
 *(byte_ptr-1)= ' ';
@@ -1109,14 +1108,13 @@
 }
 set_prefix_length(p,name_len);
 strncpy(s,first,name_len);
-p->llink= NULL;
-p->rlink= NULL;
+p->llink= p->rlink= NULL;
 init_node(p);
 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
 }
 
 /*:57*//*58:*/
-#line 837 "cwebdir/common.w"
+#line 829 "cwebdir/common.w"
 
 static void
 extend_section_name(
@@ -1123,7 +1121,7 @@
 name_pointer p,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 char*s;
 name_pointer q= p+1;
@@ -1130,7 +1128,7 @@
 int name_len= (int)(last-first)+ispref;
 #line 308 "cwebdir/comm-w2c.ch"
 if(name_ptr>=name_dir_end)overflow(_("name"));
-#line 849 "cwebdir/common.w"
+#line 841 "cwebdir/common.w"
 while(q->link!=name_dir)q= q->link;
 q->link= name_ptr;
 s= name_ptr->byte_start;
@@ -1137,7 +1135,7 @@
 name_ptr->link= name_dir;
 #line 314 "cwebdir/comm-w2c.ch"
 if(s+name_len> byte_mem_end)overflow(_("byte memory"));
-#line 854 "cwebdir/common.w"
+#line 846 "cwebdir/common.w"
 (++name_ptr)->byte_start= byte_ptr= s+name_len;
 strncpy(s,first,name_len);
 if(ispref)*(byte_ptr-1)= ' ';
@@ -1144,14 +1142,14 @@
 }
 
 /*:58*//*59:*/
-#line 865 "cwebdir/common.w"
+#line 857 "cwebdir/common.w"
 
 name_pointer
 section_lookup(
 char*first,char*last,
-int ispref)
+boolean ispref)
 {
-int c= 0;
+int c= less;
 name_pointer p= root;
 name_pointer q= NULL;
 name_pointer r= NULL;
@@ -1159,7 +1157,7 @@
 
 int name_len= (int)(last-first)+1;
 /*60:*/
-#line 889 "cwebdir/common.w"
+#line 881 "cwebdir/common.w"
 
 while(p){
 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -1171,12 +1169,12 @@
 if(r!=NULL){
 #line 320 "cwebdir/comm-w2c.ch"
 fputs(_("\n! Ambiguous prefix: matches <"),stdout);
-#line 899 "cwebdir/common.w"
+#line 891 "cwebdir/common.w"
 
 print_prefix_name(p);
 #line 326 "cwebdir/comm-w2c.ch"
 fputs(_(">\n and <"),stdout);
-#line 902 "cwebdir/common.w"
+#line 894 "cwebdir/common.w"
 print_prefix_name(r);
 err_print(">");
 return name_dir;
@@ -1190,19 +1188,19 @@
 }
 
 /*:60*/
-#line 879 "cwebdir/common.w"
+#line 871 "cwebdir/common.w"
 
 /*61:*/
-#line 914 "cwebdir/common.w"
+#line 906 "cwebdir/common.w"
 
 if(r==NULL)
 return add_section_name(par,c,first,last+1,ispref);
 
 /*:61*/
-#line 880 "cwebdir/common.w"
+#line 872 "cwebdir/common.w"
 
 /*62:*/
-#line 922 "cwebdir/common.w"
+#line 914 "cwebdir/common.w"
 
 switch(section_name_cmp(&first,name_len,r)){
 
@@ -1210,7 +1208,7 @@
 if(!ispref){
 #line 332 "cwebdir/comm-w2c.ch"
 fputs(_("\n! New name is a prefix of <"),stdout);
-#line 928 "cwebdir/common.w"
+#line 920 "cwebdir/common.w"
 
 print_section_name(r);
 err_print(">");
@@ -1217,39 +1215,39 @@
 }
 else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
 
-case equal:return r;
+case equal:break;
 case extension:if(!ispref||first<=last)
 extend_section_name(r,first,last+1,ispref);
-return r;
+break;
 case bad_extension:
 #line 338 "cwebdir/comm-w2c.ch"
 fputs(_("\n! New name extends <"),stdout);
-#line 940 "cwebdir/common.w"
+#line 932 "cwebdir/common.w"
 
 print_section_name(r);
 err_print(">");
-return r;
+break;
 default:
 #line 344 "cwebdir/comm-w2c.ch"
 fputs(_("\n! Section name incompatible with <"),stdout);
-#line 946 "cwebdir/common.w"
+#line 938 "cwebdir/common.w"
 
 print_prefix_name(r);
 #line 350 "cwebdir/comm-w2c.ch"
 fputs(_(">,\n which abbreviates <"),stdout);
-#line 949 "cwebdir/common.w"
+#line 941 "cwebdir/common.w"
 print_section_name(r);
 err_print(">");
+}
 return r;
-}
 
 /*:62*/
-#line 881 "cwebdir/common.w"
+#line 873 "cwebdir/common.w"
 
 }
 
 /*:59*//*63:*/
-#line 970 "cwebdir/common.w"
+#line 962 "cwebdir/common.w"
 
 static int section_name_cmp(
 char**pfirst,
@@ -1259,12 +1257,12 @@
 char*first= *pfirst;
 name_pointer q= r+1;
 char*ss,*s= first_chunk(r);
-int c;
-int ispref;
+int c= less;
+boolean ispref;
 while(true){
 ss= (r+1)->byte_start-1;
-if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
-else ispref= 0,ss++,q= name_dir;
+if(*ss==' '&&ss>=r->byte_start)ispref= true,q= q->link;
+else ispref= false,ss++,q= name_dir;
 switch(c= web_strcmp(first,len,s,ss-s)){
 case equal:if(q==name_dir)
 if(ispref){
@@ -1283,7 +1281,7 @@
 }
 
 /*:63*//*66:*/
-#line 1024 "cwebdir/common.w"
+#line 1016 "cwebdir/common.w"
 
 void
 err_print(
@@ -1292,7 +1290,7 @@
 char*k,*l;
 printf(*s=='!'?"\n%s":"%s",s);
 if(web_file_open)/*67:*/
-#line 1044 "cwebdir/common.w"
+#line 1036 "cwebdir/common.w"
 
 {if(changing&&include_depth==change_depth)
 #line 358 "cwebdir/comm-w2c.ch"
@@ -1299,13 +1297,13 @@
 printf(_(". (l. %d of change file)\n"),change_line);
 else if(include_depth==0)printf(_(". (l. %d)\n"),cur_line);
 else printf(_(". (l. %d of include file %s)\n"),cur_line,cur_file_name);
-#line 1049 "cwebdir/common.w"
+#line 1041 "cwebdir/common.w"
 l= (loc>=limit?limit:loc);
 if(l> buffer){
 for(k= buffer;k<l;k++)
 if(*k=='\t')putchar(' ');
 else putchar(*k);
-putchar('\n');
+new_line;
 for(k= buffer;k<l;k++)putchar(' ');
 }
 for(k= l;k<limit;k++)putchar(*k);
@@ -1314,13 +1312,13 @@
 }
 
 /*:67*/
-#line 1031 "cwebdir/common.w"
+#line 1023 "cwebdir/common.w"
 
 update_terminal;mark_error;
 }
 
 /*:66*//*68:*/
-#line 1076 "cwebdir/common.w"
+#line 1068 "cwebdir/common.w"
 
 int wrap_up(void){
 if(show_progress)new_line;
@@ -1328,10 +1326,10 @@
 print_stats();
 #line 388 "cwebdir/comm-w2c.ch"
 /*69:*/
-#line 1086 "cwebdir/common.w"
+#line 1078 "cwebdir/common.w"
 
 switch(history){
-#line 412 "cwebdir/comm-w2c.ch"
+#line 414 "cwebdir/comm-w2c.ch"
 case spotless:
 if(show_happiness)puts(_("(No errors were found.)"));break;
 case harmless_message:
@@ -1338,9 +1336,9 @@
 puts(_("(Did you see the warning message above?)"));break;
 case error_message:
 puts(_("(Pardon me, but I think I spotted something wrong.)"));break;
-case fatal_message:
+case fatal_message:default:
 puts(_("(That was a fatal error, my friend.)"));
-#line 1094 "cwebdir/common.w"
+#line 1088 "cwebdir/common.w"
 }
 
 /*:69*/
@@ -1347,7 +1345,7 @@
 #line 388 "cwebdir/comm-w2c.ch"
 
 /*88:*/
-#line 662 "cwebdir/comm-w2c.ch"
+#line 665 "cwebdir/comm-w2c.ch"
 
 if(C_file)fclose(C_file);
 if(tex_file)fclose(tex_file);
@@ -1360,16 +1358,16 @@
 
 #line 396 "cwebdir/comm-w2c.ch"
 switch(history){
+case spotless:return RETURN_OK;
 case harmless_message:return RETURN_WARN;
 case error_message:return RETURN_ERROR;
-case fatal_message:return RETURN_FAIL;
-default:return RETURN_OK;
+case fatal_message:default:return RETURN_FAIL;
 }
-#line 1084 "cwebdir/common.w"
+#line 1076 "cwebdir/common.w"
 }
 
 /*:68*//*70:*/
-#line 1102 "cwebdir/common.w"
+#line 1096 "cwebdir/common.w"
 void
 fatal(
 const char*s,const char*t)
@@ -1380,19 +1378,19 @@
 }
 
 /*:70*//*71:*/
-#line 1113 "cwebdir/common.w"
+#line 1107 "cwebdir/common.w"
 void
 overflow(
 const char*t)
 {
-#line 425 "cwebdir/comm-w2c.ch"
+#line 427 "cwebdir/comm-w2c.ch"
 printf(_("\n! Sorry, %s capacity exceeded"),t);fatal("","");
-#line 1118 "cwebdir/common.w"
+#line 1112 "cwebdir/common.w"
 }
 
 
 /*:71*//*75:*/
-#line 1167 "cwebdir/common.w"
+#line 1161 "cwebdir/common.w"
 
 static void
 scan_args(void)
@@ -1403,8 +1401,8 @@
 boolean found_web= false,found_change= false,found_out= false;
 
 
-#line 462 "cwebdir/comm-w2c.ch"
-
+#line 472 "cwebdir/comm-w2c.ch"
+strcpy(change_file_name,"/dev/null");
 #if defined DEV_NULL
 strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
 change_file_name[max_file_name_length-2]= '\0';
@@ -1411,20 +1409,19 @@
 #elif defined _DEV_NULL
 strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
 change_file_name[max_file_name_length-2]= '\0';
-#else
-strcpy(change_file_name,"/dev/null");
 #endif
 
-#line 1178 "cwebdir/common.w"
+#line 1172 "cwebdir/common.w"
 while(--argc> 0){
 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 510 "cwebdir/comm-w2c.ch"
+#line 1251 "cwebdir/common.w"
 
+#line 515 "cwebdir/comm-w2c.ch"
 {
 if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
 
 /*95:*/
-#line 799 "cwebdir/comm-w2c.ch"
+#line 802 "cwebdir/comm-w2c.ch"
 
 cb_usagehelp(program==ctangle?CTANGLEHELP:
 program==cweave?CWEAVEHELP:CTWILLHELP,NULL);
@@ -1431,12 +1428,12 @@
 
 
 /*:95*/
-#line 514 "cwebdir/comm-w2c.ch"
+#line 518 "cwebdir/comm-w2c.ch"
 
 if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
 
 /*98:*/
-#line 846 "cwebdir/comm-w2c.ch"
+#line 850 "cwebdir/comm-w2c.ch"
 
 printversionandexit(cb_banner,
 program==ctwill?"Donald E. Knuth":"Silvio Levy and Donald E. Knuth",
@@ -1444,72 +1441,68 @@
 
 
 /*:98*/
-#line 517 "cwebdir/comm-w2c.ch"
+#line 521 "cwebdir/comm-w2c.ch"
 
 if(strcmp("-verbose",*argv)==0||strcmp("--verbose",*argv)==0)
 
-{show_banner= show_progress= show_happiness= 1;continue;}
+strcpy(*argv,"-v");
 if(strcmp("-quiet",*argv)==0||strcmp("--quiet",*argv)==0)
 
-{show_banner= show_progress= show_happiness= 0;continue;}
-for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
-if(*dot_pos=='v'){
-show_banner= show_progress= show_happiness= true;
-}else
-if(*dot_pos=='q'){
-show_banner= show_progress= show_happiness= false;
-}else
-if(*dot_pos=='d'){
+strcpy(*argv,"-q");
+for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++){
+switch(*dot_pos){
+case'v':show_banner= show_progress= show_happiness= true;continue;
+case'q':show_banner= show_progress= show_happiness= false;continue;
+case'd':
 if(sscanf(++dot_pos,"%u",&kpathsea_debug)!=1)/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 /*:81*/
-#line 532 "cwebdir/comm-w2c.ch"
+#line 533 "cwebdir/comm-w2c.ch"
 
 while(isdigit(*dot_pos))dot_pos++;
 dot_pos--;
-}else
-if(*dot_pos=='l'){
-use_language= ++dot_pos;
+continue;
+case'l':use_language= ++dot_pos;break;
+default:flags[(eight_bits)*dot_pos]= flag_change;continue;
+}
 break;
-}else
-#line 1261 "cwebdir/common.w"
- flags[(eight_bits)*dot_pos]= flag_change;
 }
+}
+#line 1254 "cwebdir/common.w"
 
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
 /*:80*/
-#line 1179 "cwebdir/common.w"
+#line 1173 "cwebdir/common.w"
 
 else{
 s= name_pos= *argv;dot_pos= NULL;
-#line 482 "cwebdir/comm-w2c.ch"
-while(*s){
+#line 489 "cwebdir/comm-w2c.ch"
+while(*s)
 if(*s=='.')dot_pos= s++;
 else if(*s==DIR_SEPARATOR||*s==DEVICE_SEPARATOR||*s=='/')
 dot_pos= NULL,name_pos= ++s;
 else s++;
-}
 
-#line 1187 "cwebdir/common.w"
+#line 1180 "cwebdir/common.w"
 if(!found_web)/*77:*/
-#line 1206 "cwebdir/common.w"
+#line 1199 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1209 "cwebdir/common.w"
+#line 1202 "cwebdir/common.w"
 
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
@@ -1517,7 +1510,7 @@
 strcpy(web_file_name,*argv);
 *dot_pos= 0;
 }
-#line 1217 "cwebdir/common.w"
+#line 1210 "cwebdir/common.w"
 sprintf(tex_file_name,"%s.tex",name_pos);
 sprintf(idx_file_name,"%s.idx",name_pos);
 sprintf(scn_file_name,"%s.scn",name_pos);
@@ -1526,22 +1519,22 @@
 }
 
 /*:77*/
-#line 1188 "cwebdir/common.w"
+#line 1181 "cwebdir/common.w"
 
 else if(!found_change)/*78:*/
-#line 1224 "cwebdir/common.w"
+#line 1217 "cwebdir/common.w"
 
 {
 if(strcmp(*argv,"-")!=0){
 if(s-*argv> max_file_name_length-4)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1228 "cwebdir/common.w"
+#line 1221 "cwebdir/common.w"
 
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
@@ -1551,21 +1544,21 @@
 }
 
 /*:78*/
-#line 1189 "cwebdir/common.w"
+#line 1182 "cwebdir/common.w"
 
 else if(!found_out)/*79:*/
-#line 1236 "cwebdir/common.w"
+#line 1229 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1239 "cwebdir/common.w"
+#line 1232 "cwebdir/common.w"
 
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
@@ -1585,36 +1578,36 @@
 }
 
 /*:79*/
-#line 1190 "cwebdir/common.w"
+#line 1183 "cwebdir/common.w"
 
 else/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 /*:81*/
-#line 1191 "cwebdir/common.w"
+#line 1184 "cwebdir/common.w"
 
 }
 }
 if(!found_web)/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
 /*:81*/
-#line 1194 "cwebdir/common.w"
+#line 1187 "cwebdir/common.w"
 
 }
 
 /*:75*//*97:*/
-#line 812 "cwebdir/comm-w2c.ch"
+#line 815 "cwebdir/comm-w2c.ch"
 
 static void cb_usage(const_string str)
 {
@@ -1635,6 +1628,7 @@
 textdomain("web2c-help");
 
 while(*message){
+
 printf("%s\n",strcmp("",*message)?_(*message):*message);
 ++message;
 }
@@ -1647,11 +1641,10 @@
 }
 
 /*:97*//*99:*/
-#line 854 "cwebdir/comm-w2c.ch"
+#line 858 "cwebdir/comm-w2c.ch"
 
 void cb_show_banner(void)
 {
-assert(cb_banner[0]!='\0');
 textdomain("cweb-tl");
 
 printf("%s%s\n",_(cb_banner),versionstring);

Modified: trunk/Build/source/texk/web2c/cwebdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ChangeLog	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ChangeLog	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,44 @@
+2021-04-16  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile,
+	* README,
+	* comm-{amiga,bs,mac,mini,os2,pc,ql,vms,w2c,w32}.ch,
+	* comm-w2c.h,
+	* common.bux,
+	* common.c,
+	* common.h,
+	* common.w,
+	* ctang-{bs,man,pc,ql,vms,w2c,w32}.ch,
+	* ctangle.c,
+	* ctangle.w,
+	* ctproofmac.tex,
+	* ctrwinxmac.tex,
+	* ctwill-{mini,w2c}.ch,
+	* ctwill.bux,
+	* ctwimac.tex,
+	* cweav-{bs,man,pc,ql,vms,w2c,w32}.ch,
+	* cweave.w,
+	* cweb.1,
+	* cwebmac.tex,
+	* cwebman-w2c.ch,
+	* cwebman.tex,
+	* iso_types.w,
+	* po/cweb[-tl].pot,
+	* po/de/cweb[-tl].po,
+	* po/de/web2c-help.po,
+	* po/it/cweb.po,
+	* po/web2c-help.pot,
+	* prod-twill.w,
+	* prod.w,
+	* refsort.ch,
+	* resort.w,
+	* system.bux,
+	* texinputs/Xcwebmac.tex,
+	* texinputs/pdfctwimac.tex,
+	* twinx-startup.tex,
+	* twinx.ch,
+	* twinx.w: CWEB 4.3 and CWEBbin 2021.
+
 2021-02-25  Andreas Scherer  <https://ascherer.github.io>
 
 	* Makefile,

Modified: trunk/Build/source/texk/web2c/cwebdir/Makefile
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/Makefile	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/Makefile	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
 # This file is part of CWEB.
 # It is distributed WITHOUT ANY WARRANTY, express or implied.
-# Version 4.2 --- February 2021
+# Version 4.3 --- April 2021
 
 # Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -74,7 +74,7 @@
 CTANGLE = ./ctangle
 SOURCES = cweave.w common.w ctangle.w
 ALL =  common.w ctangle.w cweave.w prod.w \
-	Makefile common.c common.h ctangle.c \
+	Makefile README common.c common.h ctangle.c \
 	cwebman.tex cwebmac.tex comm-vms.ch ctang-vms.ch \
 	cweav-vms.ch comm-man.ch ctang-man.ch cweav-man.ch \
 	comm-pc.ch ctang-pc.ch cweav-pc.ch comm-amiga.ch \
@@ -81,7 +81,7 @@
         comm-bs.ch ctang-bs.ch cweav-bs.ch makefile.bs \
 	comm-ql.ch ctang-ql.ch cweav-ql.ch readme.ql \
 	comm-w32.ch ctang-w32.ch cweav-w32.ch \
-	comm-os2.ch comm-mac.ch cweb.1 cweb.el c++lib.w README
+	comm-os2.ch comm-mac.ch cweb.1 cweb.el c++lib.w iso_types.w
 
 .SUFFIXES: .dvi .tex .w .pdf
 
@@ -183,6 +183,8 @@
 	- mkdir $(CWEBINPUTS)
 	$(CP) c++lib.w $(CWEBINPUTS)
 	chmod 644 $(CWEBINPUTS)/c++lib.w
+	$(CP) iso_types.w $(CWEBINPUTS)
+	chmod 644 $(CWEBINPUTS)/iso_types.w
 
 floppy: $(ALL) examples
 	bar cvhf /dev/rfd0 $(ALL) examples

Modified: trunk/Build/source/texk/web2c/cwebdir/README
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/README	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/README	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,7 +1,7 @@
 % This file is part of CWEB.
 % The CWEB programs by Silvio Levy are based on programs by D. E. Knuth.
 % They are distributed WITHOUT ANY WARRANTY, express or implied.
-% This README file last updated February 2021 by Andreas Scherer
+% This README file last updated April 2021 by Andreas Scherer
 
 % Copyright (C) 1987,1990,1993,2000,2016 Silvio Levy and Donald E. Knuth
 
@@ -66,6 +66,7 @@
 prod.w
 readme.ql
 c++lib.w
+iso_types.w
 
 The file cwebman.tex is the user manual.
 The examples directory contains additional examples of the use of CWEB.
@@ -72,8 +73,9 @@
 The files common.c and ctangle.c are used for bootstrapping.
 The file cweb.1 is a manual page.
 The file cweb.el is suggested for GNU-Emacs users.
-The file c++lib.w is for C++ users (say `@i c++lib.w' at beginning of program).
-The files *-man.ch are used if you want to make the full 240-page CWEB manual.
+The files c++lib.w and iso_types.w are for C++ users (say `@i c++lib.w'
+and/or `@i iso_types.w' at beginning of program).
+The files *-man.ch are used if you want to make the full 243-page CWEB manual.
 The files *-bs.ch are used instead of *-pc.ch if you are doing BIG programs.
 You can use makefile.bs to make CWEB with *-bs.ch.
 The files *-ql.ch are for QDOS/SMSQ systems; see readme.ql for further info.

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,7 +10,7 @@
 An omitted change file argument means that |"nil:"| should be used,
 @z
 
- at x section 76
+ at x section 75
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"nil:");

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -15,7 +15,7 @@
 (Update attempt by Andreas Scherer, 31 Jan 2021.  Good luck!)
 
 
- at x Section 6.
+ at x Section 9.
   for section names */
 
 @<Common code...@>=
@@ -50,7 +50,7 @@
   union {
     void huge* equiv_member;
     void huge* xref_member;
-  } ptr_union;  /* info corresponding to names */
+  } ptr_union; /* info corresponding to names */
 } name_info; /* contains information about an identifier or section name */
 typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
 typedef name_pointer *hash_pointer;
@@ -136,23 +136,23 @@
 
 @x Section 57.
 static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
 name_pointer par, /* parent of new node */
 int c, /* right or left? */
 char *first, /* first character of section name */
 char *last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   name_pointer p=name_ptr; /* new node */
   char *s=first_chunk(p);
 @y
 static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
 name_pointer par, /* parent of new node */
 int c, /* right or left? */
 char huge* first, /* first character of section name */
 char huge* last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   name_pointer p=name_ptr; /* new node */
   char huge* s=first_chunk(p);
@@ -161,39 +161,39 @@
 
 @x Section 58.
 static void
-extend_section_name(@t\1\1@>
+extend_section_name(
 name_pointer p, /* name to be extended */
 char *first, /* beginning of extension text */
 char *last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   char *s;
 @y
 static void
-extend_section_name(@t\1\1@>
+extend_section_name(
 name_pointer p, /* name to be extended */
 char huge* first, /* beginning of extension text */
 char huge* last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   char huge* s;
 @z
 
 
- at x Section 64.
-static int section_name_cmp(@t\1\1@>
+ at x Section 63.
+static int section_name_cmp(
 char **pfirst, /* pointer to beginning of comparison string */
 int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
 {
   char *first=*pfirst; /* beginning of comparison string */
   name_pointer q=r+1; /* access to subsequent chunks */
   char *ss, *s=first_chunk(r);
 @y
-static int section_name_cmp(@t\1\1@>
+static int section_name_cmp(
 char huge** pfirst, /* pointer to beginning of comparison string */
 int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
 {
   char huge* first=*pfirst; /* beginning of comparison string */
   name_pointer q=r+1; /* access to subsequent chunks */
@@ -208,7 +208,7 @@
 @z
 
 
- at x Section 76.
+ at x Section 75.
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"NUL");
@@ -215,7 +215,7 @@
 @z
 
 
- at x Section 76.
+ at x Section 75.
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -4,27 +4,24 @@
 (Contributed 13 Oct 2000 by AndPio at aol.com; slightly edited by Don Knuth)
 
 @x in limbo, change the title page document to specify Mac version
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
 @y
-  \centerline{(Version 4.2 for MacOS)}
+  \centerline{(Version 4.3 for MacOS)}
 @z
 
- at x sections 23/24: Make input_ln accept \n, \r, \n\r, or \r\n as line endings
+ at x section 23: Make input_ln accept \n, \r, \n\r, or \r\n as line endings
 @ In the unlikely event that your standard I/O library does not
 support |feof|, |getc|, and |ungetc| you may have to change things here.
 @^system dependencies@>
 
-@<Predecl...@>=
-static boolean input_ln(FILE *);@/
-
-@ @c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+ at c
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
 {
-  register int  c=EOF; /* character read; initialized so some compilers won't complain */
-  register char *k;  /* where next character goes */
-  if (feof(fp)) return false;  /* we have hit end-of-file */
-  limit = k = buffer;  /* beginning of buffer */
+  register int c=EOF; /* character read; initialized so some compilers won't complain */
+  register char *k; /* where next character goes */
+  if (feof(fp)) return false; /* we have hit end-of-file */
+  limit = k = buffer; /* beginning of buffer */
   while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n')
     if ((*(k++) = c) != ' ') limit = k;
   if (k>buffer_end)
@@ -32,7 +29,7 @@
       ungetc(c,fp); loc=buffer; err_print("! Input line too long");
 @.Input line too long@>
     }
-  if (c==EOF && limit==buffer) return false;  /* there was nothing after
+  if (c==EOF && limit==buffer) return false; /* there was nothing after
     the last newline */
   return true;
 }
@@ -45,17 +42,14 @@
 \UNIX/, {\mc DOS} or {\mc MAC} format.
 @^system dependencies@>
 
-@<Predecl...@>=
-static boolean input_ln(FILE *);@/
-
-@ @c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+ at c
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
 {
   register int  c=EOF; /* character read; initialized so some compilers won't complain */
-  register char *k;  /* where next character goes */
-  if (feof(fp)) return false;  /* we have hit end-of-file */
-  limit = k = buffer;  /* beginning of buffer */
+  register char *k; /* where next character goes */
+  if (feof(fp)) return false; /* we have hit end-of-file */
+  limit = k = buffer; /* beginning of buffer */
   while (true) {
     c = getc(fp);
     if (c==EOF)  return limit!=buffer; /* |false|, if there was nothing after
@@ -77,7 +71,7 @@
 }
 @z
 
- at x section 28, simply return if no change file was specified
+ at x section 27, simply return if no change file was specified
   change_limit=change_buffer; /* this value is used if the change file ends */
   @<Skip over comment lines in the change file; |return| if end of file@>@;
 @y
@@ -121,13 +115,12 @@
 @y
 An omitted change file argument means that no change file should be used,
 @z
-
- at x section 76, make change file name empty when it is unspecified
+ at x section 75, make change file name empty when it is unspecified
   strcpy(change_file_name,"/dev/null");
 @y
   change_file_name[0]='\0';   /* empty string */
 @z
- at x section 76, use the Metrowerks |ccommand| to access command lines
+ at x section 75, use the Metrowerks |ccommand| to access command lines
   while (--argc > 0) {
 @y
   argc = ccommand (&argv); /* use Mac interface to command line */
@@ -134,7 +127,7 @@
 @^system dependencies@>
   while (--argc > 0) {
 @z
- at x section 76, use the path separator constant
+ at x section 75, use the path separator constant
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s==PATH_SEP) dot_pos=NULL,name_pos=++s;

Added: trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,107 @@
+Limbo.
+
+ at x
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3 [CWEBbin 2021])}
+ at y
+\def\title{COMMON (Version 4.3 [CWEBbin 2021])}
+\def\contentspagenumber{0}
+ at z
+
+Section 3.
+
+ at x
+internationalization.
+ at y
+internationalization.
+ at -A@>
+ at -S@>
+ at z
+
+Section 5.
+
+ at x
+@ Code related to input routines:
+ at y
+@ Code related to input routines:
+ at -c@>
+ at z
+
+Section 9.
+
+ at x
+@ Code related to identifier and section name storage:
+ at y
+@ Code related to identifier and section name storage:
+ at -c@>
+ at z
+
+Section 14.
+
+ at x
+@ Code related to output:
+ at y
+@ Code related to output:
+ at -a@>
+ at -b@>
+ at z
+
+Section 32.
+
+ at x
+current line is nonempty.
+ at y
+current line is nonempty.
+ at -b@>
+ at z
+
+Section 52.
+
+ at x
+ at d first_chunk(p)  ((p)->byte_start+2)
+ at y
+ at -m@>
+ at d first_chunk(p)  ((p)->byte_start+2)
+ at z
+
+Section 87.
+
+ at x
+@^system dependencies@> @.CWEBINPUTS@>
+ at y
+@^system dependencies@> @.CWEBINPUTS@>
+ at -CWEBINPUTS@>
+ at z
+
+Section 88.
+
+ at x
+@ @c
+ at y
+@ @-CWEBINPUTS@>@c
+ at z
+
+Section 89.
+
+ at x
+needs a few extra variables.
+ at y
+needs a few extra variables.
+ at -SEPARATORS@>
+ at z
+
+Section 91.
+
+ at x
+ at .cweb.mo@>
+ at y
+ at .cweb.mo@>
+ at -A@>
+ at -B@>
+ at z
+
+Section 93.
+
+ at x
+@** Index.
+ at y
+ at z


Property changes on: trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,13 +10,13 @@
 An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 76
+ at x section 75
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"NUL");
 @z
 
- at x section 76 (this change copied from comm-pc.ch)
+ at x section 75 (this change copied from comm-pc.ch)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -19,13 +19,13 @@
 An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 76
+ at x section 75
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"NUL");
 @z
 
- at x section 76 (this change copied from comm-bs.ch, July 94)
+ at x section 75 (this change copied from comm-bs.ch, July 94)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,12 +10,12 @@
 @x
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -22,12 +22,12 @@
 @y
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (QL Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (QL Version 4.3)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -34,7 +34,7 @@
 
 @x section 68 (01-FEB-1992 ST)
 programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
 @y
 programs are started. Here, for instance, we pass VAX/VMS
 a status of |SS$_NORMAL| if and only if only harmless
@@ -67,7 +67,7 @@
 null device |"NL:"| should be used, when no changes are desired.
 @z
 
- at x section 76 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
+ at x section 75 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"NL:");

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,16 +17,16 @@
 @q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
 @y
 \def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}} \ifacro\sanitizecommand\Kpathsea{KPATHSEA}\fi
-\def\title{Common code for CTANGLE and CWEAVE (4.2 [\TeX~Live])}
+\def\title{Common code for CTANGLE and CWEAVE (4.3 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
 @y
-  \centerline{(Version 4.2 [\TeX~Live])}
+  \centerline{(Version 4.3 [\TeX~Live])}
 @z
 
 @x
@@ -146,11 +146,11 @@
        fatal("! Cannot open input file ", web_file_name);
 }
 @y
-if ((found_filename=kpse_find_cweb(web_file_name))==NULL || @|
-    (web_file=fopen(found_filename,"r"))==NULL) {
+if ((found_filename=kpse_find_cweb(web_file_name))==NULL @|
+    || (web_file=fopen(found_filename,"r"))==NULL)
   fatal(_("! Cannot open input file "), web_file_name);
-} else if (strlen(found_filename) < max_file_name_length) {
-  /* Copy name for |#line| directives. */
+else if (strlen(found_filename) < max_file_name_length) {
+  /* Copy name for \#\&{line} directives. */
   if (strcmp(web_file_name, found_filename))
     strcpy(web_file_name, found_filename +
       ((strncmp(found_filename,"./",2)==0) ? 2 : 0));
@@ -162,11 +162,11 @@
 if ((change_file=fopen(change_file_name,"r"))==NULL)
        fatal("! Cannot open change file ", change_file_name);
 @y
-if ((found_filename=kpse_find_cweb(change_file_name))==NULL || @|
-    (change_file=fopen(found_filename,"r"))==NULL) {
+if ((found_filename=kpse_find_cweb(change_file_name))==NULL @|
+    || (change_file=fopen(found_filename,"r"))==NULL)
   fatal(_("! Cannot open change file "), change_file_name);
-} else if (strlen(found_filename) < max_file_name_length) {
-  /* Copy name for |#line| directives. */
+else if (strlen(found_filename) < max_file_name_length) {
+  /* Copy name for \#\&{line} directives. */
   if (strcmp(change_file_name, found_filename))
     strcpy(change_file_name, found_filename +
       ((strncmp(found_filename,"./",2)==0) ? 2 : 0));
@@ -217,7 +217,7 @@
 @x
   char temp_file_name[max_file_name_length];
   char *cur_file_name_end=cur_file_name+max_file_name_length-1;
-  char *k=cur_file_name, *kk;
+  char *kk, *k=cur_file_name;
   int l; /* length of file name */
 @y
   char *cur_file_name_end=cur_file_name+max_file_name_length-1;
@@ -227,9 +227,9 @@
 @x
   if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
 @y
-  if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL && @|
-      (cur_file=fopen(found_filename,"r"))!=NULL) {
-    /* Copy name for |#line| directives. */
+  if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL @|
+      && (cur_file=fopen(found_filename,"r"))!=NULL) {
+    /* Copy name for \#\&{line} directives. */
     if (strlen(found_filename) < max_file_name_length) {
       if (strcmp(cur_file_name, found_filename))
         strcpy(cur_file_name, found_filename +
@@ -255,7 +255,7 @@
   if (l>0) {
     if (k+l+2>=cur_file_name_end)  too_long();
 @.Include file name ...@>
-    for (; k>= cur_file_name; k--) *(k+l+1)=*k;
+    for (; k>=cur_file_name; k--) *(k+l+1)=*k;
     strcpy(cur_file_name,temp_file_name);
     cur_file_name[l]='/'; /* \UNIX/ pathname separator */
     if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@@ -364,7 +364,7 @@
 Some implementations may wish to pass the |history| value to the
 operating system so that it can be used to govern whether or not other
 programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
 @^system dependencies@>
 @y
 On multi-tasking systems like the {\mc AMIGA} it is very convenient to
@@ -394,20 +394,22 @@
   else return EXIT_SUCCESS;
 @y
   switch(history) {
+  case spotless: return RETURN_OK;
   case harmless_message: return RETURN_WARN;
   case error_message: return RETURN_ERROR;
-  case fatal_message: return RETURN_FAIL;
-  default: return RETURN_OK;
+  case fatal_message: default: return RETURN_FAIL;
   }
 @z
 
 @x
-case spotless: if (show_happiness) puts("(No errors were found.)"); break;
+case spotless:
+  if (show_happiness) puts("(No errors were found.)"); break;
 case harmless_message:
   puts("(Did you see the warning message above?)"); break;
 case error_message:
   puts("(Pardon me, but I think I spotted something wrong.)"); break;
-case fatal_message: puts("(That was a fatal error, my friend.)");
+case fatal_message: default:
+  puts("(That was a fatal error, my friend.)");
 @y
 case spotless:
   if (show_happiness) puts(_("(No errors were found.)")); break;
@@ -415,7 +417,7 @@
   puts(_("(Did you see the warning message above?)")); break;
 case error_message:
   puts(_("(Pardon me, but I think I spotted something wrong.)")); break;
-case fatal_message:
+case fatal_message: default:
   puts(_("(That was a fatal error, my friend.)"));
 @z
 
@@ -426,6 +428,14 @@
 @z
 
 @x
+or flags to be turned on (beginning with |"+"|).
+ at y
+or flags to be turned on (beginning with |"+"|).
+\TeX~Live's \.{CWEB} executables accept several ``long options'' as well;
+see section |@<Handle flag arg...@>| for details.
+ at z
+
+ at x
 char scn_file_name[max_file_name_length]; /* name of |scn_file| */
 @y
 char scn_file_name[max_file_name_length]; /* name of |scn_file| */
@@ -436,7 +446,7 @@
 show_banner=show_happiness=show_progress=make_xrefs=true;@/
 @y
 make_xrefs=true;@/
-temporary_output=true; /* Check temporary output for changes */
+check_for_change=true; /* Check temporary output for changes */
 @z
 
 @x
@@ -459,7 +469,7 @@
 @x
   strcpy(change_file_name,"/dev/null");
 @y
-@#
+  strcpy(change_file_name,"/dev/null");
 #if defined DEV_NULL
   strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
   change_file_name[max_file_name_length-2]='\0';
@@ -466,25 +476,21 @@
 #elif defined _DEV_NULL
   strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
   change_file_name[max_file_name_length-2]='\0';
-#else
-  strcpy(change_file_name,"/dev/null");
 #endif
 @^system dependencies@>
 @z
 
 @x
-      while (*s) {
+      while (*s)
         if (*s=='.') dot_pos=s++;
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
         else s++;
-      }
 @y
-      while (*s) {
+      while (*s)
         if (*s=='.') dot_pos=s++;
         else if (*s==DIR_SEPARATOR || *s==DEVICE_SEPARATOR || *s=='/')
           dot_pos=NULL,name_pos=++s;
         else s++;
-      }
 @^system dependencies@>
 @z
 
@@ -503,11 +509,9 @@
 @z
 
 @x
-@<Handle flag...@>=
-{
-  for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+  flags[(eight_bits)*dot_pos]=flag_change;
 @y
-@<Handle flag...@>=
 {
   if (strcmp("-help",*argv)==0 || strcmp("--help",*argv)==0)
 @.--help@>
@@ -517,26 +521,25 @@
     @<Display version information and |exit|@>@;
   if (strcmp("-verbose",*argv)==0 || strcmp("--verbose",*argv)==0)
 @.--verbose@>
-  { show_banner=show_progress=show_happiness=1; continue; }
+    strcpy(*argv,"-v");
   if (strcmp("-quiet",*argv)==0 || strcmp("--quiet",*argv)==0)
 @.--quiet@>
-  { show_banner=show_progress=show_happiness=0; continue; }
-  for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
-    if (*dot_pos=='v') {
-      show_banner=show_progress=show_happiness=true;
-    } else
-    if (*dot_pos=='q') {
-      show_banner=show_progress=show_happiness=false;
-    } else
-    if (*dot_pos=='d') {
+      strcpy(*argv,"-q");
+  for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++) {
+    switch (*dot_pos) {
+    case 'v': show_banner=show_progress=show_happiness=true; continue;
+    case 'q': show_banner=show_progress=show_happiness=false; continue;
+    case 'd':
       if (sscanf(++dot_pos,"%u",&kpathsea_debug)!=1) @<Print usage error...@>@;
       while (isdigit(*dot_pos)) dot_pos++; /* skip numeric part */
       dot_pos--; /* reset to final digit */
-    } else
-    if(*dot_pos=='l') {
-       use_language=++dot_pos;
-       break;
-    } else
+      continue;
+    case 'l': use_language=++dot_pos; break; /* from |switch| */
+    default: flags[(eight_bits)*dot_pos]=flag_change; continue;
+    }
+    break; /* from |for| loop */
+  }
+}
 @z
 
 @x
@@ -625,9 +628,9 @@
 @x
 @** Index.
 @y
-@** 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.
+@** Extensions to {\tentex 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
 material should nicely integrate with the original ``\&{85.~Index}.''
@@ -829,6 +832,7 @@
   textdomain("web2c-help");
 @.web2c-help.mo@>
   while (*message) {
+    /* empty string \.{""} has special meaning for |gettext| */
     printf("%s\n", strcmp("", *message) ? _(*message) : *message);
     ++message;
   }
@@ -854,7 +858,6 @@
 @c
 void cb_show_banner (void)
 {
-  assert(cb_banner[0]!='\0');
   textdomain("cweb-tl");
 @.cweb-tl.mo@>
   printf("%s%s\n", _(cb_banner), versionstring);

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 % This program by Silvio Levy and Donald E. Knuth
 % is based on a program by Knuth.
 % It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021 (works also with later versions)
+% Version 4.3 --- April 2021 (works also with later versions)
 
 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
 
@@ -27,9 +27,7 @@
 
 First comes general stuff:
 
- at s boolean int
- at s uint8_t int
- at s uint16_t int
+ at i iso_types.w
 
 
 @<Common code...@>=
@@ -73,20 +71,22 @@
 @^ASCII code dependencies@>
 
 @d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
- at d lt_lt 020 /* `\.{<<}'\,;  corresponds to MIT's {\tentex\char'20} */
- at d gt_gt 021 /* `\.{>>}'\,;  corresponds to MIT's {\tentex\char'21} */
- at d plus_plus 013 /* `\.{++}'\,;  corresponds to MIT's {\tentex\char'13} */
- at d minus_minus 01 /* `\.{--}'\,;  corresponds to MIT's {\tentex\char'1} */
- at d minus_gt 031 /* `\.{->}'\,;  corresponds to MIT's {\tentex\char'31} */
- at d non_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
- at d lt_eq 034 /* `\.{<=}'\,;  corresponds to MIT's {\tentex\char'34} */
- at d gt_eq 035 /* `\.{>=}'\,;  corresponds to MIT's {\tentex\char'35} */
- at d eq_eq 036 /* `\.{==}'\,;  corresponds to MIT's {\tentex\char'36} */
- at d or_or 037 /* `\.{\v\v}'\,;  corresponds to MIT's {\tentex\char'37} */
- at d dot_dot_dot 016 /* `\.{...}'\,;  corresponds to MIT's {\tentex\char'16} */
- at d colon_colon 06 /* `\.{::}'\,;  corresponds to MIT's {\tentex\char'6} */
- at d period_ast 026 /* `\.{.*}'\,;  corresponds to MIT's {\tentex\char'26} */
- at d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
+ at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
+ at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
+ at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
+ at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
+ at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
+ at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
+ at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
+ at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
+ at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
+ at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
+ at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
+ at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
+ at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
+ at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+@#
+ at d compress(c) if (loc++<=limit) return c
 
 @<Common code...@>=
 extern char section_text[]; /* text being sought for */
@@ -95,12 +95,16 @@
 extern char *id_loc; /* just after the current identifier in the buffer */
 
 @ Code related to input routines:
- at d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
- at d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
- at d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
- at d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
- at d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
+ at d xisalpha(c) (isalpha((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisdigit(c) (isdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisspace(c) (isspace((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xislower(c) (islower((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisupper(c) (isupper((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisxdigit(c) (isxdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d isxalpha(c) ((c)=='_' || (c)=='$')
+  /* non-alpha characters allowed in identifier */
+ at d ishigh(c) ((eight_bits)(c)>0177)
+@^high-bit character handling@>
 
 @<Common code...@>=
 extern char buffer[]; /* where each line of input goes */
@@ -181,7 +185,7 @@
 extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
 extern name_pointer id_lookup(const char *,const char *,char);
    /* looks up a string in the identifier table */
-extern name_pointer section_lookup(char *,char *,int); /* finds section name */
+extern name_pointer section_lookup(char *,char *,boolean); /* finds section name */
 extern void init_node(name_pointer);@/
 extern void init_p(name_pointer,eight_bits);@/
 extern void print_prefix_name(name_pointer);@/
@@ -212,8 +216,8 @@
 @d show_progress flags['p'] /* should progress reports be printed? */
 @d show_stats flags['s'] /* should statistics be printed at end of run? */
 @d show_happiness flags['h'] /* should lack of errors be announced? */
- at d temporary_output flags['t'] /* should temporary output take precedence? */
 @d make_xrefs flags['x'] /* should cross references be output? */
+ at d check_for_change flags['c'] /* check temporary output for changes */
 
 @<Common code...@>=
 extern int argc; /* copy of |ac| parameter to |main| */
@@ -227,10 +231,8 @@
 
 @ Code related to output:
 @d update_terminal fflush(stdout) /* empty the terminal output buffer */
- at d new_line putchar('\n') @d putxchar putchar
+ at d new_line putchar('\n')
 @d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
- at d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
 
 @<Common code...@>=
 extern FILE *C_file; /* where output of \.{CTANGLE} goes */

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -52,13 +52,13 @@
 An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 76
+ at x section 75
   strcpy(change_file_name,"/dev/null");
 @y
   strcpy(change_file_name,"NUL");
 @z
 
- at x section 76 (this change copied from comm-bs.ch, July 94)
+ at x section 75 (this change copied from comm-bs.ch, July 94)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')

Added: trunk/Build/source/texk/web2c/cwebdir/common.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.bux	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/common.bux	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,28 @@
+@$ctangle "common.h" \zip@>
+@$ctwill "common.h" \zip@>
+@$cweave "common.h" \zip@>
+
+@$HAVE_GETTEXT "common.h" \zip@>
+
+@$init_p {CWEAVE.W}32 \&{void} (\,)@>
+@$init_node {CWEAVE.W}32 \&{void} (\,)@>
+@$names_match {CWEAVE.W}32 \&{boolean} (\,)@>
+
+@$ac {CWEAVE.W}2 \&{int}@>
+@$av {CWEAVE.W}2 \&{char} ${*}{*}$@>
+@$main {CWEAVE.W}2 \&{int} (\,)@>
+
+@$print_stats {CWEAVE.W}262 \&{void} (\,)@>
+
+@$xmem {CWEAVE.W}23 \&{xref\_info} [\,]@>
+
+@$xref {CWEAVE.W}24 \\{equiv\_or\_xref}@>
+
+@$text_info {CTANGLE.W}20 \&{text} [\,]@>
+
+@$equiv {CTANGLE.W}22 \\{equiv\_or\_xref}@>
+
+@$ilk {CWEAVE.W}20 \\{dummy.Ilk}@>
+
+@$DEV_NULL {COMMON.W}75 macro@>
+@$_DEV_NULL {COMMON.W}75 macro@>

Modified: trunk/Build/source/texk/web2c/cwebdir/common.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.c	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.c	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
 /*1:*/
-#line 66 "common.w"
+#line 62 "common.w"
 
 /*3:*/
-#line 46 "common.h"
+#line 44 "common.h"
 
 #include <ctype.h>  
 #include <stdbool.h>  
@@ -13,7 +13,7 @@
 #include <string.h>  
 
 /*:3*/
-#line 67 "common.w"
+#line 63 "common.w"
 
 #define ctangle false
 #define cweave true \
@@ -34,13 +34,19 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) )  \
+#define compress(c) if(loc++<=limit) return c \
 
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
+ \
+
 #define max_include_depth 10 \
 
 #define max_file_name_length 1024
@@ -74,10 +80,7 @@
 
 #define update_terminal fflush(stdout) 
 #define new_line putchar('\n') 
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
-#define C_printf(c,a) fprintf(C_file,c,a) 
-#define C_putc(c) putc(c,C_file)  \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)  \
 
 #define max_bytes 1000000 \
 
@@ -94,7 +97,8 @@
 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
 strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) )  \
 
-#define if_section_start_make_pending(b) {*limit= '!'; \
+#define if_section_start_make_pending(b) { \
+*limit= '!'; \
 for(loc= buffer;xisspace(*loc) ;loc++) ; \
 *limit= ' '; \
 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
@@ -121,10 +125,10 @@
 
 #define flag_change (**argv!='-') 
 
-#line 68 "common.w"
+#line 64 "common.w"
 
 /*2:*/
-#line 37 "common.h"
+#line 35 "common.h"
 
 typedef bool boolean;
 typedef uint8_t eight_bits;
@@ -141,7 +145,7 @@
 extern char*id_loc;
 
 /*:4*//*5:*/
-#line 88 "common.h"
+#line 92 "common.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -149,7 +153,7 @@
 extern char*limit;
 
 /*:5*//*6:*/
-#line 105 "common.h"
+#line 109 "common.h"
 
 extern int include_depth;
 extern FILE*file[];
@@ -165,7 +169,7 @@
 extern boolean web_file_open;
 
 /*:6*//*8:*/
-#line 125 "common.h"
+#line 129 "common.h"
 
 extern sixteen_bits section_count;
 extern boolean changed_section[];
@@ -173,7 +177,7 @@
 extern boolean print_where;
 
 /*:8*//*9:*/
-#line 139 "common.h"
+#line 143 "common.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -198,12 +202,12 @@
 extern hash_pointer h;
 
 /*:9*//*11:*/
-#line 183 "common.h"
+#line 187 "common.h"
 
 extern int history;
 
 /*:11*//*13:*/
-#line 199 "common.h"
+#line 203 "common.h"
 
 extern int argc;
 extern char**argv;
@@ -214,7 +218,7 @@
 extern boolean flags[];
 
 /*:13*//*14:*/
-#line 215 "common.h"
+#line 217 "common.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
@@ -223,20 +227,20 @@
 extern FILE*active_file;
 
 /*:14*/
-#line 69 "common.w"
+#line 65 "common.w"
 
 /*18:*/
-#line 83 "common.w"
+#line 79 "common.w"
 
 boolean program;
 
 /*:18*//*19:*/
-#line 92 "common.w"
+#line 88 "common.w"
 
 int phase;
 
 /*:19*//*21:*/
-#line 130 "common.w"
+#line 126 "common.w"
 
 char section_text[longest_name+1];
 char*section_text_end= section_text+longest_name;
@@ -244,7 +248,7 @@
 char*id_loc;
 
 /*:21*//*22:*/
-#line 150 "common.w"
+#line 146 "common.w"
 
 char buffer[long_buf_size];
 char*buffer_end= buffer+buf_size-2;
@@ -252,7 +256,7 @@
 char*limit= buffer;
 
 /*:22*//*25:*/
-#line 194 "common.w"
+#line 190 "common.w"
 
 int include_depth;
 FILE*file[max_include_depth];
@@ -269,13 +273,13 @@
 boolean web_file_open= false;
 
 /*:25*//*26:*/
-#line 220 "common.w"
+#line 216 "common.w"
 
 static char change_buffer[buf_size];
 static char*change_limit;
 
 /*:26*//*37:*/
-#line 399 "common.w"
+#line 396 "common.w"
 
 sixteen_bits section_count;
 boolean changed_section[max_sections];
@@ -284,7 +288,7 @@
 boolean print_where= false;
 
 /*:37*//*43:*/
-#line 596 "common.w"
+#line 593 "common.w"
 
 char byte_mem[max_bytes];
 char*byte_mem_end= byte_mem+max_bytes-1;
@@ -292,13 +296,13 @@
 name_pointer name_dir_end= name_dir+max_names-1;
 
 /*:43*//*44:*/
-#line 607 "common.w"
+#line 604 "common.w"
 
 char*byte_ptr;
 name_pointer name_ptr;
 
 /*:44*//*46:*/
-#line 627 "common.w"
+#line 624 "common.w"
 
 name_pointer hash[hash_size];
 hash_pointer hash_end= hash+hash_size-1;
@@ -305,12 +309,12 @@
 hash_pointer h;
 
 /*:46*//*65:*/
-#line 1014 "common.w"
+#line 1006 "common.w"
 
 int history= spotless;
 
 /*:65*//*73:*/
-#line 1135 "common.w"
+#line 1129 "common.w"
 
 int argc;
 char**argv;
@@ -321,7 +325,7 @@
 boolean flags[128];
 
 /*:73*//*83:*/
-#line 1282 "common.w"
+#line 1273 "common.w"
 
 FILE*C_file;
 FILE*tex_file;
@@ -330,10 +334,10 @@
 FILE*active_file;
 
 /*:83*/
-#line 70 "common.w"
+#line 66 "common.w"
 
 /*7:*/
-#line 119 "common.h"
+#line 123 "common.h"
 
 extern boolean get_line(void);
 extern void check_complete(void);
@@ -340,12 +344,12 @@
 extern void reset_input(void);
 
 /*:7*//*10:*/
-#line 162 "common.h"
+#line 166 "common.h"
 
 extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
 extern name_pointer id_lookup(const char*,const char*,char);
 
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
 extern void init_node(name_pointer);
 extern void init_p(name_pointer,eight_bits);
 extern void print_prefix_name(name_pointer);
@@ -353,7 +357,7 @@
 extern void sprint_section_name(char*,name_pointer);
 
 /*:10*//*12:*/
-#line 186 "common.h"
+#line 190 "common.h"
 
 extern int wrap_up(void);
 extern void err_print(const char*);
@@ -361,50 +365,50 @@
 extern void overflow(const char*);
 
 /*:12*//*15:*/
-#line 223 "common.h"
+#line 225 "common.h"
 
 extern void common_init(void);
 extern void print_stats(void);
 
 /*:15*//*24:*/
-#line 180 "common.w"
+#line 176 "common.w"
 static boolean input_ln(FILE*);
 
 /*:24*//*28:*/
-#line 241 "common.w"
+#line 237 "common.w"
 static void prime_the_change_buffer(void);
 
 /*:28*//*33:*/
-#line 340 "common.w"
+#line 337 "common.w"
 static void check_change(void);
 
 /*:33*//*55:*/
-#line 774 "common.w"
+#line 767 "common.w"
 
 static int web_strcmp(char*,int,char*,int);
-static name_pointer add_section_name(name_pointer,int,char*,char*,int);
-static void extend_section_name(name_pointer,char*,char*,int);
+static name_pointer add_section_name(name_pointer,int,char*,char*,boolean);
+static void extend_section_name(name_pointer,char*,char*,boolean);
 
 /*:55*//*64:*/
-#line 1002 "common.w"
+#line 994 "common.w"
 static int section_name_cmp(char**,int,name_pointer);
 
 /*:64*//*76:*/
-#line 1197 "common.w"
+#line 1190 "common.w"
 static void scan_args(void);
 
 /*:76*/
-#line 71 "common.w"
+#line 67 "common.w"
 
 
 /*:1*//*20:*/
-#line 99 "common.w"
+#line 95 "common.w"
 
 void
 common_init(void)
 {
 /*45:*/
-#line 611 "common.w"
+#line 608 "common.w"
 
 name_dir->byte_start= byte_ptr= byte_mem;
 name_ptr= name_dir+1;
@@ -412,24 +416,24 @@
 root= NULL;
 
 /*:45*//*47:*/
-#line 634 "common.w"
+#line 631 "common.w"
 
 for(h= hash;h<=hash_end;*h++= NULL);
 
 /*:47*/
-#line 103 "common.w"
+#line 99 "common.w"
 
 /*74:*/
-#line 1148 "common.w"
+#line 1142 "common.w"
 
 show_banner= show_happiness= show_progress= make_xrefs= true;
 show_stats= false;
 
 /*:74*/
-#line 104 "common.w"
+#line 100 "common.w"
 
 /*84:*/
-#line 1289 "common.w"
+#line 1280 "common.w"
 
 scan_args();
 if(program==ctangle){
@@ -443,12 +447,12 @@
 }
 
 /*:84*/
-#line 105 "common.w"
+#line 101 "common.w"
 
 }
 
 /*:20*//*23:*/
-#line 160 "common.w"
+#line 156 "common.w"
 
 static boolean input_ln(
 FILE*fp)
@@ -470,7 +474,7 @@
 }
 
 /*:23*//*27:*/
-#line 231 "common.w"
+#line 227 "common.w"
 
 static void
 prime_the_change_buffer(void)
@@ -477,7 +481,7 @@
 {
 change_limit= change_buffer;
 /*29:*/
-#line 247 "common.w"
+#line 243 "common.w"
 
 while(true){
 change_line++;
@@ -494,10 +498,10 @@
 }
 
 /*:29*/
-#line 236 "common.w"
+#line 232 "common.w"
 
 /*30:*/
-#line 264 "common.w"
+#line 260 "common.w"
 
 do{
 change_line++;
@@ -509,10 +513,10 @@
 }while(limit==buffer);
 
 /*:30*/
-#line 237 "common.w"
+#line 233 "common.w"
 
 /*31:*/
-#line 274 "common.w"
+#line 270 "common.w"
 
 {
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -520,12 +524,12 @@
 }
 
 /*:31*/
-#line 238 "common.w"
+#line 234 "common.w"
 
 }
 
 /*:27*//*32:*/
-#line 302 "common.w"
+#line 299 "common.w"
 
 static void
 check_change(void)
@@ -538,7 +542,7 @@
 if(!change_pending)changed_section[section_count]= true;
 }
 while(true){
-changing= true;print_where= true;change_line++;
+changing= print_where= true;change_line++;
 if(!input_ln(change_file)){
 err_print("! Change file ended before @y");
 
@@ -548,7 +552,7 @@
 if(limit> buffer+1&&buffer[0]=='@'){
 char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
 /*34:*/
-#line 342 "common.w"
+#line 339 "common.w"
 
 if(xyz_code=='x'||xyz_code=='z'){
 loc= buffer+2;err_print("! Where is the matching @y?");
@@ -566,11 +570,11 @@
 }
 
 /*:34*/
-#line 324 "common.w"
+#line 321 "common.w"
 
 }
 /*31:*/
-#line 274 "common.w"
+#line 270 "common.w"
 
 {
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -578,7 +582,7 @@
 }
 
 /*:31*/
-#line 326 "common.w"
+#line 323 "common.w"
 
 changing= false;cur_line++;
 while(!input_ln(cur_file)){
@@ -594,7 +598,7 @@
 }
 
 /*:32*//*35:*/
-#line 362 "common.w"
+#line 359 "common.w"
 
 void
 reset_input(void)
@@ -601,7 +605,7 @@
 {
 limit= buffer;loc= buffer+1;buffer[0]= ' ';
 /*36:*/
-#line 377 "common.w"
+#line 374 "common.w"
 
 if((web_file= fopen(web_file_name,"r"))==NULL){
 strcpy(web_file_name,alt_web_file_name);
@@ -615,16 +619,16 @@
 fatal("! Cannot open change file ",change_file_name);
 
 /*:36*/
-#line 367 "common.w"
+#line 364 "common.w"
 
-include_depth= 0;cur_line= 0;change_line= 0;
+include_depth= cur_line= change_line= 0;
 change_depth= include_depth;
-changing= 1;prime_the_change_buffer();changing= !changing;
+changing= true;prime_the_change_buffer();changing= !changing;
 limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= false;
 }
 
 /*:35*//*38:*/
-#line 406 "common.w"
+#line 403 "common.w"
 
 boolean get_line(void)
 {
@@ -631,7 +635,7 @@
 restart:
 if(changing&&include_depth==change_depth)
 /*41:*/
-#line 514 "common.w"
+#line 511 "common.w"
 {
 change_line++;
 if(!input_ln(change_file)){
@@ -662,11 +666,11 @@
 }
 
 /*:41*/
-#line 411 "common.w"
+#line 408 "common.w"
 
 if(!changing||include_depth> change_depth){
 /*40:*/
-#line 497 "common.w"
+#line 494 "common.w"
 {
 cur_line++;
 while(!input_ln(cur_file)){
@@ -685,7 +689,7 @@
 }
 
 /*:40*/
-#line 413 "common.w"
+#line 410 "common.w"
 
 if(changing&&include_depth==change_depth)goto restart;
 }
@@ -706,11 +710,11 @@
 }
 include_depth++;
 /*39:*/
-#line 451 "common.w"
+#line 448 "common.w"
 {
 char temp_file_name[max_file_name_length];
 char*cur_file_name_end= cur_file_name+max_file_name_length-1;
-char*k= cur_file_name,*kk;
+char*kk,*k= cur_file_name;
 int l;
 
 if(*loc=='"'){
@@ -754,7 +758,7 @@
 }
 
 /*:39*/
-#line 432 "common.w"
+#line 429 "common.w"
 
 }
 return true;
@@ -761,7 +765,7 @@
 }
 
 /*:38*//*42:*/
-#line 546 "common.w"
+#line 543 "common.w"
 
 void
 check_complete(void){
@@ -775,7 +779,7 @@
 }
 
 /*:42*//*48:*/
-#line 639 "common.w"
+#line 636 "common.w"
 
 name_pointer
 id_lookup(
@@ -790,7 +794,7 @@
 if(last==NULL)for(last= first;*last!='\0';last++);
 l= (int)(last-first);
 /*49:*/
-#line 662 "common.w"
+#line 659 "common.w"
 
 h= (eight_bits)*i;
 while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
@@ -797,10 +801,10 @@
 
 
 /*:49*/
-#line 652 "common.w"
+#line 649 "common.w"
 
 /*50:*/
-#line 670 "common.w"
+#line 667 "common.w"
 
 p= hash[h];
 while(p&&!names_match(p,first,l,t))p= p->link;
@@ -810,10 +814,10 @@
 }
 
 /*:50*/
-#line 653 "common.w"
+#line 650 "common.w"
 
 if(p==name_ptr)/*51:*/
-#line 681 "common.w"
+#line 679 "common.w"
 {
 if(byte_ptr+l> byte_mem_end)overflow("byte memory");
 if(name_ptr>=name_dir_end)overflow("name");
@@ -823,13 +827,13 @@
 }
 
 /*:51*/
-#line 654 "common.w"
+#line 651 "common.w"
 
 return p;
 }
 
 /*:48*//*52:*/
-#line 713 "common.w"
+#line 711 "common.w"
 
 void
 print_section_name(
@@ -839,11 +843,9 @@
 name_pointer q= p+1;
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-term_write(s,(size_t)(ss-s));p= q->link;q= p;
-}else{
-term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir,q= NULL;
+term_write(s,(size_t)(ss-s));
 s= p->byte_start;
 }
 if(q)term_write("...",3);
@@ -850,7 +852,7 @@
 }
 
 /*:52*//*53:*/
-#line 732 "common.w"
+#line 728 "common.w"
 
 void
 sprint_section_name(
@@ -861,11 +863,8 @@
 name_pointer q= p+1;
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-p= q->link;q= p;
-}else{
-ss++;p= name_dir;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir;
 strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
 s= p->byte_start;
 }
@@ -873,7 +872,7 @@
 }
 
 /*:53*//*54:*/
-#line 753 "common.w"
+#line 746 "common.w"
 
 void
 print_prefix_name(
@@ -886,7 +885,7 @@
 }
 
 /*:54*//*56:*/
-#line 779 "common.w"
+#line 772 "common.w"
 
 static int web_strcmp(
 char*j,
@@ -904,7 +903,7 @@
 }
 
 /*:56*//*57:*/
-#line 808 "common.w"
+#line 801 "common.w"
 
 static name_pointer
 add_section_name(
@@ -912,7 +911,7 @@
 int c,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
@@ -928,14 +927,13 @@
 }
 set_prefix_length(p,name_len);
 strncpy(s,first,name_len);
-p->llink= NULL;
-p->rlink= NULL;
+p->llink= p->rlink= NULL;
 init_node(p);
 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
 }
 
 /*:57*//*58:*/
-#line 837 "common.w"
+#line 829 "common.w"
 
 static void
 extend_section_name(
@@ -942,7 +940,7 @@
 name_pointer p,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 char*s;
 name_pointer q= p+1;
@@ -959,14 +957,14 @@
 }
 
 /*:58*//*59:*/
-#line 865 "common.w"
+#line 857 "common.w"
 
 name_pointer
 section_lookup(
 char*first,char*last,
-int ispref)
+boolean ispref)
 {
-int c= 0;
+int c= less;
 name_pointer p= root;
 name_pointer q= NULL;
 name_pointer r= NULL;
@@ -974,7 +972,7 @@
 
 int name_len= (int)(last-first)+1;
 /*60:*/
-#line 889 "common.w"
+#line 881 "common.w"
 
 while(p){
 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -1001,19 +999,19 @@
 }
 
 /*:60*/
-#line 879 "common.w"
+#line 871 "common.w"
 
 /*61:*/
-#line 914 "common.w"
+#line 906 "common.w"
 
 if(r==NULL)
 return add_section_name(par,c,first,last+1,ispref);
 
 /*:61*/
-#line 880 "common.w"
+#line 872 "common.w"
 
 /*62:*/
-#line 922 "common.w"
+#line 914 "common.w"
 
 switch(section_name_cmp(&first,name_len,r)){
 
@@ -1026,16 +1024,16 @@
 }
 else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
 
-case equal:return r;
+case equal:break;
 case extension:if(!ispref||first<=last)
 extend_section_name(r,first,last+1,ispref);
-return r;
+break;
 case bad_extension:
 fputs("\n! New name extends <",stdout);
 
 print_section_name(r);
 err_print(">");
-return r;
+break;
 default:
 fputs("\n! Section name incompatible with <",stdout);
 
@@ -1043,16 +1041,16 @@
 fputs(">,\n which abbreviates <",stdout);
 print_section_name(r);
 err_print(">");
+}
 return r;
-}
 
 /*:62*/
-#line 881 "common.w"
+#line 873 "common.w"
 
 }
 
 /*:59*//*63:*/
-#line 970 "common.w"
+#line 962 "common.w"
 
 static int section_name_cmp(
 char**pfirst,
@@ -1062,12 +1060,12 @@
 char*first= *pfirst;
 name_pointer q= r+1;
 char*ss,*s= first_chunk(r);
-int c;
-int ispref;
+int c= less;
+boolean ispref;
 while(true){
 ss= (r+1)->byte_start-1;
-if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
-else ispref= 0,ss++,q= name_dir;
+if(*ss==' '&&ss>=r->byte_start)ispref= true,q= q->link;
+else ispref= false,ss++,q= name_dir;
 switch(c= web_strcmp(first,len,s,ss-s)){
 case equal:if(q==name_dir)
 if(ispref){
@@ -1086,7 +1084,7 @@
 }
 
 /*:63*//*66:*/
-#line 1024 "common.w"
+#line 1016 "common.w"
 
 void
 err_print(
@@ -1095,7 +1093,7 @@
 char*k,*l;
 printf(*s=='!'?"\n%s":"%s",s);
 if(web_file_open)/*67:*/
-#line 1044 "common.w"
+#line 1036 "common.w"
 
 {if(changing&&include_depth==change_depth)
 printf(". (l. %d of change file)\n",change_line);
@@ -1106,7 +1104,7 @@
 for(k= buffer;k<l;k++)
 if(*k=='\t')putchar(' ');
 else putchar(*k);
-putchar('\n');
+new_line;
 for(k= buffer;k<l;k++)putchar(' ');
 }
 for(k= l;k<limit;k++)putchar(*k);
@@ -1115,13 +1113,13 @@
 }
 
 /*:67*/
-#line 1031 "common.w"
+#line 1023 "common.w"
 
 update_terminal;mark_error;
 }
 
 /*:66*//*68:*/
-#line 1076 "common.w"
+#line 1068 "common.w"
 
 int wrap_up(void){
 if(show_progress)new_line;
@@ -1128,19 +1126,21 @@
 if(show_stats)
 print_stats();
 /*69:*/
-#line 1086 "common.w"
+#line 1078 "common.w"
 
 switch(history){
-case spotless:if(show_happiness)puts("(No errors were found.)");break;
+case spotless:
+if(show_happiness)puts("(No errors were found.)");break;
 case harmless_message:
 puts("(Did you see the warning message above?)");break;
 case error_message:
 puts("(Pardon me, but I think I spotted something wrong.)");break;
-case fatal_message:puts("(That was a fatal error, my friend.)");
+case fatal_message:default:
+puts("(That was a fatal error, my friend.)");
 }
 
 /*:69*/
-#line 1081 "common.w"
+#line 1073 "common.w"
 
 if(history> harmless_message)return EXIT_FAILURE;
 else return EXIT_SUCCESS;
@@ -1147,7 +1147,7 @@
 }
 
 /*:68*//*70:*/
-#line 1102 "common.w"
+#line 1096 "common.w"
 void
 fatal(
 const char*s,const char*t)
@@ -1158,7 +1158,7 @@
 }
 
 /*:70*//*71:*/
-#line 1113 "common.w"
+#line 1107 "common.w"
 void
 overflow(
 const char*t)
@@ -1168,7 +1168,7 @@
 
 
 /*:71*//*75:*/
-#line 1167 "common.w"
+#line 1161 "common.w"
 
 static void
 scan_args(void)
@@ -1182,35 +1182,32 @@
 strcpy(change_file_name,"/dev/null");
 while(--argc> 0){
 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 1258 "common.w"
+#line 1251 "common.w"
 
-{
 for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
 flags[(eight_bits)*dot_pos]= flag_change;
-}
 
 /*:80*/
-#line 1179 "common.w"
+#line 1173 "common.w"
 
 else{
 s= name_pos= *argv;dot_pos= NULL;
-while(*s){
+while(*s)
 if(*s=='.')dot_pos= s++;
 else if(*s=='/')dot_pos= NULL,name_pos= ++s;
 else s++;
-}
 if(!found_web)/*77:*/
-#line 1206 "common.w"
+#line 1199 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1209 "common.w"
+#line 1202 "common.w"
 
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
@@ -1227,21 +1224,21 @@
 }
 
 /*:77*/
-#line 1188 "common.w"
+#line 1181 "common.w"
 
 else if(!found_change)/*78:*/
-#line 1224 "common.w"
+#line 1217 "common.w"
 
 {
 if(strcmp(*argv,"-")!=0){
 if(s-*argv> max_file_name_length-4)
 /*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1228 "common.w"
+#line 1221 "common.w"
 
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
@@ -1251,20 +1248,20 @@
 }
 
 /*:78*/
-#line 1189 "common.w"
+#line 1182 "common.w"
 
 else if(!found_out)/*79:*/
-#line 1236 "common.w"
+#line 1229 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1239 "common.w"
+#line 1232 "common.w"
 
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
@@ -1284,10 +1281,10 @@
 }
 
 /*:79*/
-#line 1190 "common.w"
+#line 1183 "common.w"
 
 else/*81:*/
-#line 1264 "common.w"
+#line 1255 "common.w"
 
 {
 if(program==ctangle)
@@ -1301,12 +1298,12 @@
 }
 
 /*:81*/
-#line 1191 "common.w"
+#line 1184 "common.w"
 
 }
 }
 if(!found_web)/*81:*/
-#line 1264 "common.w"
+#line 1255 "common.w"
 
 {
 if(program==ctangle)
@@ -1320,7 +1317,7 @@
 }
 
 /*:81*/
-#line 1194 "common.w"
+#line 1187 "common.w"
 
 }
 

Modified: trunk/Build/source/texk/web2c/cwebdir/common.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.h	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.h	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 % This program by Silvio Levy and Donald E. Knuth
 % is based on a program by Knuth.
 % It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021 (works also with later versions)
+% Version 4.3 --- April 2021 (works also with later versions)
 
 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
 
@@ -27,9 +27,7 @@
 
 First comes general stuff:
 
- at s boolean int
- at s uint8_t int
- at s uint16_t int
+ at i iso_types.w
 
 @d ctangle false
 @d cweave true
@@ -56,20 +54,22 @@
 @^ASCII code dependencies@>
 
 @d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
- at d lt_lt 020 /* `\.{<<}'\,;  corresponds to MIT's {\tentex\char'20} */
- at d gt_gt 021 /* `\.{>>}'\,;  corresponds to MIT's {\tentex\char'21} */
- at d plus_plus 013 /* `\.{++}'\,;  corresponds to MIT's {\tentex\char'13} */
- at d minus_minus 01 /* `\.{--}'\,;  corresponds to MIT's {\tentex\char'1} */
- at d minus_gt 031 /* `\.{->}'\,;  corresponds to MIT's {\tentex\char'31} */
- at d non_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
- at d lt_eq 034 /* `\.{<=}'\,;  corresponds to MIT's {\tentex\char'34} */
- at d gt_eq 035 /* `\.{>=}'\,;  corresponds to MIT's {\tentex\char'35} */
- at d eq_eq 036 /* `\.{==}'\,;  corresponds to MIT's {\tentex\char'36} */
- at d or_or 037 /* `\.{\v\v}'\,;  corresponds to MIT's {\tentex\char'37} */
- at d dot_dot_dot 016 /* `\.{...}'\,;  corresponds to MIT's {\tentex\char'16} */
- at d colon_colon 06 /* `\.{::}'\,;  corresponds to MIT's {\tentex\char'6} */
- at d period_ast 026 /* `\.{.*}'\,;  corresponds to MIT's {\tentex\char'26} */
- at d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
+ at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
+ at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
+ at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
+ at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
+ at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
+ at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
+ at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
+ at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
+ at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
+ at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
+ at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
+ at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
+ at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
+ at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+@#
+ at d compress(c) if (loc++<=limit) return c
 
 @<Common code...@>=
 extern char section_text[]; /* text being sought for */
@@ -78,12 +78,16 @@
 extern char *id_loc; /* just after the current identifier in the buffer */
 
 @ Code related to input routines:
- at d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
- at d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
- at d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
- at d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
- at d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
+ at d xisalpha(c) (isalpha((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisdigit(c) (isdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisspace(c) (isspace((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xislower(c) (islower((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisupper(c) (isupper((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisxdigit(c) (isxdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d isxalpha(c) ((c)=='_' || (c)=='$')
+  /* non-alpha characters allowed in identifier */
+ at d ishigh(c) ((eight_bits)(c)>0177)
+@^high-bit character handling@>
 
 @<Common code...@>=
 extern char buffer[]; /* where each line of input goes */
@@ -163,7 +167,7 @@
 extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
 extern name_pointer id_lookup(const char *,const char *,char);
    /* looks up a string in the identifier table */
-extern name_pointer section_lookup(char *,char *,int); /* finds section name */
+extern name_pointer section_lookup(char *,char *,boolean); /* finds section name */
 extern void init_node(name_pointer);@/
 extern void init_p(name_pointer,eight_bits);@/
 extern void print_prefix_name(name_pointer);@/
@@ -207,10 +211,8 @@
 
 @ Code related to output:
 @d update_terminal fflush(stdout) /* empty the terminal output buffer */
- at d new_line putchar('\n') @d putxchar putchar
+ at d new_line putchar('\n')
 @d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
- at d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
 
 @<Common code...@>=
 extern FILE *C_file; /* where output of \.{CTANGLE} goes */

Modified: trunk/Build/source/texk/web2c/cwebdir/common.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 % This program by Silvio Levy and Donald E. Knuth
 % is based on a program by Knuth.
 % It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -22,12 +22,12 @@
 
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -47,10 +47,6 @@
 \pageno=\contentspagenumber \advance\pageno by 1
 \let\maybe=\iftrue
 
- at s boolean int
- at s uint8_t int
- at s uint16_t int
-
 @** Introduction.  This file contains code common
 to both \.{CTANGLE} and \.{CWEAVE}, which roughly concerns the following
 problems: character uniformity, input routines, error handling and
@@ -158,13 +154,13 @@
 @^system dependencies@>
 
 @c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
 {
-  register int  c=EOF; /* character read; initialized so some compilers won't complain */
-  register char *k;  /* where next character goes */
-  if (feof(fp)) return false;  /* we have hit end-of-file */
-  limit = k = buffer;  /* beginning of buffer */
+  register int c=EOF; /* character read; initialized so some compilers won't complain */
+  register char *k; /* where next character goes */
+  if (feof(fp)) return false; /* we have hit end-of-file */
+  limit = k = buffer; /* beginning of buffer */
   while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n')
     if ((*(k++) = c) != ' ') limit = k;
   if (k>buffer_end)
@@ -172,7 +168,7 @@
       ungetc(c,fp); loc=buffer; err_print("! Input line too long");
 @.Input line too long@>
     }
-  if (c==EOF && limit==buffer) return false;  /* there was nothing after
+  if (c==EOF && limit==buffer) return false; /* there was nothing after
     the last newline */
   return true;
 }
@@ -214,7 +210,7 @@
 
 Here's a shorthand expression for inequality between the two lines:
 
- at d lines_dont_match (change_limit-change_buffer != limit-buffer || @|
+ at d lines_dont_match (change_limit-change_buffer != limit-buffer @| ||
   strncmp(buffer, change_buffer, (size_t)(limit-buffer)))
 
 @<Global var...@>=
@@ -293,8 +289,9 @@
 This procedure is called only when |buffer<limit|, i.e., when the
 current line is nonempty.
 
- at d if_section_start_make_pending(b) {@+*limit='!';
-  for (loc=buffer;xisspace(*loc);loc++) ;
+ at d if_section_start_make_pending(b) {
+  *limit='!';@+
+  for (loc=buffer;xisspace(*loc);loc++) ;@+
   *limit=' ';
   if (*loc=='@@' && (xisspace(*(loc+1)) || *(loc+1)=='*')) change_pending=b;
 }
@@ -311,7 +308,7 @@
     if (!change_pending) changed_section[section_count]=true;
   }
   while (true) {
-    changing=true; print_where=true; change_line++;
+    changing=print_where=true; change_line++;
     if (!input_ln(change_file)) {
       err_print("! Change file ended before @@y");
 @.Change file ended...@>
@@ -365,9 +362,9 @@
 {
   limit=buffer; loc=buffer+1; buffer[0]=' ';
   @<Open input files@>@;
-  include_depth=0; cur_line=0; change_line=0;
+  include_depth=cur_line=change_line=0;
   change_depth=include_depth;
-  changing=1; prime_the_change_buffer(); changing=!changing;
+  changing=true; prime_the_change_buffer(); changing=!changing;
   limit=buffer; loc=buffer+1; buffer[0]=' '; input_has_ended=false;
 }
 
@@ -408,7 +405,7 @@
 {
   restart:
   if (changing && include_depth==change_depth)
-   @<Read from |change_file| and maybe turn off |changing|@>@;
+    @<Read from |change_file| and maybe turn off |changing|@>@;
   if (! changing || include_depth>change_depth) {
     @<Read from |cur_file| and maybe turn on |changing|@>@;
     if (changing && include_depth==change_depth) goto restart;
@@ -451,7 +448,7 @@
 @.CWEBINPUTS@>@<Try to open...@>= {
   char temp_file_name[max_file_name_length];
   char *cur_file_name_end=cur_file_name+max_file_name_length-1;
-  char *k=cur_file_name, *kk;
+  char *kk, *k=cur_file_name;
   int l; /* length of file name */
 
   if (*loc=='"') {
@@ -483,7 +480,7 @@
   if (l>0) {
     if (k+l+2>=cur_file_name_end)  too_long();
 @.Include file name ...@>
-    for (; k>= cur_file_name; k--) *(k+l+1)=*k;
+    for (; k>=cur_file_name; k--) *(k+l+1)=*k;
     strcpy(cur_file_name,temp_file_name);
     cur_file_name[l]='/'; /* \UNIX/ pathname separator */
     if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@@ -638,10 +635,10 @@
 
 @c
 name_pointer
-id_lookup(@t\1\1@> /* looks up a string in the identifier table */
+id_lookup( /* looks up a string in the identifier table */
 const char *first, /* first character of string */
 const char *last, /* last character of string plus one */
-char t at t\2\2@>) /* the |ilk|; used by \.{CWEAVE} only */
+char t) /* the |ilk|; used by \.{CWEAVE} only */
 {
   const char *i=first; /* position in |buffer| */
   int h; /* hash code */
@@ -678,6 +675,7 @@
 @ The information associated with a new identifier must be initialized
 in a slightly different way in \.{CWEAVE} than in \.{CTANGLE}; hence the
 |init_p| procedure.
+
 @<Enter a new name...@>= {
   if (byte_ptr+l>byte_mem_end) overflow("byte memory");
   if (name_ptr>=name_dir_end) overflow("name");
@@ -719,11 +717,9 @@
   name_pointer q = p+1;
   while (p!=name_dir) {
     ss = (p+1)->byte_start-1;
-    if (*ss==' ' && ss>=s) {
-      term_write(s,(size_t)(ss-s)); p=q->link; q=p;
-    } else {
-      term_write(s,(size_t)(ss+1-s)); p=name_dir; q=NULL;
-    }
+    if (*ss==' ' && ss>=s) p=q->link,q=p;
+    else ss++,p=name_dir,q=NULL;
+    term_write(s,(size_t)(ss-s));
     s = p->byte_start;
   }
   if (q) term_write("...",3); /* complete name not yet known */
@@ -739,11 +735,8 @@
   name_pointer q = p+1;
   while (p!=name_dir) {
     ss = (p+1)->byte_start-1;
-    if (*ss==' ' && ss>=s) {
-      p=q->link; q=p;
-    } else {
-      ss++; p=name_dir;
-    }
+    if (*ss==' ' && ss>=s) p=q->link,q=p;
+    else ss++,p=name_dir;
     strncpy(dest,s,(size_t)(ss-s)), dest+=ss-s;
     s = p->byte_start;
   }
@@ -773,15 +766,15 @@
 
 @<Predecl...@>=
 static int web_strcmp(char *,int,char *,int);@/
-static name_pointer add_section_name(name_pointer,int,char *,char *,int);@/
-static void extend_section_name(name_pointer,char *,char *,int);
+static name_pointer add_section_name(name_pointer,int,char *,char *,boolean);@/
+static void extend_section_name(name_pointer,char *,char *,boolean);
 
 @ @c
-static int web_strcmp(@t\1\1@> /* fuller comparison than |strcmp| */
+static int web_strcmp( /* fuller comparison than |strcmp| */
   char *j, /* beginning of first string */
   int j_len, /* length of first string */
   char *k, /* beginning of second string */
-  int k_len at t\2\2@>) /* length of second string */
+  int k_len) /* length of second string */
 {
   char *j1=j+j_len, *k1=k+k_len;
   while (k<k1 && j<j1 && *j==*k) k++, j++;
@@ -807,12 +800,12 @@
 
 @c
 static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
 name_pointer par, /* parent of new node */
 int c, /* right or left? */
 char *first, /* first character of section name */
 char *last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   name_pointer p=name_ptr; /* new node */
   char *s=first_chunk(p);
@@ -828,8 +821,7 @@
   }
   set_prefix_length(p,name_len);
   strncpy(s,first,name_len);
-  p->llink=NULL;
-  p->rlink=NULL;
+  p->llink=p->rlink=NULL;
   init_node(p);
   return par==NULL ? (root=p) : c==less ? (par->llink=p) : (par->rlink=p);
 }
@@ -836,11 +828,11 @@
 
 @ @c
 static void
-extend_section_name(@t\1\1@>
+extend_section_name(
 name_pointer p, /* name to be extended */
 char *first, /* beginning of extension text */
 char *last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
 {
   char *s;
   name_pointer q=p+1;
@@ -864,11 +856,11 @@
 
 @c
 name_pointer
-section_lookup(@t\1\1@> /* find or install section name in tree */
+section_lookup( /* find or install section name in tree */
 char *first,char *last, /* first and last characters of new name */
-int ispref at t\2\2@>) /* is the new name a prefix or a full name? */
+boolean ispref) /* is the new name a prefix or a full name? */
 {
-  int c=0; /* comparison between two names; initialized so some compilers won't complain */
+  int c=less; /* comparison between two names; initialized so some compilers won't complain */
   name_pointer p=root; /* current node of the search tree */
   name_pointer q=NULL; /* another place to look in the tree */
   name_pointer r=NULL; /* where a match has been found */
@@ -931,16 +923,16 @@
     }
     else if (name_len<prefix_length(r)) set_prefix_length(r,name_len);
     /* fall through */
-  case equal: return r;
+  case equal: break;
   case extension: if (!ispref || first<=last)
         extend_section_name(r,first,last+1,ispref);
-      return r;
+      break;
   case bad_extension:
       fputs("\n! New name extends <",stdout);
 @.New name extends...@>
       print_section_name(r);
       err_print(">");
-    return r;
+    break;
   default: /* no match: illegal */
     fputs("\n! Section name incompatible with <",stdout);
 @.Section name incompatible...@>
@@ -948,8 +940,8 @@
     fputs(">,\n which abbreviates <",stdout);
     print_section_name(r);
     err_print(">");
-    return r;
 }
+return r;
 
 @ The return codes of |section_name_cmp|, which compares a string with
 the full name of a section, are those of |web_strcmp| plus
@@ -968,20 +960,20 @@
 @d bad_extension 5
 
 @c
-static int section_name_cmp(@t\1\1@>
+static int section_name_cmp(
 char **pfirst, /* pointer to beginning of comparison string */
 int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
 {
   char *first=*pfirst; /* beginning of comparison string */
   name_pointer q=r+1; /* access to subsequent chunks */
   char *ss, *s=first_chunk(r);
-  int c; /* comparison */
-  int ispref; /* is chunk |r| a prefix? */
+  int c=less; /* comparison */
+  boolean ispref; /* is chunk |r| a prefix? */
   while (true) {
     ss=(r+1)->byte_start-1;
-    if (*ss==' ' && ss>=r->byte_start) ispref=1,q=q->link;
-    else ispref=0,ss++,q=name_dir;
+    if (*ss==' ' && ss>=r->byte_start) ispref=true,q=q->link;
+    else ispref=false,ss++,q=name_dir;
     switch(c=web_strcmp(first,len,s,ss-s)) {
     case equal: if (q==name_dir)
         if (ispref) {
@@ -1023,12 +1015,12 @@
 
 @c
 void
-err_print(@t\1\1@> /* prints `\..' and location of error message */
-const char *s at t\2\2@>)
+err_print( /* prints `\..' and location of error message */
+const char *s)
 {
   char *k,*l; /* pointers into |buffer| */
   printf(*s=='!'? "\n%s" : "%s",s);
-  if(web_file_open) @<Print error location based on input buffer@>@;
+  if (web_file_open) @<Print error location based on input buffer@>@;
   update_terminal; mark_error;
 }
 
@@ -1051,7 +1043,7 @@
   for (k=buffer; k<l; k++)
     if (*k=='\t') putchar(' ');
     else putchar(*k); /* print the characters already read */
-  putchar('\n');
+  new_line;
   for (k=buffer; k<l; k++) putchar(' '); /* space out the next line */
 }
 for (k=l; k<limit; k++) putchar(*k); /* print the part not yet read */
@@ -1070,7 +1062,7 @@
 Some implementations may wish to pass the |history| value to the
 operating system so that it can be used to govern whether or not other
 programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
 @^system dependencies@>
 
 @c
@@ -1085,13 +1077,15 @@
 
 @ @<Print the job |history|@>=
 switch (history) {
-case spotless: if (show_happiness) puts("(No errors were found.)"); break;
+case spotless:
+  if (show_happiness) puts("(No errors were found.)"); break;
 case harmless_message:
   puts("(Did you see the warning message above?)"); break;
 case error_message:
   puts("(Pardon me, but I think I spotted something wrong.)"); break;
-case fatal_message: puts("(That was a fatal error, my friend.)");
-} /* there are no other cases */
+case fatal_message: default:
+  puts("(That was a fatal error, my friend.)");
+}
 
 @ When there is no way to recover from an error, the |fatal| subroutine is
 invoked. This happens most often when |overflow| occurs.
@@ -1179,14 +1173,13 @@
     if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
     else {
       s=name_pos=*argv;@+dot_pos=NULL;
-      while (*s) {
+      while (*s)
         if (*s=='.') dot_pos=s++;
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
         else s++;
-      }
       if (!found_web) @<Make
-       |web_file_name|, |tex_file_name|, and |C_file_name|@>@;
-      else if (!found_change) @<Make |change_file_name| from |fname|@>@;
+        |web_file_name|, |tex_file_name|, and |C_file_name|@>@;
+      else if (!found_change) @<Make |change_file_name|@>@;
       else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
         else @<Print usage error message and quit@>@;
     }
@@ -1256,10 +1249,8 @@
 
 @ @d flag_change (**argv!='-')
 @<Handle flag...@>=
-{
-  for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
-    flags[(eight_bits)*dot_pos]=flag_change;
-}
+for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+  flags[(eight_bits)*dot_pos]=flag_change;
 
 @ @<Print usage error message and quit@>=
 {

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,16 +17,16 @@
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 4.2pc/big)"
+ at d banner "This is CTANGLE (Version 4.3pc/big)"
 @z
 
 
- at x Section 9.
+ at x Section 10.
   for section names */
 
 @<Common code...@>=
@@ -127,7 +127,7 @@
 @z
 
 
- at x Section 16.
+ at x Section 19.
   eight_bits *tok_start; /* pointer into |tok_mem| */
   sixteen_bits text_link; /* relates replacement texts */
 } text;
@@ -140,7 +140,7 @@
 @z
 
 
- at x Section 17.
+ at x Section 20.
 static eight_bits tok_mem[max_toks];
 static eight_bits *tok_mem_end=tok_mem+max_toks-1;
 static eight_bits *tok_ptr; /* first unused position in |tok_mem| */
@@ -151,7 +151,7 @@
 @z
 
 
- at x Section 18.
+ at x Section 21.
 text_info->tok_start=tok_ptr=tok_mem;
 text_ptr=text_info+1; text_ptr->tok_start=tok_mem;
   /* this makes replacement text 0 of length zero */
@@ -163,7 +163,7 @@
 @z
 
 
- at x Section 19.
+ at x Section 22.
 @d equiv equiv_or_xref /* info corresponding to names */
 @y
 @d equiv ptr_union.equiv_member /* info corresponding to names */
@@ -170,7 +170,7 @@
 @z
 
 
- at x Section 27.
+ at x Section 31.
   eight_bits *end_field; /* ending location of replacement text */
   eight_bits *byte_field; /* present location within replacement text */
 @y
@@ -179,7 +179,7 @@
 @z
 
 
- at x Section 49.
+ at x Section 55.
 out_char(
 eight_bits cur_char)
 {

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -16,7 +16,7 @@
 }
 @y
 \def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{66}
+\def\contentspagenumber{64}
 \def\title{APPENDIX E: CTANGLE}
 \let\K=\leftarrow
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -9,11 +9,11 @@
 alternate change files with -bs suffix instead of -pc.
 
 @x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
- at d banner "This is CTANGLE (Version 4.2pc)"
+ at d banner "This is CTANGLE (Version 4.3pc)"
 @z
- at x section 4
+ at x section 17
 @d max_bytes 1000000 /* the number of bytes in identifiers,
   index entries, and section names */
 @d max_toks 1000000 /* number of bytes in compressed \CEE/ code */

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,15 +7,15 @@
 
 
 @x
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
 @y
-\def\title{CTANGLE (QL Version 4.2)}
+\def\title{CTANGLE (QL Version 4.3)}
 @z
 
 @x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
- at d banner "This is CTANGLE (QL Version 4.2)"
+ at d banner "This is CTANGLE (QL Version 4.3)"
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,12 +10,12 @@
 (these changes not necessary for initial bootstrapping)
 
 @x section 1 (01-FEB-1992 ST)
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
- at d banner "This is CTANGLE (VAX/VMS Version 4.2)"
+ at d banner "This is CTANGLE (VAX/VMS Version 4.3)"
 @z
 
- at x section 3 (01-FEB-1992 ST)
+ at x section 4 (01-FEB-1992 ST)
 #include <ctype.h> /* definition of |@!isalpha|, |@!isdigit| and so on */
 #include <stdbool.h> /* definition of |@!bool|, |@!true| and |@!false| */
 #include <stddef.h> /* definition of |@!ptrdiff_t| */

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,15 +17,15 @@
 @q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
 @y
-\def\title{CTANGLE (Version 4.2 [\TeX~Live])}
+\def\title{CTANGLE (Version 4.3 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
 @y
-  \centerline{(Version 4.2 [\TeX~Live])}
+  \centerline{(Version 4.3 [\TeX~Live])}
 @z
 
 @x
@@ -41,9 +41,9 @@
 @z
 
 @x
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
- at d banner "This is CTANGLE, Version 4.2"
+ at d banner "This is CTANGLE, Version 4.3"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
@@ -78,9 +78,9 @@
 @z
 
 @x
-      overflow("output files");
+    else overflow("output files");
 @y
-      overflow(_("output files"));
+    else overflow(_("output files"));
 @z
 
 @x
@@ -113,14 +113,14 @@
     an_output_file--;
     sprint_section_name(output_file_name,*an_output_file);
     fclose(C_file);
-    C_file=fopen(output_file_name,"wb");
-    if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
+    if ((C_file=fopen(output_file_name,"wb"))==NULL)
+      fatal("! Cannot open output file ",output_file_name);
 @.Cannot open output file@>
     if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
     cur_line=1;
     stack_ptr=stack+1;
-    cur_name= (*an_output_file);
-    cur_repl= (text_pointer)cur_name->equiv;
+    cur_name=(*an_output_file);
+    cur_repl=(text_pointer)cur_name->equiv;
     cur_byte=cur_repl->tok_start;
     cur_end=(cur_repl+1)->tok_start;
     while (stack_ptr > stack) get_output();
@@ -142,8 +142,8 @@
     if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
     cur_line=1;
     stack_ptr=stack+1;
-    cur_name= (*an_output_file);
-    cur_repl= (text_pointer)cur_name->equiv;
+    cur_name=(*an_output_file);
+    cur_repl=(text_pointer)cur_name->equiv;
     cur_byte=cur_repl->tok_start;
     cur_end=(cur_repl+1)->tok_start;
     while (stack_ptr > stack) get_output();
@@ -154,9 +154,9 @@
 @z
 
 @x
-          else if (a<050000) { confusion("macro defs have strange char");}
+          else if (a<050000) confusion("macro defs have strange char");
 @y
-          else if (a<050000) { confusion(_("macro defs have strange char"));}
+          else if (a<050000) confusion(_("macro defs have strange char"));
 @z
 
 @x
@@ -338,9 +338,9 @@
 @x
 @** Index.
 @y
-@** 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.
+@** Extensions to {\tentex 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
 material should nicely integrate with the original ``\&{104.~Index}.''
@@ -368,7 +368,7 @@
     fatal(_("! Cannot open output file "),check_file_name);
 @.Cannot open output file@>
 
-  if (temporary_output) @<Compare the temporary output...@>@;
+  if (check_for_change) @<Compare the temporary output...@>@;
 
   fclose(C_file); C_file=NULL;
   fclose(check_file); check_file=NULL;

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -4,23 +4,23 @@
 Changes necessary for compiling with Borland C/C++
 
 @x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 @y
- at d banner "This is CTANGLE (Version 4.2win32)"
+ at d banner "This is CTANGLE (Version 4.3win32)"
 @z
 
 @x
-boolean names_match(@t\1\1@>
+boolean names_match(
 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 at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
 @y
-boolean __cdecl names_match(@t\1\1@>
+boolean __cdecl names_match(
 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 at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.c	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.c	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 #line 66 "ctangle.w"
 
 /*4:*/
-#line 46 "common.h"
+#line 44 "common.h"
 
 #include <ctype.h>  
 #include <stdbool.h>  
@@ -15,7 +15,7 @@
 /*:4*/
 #line 67 "ctangle.w"
 
-#define banner "This is CTANGLE (Version 4.2)" \
+#define banner "This is CTANGLE (Version 4.3)" \
 
 #define ctangle false
 #define cweave true \
@@ -36,13 +36,19 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) ) 
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) )  \
+#define compress(c) if(loc++<=limit) return c \
 
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) ) 
+#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
+ \
+
 #define max_include_depth 10 \
 
 #define max_file_name_length 1024
@@ -76,10 +82,7 @@
 
 #define update_terminal fflush(stdout) 
 #define new_line putchar('\n') 
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
-#define C_printf(c,a) fprintf(C_file,c,a) 
-#define C_putc(c) putc(c,C_file)  \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)  \
 
 #define max_bytes 1000000 \
 
@@ -95,9 +98,11 @@
 
 #define equiv equiv_or_xref \
 
+#define macro 0
 #define section_flag max_texts \
 
 #define string 02
+#define constant 03
 #define join 0177
 #define output_defs_flag (2*024000-1)  \
 
@@ -117,9 +122,12 @@
 #define verbatim 4 \
 
 #define max_files 256
+#define C_printf(c,a) fprintf(C_file,c,a) 
+#define C_putc(c) putc(c,C_file)  \
+
 #define translit_length 10 \
 
-#define ignore 0
+#define ignore 00
 #define ord 0302
 #define control_text 0303
 #define translit_code 0304
@@ -130,23 +138,15 @@
 #define section_name 0311
 #define new_section 0312 \
 
-#define constant 03 \
+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
 
-#define isxalpha(c) ((c) =='_'||(c) =='$')  \
+#define keep_digit_separators flags['k'] \
 
-#define ishigh(c) ((eight_bits) (c) > 0177)  \
- \
 
-#define compress(c) if(loc++<=limit) return c \
-
-#define macro 0
-#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
-
-
 #line 68 "ctangle.w"
 
 /*3:*/
-#line 37 "common.h"
+#line 35 "common.h"
 
 typedef bool boolean;
 typedef uint8_t eight_bits;
@@ -163,7 +163,7 @@
 extern char*id_loc;
 
 /*:5*//*6:*/
-#line 88 "common.h"
+#line 92 "common.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -171,7 +171,7 @@
 extern char*limit;
 
 /*:6*//*7:*/
-#line 105 "common.h"
+#line 109 "common.h"
 
 extern int include_depth;
 extern FILE*file[];
@@ -187,7 +187,7 @@
 extern boolean web_file_open;
 
 /*:7*//*9:*/
-#line 125 "common.h"
+#line 129 "common.h"
 
 extern sixteen_bits section_count;
 extern boolean changed_section[];
@@ -195,7 +195,7 @@
 extern boolean print_where;
 
 /*:9*//*10:*/
-#line 139 "common.h"
+#line 143 "common.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -220,12 +220,12 @@
 extern hash_pointer h;
 
 /*:10*//*12:*/
-#line 183 "common.h"
+#line 187 "common.h"
 
 extern int history;
 
 /*:12*//*14:*/
-#line 199 "common.h"
+#line 203 "common.h"
 
 extern int argc;
 extern char**argv;
@@ -236,7 +236,7 @@
 extern boolean flags[];
 
 /*:14*//*15:*/
-#line 215 "common.h"
+#line 217 "common.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
@@ -257,7 +257,7 @@
 typedef text*text_pointer;
 
 /*:19*//*31:*/
-#line 269 "ctangle.w"
+#line 273 "ctangle.w"
 
 typedef struct{
 eight_bits*end_field;
@@ -282,12 +282,12 @@
 static eight_bits*tok_ptr;
 
 /*:20*//*26:*/
-#line 198 "ctangle.w"
+#line 199 "ctangle.w"
 
 static text_pointer last_unnamed;
 
 /*:26*//*32:*/
-#line 285 "ctangle.w"
+#line 289 "ctangle.w"
 
 static output_state cur_state;
 
@@ -296,18 +296,18 @@
 static stack_pointer stack_ptr;
 
 /*:32*//*37:*/
-#line 361 "ctangle.w"
+#line 365 "ctangle.w"
 
 static int cur_val;
 
 /*:37*//*42:*/
-#line 452 "ctangle.w"
+#line 456 "ctangle.w"
 
 static eight_bits out_state;
 static boolean protect;
 
 /*:42*//*45:*/
-#line 483 "ctangle.w"
+#line 487 "ctangle.w"
 
 static name_pointer output_files[max_files];
 static name_pointer*cur_out_file,*end_output_files,*an_output_file;
@@ -315,33 +315,33 @@
 static char output_file_name[longest_name+1];
 
 /*:45*//*52:*/
-#line 582 "ctangle.w"
+#line 584 "ctangle.w"
 
 static boolean output_defs_seen= false;
 
 /*:52*//*57:*/
-#line 691 "ctangle.w"
+#line 696 "ctangle.w"
 
 static char translit[128][translit_length];
 
 /*:57*//*62:*/
-#line 770 "ctangle.w"
+#line 775 "ctangle.w"
 
 static eight_bits ccode[256];
 
 /*:62*//*66:*/
-#line 830 "ctangle.w"
+#line 835 "ctangle.w"
 
 static boolean comment_continues= false;
 
 /*:66*//*68:*/
-#line 869 "ctangle.w"
+#line 872 "ctangle.w"
 
 static name_pointer cur_section_name;
 static boolean no_where;
 
 /*:68*//*82:*/
-#line 1182 "ctangle.w"
+#line 1189 "ctangle.w"
 
 static text_pointer cur_text;
 static eight_bits next_control;
@@ -350,7 +350,7 @@
 #line 71 "ctangle.w"
 
 /*8:*/
-#line 119 "common.h"
+#line 123 "common.h"
 
 extern boolean get_line(void);
 extern void check_complete(void);
@@ -357,12 +357,12 @@
 extern void reset_input(void);
 
 /*:8*//*11:*/
-#line 162 "common.h"
+#line 166 "common.h"
 
 extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
 extern name_pointer id_lookup(const char*,const char*,char);
 
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
 extern void init_node(name_pointer);
 extern void init_p(name_pointer,eight_bits);
 extern void print_prefix_name(name_pointer);
@@ -370,7 +370,7 @@
 extern void sprint_section_name(char*,name_pointer);
 
 /*:11*//*13:*/
-#line 186 "common.h"
+#line 190 "common.h"
 
 extern int wrap_up(void);
 extern void err_print(const char*);
@@ -378,63 +378,63 @@
 extern void overflow(const char*);
 
 /*:13*//*16:*/
-#line 223 "common.h"
+#line 225 "common.h"
 
 extern void common_init(void);
 extern void print_stats(void);
 
 /*:16*//*30:*/
-#line 241 "ctangle.w"
+#line 245 "ctangle.w"
 static void store_two_bytes(sixteen_bits);
 
 /*:30*//*35:*/
-#line 324 "ctangle.w"
+#line 328 "ctangle.w"
 
 static void push_level(name_pointer);
 static void pop_level(boolean);
 
 /*:35*//*39:*/
-#line 397 "ctangle.w"
+#line 401 "ctangle.w"
 static void get_output(void);
 
 /*:39*//*44:*/
-#line 473 "ctangle.w"
+#line 477 "ctangle.w"
 static void flush_buffer(void);
 
 /*:44*//*49:*/
-#line 549 "ctangle.w"
+#line 551 "ctangle.w"
 static void phase_two(void);
 
 /*:49*//*53:*/
-#line 585 "ctangle.w"
+#line 587 "ctangle.w"
 
 static void output_defs(void);
 static void out_char(eight_bits);
 
 /*:53*//*65:*/
-#line 810 "ctangle.w"
+#line 815 "ctangle.w"
 
 static eight_bits skip_ahead(void);
 static boolean skip_comment(boolean);
 
 /*:65*//*70:*/
-#line 924 "ctangle.w"
+#line 922 "ctangle.w"
 static eight_bits get_next(void);
 
 /*:70*//*84:*/
-#line 1208 "ctangle.w"
+#line 1215 "ctangle.w"
 static void scan_repl(eight_bits);
 
 /*:84*//*91:*/
-#line 1379 "ctangle.w"
+#line 1396 "ctangle.w"
 static void scan_section(void);
 
 /*:91*//*99:*/
-#line 1460 "ctangle.w"
+#line 1477 "ctangle.w"
 static void phase_one(void);
 
 /*:99*//*101:*/
-#line 1494 "ctangle.w"
+#line 1511 "ctangle.w"
 static void skip_limbo(void);
 
 /*:101*/
@@ -463,16 +463,16 @@
 init_node(name_dir);
 
 /*:23*//*27:*/
-#line 201 "ctangle.w"
-last_unnamed= text_info;text_info->text_link= 0;
+#line 202 "ctangle.w"
+last_unnamed= text_info;text_info->text_link= macro;
 
 /*:27*//*46:*/
-#line 493 "ctangle.w"
+#line 497 "ctangle.w"
 
 cur_out_file= end_output_files= output_files+max_files;
 
 /*:46*//*58:*/
-#line 694 "ctangle.w"
+#line 699 "ctangle.w"
 
 {
 int i;
@@ -480,7 +480,7 @@
 }
 
 /*:58*//*63:*/
-#line 773 "ctangle.w"
+#line 778 "ctangle.w"
 {
 int c;
 for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -500,7 +500,7 @@
 }
 
 /*:63*//*78:*/
-#line 1103 "ctangle.w"
+#line 1111 "ctangle.w"
 section_text[0]= ' ';
 
 /*:78*/
@@ -539,7 +539,7 @@
 init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
 
 /*:25*//*29:*/
-#line 231 "ctangle.w"
+#line 235 "ctangle.w"
 
 static void
 store_two_bytes(
@@ -551,7 +551,7 @@
 }
 
 /*:29*//*34:*/
-#line 309 "ctangle.w"
+#line 313 "ctangle.w"
 
 static void
 push_level(
@@ -568,7 +568,7 @@
 }
 
 /*:34*//*36:*/
-#line 332 "ctangle.w"
+#line 336 "ctangle.w"
 
 static void
 pop_level(
@@ -584,7 +584,7 @@
 }
 
 /*:36*//*38:*/
-#line 368 "ctangle.w"
+#line 372 "ctangle.w"
 
 static void
 get_output(void)
@@ -607,7 +607,7 @@
 case 0:cur_val= a;out_char(identifier);break;
 case 1:if(a==output_defs_flag)output_defs();
 else/*40:*/
-#line 402 "ctangle.w"
+#line 406 "ctangle.w"
 
 {
 a-= 024000;
@@ -621,7 +621,7 @@
 }
 
 /*:40*/
-#line 389 "ctangle.w"
+#line 393 "ctangle.w"
 
 break;
 default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
@@ -631,7 +631,7 @@
 }
 
 /*:38*//*43:*/
-#line 460 "ctangle.w"
+#line 464 "ctangle.w"
 
 static void
 flush_buffer(void)
@@ -638,7 +638,7 @@
 {
 C_putc('\n');
 if(cur_line%100==0&&show_progress){
-printf(".");
+putchar('.');
 if(cur_line%500==0)printf("%d",cur_line);
 update_terminal;
 }
@@ -646,7 +646,7 @@
 }
 
 /*:43*//*48:*/
-#line 514 "ctangle.w"
+#line 516 "ctangle.w"
 
 static void
 phase_two(void){
@@ -653,24 +653,24 @@
 web_file_open= false;
 cur_line= 1;
 /*33:*/
-#line 298 "ctangle.w"
+#line 302 "ctangle.w"
 
 stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
 cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
 
 /*:33*/
-#line 519 "ctangle.w"
+#line 521 "ctangle.w"
 
 /*51:*/
-#line 578 "ctangle.w"
+#line 580 "ctangle.w"
 
 if(!output_defs_seen)
 output_defs();
 
 /*:51*/
-#line 520 "ctangle.w"
+#line 522 "ctangle.w"
 
-if(text_info->text_link==0&&cur_out_file==end_output_files){
+if(text_info->text_link==macro&&cur_out_file==end_output_files){
 fputs("\n! No program text was specified.",stdout);mark_harmless;
 
 }
@@ -686,19 +686,19 @@
 printf(" (%s)",C_file_name);
 update_terminal;
 }
-if(text_info->text_link==0)goto writeloop;
+if(text_info->text_link==macro)goto writeloop;
 }
 while(stack_ptr> stack)get_output();
 flush_buffer();
 writeloop:/*50:*/
-#line 555 "ctangle.w"
+#line 557 "ctangle.w"
 
 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,"wb");
-if(C_file==0)fatal("! Cannot open output file ",output_file_name);
+if((C_file= fopen(output_file_name,"wb"))==NULL)
+fatal("! Cannot open output file ",output_file_name);
 
 if(show_progress){printf("\n(%s)",output_file_name);update_terminal;}
 cur_line= 1;
@@ -712,7 +712,7 @@
 }
 
 /*:50*/
-#line 541 "ctangle.w"
+#line 543 "ctangle.w"
 
 if(show_happiness){
 if(show_progress)new_line;
@@ -722,7 +722,7 @@
 }
 
 /*:48*//*54:*/
-#line 589 "ctangle.w"
+#line 594 "ctangle.w"
 
 static void
 output_defs(void)
@@ -730,7 +730,7 @@
 sixteen_bits a;
 push_level(NULL);
 for(cur_text= text_info+1;cur_text<text_ptr;cur_text++)
-if(cur_text->text_link==0){
+if(cur_text->text_link==macro){
 cur_byte= cur_text->tok_start;
 cur_end= (cur_text+1)->tok_start;
 C_printf("%s","#define ");
@@ -748,7 +748,7 @@
 if(a<024000){
 cur_val= a;out_char(identifier);
 }
-else if(a<050000){confusion("macro defs have strange char");}
+else if(a<050000)confusion("macro defs have strange char");
 else{
 cur_val= a-050000;cur_section= cur_val;out_char(section_number);
 }
@@ -762,7 +762,7 @@
 }
 
 /*:54*//*55:*/
-#line 632 "ctangle.w"
+#line 637 "ctangle.w"
 
 static void
 out_char(
@@ -775,7 +775,7 @@
 if(protect||out_state==verbatim)C_putc('\\');
 flush_buffer();if(out_state!=verbatim)out_state= normal;break;
 /*59:*/
-#line 700 "ctangle.w"
+#line 705 "ctangle.w"
 
 case identifier:
 if(out_state==num_or_id)C_putc(' ');
@@ -790,10 +790,10 @@
 out_state= num_or_id;break;
 
 /*:59*/
-#line 643 "ctangle.w"
+#line 648 "ctangle.w"
 
 /*60:*/
-#line 713 "ctangle.w"
+#line 718 "ctangle.w"
 
 case section_number:
 if(cur_val> 0)C_printf("/*%d:*/",cur_val);
@@ -815,15 +815,15 @@
 if(*j=='\\'||*j=='"')C_putc('\\');
 C_putc(*j);
 }
-C_printf("%s","\"\n");
+C_putc('"');C_putc('\n');
 }
 break;
 
 /*:60*/
-#line 644 "ctangle.w"
+#line 649 "ctangle.w"
 
 /*56:*/
-#line 662 "ctangle.w"
+#line 667 "ctangle.w"
 
 case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
 case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
@@ -844,7 +844,7 @@
 break;
 
 /*:56*/
-#line 645 "ctangle.w"
+#line 650 "ctangle.w"
 
 case'=':case'>':C_putc(cur_char);C_putc(' ');
 out_state= normal;break;
@@ -863,7 +863,7 @@
 }
 
 /*:55*//*64:*/
-#line 794 "ctangle.w"
+#line 799 "ctangle.w"
 
 static eight_bits
 skip_ahead(void)
@@ -881,7 +881,7 @@
 }
 
 /*:64*//*67:*/
-#line 833 "ctangle.w"
+#line 838 "ctangle.w"
 
 static boolean skip_comment(
 boolean is_long_comment)
@@ -915,22 +915,23 @@
 }
 
 /*:67*//*69:*/
-#line 881 "ctangle.w"
+#line 879 "ctangle.w"
 
 static eight_bits
 get_next(void)
 {
-static int preprocessing= 0;
+static boolean preprocessing= false;
 eight_bits c;
 while(true){
 if(loc> limit){
-if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
+if(preprocessing&&*(limit-1)!='\\')preprocessing= false;
 if(get_line()==false)return new_section;
 else if(print_where&&!no_where){
 print_where= false;
 /*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -942,9 +943,10 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 893 "ctangle.w"
+#line 891 "ctangle.w"
 
 }
 else return'\n';
@@ -958,24 +960,33 @@
 }
 loc++;
 if(xisdigit(c)||c=='.')/*73:*/
-#line 964 "ctangle.w"
+#line 963 "ctangle.w"
 {
+boolean hex_flag= false;
 id_first= loc-1;
 if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
 if(*id_first=='0'){
 if(*loc=='x'||*loc=='X'){
-loc++;while(xisxdigit(*loc))loc++;goto found;
+hex_flag= true;
+loc++;while(xisxdigit(*loc)||*loc=='\'')loc++;
 }
+else if(*loc=='b'||*loc=='B'){
+loc++;while(*loc=='0'||*loc=='1'||*loc=='\'')loc++;goto found;
 }
-while(xisdigit(*loc))loc++;
+}
+while(xisdigit(*loc)||*loc=='\'')loc++;
 if(*loc=='.'){
 loc++;
-while(xisdigit(*loc))loc++;
+while((hex_flag&&xisxdigit(*loc))||xisdigit(*loc)||*loc=='\'')loc++;
 }
 if(*loc=='e'||*loc=='E'){
 if(*++loc=='+'||*loc=='-')loc++;
-while(xisdigit(*loc))loc++;
+while(xisdigit(*loc)||*loc=='\'')loc++;
 }
+else if(hex_flag&&(*loc=='p'||*loc=='P')){
+if(*++loc=='+'||*loc=='-')loc++;
+while(xisxdigit(*loc)||*loc=='\'')loc++;
+}
 found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'
 ||*loc=='f'||*loc=='F')loc++;
 id_loc= loc;
@@ -983,19 +994,19 @@
 }
 
 /*:73*/
-#line 905 "ctangle.w"
+#line 903 "ctangle.w"
 
 else if(c=='\''||c=='"'
 ||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
 ||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
 /*74:*/
-#line 992 "ctangle.w"
+#line 1000 "ctangle.w"
 {
 char delim= c;
 id_first= section_text+1;
 id_loc= section_text;*++id_loc= delim;
 if(delim=='L'||delim=='u'||delim=='U'){
-if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
+if(delim=='u'&&*loc=='8')*++id_loc= *loc++;
 delim= *loc++;*++id_loc= delim;
 }
 while(true){
@@ -1033,26 +1044,27 @@
 }
 
 /*:74*/
-#line 909 "ctangle.w"
+#line 907 "ctangle.w"
 
 else if(isalpha(c)||isxalpha(c)||ishigh(c))
 /*72:*/
-#line 957 "ctangle.w"
+#line 954 "ctangle.w"
 {
 id_first= --loc;
-while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+do{
+++loc;
+}while(isalpha((eight_bits)*loc)||isdigit((eight_bits)*loc)
 ||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
 id_loc= loc;return identifier;
 }
 
 /*:72*/
-#line 911 "ctangle.w"
+#line 909 "ctangle.w"
 
 else if(c=='@')/*75:*/
-#line 1037 "ctangle.w"
+#line 1045 "ctangle.w"
 {
-c= ccode[(eight_bits)*loc++];
-switch(c){
+switch(c= ccode[(eight_bits)*loc++]){
 case ignore:continue;
 case translit_code:err_print("! Use @l in limbo only");continue;
 
@@ -1065,11 +1077,11 @@
 case section_name:
 cur_section_name_char= *(loc-1);
 /*77:*/
-#line 1085 "ctangle.w"
+#line 1091 "ctangle.w"
 {
 char*k;
 /*79:*/
-#line 1105 "ctangle.w"
+#line 1113 "ctangle.w"
 
 k= section_text;
 while(true){
@@ -1080,7 +1092,7 @@
 }
 c= *loc;
 /*80:*/
-#line 1129 "ctangle.w"
+#line 1137 "ctangle.w"
 
 if(c=='@'){
 c= *(loc+1);
@@ -1099,7 +1111,7 @@
 }
 
 /*:80*/
-#line 1114 "ctangle.w"
+#line 1122 "ctangle.w"
 
 loc++;if(k<section_text_end)k++;
 if(xisspace(c)){
@@ -1116,14 +1128,16 @@
 if(*k==' '&&k> section_text)k--;
 
 /*:79*/
-#line 1087 "ctangle.w"
+#line 1093 "ctangle.w"
 
 if(k-section_text> 3&&strncmp(k-2,"...",3)==0)
-cur_section_name= section_lookup(section_text+1,k-3,1);
-else cur_section_name= section_lookup(section_text+1,k,0);
+cur_section_name= section_lookup(section_text+1,k-3,true);
+
+else cur_section_name= section_lookup(section_text+1,k,false);
+
 if(cur_section_name_char=='(')
 /*47:*/
-#line 497 "ctangle.w"
+#line 501 "ctangle.w"
 
 {
 for(an_output_file= cur_out_file;
@@ -1132,23 +1146,21 @@
 if(an_output_file==end_output_files){
 if(cur_out_file> output_files)
 *--cur_out_file= cur_section_name;
-else{
-overflow("output files");
+else overflow("output files");
 }
 }
-}
 
 /*:47*/
-#line 1093 "ctangle.w"
+#line 1101 "ctangle.w"
 
 return section_name;
 }
 
 /*:77*/
-#line 1051 "ctangle.w"
+#line 1058 "ctangle.w"
 
 case string:/*81:*/
-#line 1151 "ctangle.w"
+#line 1159 "ctangle.w"
 {
 id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
 while(*loc!='@'||*(loc+1)!='>')loc++;
@@ -1159,15 +1171,14 @@
 }
 
 /*:81*/
-#line 1052 "ctangle.w"
+#line 1059 "ctangle.w"
 
 case ord:/*76:*/
-#line 1064 "ctangle.w"
+#line 1071 "ctangle.w"
 
 id_first= loc;
-if(*loc=='\\'){
+if(*loc=='\\')
 if(*++loc=='\'')loc++;
-}
 while(*loc!='\''){
 if(*loc=='@'){
 if(*(loc+1)!='@')
@@ -1185,7 +1196,7 @@
 return ord;
 
 /*:76*/
-#line 1053 "ctangle.w"
+#line 1060 "ctangle.w"
 
 default:return c;
 }
@@ -1192,7 +1203,7 @@
 }
 
 /*:75*/
-#line 912 "ctangle.w"
+#line 910 "ctangle.w"
 
 else if(xisspace(c)){
 if(!preprocessing||loc> limit)continue;
@@ -1199,20 +1210,21 @@
 
 else return' ';
 }
-else if(c=='#'&&loc==buffer+1)preprocessing= 1;
+else if(c=='#'&&loc==buffer+1)preprocessing= true;
 mistake:/*71:*/
-#line 935 "ctangle.w"
+#line 931 "ctangle.w"
 
 switch(c){
 case'+':if(*loc=='+')compress(plus_plus);break;
 case'-':if(*loc=='-'){compress(minus_minus);}
-else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
-else compress(minus_gt);}}break;
+else if(*loc=='>'){
+if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
+else compress(minus_gt);
+}break;
 case'.':if(*loc=='*'){compress(period_ast);}
 else if(*loc=='.'&&*(loc+1)=='.'){
 loc++;compress(dot_dot_dot);
-}
-break;
+}break;
 case':':if(*loc==':')compress(colon_colon);break;
 case'=':if(*loc=='=')compress(eq_eq);break;
 case'>':if(*loc=='='){compress(gt_eq);}
@@ -1225,7 +1237,7 @@
 }
 
 /*:71*/
-#line 919 "ctangle.w"
+#line 917 "ctangle.w"
 
 return c;
 }
@@ -1232,7 +1244,7 @@
 }
 
 /*:69*//*83:*/
-#line 1186 "ctangle.w"
+#line 1193 "ctangle.w"
 
 static void
 scan_repl(
@@ -1239,9 +1251,10 @@
 eight_bits t)
 {
 sixteen_bits a;
-if(t==section_name){/*85:*/
-#line 1214 "ctangle.w"
+if(t==section_name)/*85:*/
+#line 1221 "ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1253,13 +1266,14 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1192 "ctangle.w"
-}
+#line 1199 "ctangle.w"
+
 while(true)switch(a= get_next()){
 /*86:*/
-#line 1227 "ctangle.w"
+#line 1236 "ctangle.w"
 
 case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
 app_repl((a/0400)+0200);
@@ -1267,7 +1281,7 @@
 case section_name:if(t!=section_name)goto done;
 else{
 /*87:*/
-#line 1260 "ctangle.w"
+#line 1269 "ctangle.w"
 {
 char*try_loc= loc;
 while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1280,14 +1294,15 @@
 }
 
 /*:87*/
-#line 1233 "ctangle.w"
+#line 1242 "ctangle.w"
 
 a= cur_section_name-name_dir;
 app_repl((a/0400)+0250);
 app_repl(a%0400);
 /*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1299,9 +1314,10 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1237 "ctangle.w"
+#line 1246 "ctangle.w"
 break;
 }
 case output_defs_code:if(t!=section_name)err_print("! Misplaced @h");
@@ -1312,8 +1328,9 @@
 app_repl((a/0400)+0200);
 app_repl(a%0400);
 /*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
 
+{
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
 id_first= change_file_name;
@@ -1325,15 +1342,16 @@
 id_loc= id_first+strlen(id_first);
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
+}
 
 /*:85*/
-#line 1246 "ctangle.w"
+#line 1255 "ctangle.w"
 
 }
 break;
 case constant:case string:
 /*88:*/
-#line 1271 "ctangle.w"
+#line 1286 "ctangle.w"
 
 app_repl(a);
 while(id_first<id_loc){
@@ -1342,16 +1360,18 @@
 else err_print("! Double @ should be used in string");
 
 }
+else if(a==constant&&*id_first=='\''&&!keep_digit_separators)
+id_first++;
 app_repl(*id_first++);
 }
 app_repl(a);break;
 
 /*:88*/
-#line 1250 "ctangle.w"
+#line 1259 "ctangle.w"
 
 case ord:
 /*89:*/
-#line 1287 "ctangle.w"
+#line 1304 "ctangle.w"
 {
 int c= (eight_bits)*id_first;
 if(c=='\\'){
@@ -1402,7 +1422,7 @@
 break;
 
 /*:89*/
-#line 1252 "ctangle.w"
+#line 1261 "ctangle.w"
 
 case definition:case format_code:case begin_C:if(t!=section_name)goto done;
 else{
@@ -1412,7 +1432,7 @@
 case new_section:goto done;
 
 /*:86*/
-#line 1197 "ctangle.w"
+#line 1204 "ctangle.w"
 
 case')':app_repl(a);
 if(t==macro)app_repl(' ');
@@ -1425,7 +1445,7 @@
 }
 
 /*:83*//*90:*/
-#line 1346 "ctangle.w"
+#line 1363 "ctangle.w"
 
 static void
 scan_section(void)
@@ -1437,10 +1457,10 @@
 if(*(loc-1)=='*'&&show_progress){
 printf("*%d",section_count);update_terminal;
 }
-next_control= 0;
+next_control= ignore;
 while(true){
 /*92:*/
-#line 1387 "ctangle.w"
+#line 1404 "ctangle.w"
 
 while(next_control<definition)
 
@@ -1449,11 +1469,11 @@
 }
 
 /*:92*/
-#line 1360 "ctangle.w"
+#line 1377 "ctangle.w"
 
 if(next_control==definition){
 /*93:*/
-#line 1394 "ctangle.w"
+#line 1411 "ctangle.w"
 {
 while((next_control= get_next())=='\n');
 if(next_control!=identifier){
@@ -1472,7 +1492,7 @@
 }
 
 /*:93*/
-#line 1362 "ctangle.w"
+#line 1379 "ctangle.w"
 
 continue;
 }
@@ -1482,7 +1502,7 @@
 if(next_control==section_name){
 p= cur_section_name;
 /*94:*/
-#line 1419 "ctangle.w"
+#line 1436 "ctangle.w"
 
 while((next_control= get_next())=='+');
 if(next_control!='='&&next_control!=eq_eq)
@@ -1489,7 +1509,7 @@
 continue;
 
 /*:94*/
-#line 1370 "ctangle.w"
+#line 1387 "ctangle.w"
 
 break;
 }
@@ -1497,22 +1517,22 @@
 }
 no_where= print_where= false;
 /*95:*/
-#line 1424 "ctangle.w"
+#line 1441 "ctangle.w"
 
 /*96:*/
-#line 1429 "ctangle.w"
+#line 1446 "ctangle.w"
 
 store_two_bytes((sixteen_bits)(0150000+section_count));
 
 
 /*:96*/
-#line 1425 "ctangle.w"
+#line 1442 "ctangle.w"
 
 scan_repl(section_name);
 /*97:*/
-#line 1433 "ctangle.w"
+#line 1450 "ctangle.w"
 
-if(p==name_dir||p==0){
+if(p==name_dir||p==NULL){
 (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
 }
 else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
@@ -1527,16 +1547,16 @@
 
 
 /*:97*/
-#line 1427 "ctangle.w"
+#line 1444 "ctangle.w"
 
 
 /*:95*/
-#line 1376 "ctangle.w"
+#line 1393 "ctangle.w"
 
 }
 
 /*:90*//*98:*/
-#line 1448 "ctangle.w"
+#line 1465 "ctangle.w"
 
 static void
 phase_one(void){
@@ -1550,7 +1570,7 @@
 }
 
 /*:98*//*100:*/
-#line 1465 "ctangle.w"
+#line 1482 "ctangle.w"
 
 static void
 skip_limbo(void)
@@ -1565,7 +1585,7 @@
 if(ccode[(eight_bits)c]==new_section)break;
 switch(ccode[(eight_bits)c]){
 case translit_code:/*102:*/
-#line 1496 "ctangle.w"
+#line 1513 "ctangle.w"
 
 while(xisspace(*loc)&&loc<limit)loc++;
 loc+= 3;
@@ -1590,7 +1610,7 @@
 }
 
 /*:102*/
-#line 1478 "ctangle.w"
+#line 1495 "ctangle.w"
 break;
 case format_code:case'@':break;
 case control_text:if(c=='q'||c=='Q'){
@@ -1608,7 +1628,7 @@
 }
 
 /*:100*//*103:*/
-#line 1522 "ctangle.w"
+#line 1539 "ctangle.w"
 
 void
 print_stats(void){

Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 % This program by Silvio Levy and Donald E. Knuth
 % is based on a program by Knuth.
 % It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -27,11 +27,11 @@
 \mathchardef\RA="3221 % right arrow
 \mathchardef\BA="3224 % double arrow
 
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont The {\ttitlefont CTANGLE} processor}
   \vskip 15pt
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -61,7 +61,7 @@
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
 
 @c
 @<Include files@>@/
@@ -151,11 +151,11 @@
 starting at position |first| equals the identifier pointed to by |p|:
 
 @c
-boolean names_match(@t\1\1@>
+boolean names_match(
 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 at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
 {@+(void)t;
   if (length(p)!=l) return false;
   return !strncmp(first,p->byte_start,l);
@@ -193,12 +193,13 @@
 The replacement text pointer for the first unnamed section appears in
 |text_info->text_link|, and the most recent such pointer is |last_unnamed|.
 
+ at d macro 0
 @d section_flag max_texts /* final |text_link| in section replacement texts */
 
 @<Private...@>=
 static text_pointer last_unnamed; /* most recent replacement text of unnamed section */
 
-@ @<Set init...@>= last_unnamed=text_info; text_info->text_link=0;
+@ @<Set init...@>= last_unnamed=text_info; text_info->text_link=macro;
 
 @ If the first byte of a token is less than |0200|, the token occupies a
 single byte. Otherwise we make a sixteen-bit token by combining two consecutive
@@ -214,15 +215,18 @@
 Some of the 7-bit codes will not be present, however, so we can
 use them for special purposes. The following symbolic names are used:
 
-\yskip \hang |join| denotes the concatenation of adjacent items with no
-space or line breaks allowed between them (the \.{@@\&} operation of \.{CWEB}).
+\yskip \hang |string| denotes the beginning or end of a string
+or a verbatim construction.
 
-\hang |string| denotes the beginning or end of a string, verbatim
-construction or numerical constant.
+\hang |constant| denotes a numerical constant.
+
+\hang |join| denotes the concatenation of adjacent items with no space
+or line breaks allowed between them (the \.{@@\&} operation of \.{CWEB}).
 @^ASCII code dependencies@>
 
- at d string 02 /* takes the place of extended ASCII \.{\char2} */
- at d join 0177 /* takes the place of ASCII delete */
+ at d string 02 /* takes the place of ASCII \.{STX} */
+ at d constant 03 /* takes the place of ASCII \.{ETX} */
+ at d join 0177 /* takes the place of ASCII \.{DEL} */
 @d output_defs_flag (2*024000-1)
 
 @ The following procedure is used to enter a two-byte value into
@@ -308,8 +312,8 @@
 
 @c
 static void
-push_level(@t\1\1@> /* suspends the current level */
-name_pointer p at t\2\2@>)
+push_level( /* suspends the current level */
+name_pointer p)
 {
   if (stack_ptr==stack_end) overflow("stack");
   *stack_ptr=cur_state;
@@ -331,8 +335,8 @@
 
 @c
 static void
-pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
-boolean flag at t\2\2@>) /* |flag==false| means we are in |output_defs| */
+pop_level( /* do this when |cur_byte| reaches |cur_end| */
+boolean flag) /* |flag==false| means we are in |output_defs| */
 {
   if (flag && cur_repl->text_link<section_flag) { /* link to a continuation */
     cur_repl=cur_repl->text_link+text_info; /* stay on the same level */
@@ -350,7 +354,7 @@
 if the next output begins or ends the replacement text of some section,
 in which case |cur_val| is that section's number (if beginning) or the
 negative of that value (if ending). (A section number of 0 indicates
-not the beginning or ending of a section, but a \&{\#line} command.)
+not the beginning or ending of a section, but a \#\&{line} command.)
 And it sends the value |identifier|
 if the next output is an identifier, in which case
 |cur_val| points to that identifier name.
@@ -463,7 +467,7 @@
 {
   C_putc('\n');
   if (cur_line % 100 == 0 && show_progress) {
-    printf(".");
+    putchar('.');
     if (cur_line % 500 == 0) printf("%d",cur_line);
     update_terminal; /* progress report */
   }
@@ -502,9 +506,7 @@
   if (an_output_file==end_output_files) {
     if (cur_out_file>output_files)
         *--cur_out_file=cur_section_name;
-    else {
-      overflow("output files");
-    }
+    else overflow("output files");
   }
 }
 
@@ -518,7 +520,7 @@
   cur_line=1;
   @<Initialize the output stacks@>@;
   @<Output macro definitions if appropriate@>@;
-  if (text_info->text_link==0 && cur_out_file==end_output_files) {
+  if (text_info->text_link==macro && cur_out_file==end_output_files) {
     fputs("\n! No program text was specified.",stdout); mark_harmless;
 @.No program text...@>
   }
@@ -534,7 +536,7 @@
         printf(" (%s)",C_file_name);
         update_terminal;
       }
-      if (text_info->text_link==0) goto writeloop;
+      if (text_info->text_link==macro) goto writeloop;
     }
     while (stack_ptr>stack) get_output();
     flush_buffer();
@@ -557,14 +559,14 @@
     an_output_file--;
     sprint_section_name(output_file_name,*an_output_file);
     fclose(C_file);
-    C_file=fopen(output_file_name,"wb");
-    if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
+    if ((C_file=fopen(output_file_name,"wb"))==NULL)
+      fatal("! Cannot open output file ",output_file_name);
 @.Cannot open output file@>
     if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
     cur_line=1;
     stack_ptr=stack+1;
-    cur_name= (*an_output_file);
-    cur_repl= (text_pointer)cur_name->equiv;
+    cur_name=(*an_output_file);
+    cur_repl=(text_pointer)cur_name->equiv;
     cur_byte=cur_repl->tok_start;
     cur_end=(cur_repl+1)->tok_start;
     while (stack_ptr > stack) get_output();
@@ -586,7 +588,10 @@
 static void output_defs(void);@/
 static void out_char(eight_bits);
 
-@ @c
+@ @d C_printf(c,a) fprintf(C_file,c,a)
+ at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
+
+ at c
 static void
 output_defs(void)
 {
@@ -593,7 +598,7 @@
   sixteen_bits a;
   push_level(NULL);
   for (cur_text=text_info+1; cur_text<text_ptr; cur_text++)
-    if (cur_text->text_link==0) { /* |cur_text| is the text for a macro */
+    if (cur_text->text_link==macro) { /* |cur_text| is the text for a |macro| */
       cur_byte=cur_text->tok_start;
       cur_end=(cur_text+1)->tok_start;
       C_printf("%s","#define ");
@@ -611,7 +616,7 @@
           if (a<024000) { /* |024000==(0250-0200)*0400| */
             cur_val=a; out_char(identifier);
           }
-          else if (a<050000) { confusion("macro defs have strange char");}
+          else if (a<050000) confusion("macro defs have strange char");
           else {
             cur_val=a-050000; cur_section=cur_val; out_char(section_number);
           }
@@ -643,7 +648,7 @@
       @/@t\4@>@<Case of an identifier@>@;
       @/@t\4@>@<Case of a section number@>@;
       @/@t\4@>@<Cases like \.{!=}@>@;
-      case '=': case '>': C_putc(cur_char); C_putc(' ');
+      case '=': case '>': C_putc(cur_char);@+C_putc(' ');
         out_state=normal; break;
       case join: out_state=unbreakable; break;
       case constant: if (out_state==verbatim) {
@@ -659,7 +664,7 @@
     }
 }
 
-@ @<Cases like \.{!=}@>=
+@ @<Cases like \.{!=}@>=@t\1\quad@>
 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;
@@ -697,7 +702,7 @@
   for (i=0;i<128;i++) sprintf(translit[i],"X%02X",(unsigned int)(128+i));
 }
 
-@ @<Case of an identifier@>=
+@ @<Case of an identifier@>=@t\1\quad@>
 case identifier:
   if (out_state==num_or_id) C_putc(' ');
   j=(cur_val+name_dir)->byte_start;
@@ -710,7 +715,7 @@
   }
   out_state=num_or_id; break;
 
-@ @<Case of a sec...@>=
+@ @<Case of a sec...@>=@t\1\quad@>
 case section_number:
   if (cur_val>0) C_printf("/*%d:*/",cur_val);
   else if(cur_val<0) C_printf("/*:%d*/",-cur_val);
@@ -731,7 +736,7 @@
       if (*j=='\\' || *j=='"') C_putc('\\');
       C_putc(*j);
     }
-    C_printf("%s","\"\n");
+    C_putc('"');@+C_putc('\n');
   }
   break;
 
@@ -756,7 +761,7 @@
 larger numbers are given to the control codes that denote more significant
 milestones.
 
- at d ignore 0 /* control code of no interest to \.{CTANGLE} */
+ at d ignore 00 /* control code of no interest to \.{CTANGLE} */
 @d ord 0302 /* control code for `\.{@@'}' */
 @d control_text 0303 /* control code for `\.{@@t}', `\.{@@\^}', etc. */
 @d translit_code 0304 /* control code for `\.{@@l}' */
@@ -817,7 +822,7 @@
 proceeds until finding the end-comment token \.{*/} or a newline; in the
 latter case |skip_comment| will be called again by |get_next|, since the
 comment is not finished.  This is done so that each newline in the
-\CEE/ part of a section is copied to the output; otherwise the \&{\#line}
+\CEE/ part of a section is copied to the output; otherwise the \#\&{line}
 commands inserted into the \CEE/ file by the output routines become useless.
 On the other hand, if the comment is introduced by \.{//} (i.e., if it
 is a \CPLUSPLUS/ ``short comment''), it always is simply delimited by the next
@@ -831,15 +836,15 @@
 static boolean comment_continues=false; /* are we scanning a comment? */
 
 @ @c
-static boolean skip_comment(@t\1\1@> /* skips over comments */
-boolean is_long_comment at t\2\2@>)
+static boolean skip_comment( /* skips over comments */
+boolean is_long_comment)
 {
   char c; /* current character */
   while (true) {
     if (loc>limit) {
       if (is_long_comment) {
-        if(get_line()) return comment_continues=true;
-        else{
+        if (get_line()) return comment_continues=true;
+        else {
           err_print("! Input ended in mid-comment");
 @.Input ended in mid-comment@>
           return comment_continues=false;
@@ -864,8 +869,6 @@
 
 @* Inputting the next token.
 
- at d constant 03
-
 @<Private...@>=
 static name_pointer cur_section_name; /* name of section just scanned */
 static boolean no_where; /* suppress |print_where|? */
@@ -873,20 +876,15 @@
 @ As one might expect, |get_next| consists mostly of a big switch
 that branches to the various special cases that can arise.
 
- at d isxalpha(c) ((c)=='_' || (c)=='$') 
-  /* non-alpha characters allowed in identifier */
- at d ishigh(c) ((eight_bits)(c)>0177)
-@^high-bit character handling@>
-
 @c
 static eight_bits
 get_next(void) /* produces the next input token */
 {
-  static int preprocessing=0;
+  static boolean preprocessing=false;
   eight_bits c; /* the current character */
   while (true) {
     if (loc>limit) {
-      if (preprocessing && *(limit-1)!='\\') preprocessing=0;
+      if (preprocessing && *(limit-1)!='\\') preprocessing=false;
       if (get_line()==false) return new_section;
       else if (print_where && !no_where) {
           print_where=false;
@@ -913,9 +911,9 @@
     else if (xisspace(c)) {
         if (!preprocessing || loc>limit) continue;
           /* we don't want a blank after a final backslash */
-        else return ' '; /* ignore spaces and tabs, unless preprocessing */
+        else return ' '; /* ignore spaces and tabs, unless |preprocessing| */
     }
-    else if (c=='#' && loc==buffer+1) preprocessing=1;
+    else if (c=='#' && loc==buffer+1) preprocessing=true;
     mistake: @<Compress two-symbol operator@>@;
     return c;
   }
@@ -930,24 +928,23 @@
 The compound assignment operators (e.g., \.{+=}) are
 treated as separate tokens.
 
- at d compress(c) if (loc++<=limit) return c
-
 @<Compress tw...@>=
 switch(c) {
   case '+': if (*loc=='+') compress(plus_plus); break;
-  case '-': if (*loc=='-') {compress(minus_minus);}
-    else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); } } break;
-  case '.': if (*loc=='*') {compress(period_ast);}
+  case '-': if (*loc=='-') {@+compress(minus_minus);@+}
+            else if (*loc=='>') {
+              if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+              else compress(minus_gt);
+            } break;
+  case '.': if (*loc=='*') {@+compress(period_ast);@+}
             else if (*loc=='.' && *(loc+1)=='.') {
-              loc++; compress(dot_dot_dot);
-            }
-            break;
+              loc++;@+compress(dot_dot_dot);
+            } break;
   case ':': if (*loc==':') compress(colon_colon); break;
   case '=': if (*loc=='=') compress(eq_eq); break;
-  case '>': if (*loc=='=') {compress(gt_eq);}
+  case '>': if (*loc=='=') {@+compress(gt_eq);@+}
     else if (*loc=='>') compress(gt_gt); break;
-  case '<': if (*loc=='=') {compress(lt_eq);}
+  case '<': if (*loc=='=') {@+compress(lt_eq);@+}
     else if (*loc=='<') compress(lt_lt); break;
   case '&': if (*loc=='&') compress(and_and); break;
   case '|': if (*loc=='|') compress(or_or); break;
@@ -956,30 +953,41 @@
 
 @ @<Get an identifier@>= {
   id_first=--loc;
-  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+  do {
+    ++loc;
+  } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
       || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
   id_loc=loc; return identifier;
 }
 
 @ @<Get a constant@>= {
+  boolean hex_flag = false; /* are we reading a hexadecimal literal? */
   id_first=loc-1;
   if (*id_first=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
   if (*id_first=='0') {
     if (*loc=='x' || *loc=='X') { /* hex constant */
-      loc++; while (xisxdigit(*loc)) loc++; goto found;
+      hex_flag = true;
+      loc++; while (xisxdigit(*loc) || *loc=='\'') loc++;
     }
+    else if (*loc=='b' || *loc=='B') { /* binary constant */
+      loc++; while (*loc=='0' || *loc=='1' || *loc=='\'') loc++; goto found;
+    }
   }
-  while (xisdigit(*loc)) loc++;
+  while (xisdigit(*loc) || *loc=='\'') loc++;
   if (*loc=='.') {
-  loc++;
-  while (xisdigit(*loc)) loc++;
+    loc++;
+    while ((hex_flag && xisxdigit(*loc)) || xisdigit(*loc) || *loc=='\'') loc++;
   }
   if (*loc=='e' || *loc=='E') { /* float constant */
     if (*++loc=='+' || *loc=='-') loc++;
-    while (xisdigit(*loc)) loc++;
+    while (xisdigit(*loc) || *loc=='\'') loc++;
   }
- found: while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
-             || *loc=='f' || *loc=='F') loc++;
+  else if (hex_flag && (*loc=='p' || *loc=='P')) { /* hex float constant */
+    if (*++loc=='+' || *loc=='-') loc++;
+    while (xisxdigit(*loc) || *loc=='\'') loc++;
+  }
+found: while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
+            || *loc=='f' || *loc=='F') loc++;
   id_loc=loc;
   return constant;
 }
@@ -994,7 +1002,7 @@
   id_first = section_text+1;
   id_loc = section_text; *++id_loc=delim;
   if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
-    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
+    if (delim=='u' && *loc=='8') *++id_loc=*loc++;
     delim=*loc++; *++id_loc=delim;
   }
   while (true) {
@@ -1035,8 +1043,7 @@
 whether there is more work to do.
 
 @<Get control code and possible section name@>= {
-  c=ccode[(eight_bits)*loc++];
-  switch(c) {
+  switch(c=ccode[(eight_bits)*loc++]) {
     case ignore: continue;
     case translit_code: err_print("! Use @@l in limbo only"); continue;
 @.Use @@l in limbo...@>
@@ -1063,9 +1070,8 @@
 
 @<Scan an ASCII constant@>=
   id_first=loc;
-  if (*loc=='\\') {
+  if (*loc=='\\')
     if (*++loc=='\'') loc++;
-  }
   while (*loc!='\'') {
     if (*loc=='@@') {
       if (*(loc+1)!='@@')
@@ -1086,8 +1092,10 @@
   char *k; /* pointer into |section_text| */
   @<Put section name into |section_text|@>@;
   if (k-section_text>3 && strncmp(k-2,"...",3)==0)
-    cur_section_name=section_lookup(section_text+1,k-3,1); /* 1 means is a prefix */
-  else cur_section_name=section_lookup(section_text+1,k,0);
+    cur_section_name=section_lookup(section_text+1,k-3,true);
+      /* |true| means it's a prefix */
+  else cur_section_name=section_lookup(section_text+1,k,false);
+      /* |false| means it's not */
   if (cur_section_name_char=='(')
     @<If it's not there, add |cur_section_name| to the output file stack, or
           complain we're out of room@>@;
@@ -1176,7 +1184,6 @@
 acted, |cur_text| will point to the replacement text just generated, and
 |next_control| will contain the control code that terminated the activity.
 
- at d macro  0
 @d app_repl(c)  {if (tok_ptr==tok_mem_end) overflow("token"); *tok_ptr++=c;}
 
 @<Private...@>=
@@ -1185,11 +1192,11 @@
 
 @ @c
 static void
-scan_repl(@t\1\1@> /* creates a replacement text */
-eight_bits t at t\2\2@>)
+scan_repl( /* creates a replacement text */
+eight_bits t)
 {
   sixteen_bits a; /* the current token */
-  if (t==section_name) {@<Insert the line number into |tok_mem|@>@;}
+  if (t==section_name) @<Insert the line number into |tok_mem|@>@;
   while (true) switch (a=get_next()) {
       @<In cases that |a| is a non-|char| token (|identifier|,
         |section_name|, etc.), either process it and change |a| to a byte
@@ -1212,19 +1219,21 @@
 file name.
 
 @<Insert the line...@>=
-store_two_bytes(0150000);
-if (changing && include_depth==change_depth) { /* correction made Feb 2017 */
-  id_first=change_file_name;
-   store_two_bytes((sixteen_bits)change_line);
-}@+else {
-  id_first=cur_file_name;
-  store_two_bytes((sixteen_bits)cur_line);
+{
+  store_two_bytes(0150000);
+  if (changing && include_depth==change_depth) { /* correction made Feb 2017 */
+    id_first=change_file_name;
+     store_two_bytes((sixteen_bits)change_line);
+  }@+else {
+    id_first=cur_file_name;
+    store_two_bytes((sixteen_bits)cur_line);
+  }
+  id_loc=id_first+strlen(id_first);
+  {int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
+    app_repl(a_l % 0400);}
 }
-id_loc=id_first+strlen(id_first);
-{int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
-  app_repl(a_l % 0400);}
 
-@ @<In cases that |a| is...@>=
+@ @<In cases that |a| is...@>=@t\1\quad@>
 case identifier: a=id_lookup(id_first,id_loc,0)-name_dir;
   app_repl((a / 0400)+0200);
   app_repl(a % 0400); break;
@@ -1268,7 +1277,13 @@
      as explained in the manual */
 }
 
-@ @<Copy a string...@>=
+@ By default, \.{CTANGLE} purges single-quote characters from \CPLUSPLUS/-style
+literals, e.g., \.{1'000'000}, so that you can use this notation also in \CEE/
+code. The \.{+k} switch will `keep' the single quotes in the output.
+
+ at d keep_digit_separators flags['k']
+
+@<Copy a string...@>=
   app_repl(a); /* |string| or |constant| */
   while (id_first < id_loc) { /* simplify \.{@@@@} pairs */
     if (*id_first=='@@') {
@@ -1276,6 +1291,8 @@
       else err_print("! Double @@ should be used in string");
 @.Double @@ should be used...@>
     }
+    else if (a==constant && *id_first=='\'' && !keep_digit_separators)
+      id_first++;
     app_repl(*id_first++);
   }
   app_repl(a); break;
@@ -1354,7 +1371,7 @@
   if (*(loc-1)=='*' && show_progress) { /* starred section */
     printf("*%d",section_count); update_terminal;
   }
-  next_control=0;
+  next_control=ignore;
   while (true) {
     @<Skip ahead until |next_control| corresponds to \.{@@d}, \.{@@<},
       \.{@@\ } or the like@>@;
@@ -1431,7 +1448,7 @@
   /* |0150000==0320*0400| */
 
 @ @<Update the data...@>=
-if (p==name_dir||p==0) { /* unnamed section, or bad section name */
+if (p==name_dir||p==NULL) { /* unnamed section, or bad section name */
   (last_unnamed)->text_link=cur_text-text_info; last_unnamed=cur_text;
 }
 else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;

Modified: trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
 % standard macros for CWEB listings (in addition to plain.tex)
-% Version 3.6 --- May 2000
+% Version 4.3 --- April 2021
 % Modified for proofs in CTWILL
 \ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CWEB3.6+PROOFS}
+\xdef\fmtversion{\fmtversion+CWEB4.3+PROOFS}
 
 \let\:=\. % preserve a way to get the dot accent
  % (all other accents will still work as usual)
@@ -107,6 +107,7 @@
 \newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
 \let\yskip=\smallskip
 \def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
 \def\lapstar{\rlap{*}}
 \def\stsec{\rightskip=0pt % get out of C mode (cf. \B)
@@ -162,7 +163,8 @@
   \hbox{$\def\?{\kern.2em}%
     \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
     \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
-    \let\~=\oct \let\^=\hex {#1}$}}
+    \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+    \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
 \def\U{\note{This code is used in section}} % xref for use of a section
 \def\Us{\note{This code is used in sections}} % xref for uses of a section
 \let\V=\lor % logical or
@@ -176,8 +178,12 @@
 
 %\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
 %\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
 \def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
         \hbox{\strut\kern2pt\.{#1}\kern2pt}}
       \hrule}\vrule\kern2pt}} % verbatim string
@@ -339,9 +345,6 @@
 \def\printtwodigits{\advance\twodigits100
   \expandafter\gobbleone\number\twodigits
   \advance\twodigits-100 }
-\def\TeX{{\ifmmode\it\fi
-   \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\datethis{\def\startsection{\leftline{\sc\today\ at \hours}\bigskip
   \let\startsection=\stsec\stsec}}
   % say `\datethis' in limbo, to get your listing timestamped before section 1

Modified: trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,8 +2,6 @@
 
 \let\:=\. % preserve a way to get the dot accent
  % (all other accents will still work as usual)
-\def\TeX{{\ifmmode\it\fi
-   \hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
 \def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \let\mc=\ninerm % medium caps
 \def\CEE/{{\mc C\spacefactor1000}}

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -14,7 +14,7 @@
 @z
 
 @x
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
 @y
 \bigskip
 {\font\itt=cmitt10 \font\bit=cmbxti10
@@ -35,7 +35,7 @@
 faithful overall rendering of {\itt CTWILL}'s code, though. \hfill
 ---Enjoy!\bigskip}
 
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
 @z
 
 Section 2.
@@ -43,7 +43,7 @@
 @x
 @ Here is a sort of user manual for \.{CTWILL}---which is exactly like
 @y
-@* \.{CTWILL} user manual.
+@* {\tentex CTWILL} user manual.
 Here is a sort of user manual for \.{CTWILL}---which is exactly like
 @z
 
@@ -93,14 +93,29 @@
 
 @x
 internationalization.
+
+ at d _(S) gettext(S)
+
+@<Include files@>=
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+@#
 @y
 internationalization.
+
+ at d _(S) gettext(S)
+ at -S@>
+
+ at r @ @<Include files@>=
 @-A@>
 @-HAVE_GETTEXT@>
- at -S@>
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
 @z
 
-Section 9.
+Section 10.
 
 @x
 @ Code related to input routines:
@@ -109,7 +124,7 @@
 @-c@>
 @z
 
-Section 13.
+Section 14.
 
 @x
 @ Code related to identifier and section name storage:
@@ -118,7 +133,7 @@
 @-c@>
 @z
 
-Section 15.
+Section 16.
 
 @x
 @ Code related to error handling:
@@ -127,7 +142,7 @@
 @-s@>
 @z
 
-Section 17.
+Section 18.
 
 @x
 extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
@@ -135,7 +150,7 @@
 extern const char *use_language; /* prefix to \.{ctwimac.tex} in \TEX/ output */
 @z
 
-Section 18.
+Section 19.
 
 @x
 @ Code related to output:
@@ -146,7 +161,7 @@
 @-c@>
 @z
 
-Section 23.
+Section 24.
 
 @x
 @* Data structures exclusive to {\tt CWEAVE}.
@@ -158,32 +173,24 @@
 Section 25.
 
 @x
-@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
+@ We keep track of the current section number in |section_count|, which
 @y
-@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
- at -p@>
- at -x@>
+ at r @ We keep track of the current section number in |section_count|, which
 @z
 
-Section 27.
+Section 26.
 
 @x
-@ \.{CTWILL} also has special data structures to keep track of current
+@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
 @y
- at r @ \.{CTWILL} also has special data structures to keep track of current
+@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
+ at -p@>
+ at -x@>
 @z
 
-Section 32.
+Section 36.
 
 @x
-@ The |new_meaning| routine changes the current ``permanent meaning''
- at y
- at r @ The |new_meaning| routine changes the current ``permanent meaning''
- at z
-
-Section 35.
-
- at x
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
 @y
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -191,23 +198,6 @@
 @-c@>
 @z
 
-Section 44.
-
- at x
-@ We have to get \CEE/'s
- at y
- at r @ We have to get \CEE/'s
- at z
-
-Section 45.
-
- at x
-id_lookup("goto",NULL,case_like);
- at y
-@ @<Store all...@>=
-id_lookup("goto",NULL,case_like);
- at z
-
 Section 49.
 
 @x
@@ -259,42 +249,133 @@
 @-c@>
 @z
 
-Section 66.
+ at x
+              if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+ at y
+              if (*(loc+1)=='*') {@+loc++;@+compress(minus_gt_ast);@+}
+ at z
 
 @x
-@<Get a string@>= {
+            else if (*loc=='.' && *(loc+1)=='.') {
+              loc++;@+compress(dot_dot_dot);
+            } break;
 @y
-@<Get a string@>= {@+
+            else if (*loc=='.' && *(loc+1)=='.') {@+
+              loc++;@+compress(dot_dot_dot);@+
+            } break;
 @z
 
+Section 64.
+
+ at x
+  id_first=--loc;
+  do {
+    ++loc;
+  } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
+      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
+  id_loc=loc; return identifier;
+}
+ at y
+  id_first=--loc;@/
+  do {
+    ++loc;
+  } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
+      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));@/
+  id_loc=loc;@/
+  return identifier;
+}
+ at z
+
+Section 67.
+
+ at x
+@ @<Get a bin...@>={
+ at y
+ at r @ @<Get a bin...@>={
+ at z
+
 Section 70.
 
 @x
+@ @<Get a wide...@>={
+ at y
+ at r @ @<Get a wide...@>={
+ at z
+
+Section 74.
+
+ at x
 @ @<Put section name...@>=
 @y
- at r @ @<Put section name...@>=
+@ @<Put section name...@>=
 @z
 
-Section 84.
+Section 75.
 
 @x
+@ @<If end of name...@>=
+ at y
+ at r @ @<If end of name...@>=
+ at z
+
+Section 87.
+
+ at x
+C_xref( /* makes cross-references for \CEE/ identifiers */
+  eight_bits spec_ctrl)
+ at y
+C_xref(eight_bits spec_ctrl)
+  /* makes cross-references for \CEE/ identifiers */
+ at z
+
+Section 88--89.
+
+ at x
+@ The |outer_xref| subroutine is like |C_xref| except that it begins
 with |next_control!='|'| and ends with |next_control>=format_code|. Thus, it
+handles \CEE/ text with embedded comments.
+
+ at c
+static void
+outer_xref(void) /* extension of |C_xref| */
+{
+  int bal; /* brace level in comment */
 @y
+@ The |outer_xref| subroutine is like |C_xref| except that it begins
 with |next_control| |!='|'| and ends with |next_control>=format_code|.
 Thus, it
+handles \CEE/ text with embedded comments.
+
+@ @c
+static void
+outer_xref(void) /* extension of |C_xref| */
+{@+
+  int bal; /* brace level in comment */
 @z
 
 Section 91.
 
 @x
+@ @<Replace |"@@@@"| by |"@@"| @>=
+{
+  char *src=id_first,*dst=id_first;
+ at y
+@ @<Replace |"@@@@"| by |"@@"| @>=
+{@+
+  char *src=id_first,*dst=id_first;
+ at z
+
+Section 96.
+
+ at x
 @ Finally, when the \TEX/ and definition parts have been treated, we have
 |next_control>=begin_C|.
 @y
-@ Finally, when the \TEX/ and definition parts have been treated, we have
+ at r @ Finally, when the \TEX/ and definition parts have been treated, we have
 \hfil\break|next_control>=begin_C|.
 @z
 
-Section 97.
+Section 102.
 
 @x
 @ The |flush_buffer| routine empties the buffer up to a given breakpoint,
@@ -303,32 +384,34 @@
 @-c@>
 @z
 
-Section 99.
+Section 106.
 
 @x
-@ When we are copying \TEX/ source material, we retain line breaks
+@ When we wish to append one character |c| to the output buffer, we write
 @y
- at r @ When we are copying \TEX/ source material, we retain line breaks
+@ When we wish to append one character |c| to the output buffer, we write
+ at -c@>
 @z
 
-Section 101.
+Section 107.
 
 @x
-@ When we wish to append one character |c| to the output buffer, we write
+out_str( /* output characters from |s| to end of string */
+const char*s)
 @y
-@ When we wish to append one character |c| to the output buffer, we write
- at -c@>
+out_str(const char*s)
+  /* output characters from |s| to end of string */
 @z
 
-Section 105.
+Section 113.
 
 @x
-@ We get to this section only in the unusual case that the entire output line
+@ The |out_name| procedure is used to output an identifier or index
 @y
- at r @ We get to this section only in the unusual case that the entire output line
+ at r @ The |out_name| procedure is used to output an identifier or index
 @z
 
-Section 111.
+Section 116.
 
 @x
 @ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
@@ -336,18 +419,8 @@
 @r @ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
 @z
 
- at x
-static eight_bits
-copy_TeX(void)
-{
- at y
-static eight_bits
-copy_TeX(void)
-{@+
- at z
+Section 117.
 
-Section 112.
-
 @x
 @ The |copy_comment| function issues a warning if more braces are opened than
 @y
@@ -356,17 +429,23 @@
 @z
 
 @x
-int bal at t\2\2@>) /* brace balance */
-{
-  char c; /* current character being copied */
+static int copy_comment( /* copies \TeX\ code in comments */
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal) /* brace balance */
 @y
-int bal at t\2\2@>) /* brace balance */
-{@+
-  char c; /* current character being copied */
+static int copy_comment(
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal) /* brace balance */
 @z
 
-Section 117.
+ at x
+      } else {
+ at y
+      } @+ else {
+ at z
 
+Section 122.
+
 @x
 @ Here is a list of the category codes that scraps can have.
 @y
@@ -373,7 +452,7 @@
 @r @ Here is a list of the category codes that scraps can have.
 @z
 
-Section 121.
+Section 126.
 
 @x
 @ The token lists for translated \TEX/ output contain some special control
@@ -382,7 +461,7 @@
 @-n@>
 @z
 
-Section 122.
+Section 127.
 
 @x
 \yskip\noindent All of these tokens are removed from the \TEX/ output that
@@ -391,7 +470,7 @@
 @-n@>
 @z
 
-Section 123.
+Section 128.
 
 @x
 @ The raw input is converted into scraps according to the following table,
@@ -409,12 +488,12 @@
 \yskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 124.
+Section 129.
 
 @x
-\.>&|prerangle|: \.{\\rangle}&yes\cr
+\./&|binop|: \./&yes\cr
 @y
-\.>&|prerangle|: \.{\\rangle}&yes\cr}
+\./&|binop|: \./&yes\cr}
 
 @ Cont.
 
@@ -421,24 +500,24 @@
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 125.
+Section 130.
 
 @x
-\.{continue}&|case_like|: \stars&maybe\cr
+\.{complex}&|int_like|: \stars&yes\cr
 @y
-\.{continue}&|case_like|: \stars&maybe\cr}
+\.{complex}&|int_like|: \stars&yes\cr}
 
- at r @ Cont.
+@ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 126.
+Section 131.
 
 @x
-\.{long}&|raw_int|: \stars&maybe\cr
+\.{friend}&|int_like|: \stars&maybe\cr
 @y
-\.{long}&|raw_int|: \stars&maybe\cr}
+\.{friend}&|int_like|: \stars&maybe\cr}
 
 @ Cont.
 
@@ -445,20 +524,32 @@
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 127.
+Section 132.
 
 @x
-\.{try}&|else_like|: \stars&maybe\cr
+\.{static\_cast}&|raw_int|: \stars&maybe\cr
 @y
-\.{try}&|else_like|: \stars&maybe\cr}
+\.{static\_cast}&|raw_int|: \stars&maybe\cr}
 
- at r @ Cont.
+@ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Sections 128--135.
+Section 133.
 
+ at x
+\.{xor\_eq}&|alfop|: \stars&yes\cr
+ at y
+\.{xor\_eq}&|alfop|: \stars&yes\cr}
+
+@ Cont.
+
+\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
+ at z
+
+Sections 134--142.
+
 @x l.7 line numbers refer to 'prod.w'
 @ Here is a table of all the productions.  Each production that
 @y
@@ -489,9 +580,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -in@>@-x@>@-y@>
 \prodno=13 \midcol=2.5in
@@ -519,9 +610,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -in@>
 \prodno=27 \midcol=2.5in
@@ -549,9 +640,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -in@>
 \prodno=47 \midcol=2.5in
@@ -565,9 +656,9 @@
 @z
 
 @x l.164
-       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
 @y
-       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
 \endgroup
 
 @ Cont.
@@ -579,9 +670,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -any@>@-z@>@-g@>@-a@>@-x@>@-y@>@-f@>
 \prodno=61 \midcol=2.5in
@@ -610,9 +701,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -any@>@-z@>@-g@>@-a@>
 \prodno=86 \midcol=2.5in
@@ -632,6 +723,11 @@
 \endgroup
 
 @ Cont.
+ at -deprecated@>
+ at -fallthrough@>
+ at -likely@>
+ at -nodiscard@>
+ at -unlikely@>
 \begingroup \lineskip=4pt
 \def\alt #1 #2
 {$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
@@ -640,9 +736,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip at -any_other@>@-z@>@-f@>@-x@>@-p@>
 \prodno=100 \midcol=2.5in
@@ -669,15 +765,56 @@
 @y
 @z
 
- at x l.272
-\+& |any_other| |end_arg| & |end_arg| &    \&{char}$*$\.{@@]}\cr
+ at x l.291
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+ at y
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\endgroup
+
+@ Cont.
+ at -deprecated@>
+ at -fallthrough@>
+ at -likely@>
+ at -nodiscard@>
+ at -unlikely@>
+\begingroup \lineskip=4pt
+\def\alt #1 #2
+{$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
+   \strut\hbox{#2}\cr}\!\Bigr\}$ }
+\def\altt #1 #2 #3
+{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
+   \strut\hbox{#3}\cr}\!\Biggr\}$ }
+\def\malt #1 #2
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+\def\maltt #1 #2 #3
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+   \strut\hbox{#3}\hfill\cr}$}
+\yskip at -any_other@>@-z@>@-f@>@-x@>@-p@>
+\prodno=143 \midcol=2.5in
+\def\theprodno{\number\prodno \global\advance\prodno by1\enspace}
+\def\dagit{\dag\theprodno}
+\def\+#1&#2&#3&#4\cr{\def\next{#1}%
+ \line{\hbox to 2em{\hss
+  \ifx\next\empty\theprodno\else\next\fi}\strut
+  \ignorespaces#2\hfil\hbox to\midcol{$\RA$
+  \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
+\advance\midcol20pt
+ at z
+
+ at x l.326
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
 \yskip
 \yskip
 \yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
 \parindent=0pt
 \dag{\bf Notes}
 @y
-\+& |any_other| |end_arg| & |end_arg| &    \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
 \advance\midcol-3pt
 \+\dag200\enspace& |typedef_like| |decl_head| \alt|exp| |int_like| &
       |typedef_like| |decl_head| \hfill $D=D$\alt $E^{**}$ $I^{**}$ \unskip &
@@ -689,15 +826,18 @@
   \&{typedef} \&{int} \&{foo}\cr
 \endgroup
 
- at r @-any_other@>@-z@>@ \begingroup\dag{\bf Notes}
+ at -any_other@>@-z@>@ \begingroup\dag{\bf Notes}
+\advance \hsize by -4cm
+\parindent=0pt
+\everypar={\hangindent=2em}
 @z
 
-Section 136.
+Section 143.
 
 @x
 @* Implementing the productions.
 @y
-@* Implementing the productions.  \advance \hsize by -4cm
+@* Implementing the productions.\advance \hsize by -4cm
 \ifx\undefined\pdfpagewidth \else \advance \pdfpagewidth by -4cm \fi
 @z
 
@@ -707,7 +847,7 @@
 the category codes |pp->cat|, |(pp+1)->cat|, $\,\ldots\,$
 @z
 
-Section 139.
+Section 146.
 
 @x
 @ Token lists in |@!tok_mem| are composed of the following kinds of
@@ -716,17 +856,9 @@
 @-p@>
 @z
 
-Section 141.
+Section 149.
 
 @x
-@ @<Print token |r|...@>=
- at y
- at r @ @<Print token |r|...@>=
- at z
-
-Section 142.
-
- at x
 @ The production rules listed above are embedded directly into \.{CWEAVE},
 @y
 @ The production rules listed above are embedded directly into \.{CWEAVE},
@@ -739,7 +871,7 @@
 @-pp@>
 @z
 
-Section 143.
+Section 150.
 
 @x
 The code below is an exact translation of the production rules into
@@ -748,7 +880,7 @@
 @-a@>
 @z
 
-Section 146.
+Section 153.
 
 @x
 @ Let us consider the big switch for productions now, before looking
@@ -756,9 +888,23 @@
 @r @ Let us consider the big switch for productions now, before looking
 @z
 
-Section 147.
+ at x
+        && pp->cat!=new_exp
+        && pp->cat!=ftemplate @|
+ at y
+        && pp->cat!=new_exp @|
+        && pp->cat!=ftemplate
+ at z
 
 @x
+        && pp->cat!=const_like
+ at y
+        && pp->cat!=const_like @|
+ at z
+
+Section 154.
+
+ at x
   switch (pp->cat) {
     case exp: @<Cases for |exp|@>@; @+break;
     case lpar: @<Cases for |lpar|@>@; @+break;
@@ -807,6 +953,11 @@
     case typedef_like: @<Cases for |typedef_like|@>@; @+break;
     case delete_like: @<Cases for |delete_like|@>@; @+break;
     case question: @<Cases for |question|@>@; @+break;
+    case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+    case lbrack: @<Cases for |lbrack|@>@; @+break;
+    case attr_head: @<Cases for |attr_head|@>@; @+break;
+    case attr: @<Cases for |attr|@>@; @+break;
+    case default_like: @<Cases for |default_like|@>@; @+break;
   }
   pp++; /* if no match was found, we move to the right */
 }
@@ -817,7 +968,7 @@
   pp++; /* if no match was found, we move to the right */
 }
 
-@ @<Cases for |pp->cat|@>=
+@ @<Cases for |pp->cat|@>=@t\1\5\5@>
     case exp: @<Cases for |exp|@>@; @+break;
     case lpar: @<Cases for |lpar|@>@; @+break;
     case unop: @<Cases for |unop|@>@; @+break;
@@ -865,9 +1016,14 @@
     case typedef_like: @<Cases for |typedef_like|@>@; @+break;
     case delete_like: @<Cases for |delete_like|@>@; @+break;
     case question: @<Cases for |question|@>@; @+break;
+    case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+    case lbrack: @<Cases for |lbrack|@>@; @+break;
+    case attr_head: @<Cases for |attr_head|@>@; @+break;
+    case attr: @<Cases for |attr|@>@; @+break;
+    case default_like: @<Cases for |default_like|@>@; @+break;
 @z
 
-Section 148.
+Section 155.
 
 @x
 of identifiers in case labels.
@@ -878,7 +1034,7 @@
 If the first identifier is the keyword `\&{operator}', we give up;
 @z
 
-Section 150.
+Section 157.
 
 @x
 @ The scraps currently being parsed must be inspected for any
@@ -892,15 +1048,34 @@
 \hfil\break|make_reserved|, hence |tok_loc| has been set.
 @z
 
-Section 154.
+ at x
+make_reserved( /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p)
+ at y
+make_reserved(scrap_pointer p)
+  /* make the first identifier in |p->trans| like |int| */
+ at z
 
+Section 158.
+
 @x
+make_underlined(
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p)
+ at y
+make_underlined(scrap_pointer p)
+  /* underline the entry for the first identifier in |p->trans| */
+ at z
+
+Section 161.
+
+ at x
 @ \.{CTWILL} needs the following procedure, which appends tokens of a
 @y
 @r @ \.{CTWILL} needs the following procedure, which appends tokens of a
 @z
 
-Section 155.
+Section 162.
 
 @x
 @ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
@@ -917,49 +1092,77 @@
 {@+
 @z
 
-Section 159.
+Section 163.
 
 @x
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }
+ at y
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }@+
+ at z
+
+Section 164.
+
+ at x
+   && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at y
+   @|&& *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at z
+
+Section 166.
+
+ at x
 @ @<Cases for |lpar|@>=
 @y
 @r @ @<Cases for |lpar|@>=
 @z
 
-Section 168.
+Section 180.
 
 @x
-@ @<Cases for |decl_head|@>=
+  if (indent_param_decl) {
+    app(outdent); app(outdent);
+  }
 @y
- at r @ @<Cases for |decl_head|@>=
+  if (indent_param_decl) {@+app(outdent); app(outdent);@+}
 @z
 
-Section 173.
+Section 189.
 
 @x
-@ @<Cases for |fn_decl|@>=
+@ @<Cases for |case_like|@>=
 @y
- at r @ @<Cases for |fn_decl|@>=
+ at r @ @<Cases for |case_like|@>=
 @z
 
-Section 208.
+Section 206.
 
 @x
-@ Here's the |squash| procedure, which
+@ @<Cases for |raw_ubin|@>=
 @y
- at r @ Here's the |squash| procedure, which
+ at r @ @<Cases for |raw_ubin|@>=
 @z
 
-Section 212.
+Section 221.
 
 @x
-@ @<Print a snapsh...@>=
+@ And here now is the code that applies productions as long as possible.
 @y
- at r @ @<Print a snapsh...@>=
+ at r @ And here now is the code that applies productions as long as possible.
 @z
 
-Section 220.
+Section 230.
 
 @x
+    if (next_control=='|' || next_control==begin_comment ||
+        next_control==begin_short_comment) return;
+ at y
+    if (next_control=='|' || next_control==begin_comment @| ||
+        next_control==begin_short_comment) return;
+ at z
+
+Section 232.
+
+ at x
 @ The following macro is used to append a scrap whose tokens have just
 @y
 @ The following macro is used to append a scrap whose tokens have just
@@ -967,71 +1170,280 @@
 @-c@>
 @z
 
-Section 229.
+Section 233.
 
 @x
-@ The |outer_parse| routine is to |C_parse| as |outer_xref|
+@ @<Append the scr...@>=
+@<Make sure that there is room for the new scraps, tokens, and texts@>@;
 @y
- at r @ The |outer_parse| routine is to |C_parse| as |outer_xref|
+ at r @ @<Append the scr...@>=
+@#
+@<Make sure that there is room for the new scraps, tokens, and texts@>@;
+@#
 @z
 
-Section 235.
+ at x
+  case '/': case '.':
+    app(next_control);@+app_scrap(binop,yes_math);@+break;
+  case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+ at .\\langle@>
+  case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+ at .\\rangle@>
+  case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+ at .\\K@>
+  case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+ at .\\OR@>
+  case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+ at .\\XOR@>
+  case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+ at .\\MOD@>
+  case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+ at .\\R@>
+  case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+ at .\\CM@>
+  case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+  case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+  case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+ at .\\AND@>
+  case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+ at .\\?@>
+  case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+ at .\\\#@>
+ at y
+@#
+  @t\4@> @<Cases for operators@>@;
+@#
+ at z
 
 @x
-@ To insert token-list |p| into the output, the |push_level| subroutine
+  case ignore: case xref_roman: case xref_wildcard:
+  case meaning: case suppress:
 @y
- at r @ To insert token-list |p| into the output, the |push_level| subroutine
+  case ignore: case xref_roman: case xref_wildcard:@/
+  case meaning: case suppress:@/
 @z
 
-Section 237.
+ at x
+  case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+  case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+  case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+  case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
+  case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+ at .\\\{@>@q}@>
+  case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+ at q{@>@.\\\}@>
+  case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+  case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+  case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ at y
+@#
+  @t\4@> @<Cases for syntax markers@>@;
+ at z
 
 @x
-called when |stack_ptr==1|.
+  @t\4@>  @<Cases involving nonstandard characters@>@;
 @y
-called when |stack_ptr| |==1|.
+  @t\4@>  @<Cases involving nonstandard characters@>@;
+@#
 @z
 
-Section 241.
+ at x
+  overflow(_("scrap/token/text"));
+}
+ at y
+  overflow(_("scrap/token/text"));
+}
 
+@ @<Cases for operators@>=@t\1\5\5@>
+  case '/': case '.':
+    app(next_control);@+app_scrap(binop,yes_math);@+break;
+  case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+ at .\\langle@>
+  case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+ at .\\rangle@>
+  case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+ at .\\K@>
+  case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+ at .\\OR@>
+  case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+ at .\\XOR@>
+  case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+ at .\\MOD@>
+  case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+ at .\\R@>
+  case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+ at .\\CM@>
+  case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+  case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+  case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+ at .\\AND@>
+  case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+ at .\\?@>
+  case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+ at .\\\#@>
+
+@ @<Cases for syntax markers@>=@t\1\5\5@>
+  case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+  case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+  case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+  case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
+  case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+ at .\\\{@>@q}@>
+  case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+ at q{@>@.\\\}@>
+  case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+  case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+  case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ at z
+
+Section 237.
+
 @x
-  text_pointer save_text_ptr;
-  sixteen_bits save_next_control; /* values to be restored */
-  text_pointer p; /* translation of the \CEE/ text */
+@ Some nonstandard characters may have entered \.{CWEAVE} by means of
 @y
-  text_pointer save_text_ptr, p; /* translation of the \CEE/ text */
-  sixteen_bits save_next_control; /* values to be restored */
+ at r @ Some nonstandard characters may have entered \.{CWEAVE} by means of
 @z
 
-Section 244.
+Section 239.
 
 @x
-else @<Look ahead for strongest line break, |goto reswitch|@>
+@<Append a \TEX/ string, without forming a scrap@>=
 @y
-else {@<Look ahead for strongest line break, |goto reswitch|@>}
+ at r @ @<Append a \TEX/ string, without forming a scrap@>=
 @z
 
 Section 245.
 
 @x
-@<Look ahead for st...@>= {
+make_pb=true;
+
+@ @c
 @y
-@<Look ahead for st...@>=
+make_pb=true;
+
+ at r @ @c
 @z
 
+Section 249.
+
 @x
+@<Private...@>=
+ at y
+ at r @ @<Private...@>=
+ at z
+
+Section 252.
+
+ at x
+@ @c
+static void
+push_level( /* suspends the current level */
+text_pointer p)
+ at y
+@ Suspend the current level.
+ at c
+static void
+push_level(text_pointer p)@/
+ at z
+
+Section 253.
+
+ at x
+called when |stack_ptr==1|.
+ at y
+called when |stack_ptr| |==1|.
+ at z
+
+Section 257.
+
+ at x
+@ The real work associated with token output is done by |make_output|.
+ at y
+ at r @ The real work associated with token output is done by |make_output|.
+ at z
+
+Section 258.
+
+ at x
+    reswitch: switch(a) {
+      case end_translation: return;
+      case identifier: case res_word: @<Output an identifier@>@; break;
+      case section_code: @<Output a section name@>@; break;
+      case math_rel: out_str("\\MRL{"@q}@>);
+ at .\\MRL@>
+      case noop: case inserted: break;
+      case cancel: case big_cancel: c=0; b=a;
+        while (true) {
+          a=get_output();
+          if (a==inserted) continue;
+          if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
+          if (a==indent) c++;
+          else if (a==outdent) c--;
+            else if (a==opt) a=get_output();
+        }
+        @<Output saved |indent| or |outdent| tokens@>@;
+        goto reswitch;
+      case dindent: a=get_output();
+        if (a!=big_force) {
+          out_str("\\1\\1"); goto reswitch;
+        }
+        else dindent_pending=true; /* fall through */
+      case indent: case outdent: case opt: case backup: case break_space:
+      case force: case big_force: case preproc_line: @<Output a control,
+        look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
+      case quoted_char: out(*(cur_tok++));
+      case qualifier: break;
+      default: out(a); /* otherwise |a| is an ordinary character */
+    }
+  }
 }
 @y
+    reswitch: @/@<The output |switch|@>@;
+  }
+}
+
+ at r @ @<The output |switch|@>=
+    switch(a) {
+      case end_translation: return;
+      case identifier: case res_word: @<Output an identifier@>@; break;
+      case section_code: @<Output a section name@>@; break;
+      case math_rel: out_str("\\MRL{"@q}@>);
+ at .\\MRL@>
+      case noop: case inserted: break;
+      case cancel: case big_cancel: c=0; b=a;
+        while (true) {
+          a=get_output();
+          if (a==inserted) continue;
+          if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
+          if (a==indent) c++;
+          else if (a==outdent) c--;
+            else if (a==opt) a=get_output();
+        }
+        @<Output saved |indent| or |outdent| tokens@>@;
+        goto reswitch;
+      case dindent: a=get_output();
+        if (a!=big_force) {
+          out_str("\\1\\1"); goto reswitch;
+        }
+        else dindent_pending=true; /* fall through */
+      case indent: case outdent: case opt: case backup: case break_space:
+      case force: case big_force: case preproc_line: @<Output a control,
+        look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
+      case quoted_char: out(*(cur_tok++));
+      case qualifier: break;
+      default: out(a); /* otherwise |a| is an ordinary character */
+    }
 @z
 
-Section 246.
+Section 264.
 
 @x
-@ @<Output saved...@>=
+@ The remaining part of |make_output| is somewhat more complicated. When we
 @y
- at r @ @<Output saved...@>=
+ at r @ The remaining part of |make_output| is somewhat more complicated. When we
 @z
 
-Section 250.
+Section 267.
 
 @x
 @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
@@ -1039,7 +1451,7 @@
 @r @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
 @z
 
-Section 256.
+Section 273.
 
 @x
 @ The output file will contain the control sequence \.{\\Y} between non-null
@@ -1047,7 +1459,7 @@
 @r @ The output file will contain the control sequence \.{\\Y} between non-null
 @z
 
-Section 259.
+Section 276.
 
 @x
 @<Translate the \T...@>= do {
@@ -1055,15 +1467,29 @@
 @<Translate the \T...@>= do {@+
 @z
 
-Section 267.
+Section 282.
 
 @x
+@<Start a macro...@>= {
+ at y
+ at r @ @<Start a macro...@>= {
+ at z
+
+ at x
+  if(!space_checked){emit_space_if_needed;save_position;}
+ at y
+  if(!space_checked){@+emit_space_if_needed;save_position;@+}
+ at z
+
+Section 285.
+
+ at x
 |next_control>=begin_C|. We will make the global variable |this_section|
 @y
 \hfil\break|next_control>=begin_C|. We will make the global variable |this_section|
 @z
 
-Section 268.
+Section 286.
 
 @x
 @ @<Translate the \CEE/...@>=
@@ -1071,7 +1497,7 @@
 @r @ @<Translate the \CEE/...@>=
 @z
 
-Section 272.
+Section 290.
 
 @x
 @ The |footnote| procedure gives cross-reference information about
@@ -1079,26 +1505,26 @@
 @r @ The |footnote| procedure gives cross-reference information about
 @z
 
-Section 284.
+Section 302.
 
 @x
 @ A left-to-right radix sorting method is used, since this makes it easy to
 @y
-@ A left-to-right radix sorting method is used, since this makes it easy to
+ at r @ A left-to-right radix sorting method is used, since this makes it easy to
 @-c@>
 @z
 
-Section 286.
+Section 304.
 
 @x
-@ During the sorting phase we shall use the |cat| and |trans| arrays from
+@<Rest of |trans_plus| union@>=
 @y
-@ During the sorting phase we shall use the |cat| and |trans| arrays from
+@ @<Rest of |trans_plus| union@>=
 @-j@>
 @-k@>
 @z
 
-Section 289.
+Section 308.
 
 @x
 $|collate|[0]<|collate|[1]<\cdots<|collate|[100]$.
@@ -1106,15 +1532,17 @@
 |collate[0]| $<$|collate[1]|$<\cdots<$|collate[100]|.
 @z
 
-Section 296.
+Section 310.
 
 @x
-    else {char *j;
+unbucket( /* empties buckets having depth |d| */
+eight_bits d)
 @y
-    else {@+char *j;
+unbucket(eight_bits d)
+  /* empties buckets having depth |d| */
 @z
 
-Section 303.
+Section 322.
 
 @x
 @ Because on some systems the difference between two pointers is a |ptrdiff_t|
@@ -1124,18 +1552,80 @@
 |ptrdiff_t| rather than an |int|, we use \.{\%ld} to print these quantities.
 @z
 
-Section 304.
+ at x
+  puts(_("\nMemory usage statistics:"));
+ at .Memory usage statistics:@>
+  printf(_("%ld names (out of %ld)\n"),
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
+  printf(_("%ld cross-references (out of %ld)\n"),
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
+  printf(_("%ld bytes (out of %ld)\n"),
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
+  printf(_("%ld temp meanings (out of %ld)\n"),
+            (ptrdiff_t)(max_temp_meaning_ptr-temp_meaning_stack),
+            (long)max_meanings);
+  printf(_("%ld titles (out of %ld)\n"),
+            (ptrdiff_t)(title_code_ptr-title_code),(long)max_titles);
+  puts(_("Parsing:"));
+  printf(_("%ld scraps (out of %ld)\n"),
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
+  printf(_("%ld texts (out of %ld)\n"),
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
+  printf(_("%ld tokens (out of %ld)\n"),
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
+  printf(_("%ld levels (out of %ld)\n"),
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
+  puts(_("Sorting:"));
+  printf(_("%ld levels (out of %ld)\n"),
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
+ at y
+  puts(_("\nMemory usage statistics:"));@/
+ at .Memory usage statistics:@>
+  printf(_("%ld names (out of %ld)\n"),
+            (ptrdiff_t)(name_ptr-name_dir),@/
+            @t\5\5\5\5@>(long)max_names);@/
+  printf(_("%ld cross-references (out of %ld)\n"),
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);@/
+  printf(_("%ld bytes (out of %ld)\n"),
+            (ptrdiff_t)(byte_ptr-byte_mem),@/
+            @t\5\5\5\5@>(long)max_bytes);@/
+  printf(_("%ld temp meanings (out of %ld)\n"),
+            (ptrdiff_t)(max_temp_meaning_ptr-temp_meaning_stack),@/
+            @t\5\5\5\5@>(long)max_meanings);@/
+  printf(_("%ld titles (out of %ld)\n"),
+            (ptrdiff_t)(title_code_ptr-title_code),@/
+            @t\5\5\5\5@>(long)max_titles);@/
+  puts(_("Parsing:"));@/
+  printf(_("%ld scraps (out of %ld)\n"),
+            (ptrdiff_t)(max_scr_ptr-scrap_info),@/
+            @t\5\5\5\5@>(long)max_scraps);@/
+  printf(_("%ld texts (out of %ld)\n"),
+            (ptrdiff_t)(max_text_ptr-tok_start),@/
+            @t\5\5\5\5@>(long)max_texts);@/
+  printf(_("%ld tokens (out of %ld)\n"),
+            (ptrdiff_t)(max_tok_ptr-tok_mem),@/
+            @t\5\5\5\5@>(long)max_toks);@/
+  printf(_("%ld levels (out of %ld)\n"),
+            (ptrdiff_t)(max_stack_ptr-stack),@/
+            @t\5\5\5\5@>(long)stack_size);@/
+  puts(_("Sorting:"));@/
+  printf(_("%ld levels (out of %ld)\n"),
+            (ptrdiff_t)(max_sort_ptr-scrap_info),@/
+            @t\5\5\5\5@>(long)max_scraps);
+ at z
 
+Section 323.
+
 @x
 \bigskip
 \font\itt=cmitt10
-{\noindent \it Although \.{\itt CTWILL} is based on \.{\itt cweave.w}, new and
+{\noindent \it Although {\itt CTWILL} is based on {\itt cweave.w}, new and
 modified material is incorporated all over the place, without taking special
 care for keeping the original section numbering intact.}
 @y
 @z
 
-Section 312.
+Section 331.
 
 @x
 @** Index.

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -34,9 +34,9 @@
 @z
 
 @x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
 @y
-\def\title{CTWILL (Version 4.2 [\TeX~Live])}
+\def\title{CTWILL (Version 4.3 [\TeX~Live])}
 @z
 
 @x
@@ -46,9 +46,9 @@
 @z
 
 @x
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
 @y
-  \centerline{(Version 4.2 [\TeX~Live])}
+  \centerline{(Version 4.3 [\TeX~Live])}
 @z
 
 @x
@@ -75,7 +75,7 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
 This is the \.{CTWILL} program by D. E. Knuth, based
 on \.{CWEAVE} by Silvio Levy and D.~E. Knuth. It is also based on
@@ -94,7 +94,7 @@
 The ``banner line'' defined here should be changed whenever \.{CTWILL} is
 modified. The version number parallels the corresponding version of \.{CWEAVE}.
 
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
@@ -628,6 +628,10 @@
 
 @x
 @.Control codes are forbidden...@>
+  }
+}
+
+@ @<Predecl...@>=@+static void skip_restricted(void);
 @y
 @.Control codes are forbidden...@>
     if (c==meaning && phase==2) @<Process a user-generated meaning@>@;
@@ -635,15 +639,7 @@
   }
 }
 
-@ @<Suppress mini-index entry@>=
-{ char *first=id_first,*last=id_loc;
-  while (xisspace(*first)) first++;
-  while (xisspace(*(last-1))) last--;
-  if (first<last) {
-    struct perm_meaning *q=id_lookup(first,last,normal)-name_dir+cur_meaning;
-    q->stamp=section_count; /* this is what actually suppresses output */
-  }
-}
+@ @<Predecl...@>=@+static void skip_restricted(void);
 
 @ @<Process a user-generated meaning@>=
 { char *first=id_first;
@@ -664,6 +660,16 @@
   loc=id_loc+2;
 }
 
+@ @<Suppress mini-index entry@>=
+{ char *first=id_first,*last=id_loc;
+  while (xisspace(*first)) first++;
+  while (xisspace(*(last-1))) last--;
+  if (first<last) {
+    struct perm_meaning *q=id_lookup(first,last,normal)-name_dir+cur_meaning;
+    q->stamp=section_count; /* this is what actually suppresses output */
+  }
+}
+
 @ @<Digest...@>=
 { meaning_struct *m;
   struct perm_meaning *q=p-name_dir+cur_meaning;
@@ -683,6 +689,8 @@
   else { char *q=m->tex_part;
     while (loc<id_loc) *q++=*loc++;
     *q='\0';
+  }
+}
 @z
 
 @x
@@ -872,10 +880,10 @@
 @z
 
 @x
- at d end_arg 62 /* \.{@@]} */
+ at d attr_head 69 /* denotes beginning of attribute */
 @y
- at d end_arg 62 /* \.{@@]} */
- at d title 63 /* program name or header name in a ``meaning'' */
+ at d attr_head 69 /* denotes beginning of attribute */
+ at d title 70 /* program name or header name in a ``meaning'' */
 @z
 
 @x
@@ -903,14 +911,14 @@
 
 @c
 static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+print_text( /* prints a token list for debugging; not used in |main| */
 @y
 @d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
 
 @c
 #if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
 @z
 
 @x
@@ -964,9 +972,9 @@
 @z
 
 @x
-  r->num=m; /* everything from |q| on is left undisturbed */
+r->num=m; /* everything from |q| on is left undisturbed */
 @y
-  r->num=m; /* everything from |q| on is left undisturbed */
+r->num=m; /* everything from |q| on is left undisturbed */
 
 @ \.{CTWILL} needs the following procedure, which appends tokens of a
 translated text until coming to |tok_loc|, then suppresses text that may
@@ -973,7 +981,7 @@
 appear between parentheses or brackets. The calling routine should set
 |ident_seen=false| first. (This is admittedly tricky.)
 
- at c boolean ident_seen;
+ at c static boolean ident_seen;
 static boolean app_supp(
   text_pointer p)
 { token_pointer j;
@@ -1089,7 +1097,7 @@
 @x
 @<Cases for |exp|@>=
 if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+  make_underlined(pp); big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,1);
 }
 @y
@@ -1097,16 +1105,13 @@
 if(cat1==lbrace || cat1==int_like || cat1==decl) {
   make_underlined(pp);
   make_ministring(0);
-  big_app1(pp);
-  if (indent_param_decl) {
-    big_app(indent); app(indent);
-  }
+  if (indent_param_decl) big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,1);
 }
 @z
 
 @x
-  make_underlined (pp);  squash(pp,2,tag,-1,7);
+  make_underlined (pp); squash(pp,2,tag,-1,7);
 @y
   make_underlined (pp);
   if (tok_loc>operator_found) {
@@ -1123,8 +1128,7 @@
   big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
 }
 else if (cat1==ubinop) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
-  reduce(pp,2,decl_head,-1,34);
+  big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -1134,7 +1138,7 @@
   squash(pp,3,decl_head,-1,36);
 else if (cat1==cast) squash(pp,2,decl_head,-1,37);
 else if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+  big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
 }
 else if (cat1==semi) squash(pp,2,decl,-1,39);
 @y
@@ -1143,7 +1147,7 @@
   big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
 }
 else if (cat1==ubinop) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+  big_app1_insert(pp,'{'); big_app('}');
   reduce(pp,2,decl_head,-1,34);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
@@ -1156,10 +1160,7 @@
   squash(pp,3,decl_head,-1,36);
 else if (cat1==cast) squash(pp,2,decl_head,-1,37);
 else if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  big_app1(pp);
-  if (indent_param_decl) {
-    big_app(indent); app(indent);
-  }
+  if (indent_param_decl) big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,38);
 }
 else if (cat1==semi) squash(pp,2,decl,-1,39);
@@ -1168,24 +1169,19 @@
 @x
 @ @<Cases for |decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1);
-  reduce(pp,2,decl,-1,40);
+  big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
 }
 else if (cat1==stmt || cat1==function) {
-  big_app1(pp); big_app(big_force);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+  big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
 }
 @y
 @ @<Cases for |decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1);
-  reduce(pp,2,decl,-1,40);
+  big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
 }
 else if (cat1==stmt || cat1==function) {
-  big_app1(pp);
-  if(order_decl_stmt) big_app(big_force);
-  else big_app(force);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+  big_app1_insert(pp,order_decl_stmt ? big_force : force);
+  reduce(pp,2,cat1,-1,41);
 }
 @z
 
@@ -1199,7 +1195,7 @@
 @x
 @ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+  big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
 }
 else if (cat1==stmt) {
   big_app1(pp); app(outdent); app(outdent); big_app(force);
@@ -1208,7 +1204,7 @@
 @y
 @ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+  big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
 }
 else if (cat1==stmt) {
   big_app1(pp);
@@ -1215,12 +1211,18 @@
   if (indent_param_decl) {
     app(outdent); app(outdent);
   }
-  big_app(force);
-  big_app1(pp+1); reduce(pp,2,function,-1,52);
+  big_app(force); big_app1(pp+1); reduce(pp,2,function,-1,52);
 }
 @z
 
 @x
+  big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
+ at y
+  big_app1(pp); if (indent_param_decl) big_app(dindent);
+  big_app1(pp+1); reduce(pp,2,fn_decl,0,73);
+ at z
+
+ at x
 if (cat1==define_like) make_underlined(pp+2);
 @y
 if (cat1==define_like) { /* \.{\#define} is analogous to \&{extern} */
@@ -1241,9 +1243,9 @@
 @z
 
 @x
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,102);
+  big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,102);
 @y
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,123);
+  big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,123);
 @z
 
 @x
@@ -1251,11 +1253,11 @@
 if ((cat1==int_like || cat1==cast) && (cat2==comma || cat2==semi))
   squash(pp+1,1,exp,-1,115);
 else if (cat1==int_like) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,116);
+  big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,116);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); make_reserved(pp+1);
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,117);
+  big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,117);
 }
 else if (cat1==comma) {
   big_app2(pp); big_app(' '); reduce(pp,2,typedef_like,0,118);
@@ -1262,8 +1264,7 @@
 }
 else if (cat1==semi) squash(pp,2,decl,-1,119);
 else if (cat1==ubinop && (cat2==ubinop || cat2==cast)) {
-  big_app('{'); big_app1(pp+1); big_app('}'); big_app1(pp+2);
-  reduce(pp+1,2,cat2,0,120);
+  big_app('{'); big_app1_insert(pp+1,'}'); reduce(pp+1,2,cat2,0,120);
 }
 @y
 @ Here \.{CTWILL} deviates from the normal productions introduced in
@@ -1353,11 +1354,9 @@
 @z
 
 @x
-to \.{\\PB}, if the user has invoked \.{CWEAVE} with the \.{+e} flag.
-Although \.{cwebmac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}.  Although \.{cwebmac} ignores \.{\\PB}, other macro packages
 @y
-to \.{\\PB}, if the user has invoked \.{CTWILL} with the \.{+e} flag.
-Although \.{ctwimac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}.  Although \.{ctwimac} ignores \.{\\PB}, other macro packages
 @z
 
 @x
@@ -1412,12 +1411,10 @@
 @z
 
 @x
-while (!input_has_ended) @<Translate the current section@>@;
-}
+@ @<Predecl...@>=@+static void phase_two(void);
 
 @y
-while (!input_has_ended) @<Translate the current section@>@;
-}
+@ @<Predecl...@>=@+static void phase_two(void);
 
 @ @<Private...@>=
 static FILE *aux_file;
@@ -1479,15 +1476,15 @@
 @y
 @.\\N@>
   if (right_start_switch) {
-    out_str("N"); right_start_switch=false;
+    out('N'); right_start_switch=false;
 @.\\NN@>
   }
 @z
 
 @x
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
 @y
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
 flush_buffer(out_ptr,false,false);
 @z
 
@@ -1551,12 +1548,12 @@
 @x
 @.Improper macro definition@>
   else {
-    app('$'); app_cur_id(false);
+    app_cur_id(false);
 @y
 @.Improper macro definition@>
   else {
     id_being_defined=id_lookup(id_first,id_loc,normal);
-    app('$'); app_cur_id(false);
+    app_cur_id(false);
     def_diff=*loc-'(';
 @z
 
@@ -1809,9 +1806,9 @@
 @z
 
 @x
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
+  case normal: case func_template:
 @y
-  case normal: if (is_tiny(cur_name)) out_str("\\|");
+  case normal:
 @z
 
 @x
@@ -1900,20 +1897,20 @@
 @x
 @** Index.
 @y
-@** 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.
+@** Extensions to {\tentex CWEB}.  The following sections introduce new or
+improved features that have been created by numerous contributors over the
+course of a quarter century.
 
 \bigskip
 \font\itt=cmitt10
-{\noindent \it Although \.{\itt CTWILL} is based on \.{\itt cweave.w}, new and
+{\noindent \it Although {\itt CTWILL} is based on {\itt cweave.w}, new and
 modified material is incorporated all over the place, without taking special
 care for keeping the original section numbering intact.}
 
 @* Formatting alternatives.
-\.{CWEAVE} indents declarations after old-style function definitions.
-With the \.{-i} option they will come out flush left.  You won't see
-any difference if you use ANSI-style function definitions.
+\.{CWEAVE} indents declarations after old-style function definitions and
+long parameter lists of modern function definitions.
+With the \.{-i} option they will come out flush left.
 
 @d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
 
@@ -1947,7 +1944,7 @@
     fatal(_("! Cannot open output file "),check_file_name);
 @.Cannot open output file@>
 
-  if (temporary_output) @<Compare the temporary output...@>@;
+  if (check_for_change) @<Compare the temporary output...@>@;
 
   fclose(tex_file); tex_file=NULL;
   fclose(check_file); check_file=NULL;
@@ -1979,7 +1976,7 @@
   rename(check_file_name,tex_file_name);
 }
 
-@* Put ``version'' information in \.{COMMON}.
+@* Put ``version'' information in a single spot.
 Don't do this at home, kids! Push our local macro to the variable in \.{COMMON}
 for printing the |banner| and the |versionstring| from there.
 

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill.bux	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill.bux	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,17 +1,17 @@
 @$program {COMMON.W}18 \&{int}@>
-@$ctangle {COMMON.W}18 \&{int}@>
-@$ctwill {COMMON.W}18 \&{int}@>
-@$cweave {COMMON.W}18 \&{int}@>
+@$ctangle {COMMON.W}2 \&{int}@>
+@$ctwill {COMMON.W}2 \&{int}@>
+@$cweave {COMMON.W}2 \&{int}@>
 @$phase {COMMON.W}19 \&{int}@>
 @$common_init {COMMON.W}20 \&{void} (\,)@>
+@$section_text {COMMON.W}21 \&{char} [\,][\,]@>
+@$section_text_end {COMMON.W}21 \&{char} ${*}$@>
 @$id_first {COMMON.W}21 \&{char} ${*}$@>
 @$id_loc {COMMON.W}21 \&{char} ${*}$@>
-@$section_text {COMMON.W}21 \&{char} [\,][\,]@>
-@$section_text_end {COMMON.W}21 \&{char} ${*}$@>
 @$buffer {COMMON.W}22 \&{char} [\,]@>
 @$buffer_end {COMMON.W}22 \&{char} ${*}$@>
+@$loc {COMMON.W}22 \&{char} ${*}$@>
 @$limit {COMMON.W}22 \&{char} ${*}$@>
-@$loc {COMMON.W}22 \&{char} ${*}$@>
 
 @$include_depth {COMMON.W}25 \&{int}@>
 @$file {COMMON.W}25 \&{FILE} ${*}$ [\,]@>
@@ -18,7 +18,6 @@
 @$change_file {COMMON.W}25 \&{FILE} ${*}$@>
 @$file_name {COMMON.W}25 \&{char} [\,][\,]@>
 @$change_file_name {COMMON.W}25 \&{char} [\,]@>
-@$alt_web_file_name {COMMON.W}25 \&{char} [\,]@>
 @$line {COMMON.W}25 \&{int} [\,]@>
 @$change_line {COMMON.W}25 \&{int}@>
 @$change_depth {COMMON.W}25 \&{int}@>
@@ -43,9 +42,9 @@
 @$byte_ptr {COMMON.W}44 \&{char} ${*}$@>
 @$name_ptr {COMMON.W}44 \&{name\_pointer}@>
 
-@$h {COMMON.W}46 \&{hash\_pointer}@>
 @$hash {COMMON.W}46 \&{name\_pointer} [\,]@>
 @$hash_end {COMMON.W}46 \&{hash\_pointer}@>
+@$h {COMMON.W}46 \&{hash\_pointer}@>
 
 @$id_lookup {COMMON.W}48 \&{name\_pointer} (\,)@>
 
@@ -72,7 +71,6 @@
 @$scn_file_name {COMMON.W}73 \&{char} [\,]@>
 @$check_file_name {COMMON.W}73 \&{char} [\,]@>
 @$flags {COMMON.W}73 \&{boolean} [\,]@>
-@$use_language {COMMON.W}86 \&{const char} ${*}$@>
 
 @$C_file {COMMON.W}83 \&{FILE} ${*}$@>
 @$tex_file {COMMON.W}83 \&{FILE} ${*}$@>
@@ -81,6 +79,8 @@
 @$check_file {COMMON.W}83 \&{FILE} ${*}$@>
 @$active_file {COMMON.W}83 \&{FILE} ${*}$@>
 
+@$use_language {COMMON.W}86 \&{const char} ${*}$@>
+
 @$cb_banner {COMMON.W}87 \&{char} [\,]@>
 
 @$cb_show_banner {COMMON.W}99 \&{void} (\,)@>

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,9 +1,9 @@
 % standard macros for CWEB listings (in addition to plain.tex)
-% Version 3.6 --- May 2000
+% Version 4.3 --- April 2021
 % modified for pages produced by CTWILL
 % further modified for page size of the MMIXware book
 \ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CTWILL3.6+LNCS}
+\xdef\fmtversion{\fmtversion+CTWILL4.3+LNCS}
 
 \let\:=\. % preserve a way to get the dot accent
  % (all other accents will still work as usual)
@@ -218,6 +218,7 @@
 \newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
 \let\yskip=\smallskip
 \def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\note#1#2.{\par\penalty5000
   \Y\noindent{\hangindent2\em\baselineskip10pt\eightrm#1~#2.\par}}
 \def\lapstar{\rlap{*}}
@@ -278,7 +279,8 @@
   \hbox{$\def\?{\kern.2em}%
     \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
     \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
-    \let\~=\oct \let\^=\hex {#1}$}}
+    \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+    \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
 \def\U{\note{This code is used in section}} % xref for use of a section
 \def\Us{\note{This code is used in sections}} % xref for uses of a section
 \let\V=\lor % logical or
@@ -292,16 +294,16 @@
 
 %\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
 %\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
 \def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
         \hbox{\strut\kern2pt\.{#1}\kern2pt}}
       \hrule}\vrule\kern2pt}} % verbatim string
 
-\def\TeX{{\ifmmode\it\fi
-   \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
-
 % now here's the mini-index formatting control
 \newcount\nrefs % total number of references in partial page
 \newcount\baseno % smallest section number in partial page

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -20,16 +20,16 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 4.2pc/big)"
+ at d banner "This is CWEAVE (Version 4.3pc/big)"
 @z
 
 
- at x Section 7.
+ at x Section 10.
   for section names */
 
 @<Common code...@>=
@@ -119,11 +119,11 @@
 
 
 @x Section 24.
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 @y
 xmem_end = xmem + max_refs - 1;
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 @z
 
@@ -165,7 +165,7 @@
 @z
 
 
- at x Section 74.
+ at x Section 78.
       if (unindexed(lhs)) { /* retain only underlined entries */
         xref_pointer q,r=NULL;
         for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
@@ -186,7 +186,7 @@
 @z
 
 
- at x Section 93.
+ at x Section 97.
   char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
   out('{');
   for (k=p->byte_start; k<k_end; k++) {
@@ -197,7 +197,7 @@
 @z
 
 
- at x Section 209.
+ at x Section 218.
   char *p; /* index into |byte_mem| */
 @y
   char huge *p; /* index into |byte_mem| */
@@ -204,7 +204,7 @@
 @z
 
 
- at x Section 244.
+ at x Section 253.
     if (cur_name->xref!=(void *)xmem) {
 @y
     if (cur_name->xref!=(void huge*)xmem) {
@@ -211,7 +211,7 @@
 @z
 
 
- at x Section 246.
+ at x Section 255.
 static char *cur_byte; /* index into |byte_mem| */
 @y
 static char huge* cur_byte; /* index into |byte_mem| */
@@ -218,18 +218,20 @@
 @z
 
 
- at x Section 255.
+ at x Section 264.
 switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char *j;
+  case normal: case func_template:
+    if (is_tiny(cur_name)) out_str("\\|");
+    else {@+char *j;
 @y
 switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char huge* j;
+  case normal: case func_template:
+    if (is_tiny(cur_name)) out_str("\\|");
+    else {@+char huge* j;
 @z
 
 
- at x Section 255.
+ at x Section 264.
   case custom: {char *j; out_str("$\\");
 @y
   case custom: {char huge* j; out_str("$\\");

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -16,7 +16,7 @@
 }
 @y
 \def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{111}
+\def\contentspagenumber{109}
 \def\title{APPENDIX F: CWEAVE}
 \let\K=\leftarrow
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -11,12 +11,12 @@
 change files that have -bs in their name instead of -pc.)
 
 @x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
- at d banner "This is CWEAVE (Version 4.2pc)"
+ at d banner "This is CWEAVE (Version 4.3pc)"
 @z
 
- at x section 4
+ at x section 17
 @d max_bytes 1000000 /* the number of bytes in identifiers,
 @y
 @d max_bytes (unsigned)60000 /* the number of bytes in identifiers,

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,15 +7,15 @@
 
 
 @x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
 @y
-\def\title{CWEAVE (QL Version 4.2)}
+\def\title{CWEAVE (QL Version 4.3)}
 @z
 
 @x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
- at d banner "This is CWEAVE (QL Version 4.2)"
+ at d banner "This is CWEAVE (QL Version 4.3)"
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -13,12 +13,12 @@
 (also modified by Don Knuth to keep version numbers uptodate)
 
 @x section 1 (01-FEB-1992 ST)
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
- at d banner "This is CWEAVE (VAX/VMS Version 4.2)"
+ at d banner "This is CWEAVE (VAX/VMS Version 4.3)"
 @z
 
- at x section 3 (01-FEB-1992 ST)
+ at x section 4 (01-FEB-1992 ST)
 #include <ctype.h> /* definition of |@!isalpha|, |@!isdigit| and so on */
 #include <stdbool.h> /* definition of |@!bool|, |@!true| and |@!false| */
 #include <stddef.h> /* definition of |@!ptrdiff_t| */

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,15 +17,15 @@
 @q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
 @y
-\def\title{CWEAVE (Version 4.2 [\TeX~Live])}
+\def\title{CWEAVE (Version 4.3 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
 @y
-  \centerline{(Version 4.2 [\TeX~Live])}
+  \centerline{(Version 4.3 [\TeX~Live])}
 @z
 
 @x
@@ -41,9 +41,9 @@
 @z
 
 @x
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
- at d banner "This is CWEAVE, Version 4.2"
+ at d banner "This is CWEAVE, Version 4.3"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
@@ -252,14 +252,14 @@
 
 @c
 static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+print_text( /* prints a token list for debugging; not used in |main| */
 @y
 @d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
 
 @c
 #if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
 @z
 
 @x
@@ -281,16 +281,13 @@
 @x
 @<Cases for |exp|@>=
 if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+  make_underlined(pp); big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,1);
 }
 @y
 @<Cases for |exp|@>=
 if(cat1==lbrace || cat1==int_like || cat1==decl) {
-  make_underlined(pp); big_app1(pp);
-  if (indent_param_decl) {
-    big_app(indent); app(indent);
-  }
+  make_underlined(pp); if (indent_param_decl) big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,1);
 }
 @z
@@ -301,8 +298,7 @@
   big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
 }
 else if (cat1==ubinop) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
-  reduce(pp,2,decl_head,-1,34);
+  big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -312,7 +308,7 @@
   squash(pp,3,decl_head,-1,36);
 else if (cat1==cast) squash(pp,2,decl_head,-1,37);
 else if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+  big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
 }
 else if (cat1==semi) squash(pp,2,decl,-1,39);
 @y
@@ -321,7 +317,7 @@
   big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
 }
 else if (cat1==ubinop) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+  big_app1_insert(pp,'{'); big_app('}');
   reduce(pp,2,decl_head,-1,34);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
@@ -332,10 +328,7 @@
   squash(pp,3,decl_head,-1,36);
 else if (cat1==cast) squash(pp,2,decl_head,-1,37);
 else if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  big_app1(pp);
-  if (indent_param_decl) {
-    big_app(indent); app(indent);
-  }
+  if (indent_param_decl) big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,38);
 }
 else if (cat1==semi) squash(pp,2,decl,-1,39);
@@ -344,24 +337,19 @@
 @x
 @ @<Cases for |decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1);
-  reduce(pp,2,decl,-1,40);
+  big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
 }
 else if (cat1==stmt || cat1==function) {
-  big_app1(pp); big_app(big_force);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+  big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
 }
 @y
 @ @<Cases for |decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1);
-  reduce(pp,2,decl,-1,40);
+  big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
 }
 else if (cat1==stmt || cat1==function) {
-  big_app1(pp);
-  if(order_decl_stmt) big_app(big_force);
-  else big_app(force);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+  big_app1_insert(pp,order_decl_stmt ? big_force : force);
+  reduce(pp,2,cat1,-1,41);
 }
 @z
 
@@ -368,7 +356,7 @@
 @x
 @ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+  big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
 }
 else if (cat1==stmt) {
   big_app1(pp); app(outdent); app(outdent); big_app(force);
@@ -377,7 +365,7 @@
 @y
 @ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+  big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
 }
 else if (cat1==stmt) {
   big_app1(pp);
@@ -384,12 +372,18 @@
   if (indent_param_decl) {
     app(outdent); app(outdent);
   }
-  big_app(force);
-  big_app1(pp+1); reduce(pp,2,function,-1,52);
+  big_app(force); big_app1(pp+1); reduce(pp,2,function,-1,52);
 }
 @z
 
 @x
+  big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
+ at y
+  big_app1(pp); if (indent_param_decl) big_app(dindent);
+  big_app1(pp+1); reduce(pp,2,fn_decl,0,73);
+ at z
+
+ at x
     overflow("token");
 @y
     overflow(_("token"));
@@ -620,17 +614,17 @@
 @x
 @** Index.
 @y
-@** 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.
+@** Extensions to {\tentex 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
-material should nicely integrate with the original ``\&{263.~Index}.''
+material should nicely integrate with the original ``\&{272.~Index}.''
 
 @* Formatting alternatives.
-\.{CWEAVE} indents declarations after old-style function definitions.
-With the \.{-i} option they will come out flush left.  You won't see
-any difference if you use ANSI-style function definitions.
+\.{CWEAVE} indents declarations after old-style function definitions and
+long parameter lists of modern function definitions.
+With the \.{-i} option they will come out flush left.
 
 @d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
 
@@ -664,7 +658,7 @@
     fatal(_("! Cannot open output file "),check_file_name);
 @.Cannot open output file@>
 
-  if (temporary_output) @<Compare the temporary output...@>@;
+  if (check_for_change) @<Compare the temporary output...@>@;
 
   fclose(tex_file); tex_file=NULL;
   fclose(check_file); check_file=NULL;

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,23 +2,23 @@
 (Contributed by Fabrice Popineau, February 2002)
 
 @x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 @y
- at d banner "This is CWEAVE (Version 4.2win32)"
+ at d banner "This is CWEAVE (Version 4.3win32)"
 @z
 
 @x
-boolean names_match(@t\1\1@>
+boolean names_match(
 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 at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
 @y
-boolean __cdecl names_match(@t\1\1@>
+boolean __cdecl names_match(
 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 at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/cweave.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweave.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweave.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
 % This program by Silvio Levy and Donald E. Knuth
 % is based on a program by Knuth.
 % It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -32,11 +32,11 @@
 \def\skipxTeX{\\{skip\_\TEX/}}
 \def\copyxTeX{\\{copy\_\TEX/}}
 
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
   \vskip 15pt
-  \centerline{(Version 4.2)}
+  \centerline{(Version 4.3)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -67,9 +67,10 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
 
- at c @<Include files@>@/
+ at c
+@<Include files@>@/
 @h
 @<Common code for \.{CWEAVE} and \.{CTANGLE}@>@/
 @<Typedef declarations@>@/
@@ -85,9 +86,9 @@
 to \.{CTANGLE} and \.{CWEAVE}, before proceeding further.
 
 @c
-int main (@t\1\1@>
+int main (
 int ac, /* argument count */
-char **av at t\2\2@>) /* argument values */
+char **av) /* argument values */
 {
   argc=ac; argv=av;
   program=cweave;
@@ -99,7 +100,7 @@
   phase_one(); /* read all the user's text and store the cross-references */
   phase_two(); /* read all the text again and translate it to \TEX/ form */
   phase_three(); /* output the cross-reference index */
-  if (tracing==2 && !show_progress) new_line;
+  if (tracing==fully && !show_progress) new_line;
   return wrap_up(); /* and exit gracefully */
 }
 
@@ -143,7 +144,7 @@
 \yskip\hang |typewriter| identifiers are index entries that appear after
 \.{@@.} in the \.{CWEB} file.
 
-\yskip\hang |alfop|, \dots, |template_like|
+\yskip\hang |alfop|, \dots, |attr|
 identifiers are \CEE/ or \CPLUSPLUS/ reserved words whose |ilk|
 explains how they are to be treated when \CEE/ code is being
 formatted.
@@ -176,6 +177,10 @@
 @d typedef_like 56 /* \&{typedef} */
 @d define_like 57 /* \&{define} */
 @d template_like 58 /* \&{template} */
+ at d alignas_like 59 /* \&{alignas} */
+ at d using_like 60 /* \&{using} */
+ at d default_like 61 /* \&{default} */
+ at d attr 62 /* \&{noexcept} and attributes */
 
 @ We keep track of the current section number in |section_count|, which
 is the total number of sections that have started.  Sections which have
@@ -229,7 +234,7 @@
 @d xref equiv_or_xref
 
 @<Set init...@>=
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -239,7 +244,7 @@
 If the user has sent the |no_xref| flag (the \.{-x} option of the command line),
 it is unnecessary to keep track of cross-references for identifiers.
 If one were careful, one could probably make more changes around section
-100 to avoid a lot of identifier looking up.
+115 to avoid a lot of identifier looking up.
 
 @d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
   else (++xref_ptr)->num=c;
@@ -289,9 +294,9 @@
 new_section_xref(
 name_pointer p)
 {
-  xref_pointer q,r; /* pointers to previous cross-references */
-  q=(xref_pointer)p->xref; r=xmem;
-  if (q>xmem)
+  xref_pointer q=(xref_pointer)p->xref;
+  xref_pointer r=xmem; /* pointers to previous cross-references */
+  if (q>r)
         while (q->num>section_xref_switch) {r=q; q=q->xlink;}
   if (r->num==section_count+section_xref_switch)
         return; /* don't duplicate entries */
@@ -309,8 +314,7 @@
 set_file_flag(
 name_pointer p)
 {
-  xref_pointer q;
-  q=(xref_pointer)p->xref;
+  xref_pointer q=(xref_pointer)p->xref;
   if (q->num==file_flag) return;
   append_xref(file_flag);
   xref_ptr->xlink = q;
@@ -350,11 +354,11 @@
 
 @ Here are the three procedures needed to complete |id_lookup|:
 @c
-boolean names_match(@t\1\1@>
+boolean names_match(
 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 at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
 {
   if (length(p)!=l) return false;
   if (p->ilk!=t && !(t==normal && abnormal(p))) return false;
@@ -385,14 +389,18 @@
 
 @ @<Predecl...@>=@+static void update_node(name_pointer p);
 
-@ We have to get \CEE/'s
+@ We have to get \CEE/'s and \CPLUSPLUS/'s
 reserved words into the hash table, and the simplest way to do this is
 to insert them every time \.{CWEAVE} is run.  Fortunately there are relatively
 few reserved words. (Some of these are not strictly ``reserved,'' but
-are defined in header files of the ISO Standard \CEE/ Library.)
+are defined in header files of the ISO Standard \CEE/ Library.
+An ever growing list of \CPLUSPLUS/ keywords can be found here:
+\.{https://en.cppreference.com/w/cpp/keyword}.)
 @^reserved words@>
 
 @<Store all the reserved words@>=
+id_lookup("alignas",NULL,alignas_like);
+id_lookup("alignof",NULL,sizeof_like);
 id_lookup("and",NULL,alfop);
 id_lookup("and_eq",NULL,alfop);
 id_lookup("asm",NULL,sizeof_like);
@@ -404,13 +412,24 @@
 id_lookup("case",NULL,case_like);
 id_lookup("catch",NULL,catch_like);
 id_lookup("char",NULL,raw_int);
+id_lookup("char8_t",NULL,raw_int);
+id_lookup("char16_t",NULL,raw_int);
+id_lookup("char32_t",NULL,raw_int);
 id_lookup("class",NULL,struct_like);
 id_lookup("clock_t",NULL,raw_int);
 id_lookup("compl",NULL,alfop);
+id_lookup("concept",NULL,int_like);
 id_lookup("const",NULL,const_like);
+id_lookup("consteval",NULL,const_like);
+id_lookup("constexpr",NULL,const_like);
+id_lookup("constinit",NULL,const_like);
 id_lookup("const_cast",NULL,raw_int);
 id_lookup("continue",NULL,case_like);
-id_lookup("default",NULL,case_like);
+id_lookup("co_await",NULL,case_like);
+id_lookup("co_return",NULL,case_like);
+id_lookup("co_yield",NULL,case_like);
+id_lookup("decltype",NULL,sizeof_like);
+id_lookup("default",NULL,default_like);
 id_lookup("define",NULL,define_like);
 id_lookup("defined",NULL,sizeof_like);
 id_lookup("delete",NULL,delete_like);
@@ -427,6 +446,7 @@
 id_lookup("export",NULL,int_like);
 id_lookup("extern",NULL,int_like);
 id_lookup("FILE",NULL,raw_int);
+id_lookup("false",NULL,normal);
 id_lookup("float",NULL,raw_int);
 id_lookup("for",NULL,for_like);
 id_lookup("fpos_t",NULL,raw_int);
@@ -445,9 +465,11 @@
 id_lookup("mutable",NULL,int_like);
 id_lookup("namespace",NULL,struct_like);
 id_lookup("new",NULL,new_like);
+id_lookup("noexcept",NULL,attr);
 id_lookup("not",NULL,alfop);
 id_lookup("not_eq",NULL,alfop);
 id_lookup("NULL",NULL,custom);
+id_lookup("nullptr",NULL,custom);
 id_lookup("offsetof",NULL,raw_int);
 id_lookup("operator",NULL,operator_like);
 id_lookup("or",NULL,alfop);
@@ -459,6 +481,8 @@
 id_lookup("public",NULL,public_like);
 id_lookup("register",NULL,int_like);
 id_lookup("reinterpret_cast",NULL,raw_int);
+id_lookup("requires",NULL,int_like);
+id_lookup("restrict",NULL,int_like);
 id_lookup("return",NULL,case_like);
 id_lookup("short",NULL,raw_int);
 id_lookup("sig_atomic_t",NULL,raw_int);
@@ -466,21 +490,24 @@
 id_lookup("size_t",NULL,raw_int);
 id_lookup("sizeof",NULL,sizeof_like);
 id_lookup("static",NULL,int_like);
+id_lookup("static_assert",NULL,sizeof_like);
 id_lookup("static_cast",NULL,raw_int);
 id_lookup("struct",NULL,struct_like);
 id_lookup("switch",NULL,for_like);
 id_lookup("template",NULL,template_like);
 id_lookup("this",NULL,custom);
+id_lookup("thread_local",NULL,raw_int);
 id_lookup("throw",NULL,case_like);
 id_lookup("time_t",NULL,raw_int);
+id_lookup("true",NULL,normal);
 id_lookup("try",NULL,else_like);
 id_lookup("typedef",NULL,typedef_like);
-id_lookup("typeid",NULL,raw_int);
+id_lookup("typeid",NULL,sizeof_like);
 id_lookup("typename",NULL,struct_like);
 id_lookup("undef",NULL,if_like);
 id_lookup("union",NULL,struct_like);
 id_lookup("unsigned",NULL,raw_int);
-id_lookup("using",NULL,int_like);
+id_lookup("using",NULL,using_like);
 id_lookup("va_dcl",NULL,decl); /* Berkeley's variable-arg-list convention */
 id_lookup("va_list",NULL,raw_int); /* ditto */
 id_lookup("virtual",NULL,int_like);
@@ -491,6 +518,8 @@
 id_lookup("xor",NULL,alfop);
 id_lookup("xor_eq",NULL,alfop);@+ res_wd_end=name_ptr;
 id_lookup("TeX",NULL,custom);
+id_lookup("complex",NULL,int_like);
+id_lookup("imaginary",NULL,int_like);
 id_lookup("make_pair",NULL,func_template);
 
 @* Lexical scanning.
@@ -513,11 +542,11 @@
 @^ASCII code dependencies@>
 
 @d ignore 00 /* control code of no interest to \.{CWEAVE} */
- at d verbatim 02 /* takes the place of extended ASCII \.{\char2} */
+ at d verbatim 02 /* takes the place of ASCII \.{STX} */
 @d begin_short_comment 03 /* \CPLUSPLUS/ short comment */
 @d begin_comment '\t' /* tab marks will not appear */
 @d underline '\n' /* this code will be intercepted without confusion */
- at d noop 0177 /* takes the place of ASCII delete */
+ at d noop 0177 /* takes the place of ASCII \.{DEL} */
 @d xref_roman 0203 /* control code for `\.{@@\^}' */
 @d xref_wildcard 0204 /* control code for `\.{@@:}' */
 @d xref_typewriter 0205 /* control code for `\.{@@.}' */
@@ -549,7 +578,7 @@
 static eight_bits ccode[256]; /* meaning of a char following \.{@@} */
 
 @ @<Set ini...@>=
-{int c; for (c=0; c<256; c++) ccode[c]=0;}
+{int c; for (c=0; c<256; c++) ccode[c]=ignore;}
 ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']
    =ccode['*']=new_section;
 ccode['@@']='@@'; /* `quoted' at sign */
@@ -671,14 +700,7 @@
 
 @ As one might expect, |get_next| consists mostly of a big switch
 that branches to the various special cases that can arise.
-\CEE/ allows underscores to appear in identifiers, and some \CEE/
-compilers even allow the dollar sign.
 
- at d isxalpha(c) ((c)=='_' || (c)=='$')
-   /* non-alpha characters allowed in identifier */
- at d ishigh(c) ((eight_bits)(c)>0177)
-@^high-bit character handling@>
-
 @c
 static eight_bits
 get_next(void) /* produces the next input token */
@@ -694,7 +716,7 @@
            || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
            || (c=='<' && sharp_include_line==true))
         @<Get a string@>@;
-    else if (xisalpha(c) || isxalpha(c) || ishigh(c))
+    else if (isalpha(c) || isxalpha(c) || ishigh(c))
       @<Get an identifier@>@;
     else if (c=='@@') @<Get control code and possible section name@>@;
     else if (xisspace(c)) continue; /* ignore spaces and tabs */
@@ -733,7 +755,8 @@
 name as a string.
 
 @<Private...@>=
-static boolean sharp_include_line=false; /* are we scanning a \&{\#include} line? */
+static boolean sharp_include_line=false;
+  /* are we scanning a \#\&{include} line? */
 
 @ @<Check if next token is |include|@>=
 while (loc<=buffer_end-7 && xisspace(*loc)) loc++;
@@ -758,26 +781,25 @@
 The compound assignment operators (e.g., \.{+=}) are
 treated as separate tokens.
 
- at d compress(c) if (loc++<=limit) return c
-
 @<Compress tw...@>=
 switch(c) {
-  case '/': if (*loc=='*') {compress(begin_comment);}
+  case '/': if (*loc=='*') {@+compress(begin_comment);@+}
     else if (*loc=='/') compress(begin_short_comment); break;
   case '+': if (*loc=='+') compress(plus_plus); break;
-  case '-': if (*loc=='-') {compress(minus_minus);}
-    else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); } } break;
-  case '.': if (*loc=='*') {compress(period_ast);}
+  case '-': if (*loc=='-') {@+compress(minus_minus);@+}
+            else if (*loc=='>') {
+              if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+              else compress(minus_gt);
+            } break;
+  case '.': if (*loc=='*') {@+compress(period_ast);@+}
             else if (*loc=='.' && *(loc+1)=='.') {
-              loc++; compress(dot_dot_dot);
-            }
-            break;
+              loc++;@+compress(dot_dot_dot);
+            } break;
   case ':': if (*loc==':') compress(colon_colon); break;
   case '=': if (*loc=='=') compress(eq_eq); break;
-  case '>': if (*loc=='=') {compress(gt_eq);}
+  case '>': if (*loc=='=') {@+compress(gt_eq);@+}
     else if (*loc=='>') compress(gt_gt); break;
-  case '<': if (*loc=='=') {compress(lt_eq);}
+  case '<': if (*loc=='=') {@+compress(lt_eq);@+}
     else if (*loc=='<') compress(lt_lt); break;
   case '&': if (*loc=='&') compress(and_and); break;
   case '|': if (*loc=='|') compress(or_or); break;
@@ -786,7 +808,9 @@
 
 @ @<Get an identifier@>= {
   id_first=--loc;
-  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+  do {
+    ++loc;
+  } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
       || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
   id_loc=loc; return identifier;
 }
@@ -798,28 +822,38 @@
 with \TEX/ macros that the user can redefine to fit the context.
 In order to simplify such macros, we replace some of the characters.
 
+On output, the \.{\ } that replaces \.{'} in \CPLUSPLUS/ literals will become
+``\.{\\\ }''.
+
 Notice that in this section and the next, |id_first| and |id_loc|
 are pointers into the array |section_text|, not into |buffer|.
 
+ at d gather_digits_while(t) while (t || *loc=='\'')
+  if (*loc=='\'') { /* \CPLUSPLUS/-style digit separator */
+    *id_loc++=' '; loc++; /* insert a little bit of space */
+  }@+else *id_loc++=*loc++;
+
 @<Get a constant@>= {
   id_first=id_loc=section_text+1;
+  if (*(loc-1)=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
   if (*(loc-1)=='0') {
-    if (*loc=='x' || *loc=='X') {*id_loc++='^'; loc++;
-      while (xisxdigit(*loc)) *id_loc++=*loc++;} /* hex constant */
-    else if (xisdigit(*loc)) {*id_loc++='~';
-      while (xisdigit(*loc)) *id_loc++=*loc++;} /* octal constant */
-    else goto dec; /* decimal constant */
+    if (*loc=='x' || *loc=='X') @<Get a hexadecimal constant@>@;
+    else if (*loc=='b' || *loc=='B') @<Get a binary constant@>@;
+    else if (xisdigit(*loc)) @<Get an octal constant@>@;
   }
-  else { /* decimal constant */
-    if (*(loc-1)=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
-    dec: *id_loc++=*(loc-1);
-    while (xisdigit(*loc) || *loc=='.') *id_loc++=*loc++;
-    if (*loc=='e' || *loc=='E') { /* float constant */
-      *id_loc++='_'; loc++;
-      if (*loc=='+' || *loc=='-') *id_loc++=*loc++;
-      while (xisdigit(*loc)) *id_loc++=*loc++;
-    }
-  }
+  *id_loc++=*(loc-1); /* decimal constant */
+  gather_digits_while(xisdigit(*loc) || *loc=='.');
+get_exponent:
+  if (*loc=='e' || *loc=='E')
+    *id_loc++='_';
+  else if (*loc=='p' || *loc=='P')
+    *id_loc++='%';
+  else
+    goto digit_suffix;
+  loc++;
+  if (*loc=='+' || *loc=='-') *id_loc++=*loc++;
+  gather_digits_while(xisdigit(*loc));
+digit_suffix:
   while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
          || *loc=='f' || *loc=='F') {
     *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
@@ -827,22 +861,37 @@
   return constant;
 }
 
+@ @<Get a hex...@>={
+  *id_loc++='^'; loc++;
+  gather_digits_while(xisxdigit(*loc) || *loc=='.');
+  *id_loc++='/'; goto get_exponent;
+}
+
+@ @<Get a bin...@>={
+  *id_loc++='\\'; loc++;
+  gather_digits_while(*loc=='0' || *loc=='1');
+  *id_loc++='/'; goto digit_suffix;
+}
+
+@ @<Get an oct...@>={
+  *id_loc++='~'; gather_digits_while(xisdigit(*loc));
+  *id_loc++='/'; goto digit_suffix;
+}
+
 @ \CEE/ strings and character constants, delimited by double and single
 quotes, respectively, can contain newlines or instances of their own
 delimiters if they are protected by a backslash.  We follow this
 convention, but do not allow the string to be longer than |longest_name|.
 
-@<Get a string@>= {
+@<Get a string@>= {@+
   char delim = c; /* what started the string */
   id_first = section_text+1;
   id_loc = section_text;
   if (delim=='\'' && *(loc-2)=='@@') {*++id_loc='@@'; *++id_loc='@@';}
   *++id_loc=delim;
-  if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
-    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
-    delim=*loc++; *++id_loc=delim;
-  }
-  if (delim=='<') delim='>'; /* for file names in \&{\#include} lines */
+  if (delim=='L' || delim=='u' || delim=='U')
+    @<Get a wide character constant@>@;
+  if (delim=='<') delim='>'; /* for file names in \#\&{include} lines */
   while (true) {
     if (loc>=limit) {
       if(*(limit-1)!='\\') {
@@ -858,10 +907,14 @@
       if (++id_loc<=section_text_end) *id_loc=c;
       break;
     }
-    if (c=='\\') { if (loc>=limit) continue;
-      else { if (++id_loc<=section_text_end) {
-        *id_loc = '\\'; c=*loc++;
-      } } }
+    if (c=='\\') {
+      if (loc>=limit) continue;
+      else {
+        if (++id_loc<=section_text_end) {
+          *id_loc = '\\'; c=*loc++;
+        }
+      }
+    }
     if (++id_loc<=section_text_end) *id_loc=c;
   }
   if (id_loc>=section_text_end) {
@@ -874,6 +927,11 @@
   return string;
 }
 
+@ @<Get a wide...@>={
+  if (delim=='u' && *loc=='8') *++id_loc=*loc++;
+  delim=*loc++; *++id_loc=delim;
+}
+
 @ After an \.{@@} sign has been scanned, the next character tells us
 whether there is more work to do.
 
@@ -885,7 +943,7 @@
     case underline: xref_switch=def_flag; continue;
     case trace: tracing=c-'0'; continue;
     case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
-    case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return c;
+    case TeX_string: skip_restricted(); return ccode[(eight_bits)c];
     case section_name:
       @<Scan the section name and make |cur_section| point to it@>@;
     case verbatim: @<Scan a verbatim string@>@;
@@ -902,8 +960,9 @@
   cur_section_char=*(loc-1);
   @<Put section name into |section_text|@>@;
   if (k-section_text>3 && strncmp(k-2,"...",3)==0)
-        cur_section=section_lookup(section_text+1,k-3,1); /* 1 indicates a prefix */
-  else cur_section=section_lookup(section_text+1,k,0);
+        cur_section=section_lookup(section_text+1,k-3,true);
+          /* |true| indicates a prefix */
+  else cur_section=section_lookup(section_text+1,k,false);
   xref_switch=0; return section_name;
 }
 
@@ -969,8 +1028,7 @@
   if (loc++>limit) {
     err_print("! Control text didn't end"); loc=limit;
 @.Control text didn't end@>
-  }
-  else {
+  } else {
     if (*loc=='@@'&&loc<=limit) {loc++; goto false_alarm;}
     if (*loc++!='>')
       err_print("! Control codes are forbidden in control text");
@@ -1067,8 +1125,8 @@
 
 @ @c
 static void
-C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl at t\2\2@>)
+C_xref( /* makes cross-references for \CEE/ identifiers */
+  eight_bits spec_ctrl)
 {
   name_pointer p; /* a referenced name */
   while (next_control<format_code || next_control==spec_ctrl) {
@@ -1297,7 +1355,7 @@
 less than |out_buf_end|. If the |per_cent| parameter is |false|,
 trailing blanks are suppressed.
 The characters emptied from the buffer form a new line of output;
-if the |carryover| parameter is true, a |"%"| in that line will be
+if the |carryover| parameter is |true|, a |"%"| in that line will be
 carried over to the next line (so that \TEX/ will ignore the completion
 of commented-out text).
 
@@ -1313,11 +1371,11 @@
 
 @ @c
 static void
-flush_buffer(@t\1\1@>
+flush_buffer(
 char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
-boolean per_cent,boolean carryover at t\2\2@>)
+boolean per_cent,boolean carryover)
 {
-  char *j; j=b; /* pointer into |out_buf| */
+  char *j=b; /* pointer into |out_buf| */
   if (! per_cent) /* remove trailing blanks */
     while (j>out_buf && *j==' ') j--;
   c_line_write(j-out_buf);
@@ -1378,8 +1436,8 @@
 
 @ @c
 static void
-out_str(@t\1\1@> /* output characters from |s| to end of string */
-const char*s at t\2\2@>)
+out_str( /* output characters from |s| to end of string */
+const char*s)
 {
   while (*s) out(*s++);
 }
@@ -1546,9 +1604,9 @@
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
 
 @c
-static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
+static int copy_comment( /* copies \TeX\ code in comments */
 boolean is_long_comment, /* is this a traditional \CEE/ comment? */
-int bal at t\2\2@>) /* brace balance */
+int bal) /* brace balance */
 {
   char c; /* current character being copied */
   while (true) {
@@ -1559,8 +1617,7 @@
 @.Input ended in mid-comment@>
           loc=buffer+1; goto done;
         }
-      }
-      else {
+      } else {
         if (bal>1) err_print("! Missing } in comment");
 @.Missing \} in comment@>
         goto done;
@@ -1583,7 +1640,7 @@
       }
     }
   }
-done:@<Clear |bal| and |return|@>@;
+done: @<Clear |bal| and |return|@>@;
 }
 
 @ @<Check for end of comment@>=
@@ -1601,9 +1658,11 @@
 @.Illegal use of @@...@>
     loc-=2; if (phase==2) *(tok_ptr-1)=' '; goto done;
   }
+} else {
+  if (c=='\\' && *loc!='@@') {
+    if (phase==2) app_tok(*(loc++))@; else loc++;
+  }
 }
-else { if (c=='\\' && *loc!='@@') {
-  if (phase==2) app_tok(*(loc++))@; else loc++; } }
 
 @ We output
 enough right braces to keep \TEX/ happy.
@@ -1683,8 +1742,8 @@
 @d rbrace 8 /* denotes a right brace */
 @d decl_head 9 /* denotes an incomplete declaration */
 @d comma 10 /* denotes a comma */
- at d lpar 11 /* denotes a left parenthesis or left bracket */
- at d rpar 12 /* denotes a right parenthesis or right bracket */
+ at d lpar 11 /* denotes a left parenthesis */
+ at d rpar 12 /* denotes a right parenthesis */
 @d prelangle 13 /* denotes `$<$' before we know what it is */
 @d prerangle 14 /* denotes `$>$' before we know what it is */
 @d langle 15 /* denotes `$<$' when it's used as angle bracket in a template */
@@ -1706,10 +1765,13 @@
 @d insert 37 /* a scrap that gets combined with its neighbor */
 @d section_scrap 38 /* section name */
 @d dead 39 /* scrap that won't combine */
- at d ftemplate 59 /* \\{make\_pair} */
- at d new_exp 60 /* \&{new} and a following type identifier */
- at d begin_arg 61 /* \.{@@[} */
- at d end_arg 62 /* \.{@@]} */
+ at d ftemplate 63 /* \\{make\_pair} */
+ at d new_exp 64 /* \&{new} and a following type identifier */
+ at d begin_arg 65 /* \.{@@[} */
+ at d end_arg 66 /* \.{@@]} */
+ at d lbrack 67 /* denotes a left bracket */
+ at d rbrack 68 /* denotes a right bracket */
+ at d attr_head 69 /* denotes beginning of attribute */
 
 @<Private...@>=
 static char cat_name[256][12];
@@ -1774,6 +1836,13 @@
     strcpy(cat_name[new_exp],"new_exp");
     strcpy(cat_name[begin_arg],"@@["@q]@>);
     strcpy(cat_name[end_arg], at q[@>"@@]");
+    strcpy(cat_name[lbrack],"[");
+    strcpy(cat_name[rbrack],"]");
+    strcpy(cat_name[attr_head],"attr_head");
+    strcpy(cat_name[attr],"attr");
+    strcpy(cat_name[alignas_like],"alignas");
+    strcpy(cat_name[using_like],"using");
+    strcpy(cat_name[default_like],"default");
     strcpy(cat_name[0],"zero");
 
 @ This code allows \.{CWEAVE} to display its parsing steps.
@@ -1780,8 +1849,8 @@
 
 @c
 static void
-print_cat(@t\1\1@> /* symbolic printout of a category */
-eight_bits c at t\2\2@>)
+print_cat( /* symbolic printout of a category */
+eight_bits c)
 {
   fputs(cat_name[c],stdout);
 }
@@ -1813,8 +1882,10 @@
 
 \yskip\hang |indent| causes future lines to be indented one more em;
 
-\yskip\hang |outdent| causes future lines to be indented one less em.
+\yskip\hang |outdent| causes future lines to be indented one less em;
 
+\yskip\hang |dindent| causes future lines to be indented two more ems.
+
 \yskip\noindent All of these tokens are removed from the \TEX/ output that
 comes from \CEE/ text between \pb\ signs; |break_space| and |force| and
 |big_force| become single spaces in this mode. The translation of other
@@ -1827,6 +1898,10 @@
 |force|, and/or |big_force| tokens is first replaced by a single token
 (the maximum of the given ones).
 
+A |dindent| token becomes \.{\\1\\1}. It is equivalent to a pair of |indent|
+tokens. However, if |dindent| immediately precedes |big_force|, the two tokens
+are swapped, so that the indentation happens after the line break.
+
 The token |math_rel| will be translated into
 \.{\\MRL\{}, and it will get a matching \.\} later.
 Other control sequences in the \TEX/ output will be
@@ -1854,6 +1929,7 @@
 @d end_translation 0223 /* special sentinel token at end of list */
 @d inserted 0224 /* sentinel to mark translations of inserts */
 @d qualifier 0225 /* introduces an explicit namespace qualifier */
+ at d dindent 0226 /* two more tabs (\.{\\1\\1}) */
 
 @ The raw input is converted into scraps according to the following table,
 which gives category codes followed by the translations.
@@ -1892,11 +1968,14 @@
 \.{@@=}string\.{@@>}&|exp|: \.{\\vb\{}string with special characters
   quoted\.\}&maybe\cr
 \.{@@'7'}&|exp|: \.{\\.\{@@'7'\}}&maybe\cr
-\.{077} or \.{\\77}&|exp|: \.{\\T\{\\\~77\}}&maybe\cr
-\.{0x7f}&|exp|: \.{\\T\{\\\^7f\}}&maybe\cr
+\.{077} or \.{\\77}&|exp|: \.{\\T\{\\\~77/\}}&maybe\cr
+\.{0x7f}&|exp|: \.{\\T\{\\\^7f/\}}&maybe\cr
+\.{0b10111}&|exp|: \.{\\T\{\\\\10111/\}}&maybe\cr
 \.{77}&|exp|: \.{\\T\{77\}}&maybe\cr
 \.{77L}&|exp|: \.{\\T\{77\\\$L\}}&maybe\cr
 \.{0.1E5}&|exp|: \.{\\T\{0.1\\\_5\}}&maybe\cr
+\.{0x10p3}&|exp|: \.{\\T\{\\\^10/\\\%3\}}&maybe\cr
+\.{1'000'000}&|exp|: \.{\\T\{1\\\ 000\\\ 000\}}&maybe\cr
 \.+&|ubinop|: \.+&yes\cr
 \.-&|ubinop|: \.-&yes\cr
 \.*&|raw_ubin|: \.*&yes\cr
@@ -1913,9 +1992,9 @@
 \.\~&|unop|: \.{\\CM}&yes\cr
 \.\&&|raw_ubin|: \.{\\AND}&yes\cr
 \.(&|lpar|: \.(&maybe\cr
-\.[&|lpar|: \.[&maybe\cr
 \.)&|rpar|: \.)&maybe\cr
-\.]&|rpar|: \.]&maybe\cr
+\.[&|lbrack|: \.[&maybe\cr
+\.]&|rbrack|: \.]&maybe\cr
 \.\{&|lbrace|: \.\{&yes\cr
 \.\}&|lbrace|: \.\}&yes\cr
 \.,&|comma|: \.,&yes\cr
@@ -1926,6 +2005,8 @@
 end of \.\# line&|rproc|:  |force|&no\cr
 identifier&|exp|: \.{\\\\\{}identifier with underlines and
              dollar signs quoted\.\}&maybe\cr
+\.{alignas}&|alignas_like|: \stars&maybe\cr
+\.{alignof}&|sizeof_like|: \stars&maybe\cr
 \.{and}&|alfop|: \stars&yes\cr
 \.{and\_eq}&|alfop|: \stars&yes\cr
 \.{asm}&|sizeof_like|: \stars&maybe\cr
@@ -1937,13 +2018,25 @@
 \.{case}&|case_like|: \stars&maybe\cr
 \.{catch}&|catch_like|: \stars&maybe\cr
 \.{char}&|raw_int|: \stars&maybe\cr
+\.{char8\_t}&|raw_int|: \stars&maybe\cr
+\.{char16\_t}&|raw_int|: \stars&maybe\cr
+\.{char32\_t}&|raw_int|: \stars&maybe\cr
 \.{class}&|struct_like|: \stars&maybe\cr
 \.{clock\_t}&|raw_int|: \stars&maybe\cr
 \.{compl}&|alfop|: \stars&yes\cr
+\.{complex}&|int_like|: \stars&yes\cr
+\.{concept}&|int_like|: \stars&maybe\cr
 \.{const}&|const_like|: \stars&maybe\cr
+\.{consteval}&|const_like|: \stars&maybe\cr
+\.{constexpr}&|const_like|: \stars&maybe\cr
+\.{constinit}&|const_like|: \stars&maybe\cr
 \.{const\_cast}&|raw_int|: \stars&maybe\cr
 \.{continue}&|case_like|: \stars&maybe\cr
-\.{default}&|case_like|: \stars&maybe\cr
+\.{co\_await}&|case_like|: \stars&maybe\cr
+\.{co\_return}&|case_like|: \stars&maybe\cr
+\.{co\_yield}&|case_like|: \stars&maybe\cr
+\.{decltype}&|sizeof_like|: \stars&maybe\cr
+\.{default}&|default_like|: \stars&maybe\cr
 \.{define}&|define_like|: \stars&maybe\cr
 \.{defined}&|sizeof_like|: \stars&maybe\cr
 \.{delete}&|delete_like|: \stars&maybe\cr
@@ -1960,6 +2053,7 @@
 \.{export}&|int_like|: \stars&maybe\cr
 \.{extern}&|int_like|: \stars&maybe\cr
 \.{FILE}&|raw_int|: \stars&maybe\cr
+\.{false}&|normal|: \stars&maybe\cr
 \.{float}&|raw_int|: \stars&maybe\cr
 \.{for}&|for_like|: \stars&maybe\cr
 \.{fpos\_t}&|raw_int|: \stars&maybe\cr
@@ -1968,6 +2062,7 @@
 \.{if}&|if_like|: \stars&maybe\cr
 \.{ifdef}&|if_like|: \stars&maybe\cr
 \.{ifndef}&|if_like|: \stars&maybe\cr
+\.{imaginary}&|int_like|: \stars&maybe\cr
 \.{include}&|if_like|: \stars&maybe\cr
 \.{inline}&|int_like|: \stars&maybe\cr
 \.{int}&|raw_int|: \stars&maybe\cr
@@ -1979,9 +2074,11 @@
 \.{mutable}&|int_like|: \stars&maybe\cr
 \.{namespace}&|struct_like|: \stars&maybe\cr
 \.{new}&|new_like|: \stars&maybe\cr
+\.{noexcept}&|attr|: \stars&maybe\cr
 \.{not}&|alfop|: \stars&yes\cr
 \.{not\_eq}&|alfop|: \stars&yes\cr
 \.{NULL}&|exp|: \.{\\NULL}&yes\cr
+\.{nullptr}&|exp|: \.{\\NULL}&yes\cr
 \.{offsetof}&|raw_int|: \stars&maybe\cr
 \.{operator}&|operator_like|: \stars&maybe\cr
 \.{or}&|alfop|: \stars&yes\cr
@@ -1993,6 +2090,8 @@
 \.{public}&|public_like|: \stars&maybe\cr
 \.{register}&|int_like|: \stars&maybe\cr
 \.{reinterpret\_cast}&|raw_int|: \stars&maybe\cr
+\.{requires}&|int_like|: \stars&maybe\cr
+\.{restrict}&|int_like|: \stars&maybe\cr
 \.{return}&|case_like|: \stars&maybe\cr
 \.{short}&|raw_int|: \stars&maybe\cr
 \.{sig\_atomic\_t}&|raw_int|: \stars&maybe\cr
@@ -2000,6 +2099,7 @@
 \.{size\_t}&|raw_int|: \stars&maybe\cr
 \.{sizeof}&|sizeof_like|: \stars&maybe\cr
 \.{static}&|int_like|: \stars&maybe\cr
+\.{static\_assert}&|sizeof_like|: \stars&maybe\cr
 \.{static\_cast}&|raw_int|: \stars&maybe\cr
 \.{struct}&|struct_like|: \stars&maybe\cr
 \.{switch}&|for_like|: \stars&maybe\cr
@@ -2006,16 +2106,17 @@
 \.{template}&|template_like|: \stars&maybe\cr
 \.{TeX}&|exp|: \.{\\TeX}&yes\cr
 \.{this}&|exp|: \.{\\this}&yes\cr
+\.{thread\_local}&|raw_int|: \stars&maybe\cr
 \.{throw}&|case_like|: \stars&maybe\cr
 \.{time\_t}&|raw_int|: \stars&maybe\cr
 \.{try}&|else_like|: \stars&maybe\cr
 \.{typedef}&|typedef_like|: \stars&maybe\cr
-\.{typeid}&|raw_int|: \stars&maybe\cr
+\.{typeid}&|sizeof_like|: \stars&maybe\cr
 \.{typename}&|struct_like|: \stars&maybe\cr
 \.{undef}&|if_like|: \stars&maybe\cr
 \.{union}&|struct_like|: \stars&maybe\cr
 \.{unsigned}&|raw_int|: \stars&maybe\cr
-\.{using}&|int_like|: \stars&maybe\cr
+\.{using}&|using_like|: \stars&maybe\cr
 \.{va\_dcl}&|decl|: \stars&maybe\cr
 \.{va\_list}&|raw_int|: \stars&maybe\cr
 \.{virtual}&|int_like|: \stars&maybe\cr
@@ -2137,8 +2238,8 @@
 
 @c
 static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
-text_pointer p at t\2\2@>)
+print_text( /* prints a token list for debugging; not used in |main| */
+text_pointer p)
 {
   token_pointer j; /* index into |tok_mem| */
   sixteen_bits r; /* remainder of token after the flag has been stripped off */
@@ -2150,7 +2251,7 @@
         break; /* |id_flag| */
       case 2: printf("\\&{"@q}@>); print_id((name_dir+r)); printf(@q{@>"}");
         break; /* |res_flag| */
-      case 3: printf("<"); print_section_name((name_dir+r)); printf(">");
+      case 3: putchar('<'); print_section_name((name_dir+r)); putchar('>');
         break; /* |section_flag| */
       case 4: printf("[[%d]]",r); break; /* |tok_flag| */
       case 5: printf("|[[%d]]|",r); break; /* |inner_tok_flag| */
@@ -2169,6 +2270,7 @@
   case cancel: printf("[cancel]"); break;
   case indent: printf("[indent]"); break;
   case outdent: printf("[outdent]"); break;
+  case dindent: printf("[dindent]"); break;
   case backup: printf("[backup]"); break;
   case opt: printf("[opt]"); break;
   case break_space: printf("[break]"); break;
@@ -2178,7 +2280,7 @@
   case quoted_char: j++; printf("[%o]",(unsigned int)*j); break;
   case end_translation: printf("[quit]"); break;
   case inserted: printf("[inserted]"); break;
-  default: putxchar(r);
+  default: putchar(r);
 }
 
 @ The production rules listed above are embedded directly into \.{CWEAVE},
@@ -2253,8 +2355,9 @@
 @d no_math 2 /* should be in horizontal mode */
 @d yes_math 1 /* should be in math mode */
 @d maybe_math 0 /* works in either horizontal or math mode */
- at d big_app2(a) big_app1(a);big_app1(a+1)
- at d big_app3(a) big_app2(a);big_app1(a+2)
+ at d big_app2(a) big_app1(a);@+big_app1(a+1)
+ at d big_app3(a) big_app2(a);@+big_app1(a+2)
+ at d big_app1_insert(p,c) big_app1(p);@+big_app(c);@+big_app1(p+1)
 @d app(a) *(tok_ptr++)=(token)(a)
 @d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
 
@@ -2278,12 +2381,12 @@
 big_app(
 token a)
 {
-        if (a==' ' || (a>=big_cancel && a<=big_force)) /* non-math token */ {
+        if (a==' ' || (a>=big_cancel && a<=big_force) || a==dindent)
+            /* non-math token */ {
                 if (cur_mathness==maybe_math) init_mathness=no_math;
                 else if (cur_mathness==yes_math) app_str("{}$");
                 cur_mathness=no_math;
-        }
-        else {
+        } else {
                 if (cur_mathness==maybe_math) init_mathness=yes_math;
                 else if (cur_mathness==no_math) app_str("${}");
                 cur_mathness=yes_math;
@@ -2320,7 +2423,7 @@
 @d cat2 (pp+2)->cat
 @d cat3 (pp+3)->cat
 @d lhs_not_simple (pp->cat!=public_like
-        && pp->cat!=semi 
+        && pp->cat!=semi
         && pp->cat!=prelangle
         && pp->cat!=prerangle @|
         && pp->cat!=template_like
@@ -2337,6 +2440,8 @@
   if (cat1==end_arg && lhs_not_simple)
     if (pp->cat==begin_arg) squash(pp,2,exp,-2,124);
     else squash(pp,2,end_arg,-1,125);
+  else if (pp->cat==rbrack) squash(pp,1,rpar,-3,130);
+  else if (pp->cat==using_like) squash(pp,1,int_like,-3,140);
   else if (cat1==insert) squash(pp,2,pp->cat,-2,0);
   else if (cat2==insert) squash(pp+1,2,(pp+1)->cat,-1,0);
   else if (cat3==insert) squash(pp+2,2,(pp+2)->cat,0,0);
@@ -2389,6 +2494,11 @@
     case typedef_like: @<Cases for |typedef_like|@>@; @+break;
     case delete_like: @<Cases for |delete_like|@>@; @+break;
     case question: @<Cases for |question|@>@; @+break;
+    case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+    case lbrack: @<Cases for |lbrack|@>@; @+break;
+    case attr_head: @<Cases for |attr_head|@>@; @+break;
+    case attr: @<Cases for |attr|@>@; @+break;
+    case default_like: @<Cases for |default_like|@>@; @+break;
   }
   pp++; /* if no match was found, we move to the right */
 }
@@ -2457,8 +2567,8 @@
 
 @c
 static void
-make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p at t\2\2@>)
+make_reserved( /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p)
 {
   sixteen_bits tok_value; /* the name of this identifier, plus its flag */
   token_pointer tok_loc; /* pointer to |tok_value| */
@@ -2488,9 +2598,9 @@
 
 @c
 static void
-make_underlined(@t\1\1@>
+make_underlined(
 /* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p at t\2\2@>)
+scrap_pointer p)
 {
   token_pointer tok_loc; /* where the first identifier appears */
   if ((tok_loc=find_first_ident(p->trans))<=operator_found)
@@ -2535,11 +2645,11 @@
 (namely, at |p->xref|), but rather right before |q|.
 
 @<Insert new cross-reference at |q|...@>=
-  append_xref(0); /* this number doesn't matter */
-  xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
-  update_node(p);
-  while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
-  r->num=m; /* everything from |q| on is left undisturbed */
+append_xref(0); /* this number doesn't matter */
+xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
+update_node(p);
+while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
+r->num=m; /* everything from |q| on is left undisturbed */
 
 @ Now comes the code that tries to match each production starting
 with a particular type of scrap. Whenever a match is discovered,
@@ -2548,7 +2658,7 @@
 
 @<Cases for |exp|@>=
 if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+  make_underlined(pp); big_app(dindent); big_app1(pp);
   reduce(pp,1,fn_decl,0,1);
 }
 else if (cat1==unop) squash(pp,2,exp,-2,2);
@@ -2562,16 +2672,20 @@
 else if (cat1==cast && cat2==colon) squash(pp+2,1,base,0,5);
 else if (cat1==semi) squash(pp,2,stmt,-1,6);
 else if (cat1==colon) {
-  make_underlined (pp);  squash(pp,2,tag,-1,7);
+  make_underlined (pp); squash(pp,2,tag,-1,7);
 }
 else if (cat1==rbrace) squash(pp,1,stmt,-1,8);
 else if (cat1==lpar && cat2==rpar && (cat3==const_like || cat3==case_like)) {
-  big_app1(pp+2); big_app(' '); big_app1(pp+3); reduce(pp+2,2,rpar,0,9);
+  big_app1_insert(pp+2,' '); reduce(pp+2,2,rpar,0,9);
 }
 else if (cat1==cast && (cat2==const_like || cat2==case_like)) {
-  big_app1(pp+1); big_app(' '); big_app1(pp+2); reduce(pp+1,2,cast,0,9);
+  big_app1_insert(pp+1,' '); reduce(pp+1,2,cast,0,9);
 }
 else if (cat1==exp || cat1==cast) squash(pp,2,exp,-2,10);
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,142);
+}
+else if (cat1==colcol && cat2==int_like) squash(pp,3,int_like,-2,152);
 
 @ @<Cases for |lpar|@>=
 if ((cat1==exp||cat1==ubinop) && cat2==rpar) squash(pp,3,exp,-2,11);
@@ -2594,15 +2708,13 @@
 
 @ @<Cases for |ubinop|@>=
 if (cat1==cast && cat2==rpar) {
-  big_app('{'); big_app1(pp); big_app('}'); big_app1(pp+1);
-  reduce(pp,2,cast,-2,17);
+  big_app('{'); big_app1_insert(pp,'}'); reduce(pp,2,cast,-2,17);
 }
 else if (cat1==exp || cat1==int_like) {
-  big_app('{'); big_app1(pp); big_app('}'); big_app1(pp+1);
-  reduce(pp,2,cat1,-2,18);
+  big_app('{'); big_app1_insert(pp,'}'); reduce(pp,2,cat1,-2,18);
 }
 else if (cat1==binop) {
-  big_app(math_rel); big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+  big_app(math_rel); big_app1_insert(pp,'{'); big_app('}');
   big_app('}'); reduce(pp,2,binop,-1,19);
 }
 
@@ -2616,7 +2728,7 @@
 @ @<Cases for |cast|@>=
 if (cat1==lpar) squash(pp,2,lpar,-1,21);
 else if (cat1==exp) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,21);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,21);
 }
 else if (cat1==semi) squash(pp,1,exp,-2,22);
 
@@ -2623,12 +2735,12 @@
 @ @<Cases for |sizeof_like|@>=
 if (cat1==cast) squash(pp,2,exp,-2,23);
 else if (cat1==exp) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,24);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,24);
 }
 
 @ @<Cases for |int_like|@>=
 if (cat1==int_like|| cat1==struct_like) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,cat1,-2,25);
+  big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,25);
 }
 else if (cat1==exp && (cat2==raw_int||cat2==struct_like))
   squash(pp,2,int_like,-2,26);
@@ -2644,7 +2756,8 @@
 @ @<Cases for |colcol|@>=
 if (cat1==exp||cat1==int_like) {
   app(qualifier); squash(pp,2,cat1,-2,31);
-}@+else if (cat1==colcol) squash(pp,2,colcol,-1,32);
+}
+else if (cat1==colcol) squash(pp,2,colcol,-1,32);
 
 @ @<Cases for |decl_head|@>=
 if (cat1==comma) {
@@ -2651,8 +2764,7 @@
   big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
 }
 else if (cat1==ubinop) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
-  reduce(pp,2,decl_head,-1,34);
+  big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -2662,18 +2774,19 @@
   squash(pp,3,decl_head,-1,36);
 else if (cat1==cast) squash(pp,2,decl_head,-1,37);
 else if (cat1==lbrace || cat1==int_like || cat1==decl) {
-  big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+  big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
 }
 else if (cat1==semi) squash(pp,2,decl,-1,39);
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,decl_head,-1,139);
+}
 
 @ @<Cases for |decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1);
-  reduce(pp,2,decl,-1,40);
+  big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
 }
 else if (cat1==stmt || cat1==function) {
-  big_app1(pp); big_app(big_force);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+  big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
 }
 
 @ @<Cases for |base|@>=
@@ -2683,7 +2796,7 @@
     app(opt); app('9'); reduce(pp,3,base,0,42);
   }
   else if (cat2==lbrace) {
-    big_app1(pp); big_app(' '); big_app1(pp+1); big_app(' '); big_app1(pp+2);
+    big_app1_insert(pp,' '); big_app(' '); big_app1(pp+2);
     reduce(pp,3,lbrace,-2,43);
   }
 }
@@ -2690,12 +2803,12 @@
 
 @ @<Cases for |struct_like|@>=
 if (cat1==lbrace) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,struct_head,0,44);
+  big_app1_insert(pp,' '); reduce(pp,2,struct_head,0,44);
 }
 else if (cat1==exp||cat1==int_like) {
   if (cat2==lbrace || cat2==semi) {
     make_underlined(pp+1); make_reserved(pp+1);
-    big_app1(pp); big_app(' '); big_app1(pp+1);
+    big_app1_insert(pp,' ');
     if (cat2==semi) reduce(pp,2,decl_head,0,45);
     else {
       big_app(' '); big_app1(pp+2);reduce(pp,3,struct_head,0,46);
@@ -2703,14 +2816,20 @@
   }
   else if (cat2==colon) squash(pp+2,1,base,2,47);
   else if (cat2!=base) {
-    big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,int_like,-2,48);
+    big_app1_insert(pp,' '); reduce(pp,2,int_like,-2,48);
   }
 }
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,struct_like,-3,141);
+}
+else if (cat1==struct_like) {
+  big_app1_insert(pp,' '); reduce(pp,2,struct_like,-3,151);
+}
 
 @ @<Cases for |struct_head|@>=
 if ((cat1==decl || cat1==stmt || cat1==function) && cat2==rbrace) {
   big_app1(pp); big_app(indent); big_app(force); big_app1(pp+1);
-  big_app(outdent); big_app(force);  big_app1(pp+2);
+  big_app(outdent); big_app(force); big_app1(pp+2);
   reduce(pp,3,int_like,-2,49);
 }
 else if (cat1==rbrace) {
@@ -2721,16 +2840,19 @@
 
 @ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
-  big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+  big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
 }
 else if (cat1==stmt) {
   big_app1(pp); app(outdent); app(outdent); big_app(force);
   big_app1(pp+1); reduce(pp,2,function,-1,52);
 }
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,fn_decl,0,157);
+}
 
 @ @<Cases for |function|@>=
 if (cat1==function || cat1==decl || cat1==stmt) {
-  big_app1(pp); big_app(big_force); big_app1(pp+1); reduce(pp,2,cat1,-1,53);
+  big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,53);
 }
 
 @ @<Cases for |lbrace|@>=
@@ -2740,8 +2862,8 @@
   reduce(pp,2,stmt,-1,54);
 }
 else if ((cat1==stmt||cat1==decl||cat1==function) && cat2==rbrace) {
-  big_app(force); big_app1(pp);  big_app(indent); big_app(force);
-  big_app1(pp+1); big_app(force); big_app(backup);  big_app1(pp+2);
+  big_app(force); big_app1(pp); big_app(indent); big_app(force);
+  big_app1(pp+1); big_app(force); big_app(backup); big_app1(pp+2);
   big_app(outdent); big_app(force); reduce(pp,3,stmt,-1,55);
 }
 else if (cat1==exp) {
@@ -2751,7 +2873,7 @@
 
 @ @<Cases for |if_like|@>=
 if (cat1==exp) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,if_clause,0,57);
+  big_app1_insert(pp,' '); reduce(pp,2,if_clause,0,57);
 }
 
 @ @<Cases for |else_like|@>=
@@ -2778,19 +2900,24 @@
     big_app1(pp+1); big_app(outdent); big_app(force); big_app1(pp+2);
     if (cat3==if_like) {
       big_app(' '); big_app1(pp+3); reduce(pp,4,if_like,0,63);
-    }@+else reduce(pp,3,else_like,0,64);
+    }
+    else reduce(pp,3,else_like,0,64);
   }
   else squash(pp,1,else_like,0,65);
 }
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,if_head,0,146);
+}
 
 @ @<Cases for |if_head|@>=
 if (cat1==stmt || cat1==exp) {
   if (cat2==else_like) {
     big_app(force); big_app1(pp); big_app(break_space); app(noop);
-    big_app(cancel); big_app1(pp+1); big_app(force); big_app1(pp+2);
+    big_app(cancel); big_app1_insert(pp+1,force);
     if (cat3==if_like) {
       big_app(' '); big_app1(pp+3); reduce(pp,4,if_like,0,66);
-    }@+else reduce(pp,3,else_like,0,67);
+    }
+    else reduce(pp,3,else_like,0,67);
   }
   else squash(pp,1,else_head,0,68);
 }
@@ -2806,22 +2933,23 @@
 if (cat1==semi) squash(pp,2,stmt,-1,70);
 else if (cat1==colon) squash(pp,2,tag,-1,71);
 else if (cat1==exp) {
-  big_app1(pp); big_app(' ');  big_app1(pp+1);  reduce(pp,2,exp,-2,72);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,72);
 }
 
 @ @<Cases for |catch_like|@>=
 if (cat1==cast || cat1==exp) {
-  big_app2(pp); big_app(indent); big_app(indent); reduce(pp,2,fn_decl,0,73);
+  big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
 }
 
 @ @<Cases for |tag|@>=
 if (cat1==tag) {
-  big_app1(pp); big_app(break_space); big_app1(pp+1); reduce(pp,2,tag,-1,74);
+  big_app1_insert(pp,break_space); reduce(pp,2,tag,-1,74);
 }
 else if (cat1==stmt||cat1==decl||cat1==function) {
-  big_app(force); big_app(backup); big_app1(pp); big_app(break_space);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,75);
+  big_app(force); big_app(backup); big_app1_insert(pp,break_space);
+  reduce(pp,2,cat1,-1,75);
 }
+else if (cat1==rbrace) squash(pp,1,decl,-1,156);
 
 @ The user can decide at run-time whether short statements should be
 grouped together on the same line.
@@ -2833,12 +2961,8 @@
 
 @ @<Cases for |stmt|@>=
 if (cat1==stmt||cat1==decl||cat1==function) {
-  big_app1(pp);
-  if (cat1==function) big_app(big_force);
-  else if (cat1==decl) big_app(big_force);
-  else if (force_lines) big_app(force);
-  else big_app(break_space);
-  big_app1(pp+1); reduce(pp,2,cat1,-1,76);
+  big_app1_insert(pp, (cat1==function || cat1==decl) ? big_force :
+     force_lines ? force : break_space); reduce(pp,2,cat1,-1,76);
 }
 
 @ @<Cases for |semi|@>=
@@ -2846,7 +2970,7 @@
 
 @ @<Cases for |lproc|@>=
 if (cat1==define_like) make_underlined(pp+2);
-if (cat1==else_like || cat1==if_like ||cat1==define_like)
+if (cat1==else_like || cat1==if_like || cat1==define_like)
   squash(pp,2,lproc,0,78);
 else if (cat1==rproc) {
   app(inserted); big_app2(pp); reduce(pp,2,insert,-1,79);
@@ -2856,7 +2980,7 @@
     reduce(pp,3,insert,-1,80);
   }
   else if (cat2==exp && cat3==rproc && cat1==exp) {
-    app(inserted); big_app1(pp); big_app(' '); big_app1(pp+1); app_str(" \\5");
+    app(inserted); big_app1_insert(pp,' '); app_str("\\5");
 @.\\5@>
     big_app2(pp+2); reduce(pp,4,insert,-1,80);
   }
@@ -2880,7 +3004,10 @@
 init_mathness=cur_mathness=yes_math;
 app('>'); reduce(pp,1,binop,-2,85);
 
-@ @<Cases for |langle|@>=
+@ @d reserve_typenames flags['t']
+  /* should we treat \&{typename} in a template like \&{typedef}? */
+
+@<Cases for |langle|@>=
 if (cat1==prerangle) {
   big_app1(pp); app('\\'); app(','); big_app1(pp+1);
 @.\\,@>
@@ -2892,31 +3019,42 @@
     big_app3(pp); app(opt); app('9'); reduce(pp,3,langle,0,88);
   }
 }
+else if (cat1==struct_like) {
+  if ((cat2==exp || cat2==int_like) && (cat3==comma || cat3==prerangle)) {
+    make_underlined(pp+2); if (reserve_typenames) make_reserved(pp+2);
+    big_app2(pp); big_app(' '); big_app2(pp+2);
+    if (cat3==comma) reduce(pp,4,langle,0,153);
+    else reduce(pp,4,cast,-1,154);
+  }
+}
 
 @ @<Cases for |template_like|@>=
 if (cat1==exp && cat2==prelangle) squash(pp+2,1,langle,2,89);
 else if (cat1==exp || cat1==raw_int) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,cat1,-2,90);
-}@+ else squash(pp,1,raw_int,0,91);
+  big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,90);
+}
+else if (cat1==cast && cat2==struct_like) {
+  big_app1_insert(pp,' '); reduce(pp,2,struct_like,0,155);
+}
+else squash(pp,1,raw_int,0,91);
 
 @ @<Cases for |new_like|@>=
 if (cat1==lpar && cat2==exp && cat3==rpar) squash(pp,4,new_like,0,92);
 else if (cat1==cast) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,93);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,93);
 }
 else if (cat1!=lpar) squash(pp,1,new_exp,0,94);
 
 @ @<Cases for |new_exp|@>=
 if (cat1==int_like || cat1==const_like) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,new_exp,0,95);
+  big_app1_insert(pp,' '); reduce(pp,2,new_exp,0,95);
 }
 else if (cat1==struct_like && (cat2==exp || cat2==int_like)) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); big_app(' ');
+  big_app1_insert(pp,' '); big_app(' ');
   big_app1(pp+2); reduce(pp,3,new_exp,0,96);
 }
 else if (cat1==raw_ubin) {
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
-  reduce(pp,2,new_exp,0,97);
+  big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,new_exp,0,97);
 }
 else if (cat1==lpar) squash(pp,1,exp,-2,98);
 else if (cat1==exp) {
@@ -2931,7 +3069,7 @@
 
 @ @<Cases for |for_like|@>=
 if (cat1==exp) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,102);
+  big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,102);
 }
 
 @ @<Cases for |raw_ubin|@>=
@@ -2938,7 +3076,8 @@
 if (cat1==const_like) {
   big_app2(pp); app_str("\\ "); reduce(pp,2,raw_ubin,0,103);
 @.\\\ @>
-} else squash(pp,1,ubinop,-2,104);
+}
+else squash(pp,1,ubinop,-2,104);
 
 @ @<Cases for |const_like|@>=
 squash(pp,1,int_like,-2,105);
@@ -2948,16 +3087,16 @@
 else if (cat1==colcol) squash(pp,2,colcol,-1,107);
 else if (cat1==cast) squash(pp,2,raw_int,0,108);
 else if (cat1==lpar) squash(pp,1,exp,-2,109);
+else if (cat1==lbrack) squash(pp,1,exp,-2,144);
 else if (cat1!=langle) squash(pp,1,int_like,-3,110);
 
 @ @<Cases for |operator_like|@>=
 if (cat1==binop || cat1==unop || cat1==ubinop) {
   if (cat2==binop) break;
-  big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
-  reduce(pp,2,exp,-2,111);
+  big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,exp,-2,111);
 }
 else if (cat1==new_like || cat1==delete_like) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,112);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,112);
 }
 else if (cat1==comma) squash(pp,2,exp,-2,113);
 else if (cat1!=raw_ubin) squash(pp,1,new_exp,0,114);
@@ -2966,11 +3105,11 @@
 if ((cat1==int_like || cat1==cast) && (cat2==comma || cat2==semi))
   squash(pp+1,1,exp,-1,115);
 else if (cat1==int_like) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,116);
+  big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,116);
 }
 else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); make_reserved(pp+1);
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,117);
+  big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,117);
 }
 else if (cat1==comma) {
   big_app2(pp); big_app(' '); reduce(pp,2,typedef_like,0,118);
@@ -2977,8 +3116,7 @@
 }
 else if (cat1==semi) squash(pp,2,decl,-1,119);
 else if (cat1==ubinop && (cat2==ubinop || cat2==cast)) {
-  big_app('{'); big_app1(pp+1); big_app('}'); big_app1(pp+2);
-  reduce(pp+1,2,cat2,0,120);
+  big_app('{'); big_app1_insert(pp+1,'}'); reduce(pp+1,2,cat2,0,120);
 }
 
 @ @<Cases for |delete_like|@>=
@@ -2988,7 +3126,7 @@
   reduce(pp,3,delete_like,0,121);
 }
 else if (cat1==exp) {
-  big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,122);
+  big_app1_insert(pp,' '); reduce(pp,2,exp,-2,122);
 }
 
 @ @<Cases for |question|@>=
@@ -2997,6 +3135,51 @@
   squash(pp,3,binop,-2,123);
 }
 
+@ @<Cases for |alignas_like|@>=
+if (cat1==decl_head) squash(pp,2,attr,-1,126);
+else if (cat1==exp) squash(pp,2,attr,-1,127);
+else if (cat1==cast) squash(pp,2,attr,-1,158);
+
+@ @<Cases for |lbrack|@>=
+if (cat1==lbrack)
+  if (cat2==rbrack && cat3==rbrack) squash(pp,4,exp,-2,147);
+  else squash(pp,2,attr_head,-1,128);
+else squash(pp,1,lpar,-1,129);
+
+@ @<Cases for |attr_head|@>=
+if (cat1==rbrack && cat2==rbrack) squash(pp,3,attr,-1,131);
+else if (cat1==exp) squash(pp,2,attr_head,0,132);
+else if (cat1==using_like && cat2==exp && cat3==colon) {
+  big_app2(pp); big_app(' '); big_app2(pp+2); big_app(' ');
+  reduce(pp,4,attr_head,0,133);
+}
+else if (cat1==comma) squash(pp,2,attr_head,0,145);
+
+@ @<Cases for |attr|@>=
+if (cat1==lbrace || cat1==stmt) {
+  big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,134);
+}
+else if (cat1==tag) {
+  big_app1_insert(pp,' '); reduce(pp,2,tag,-1,135);
+}
+else if (cat1==semi) squash(pp,2,stmt,-2,136);
+else if (cat1==attr) {
+  big_app1_insert(pp,' '); reduce(pp,2,attr,-1,137);
+}
+else if (cat1==decl_head) {
+  big_app1_insert(pp,' '); reduce(pp,2,decl_head,-1,138);
+}
+else if (cat1==typedef_like) {
+  big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,143);
+}
+else if (cat1==function) {
+  big_app1_insert(pp,' '); reduce(pp,2,function,-1,148);
+}
+
+@ @<Cases for |default_like|@>=
+if (cat1==colon) squash(pp,1,case_like,-3,149);
+else squash(pp,1,exp,-2,150);
+
 @ Now here's the |reduce| procedure used in our code for productions.
 
 The `|freeze_text|' macro is used to give official status to a token list.
@@ -3103,19 +3286,23 @@
 }
 
 @ If \.{CWEAVE} is being run in debugging mode, the production numbers and
-current stack categories will be printed out when |tracing| is set to 2;
+current stack categories will be printed out when |tracing| is set to |fully|;
 a sequence of two or more irreducible scraps will be printed out when
-|tracing| is set to 1.
+|tracing| is set to |partly|.
 
+ at d off 0
+ at d partly 1
+ at d fully 2
+
 @<Private...@>=
-static int tracing; /* can be used to show parsing details */
+static int tracing=off; /* can be used to show parsing details */
 
 @ @<Print a snapsh...@>=
 { scrap_pointer k_l; /* pointer into |scrap_info| */
-  if (tracing==2) {
+  if (tracing==fully) {
     printf("\n%d:",n);
     for (k_l=scrap_base; k_l<=lo_ptr; k_l++) {
-      if (k_l==pp) putxchar('*'); else putxchar(' ');
+      if (k_l==pp) putchar('*'); else putchar(' ');
       if (k_l->mathness %4 ==  yes_math) putchar('+');
       else if (k_l->mathness %4 ==  no_math) putchar('-');
       print_cat(k_l->cat);
@@ -3122,7 +3309,7 @@
       if (k_l->mathness /4 ==  yes_math) putchar('+');
       else if (k_l->mathness /4 ==  no_math) putchar('-');
     }
-    if (hi_ptr<=scrap_ptr) fputs("...",stdout); /* indicate that more is coming */
+    if (hi_ptr<=scrap_ptr) printf("..."); /* indicate that more is coming */
   }
 }
 
@@ -3143,8 +3330,8 @@
 static text_pointer
 translate(void) /* converts a sequence of scraps */
 {
-  scrap_pointer i, /* index into |cat| */
-  j; /* runs through final scraps */
+  scrap_pointer i; /* index into |cat| */
+  scrap_pointer j; /* runs through final scraps */
   pp=scrap_base; lo_ptr=pp-1; hi_ptr=pp;
   @<If tracing, print an indication of where we are@>@;
   @<Reduce the scraps...@>@;
@@ -3171,17 +3358,17 @@
 }
 
 @ @<If semi-tracing, show the irreducible scraps@>=
-if (lo_ptr>scrap_base && tracing==1) {
+if (lo_ptr>scrap_base && tracing==partly) {
   printf("\nIrreducible scrap sequence in section %d:",section_count);
 @.Irreducible scrap sequence...@>
   mark_harmless;
   for (j=scrap_base; j<=lo_ptr; j++) {
-    printf(" "); print_cat(j->cat);
+    putchar(' '); print_cat(j->cat);
   }
 }
 
 @ @<If tracing,...@>=
-if (tracing==2) {
+if (tracing==fully) {
   printf("\nTracing after l. %d:\n",cur_line); mark_harmless;
 @.Tracing after...@>
   if (loc>buffer+50) {
@@ -3208,8 +3395,8 @@
 
 @c
 static void
-C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl at t\2\2@>)
+C_parse( /* creates scraps from \CEE/ tokens */
+  eight_bits spec_ctrl)
 {
   int count; /* characters remaining before string break */
   while (next_control<format_code || next_control==spec_ctrl) {
@@ -3236,7 +3423,7 @@
 switch (next_control) {
   case section_name:
     app(section_flag+(int)(cur_section-name_dir));
-    app_scrap(section_scrap,maybe_math);
+    app_scrap(section_scrap,maybe_math);@+
     app_scrap(exp,yes_math);@+break;
   case string: case constant: case verbatim:
     @<Append a string or constant@>@;@+break;
@@ -3271,8 +3458,10 @@
 @.\\\#@>
   case ignore: case xref_roman: case xref_wildcard:
   case xref_typewriter: case noop:@+break;
-  case '(': case '[': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
-  case ')': case ']': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+  case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+  case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+  case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+  case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
   case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
 @.\\\{@>@q}@>
   case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
@@ -3320,7 +3509,7 @@
 standard ones. They are converted to \TEX/ control sequences so that it is
 possible to keep \.{CWEAVE} from outputting unusual |char| codes.
 
-@<Cases involving nonstandard...@>=
+@<Cases involving nonstandard...@>=@t\1\quad@>
 case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
 @.\\I@>
 case lt_eq: app_str("\\Z");@+app_scrap(binop,yes_math);@+break;
@@ -3447,8 +3636,8 @@
 
 @ @c
 static void
-app_cur_id(@t\1\1@>
-boolean scrapping at t\2\2@>) /* are we making this into a scrap? */
+app_cur_id(
+boolean scrapping) /* are we making this into a scrap? */
 {
   name_pointer p=id_lookup(id_first,id_loc,normal);
   if (p->ilk<=custom) { /* not a reserved word */
@@ -3475,8 +3664,8 @@
 C_translate(void)
 {
   text_pointer p; /* points to the translation */
-  scrap_pointer save_base; /* holds original value of |scrap_base| */
-  save_base=scrap_base; scrap_base=scrap_ptr+1;
+  scrap_pointer save_base=scrap_base; /* holds original value of |scrap_base| */
+  scrap_base=scrap_ptr+1;
   C_parse(section_name); /* get the scraps together */
   if (next_control!='|') err_print("! Missing '|' after C text");
 @.Missing '|'...@>
@@ -3493,8 +3682,7 @@
 until |next_control>=format_code|. Thus, it takes care of embedded comments.
 
 The token list created from within `\pb' brackets is output as an argument
-to \.{\\PB}, if the user has invoked \.{CWEAVE} with the \.{+e} flag.
-Although \.{cwebmac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}.  Although \.{cwebmac} ignores \.{\\PB}, other macro packages
 might use it to localize the special meaning of the macros that mark up
 program text.
 
@@ -3615,8 +3803,8 @@
 
 @ @c
 static void
-push_level(@t\1\1@> /* suspends the current level */
-text_pointer p at t\2\2@>)
+push_level( /* suspends the current level */
+text_pointer p)
 {
   if (stack_ptr==stack_end) overflow("stack");
   if (stack_ptr>stack) { /* save current state */
@@ -3701,12 +3889,11 @@
 static void
 output_C(void) /* outputs the current token list */
 {
-  token_pointer save_tok_ptr;
-  text_pointer save_text_ptr;
-  sixteen_bits save_next_control; /* values to be restored */
+  token_pointer save_tok_ptr=tok_ptr;
+  text_pointer save_text_ptr=text_ptr;
+  sixteen_bits save_next_control=next_control; /* values to be restored */
   text_pointer p; /* translation of the \CEE/ text */
-  save_tok_ptr=tok_ptr; save_text_ptr=text_ptr;
-  save_next_control=next_control; next_control=ignore; p=C_translate();
+  next_control=ignore; p=C_translate();
   app(inner_tok_flag+(int)(p-tok_start));
   if (make_pb) {
     out_str("\\PB{"); make_output(); out('}');
@@ -3724,8 +3911,8 @@
 static void
 make_output(void) /* outputs the equivalents of tokens */
 {
-  eight_bits a=0, /* current output byte */
-  b; /* next output byte */
+  eight_bits a=0; /* current output byte */
+  eight_bits b; /* next output byte */
   int c; /* count of |indent| and |outdent| tokens */
   char scratch[longest_name+1]; /* scratch area for section names */
   char *k, *k_limit; /* indices into |scratch| */
@@ -3735,6 +3922,7 @@
   char *save_loc, *save_limit; /* |loc| and |limit| to be restored */
   name_pointer cur_section_name; /* name of section being output */
   boolean save_mode; /* value of |cur_mode| before a sequence of breaks */
+  boolean dindent_pending=false; /* should a |dindent| be output? */
   app(end_translation); /* append a sentinel */
   freeze_text; push_level(text_ptr-1);
   while (true) {
@@ -3751,11 +3939,17 @@
           a=get_output();
           if (a==inserted) continue;
           if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
-          if (a==indent) c++; else if (a==outdent) c--;
-          else if (a==opt) a=get_output();
+          if (a==indent) c++;
+          else if (a==outdent) c--;
+            else if (a==opt) a=get_output();
         }
         @<Output saved |indent| or |outdent| tokens@>@;
         goto reswitch;
+      case dindent: a=get_output();
+        if (a!=big_force) {
+          out_str("\\1\\1"); goto reswitch;
+        }
+        else dindent_pending=true; /* fall through */
       case indent: case outdent: case opt: case backup: case break_space:
       case force: case big_force: case preproc_line: @<Output a control,
         look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
@@ -3779,7 +3973,8 @@
     for (p=cur_name->byte_start;p<(cur_name+1)->byte_start;p++)
       out(*p=='_'? 'x': *p=='$'? 'X': *p);
     break;
-  } else if (is_tiny(cur_name)) out('|')@;
+  }
+  else if (is_tiny(cur_name)) out('|')@;
 @.\\|@>
   else { delim='.';
     for (p=cur_name->byte_start;p<(cur_name+1)->byte_start;p++)
@@ -3790,10 +3985,12 @@
   }
 @.\\\\@>
 @.\\.@>
-}@+else if (cur_name->ilk==alfop) {
+}
+else if (cur_name->ilk==alfop) {
   out('X');
   goto custom_out;
-}@+else out('&'); /* |a==res_word| */
+}
+else out('&'); /* |a==res_word| */
 @.\\\&@>
 if (is_tiny(cur_name)) {
   if (isxalpha((cur_name->byte_start)[0]))
@@ -3820,7 +4017,7 @@
       else out_str("{-1}"); /* |force_lines| encourages more \.{@@\v} breaks */
     }
   } else if (a==opt) b=get_output(); /* ignore digit following |opt| */
-  }
+}
 else @<Look ahead for strongest line break, |goto reswitch|@>
 
 @ If several of the tokens |break_space|, |force|, |big_force| occur in a
@@ -3830,7 +4027,10 @@
 is suppressed (i.e., a line break that follows `\.{\\Y\\B}').
 
 @<Look ahead for st...@>= {
-  b=a; save_mode=cur_mode; c=0;
+  b=a; save_mode=cur_mode;
+  if (dindent_pending) {
+    c=2; dindent_pending=false;
+  } else c=0;
   while (true) {
     a=get_output();
     if (a==inserted) continue;
@@ -3908,9 +4108,9 @@
   if (b=='@@') @<Skip next character, give error if not `\.{@@}'@>@;
   if (an_output)
     switch (b) {
- case  ' ':case '\\':case '#':case '%':case '$':case '^':
- case '{': case '}': case '~': case '&': case '_':
-    out('\\'); /* falls through */
+    case ' ': case '\\': case '#': case '%': case '$': case '^':
+    case '{': case '}': case '~': case '&': case '_':
+      out('\\'); /* falls through */
 @.\\\ @>
 @.\\\\@>
 @.\\\#@>
@@ -3922,15 +4122,16 @@
 @.\\\~@>
 @.\\\&@>
 @.\\\_@>
- default: out(b);
+    default: out(b);
     }
-  else { if (b!='|') out(b)@;
-  else {
-    @<Copy the \CEE/ text into the |buffer| array@>@;
-    save_loc=loc; save_limit=limit; loc=limit+2; limit=j+1;
-    *limit='|'; output_C();
-    loc=save_loc; limit=save_limit;
-  } }
+  else
+    if (b!='|') out(b)@;
+    else {
+      @<Copy the \CEE/ text into the |buffer| array@>@;
+      save_loc=loc; save_limit=limit; loc=limit+2; limit=j+1;
+      *limit='|'; output_C();
+      loc=save_loc; limit=save_limit;
+    }
 }
 
 @ @<Skip next char...@>=
@@ -4055,14 +4256,13 @@
   if (show_progress)
   printf("*%d",section_count); update_terminal; /* print a progress report */
 }
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
 
 @ In the \TEX/ part of a section, we simply copy the source text, except that
 index entries are not copied and \CEE/ text within \pb\ is translated.
 
 @<Translate the \T...@>= do {
-  next_control=copy_TeX();
-  switch (next_control) {
+  switch (next_control=copy_TeX()) {
     case '|': init_stack; output_C(); break;
     case '@@': out('@@'); break;
     case TeX_string: case noop:
@@ -4105,8 +4305,8 @@
 
 @c
 static void
-finish_C(@t\1\1@> /* finishes a definition or a \CEE/ part */
-  boolean visible at t\2\2@>) /* nonzero if we should produce \TeX\ output */
+finish_C( /* finishes a definition or a \CEE/ part */
+  boolean visible) /* |true| if we should produce \TeX\ output */
 {
   text_pointer p; /* translation of the scraps */
   if (visible) {
@@ -4114,7 +4314,7 @@
     p=translate();
 @.\\B@>
     app(tok_flag+(int)(p-tok_start)); make_output(); /* output the list */
-    if (out_ptr>out_buf+1) {
+    if (out_ptr>out_buf+1)
       if (*(out_ptr-1)=='\\') {
 @.\\6@>
 @.\\7@>
@@ -4122,7 +4322,6 @@
         if (*out_ptr=='6') out_ptr-=2;
         else if (*out_ptr=='7') *out_ptr='Y';
       }
-    }
     out_str("\\par"); finish_line();
   }
   if (text_ptr>max_text_ptr) max_text_ptr=text_ptr;
@@ -4145,22 +4344,30 @@
 @<Start a macro...@>= {
   if (save_line!=out_line || save_place!=out_ptr || space_checked) app(backup);
   if(!space_checked){emit_space_if_needed;save_position;}
-  app_str("\\D"); /* this will produce `\&{define }' */
+  app_str("\\D"); /* this will produce `\#\&{define }' */
 @.\\D@>
   if ((next_control=get_next())!=identifier)
     err_print("! Improper macro definition");
 @.Improper macro definition@>
   else {
-    app('$'); app_cur_id(false);
-    if (*loc=='(')
+    app_cur_id(false);
+    if (*loc=='(') {
+      app('$');
   reswitch: switch (next_control=get_next()) {
       case '(': case ',': app(next_control); goto reswitch;
       case identifier: app_cur_id(false); goto reswitch;
       case ')': app(next_control); next_control=get_next(); break;
+      case dot_dot_dot: app_str("\\,\\ldots\\,"); @.\\,@> @.\\ldots@>
+        app_scrap(raw_int,no_math);
+        if ((next_control=get_next())==')') {
+          app(next_control); next_control=get_next(); break;
+        } /* otherwise fall through */
       default: err_print("! Improper macro definition"); break;
+      }
+      app('$');
     }
     else next_control=get_next();
-    app_str("$ "); app(break_space);
+    app(break_space);
     app_scrap(dead,no_math); /* scrap won't take part in the parsing */
   }
 }
@@ -4174,7 +4381,6 @@
   next_control=get_next();
   if (next_control==identifier) {
     app(id_flag+(int)(id_lookup(id_first, id_loc,normal)-name_dir));
-    app(' ');
     app(break_space); /* this is syntactically separate from what follows */
     next_control=get_next();
     if (next_control==identifier) {
@@ -4220,7 +4426,7 @@
 if (next_control!='=' && next_control!=eq_eq)
   err_print("! You need an = sign after the section name");
 @.You need an = sign...@>
-  else next_control=get_next();
+else next_control=get_next();
 if (out_ptr>out_buf+1 && *out_ptr=='Y' && *(out_ptr-1)=='\\') app(backup);
     /* the section name will be flush left */
 @.\\Y@>
@@ -4277,8 +4483,8 @@
 
 @c
 static void
-footnote(@t\1\1@> /* outputs section cross-references */
-sixteen_bits flag at t\2\2@>)
+footnote( /* outputs section cross-references */
+sixteen_bits flag)
 {
   xref_pointer q; /* cross-reference pointer variable */
   if (cur_xref->num<=flag) return;
@@ -4519,8 +4725,8 @@
 
 @c
 static void
-unbucket(@t\1\1@> /* empties buckets having depth |d| */
-eight_bits d at t\2\2@>)
+unbucket( /* empties buckets having depth |d| */
+eight_bits d)
 {
   int c; /* index into |bucket|; cannot be a simple |char| because of sign
     comparison below */
@@ -4576,14 +4782,15 @@
 
 @ @<Output the name...@>=
 switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char *j;
+  case normal: case func_template:
+    if (is_tiny(cur_name)) out_str("\\|");
+    else {@+char *j;
       for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
         if (xislower(*j)) goto lowcase;
       out_str("\\."); break;
 lowcase: out_str("\\\\");
     }
-  break;
+    break;
 @.\\|@>
 @.\\.@>
 @.\\\\@>
@@ -4621,6 +4828,7 @@
 @ List inversion is best thought of as popping elements off one stack and
 pushing them onto another. In this case |cur_xref| will be the head of
 the stack that we push things onto.
+
 @<Private...@>=
 static xref_pointer next_xref, this_xref;
   /* pointer variables for rearranging a list */
@@ -4638,8 +4846,8 @@
 
 @c
 static void
-section_print(@t\1\1@> /* print all section names in subtree |p| */
-name_pointer p at t\2\2@>)
+section_print( /* print all section names in subtree |p| */
+name_pointer p)
 {
   if (p) {
     section_print(p->llink); out_str("\\I");

Modified: trunk/Build/source/texk/web2c/cwebdir/cweb.1
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweb.1	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweb.1	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,4 +1,4 @@
-.TH CWEB 1 2018-Dec-16
+.TH CWEB 1 2021-Mar-24
 .
 .SH NAME
 ctangle, cweave \- translate CWEB to C and/or TeX
@@ -9,7 +9,7 @@
 [
 .B \-bhp
 ] [
-.B +s
+.B +ks
 ] webfile[.w] [{changefile[.ch]|-} [outputfile[.c]]]
 .br
 .B cweave
@@ -16,7 +16,7 @@
 [
 .B \-befhpx
 ] [
-.B +s
+.B +st
 ] webfile[.w] [{changefile[.ch]|-} [outputfile[.tex]]]
 .ad
 .
@@ -80,7 +80,13 @@
 .B +s
 option prints statistics about memory usage at the end of a run.
 .PP
-There are three other options applicable to
+There is one other option applicable to
+.I ctangle
+only:
+.B +k
+means keep '-separators in numeric literals in the C/C++\ output.
+.PP
+There are four other options applicable to
 .I cweave
 only:
 .B \-f
@@ -89,13 +95,15 @@
 inhibits the enclosure of C\ material formatted by
 .I cweave
 in brackets
-\ePB{...}.
-Such brackets are normally inserted so that special hooks
+\ePB{...};
+such brackets are normally inserted so that special hooks
 can be used by
 .I cweb-latex
 and similar programs.
 .B \-x
-means omit the index and table of contents.
+means omit the index, the names of the sections, and the table of contents.
+.B +t
+means treat 'typename' in templates like 'typedef'.
 .
 .SH FILES
 The location of the files mentioned below varies from system to system.

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,7 +1,7 @@
 % standard macros for CWEB listings (in addition to plain.tex)
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
 \ifx\renewenvironment\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CWEB4.2}
+\xdef\fmtversion{\fmtversion+CWEB4.3}
 \chardef\cwebversion=4 \chardef\cwebrevision=1
 \newif\ifpdf
 \ifx\pdf+\pdftrue\fi
@@ -31,6 +31,7 @@
 \def\TEX/{\TeX}
 \def\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
 \def\Cee{\CEE/} % for backward compatibility
+\def\Cpp{\CPLUSPLUS/} % for backward compatibility
 \def\9#1{}
  % with this definition of \9 you can say @:sort key}{TeX code@>
  % to alphabetize an index entry by the sort key but format with the TeX code
@@ -124,6 +125,7 @@
 \newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
 \let\yskip=\smallskip
 \def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\note#1#2.{\Y\noindent{\hangindent2em%
     \baselineskip10pt\eightrm#1~\ifacro{\pdfnote#2.}\else#2\fi.\par}}
 
@@ -287,7 +289,7 @@
     \else \special{pdf: dest (\romannumeral\secstar)
       [ @thispage /FitH @ypos ]}\fi}}\fi}
 \let\startsection=\stsec
-\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
 \def\A{\note{See also section}} % xref for doubly defined section name
 \def\As{\note{See also sections}} % xref for multiply defined section name
 \def\B{\rightskip=0pt plus 100pt minus 10pt % go into C mode
@@ -300,7 +302,7 @@
 \let\SHC\C % "// short comments" treated like "/* ordinary comments */"
 %\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
 %\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
-\def\D{\defin{\#define}} % macro definition
+\def\D{\defin{{\rm\#}define}} % macro definition
 \let\E=\equiv % equivalence sign
 \def\ET{ and~} % conjunction between two section numbers
 \def\ETs{, and~} % conjunction between the last two of several section numbers
@@ -341,12 +343,15 @@
 \def\Qs{\note{This code is cited in sections}} % xref for mentions of a section
 \let\R=\lnot % logical not
 % \S is section sign
+\def\digitseparator{\,} % a bit of extra space
 \def\T#1{\leavevmode % octal, hex or decimal constant
   \hbox{$\def\?{\kern.2em}%
+    \let\ \digitseparator%
 %    \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant % versions < 3.67
     \def\$##1{\egroup_{\rm##1}\bgroup}% suffix to constant % in version 3.67
     \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
-    \let\~=\oct \let\^=\hex {#1}$}}
+    \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+    \let\~=\oct \let\^=\hex \let\\=\bin {#1}$}}
 \def\U{\note{This code is used in section}} % xref for use of a section
 \def\Us{\note{This code is used in sections}} % xref for uses of a section
 \let\V=\lor % logical or
@@ -365,8 +370,12 @@
 
 %\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
 %\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
 \def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
         \hbox{\strut\kern2pt\.{#1}\kern2pt}}
       \hrule}\vrule\kern2pt}} % verbatim string
@@ -482,14 +491,13 @@
     \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
       {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
       \pdfoutline goto num \the\toksA \expandafter{\the\toksE}}
-  \else\ifpdf
-    \special{pdf: outline -1 << /Title (\outsecname)
+  \else \special{pdf: outline -1 << /Title (\outsecname)
       /Dest [ @thispage /FitH @ypos ] >>}
     \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
       {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
       \special{pdf: outline 0 << /Title (\the\toksE)
         /A << /S /GoTo /D (\romannumeral\the\toksA) >> >>}}
-  \fi\fi\fi
+  \fi\fi
   \readsections}
 \def\makebookmarks{\let\ZZ=\writebookmarkline \readcontents\relax}
 \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
@@ -536,9 +544,6 @@
 \def\printtwodigits{\advance\twodigits100
   \expandafter\gobbleone\number\twodigits
   \advance\twodigits-100 }
-\def\TeX{{\ifmmode\it\fi
-   \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\datethis{\def\startsection{\leftline{\sc\today\ at \hours}\bigskip
   \let\startsection=\stsec\stsec}}
   % say `\datethis' in limbo, to get your listing timestamped before section 1

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -93,17 +93,17 @@
 @z
 
 @x
-\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.2)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.3)}
 @y
 \def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}}
-\def\runninghead{{\tentt CWEB} USER MANUAL (Version 4.2 [\TeX~Live])}
+\def\runninghead{{\tentt CWEB} USER MANUAL (Version 4.3 [\TeX~Live])}
 @z
 
 @x
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)}
 @y
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)%
-\footnote*{This document describes the extended \.{CWEB} (Version 4.2 [\TeX~Live]).}}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)%
+\footnote*{This document describes the extended \.{CWEB} (Version 4.3 [\TeX~Live]).}}
 @z
 
 @x
@@ -159,35 +159,38 @@
 @z
 
 @x
-output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)
+options are currently implemented:
+
+\yskip
+\def\option#1 {\textindent{\.#1}\hangindent2\parindent}
 @y
-output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)%
+\def\option#1 {\textindent{\.#1}\hangindent2\parindent}%
+options are currently implemented:%
 \cwebfootnote{This extended version of \.{CWEB} adds the following options
 to the list:
 \hfil\smallskip
+\option c Overwrite output files with temporary output only if changes occur.
+(On by default.)
+\hfil\vskip\normallineskip
 \option d Set the debugging variable \\{kpathsea\_debug} to the numeric
 value $N\in[0,127]$ of this option.  See section~93 % FIXME
 of \pdfURL{appendix~D}{common-changes.pdf} for details.
 \hfil\vskip\normallineskip
-\option i Indent parameters in function declarations.  This causes the
-formal parameter declarations in function heads to be indented.  (On by
-default; \.{-i} typesets declarations flush left; some people think this
-to be more logical than indenting them) (Has no effect on \.{CTANGLE}.)
+\option i Indent parameters in function declarations.  (On by default;
+\.{-i} typesets declarations flush left; some people think this to be
+more logical than indenting them.) (Has no effect on \.{CTANGLE}.)
 \hfil\vskip\normallineskip
 \option l This option takes the string of characters to its right as its
 argument to switch between different user languages and macro packages.
 For example, if you call \.{CWEAVE} with the `\.{+ld}' (or `\.{-ld}') option,
 the German \.{CWEB} macros \.{dcwebmac.tex} will be loaded in the first line
-of output instead of the English ones. To avoid conflicts, the Danish
-macros could be called \.{dkcwebmac.tex} and would be included by `\.{+ldk}'.
-(Off by default) (Has no effect on \.{CTANGLE}.)
+of output instead of the English ones. (Off by default.) (Has no effect on
+\.{CTANGLE}.)
 \hfil\vskip\normallineskip
 \option o Separate declarations and the first statement in a function block.
-\.{CWEAVE} automatically inserts a bit of extra space.  (On by default.)
-(Has no effect on \.{CTANGLE}.)
-\hfil\vskip\normallineskip
-\option t Overwrite output files with temporary output only if changes occur.
-(On by default.)}
+(On by default.) (Has no effect on\break\hbox{}\qquad\.{CTANGLE}.)}
+
+\yskip
 @z
 
 @x
@@ -311,9 +314,9 @@
 @z
 
 @x
-  \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
 @y
-  \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,5 +1,4 @@
 % This file generates the user manual; TeX it, don't read it!
-% update 14 Nov 2016 by DEK: corrected obsolete remarks re debugging info
 
 \def\tangref{3} % where the main explanation of CTANGLing is given
 \input cwebmac
@@ -36,7 +35,7 @@
 
 \def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill}
 \def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno}
-\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.2)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.3)}
 
 % This verbatim mode assumes that ! marks are !! in the text being copied.
 \def\verbatim{\begingroup
@@ -50,7 +49,7 @@
 \null\vfill
 \centerline{\titlefont The {\ttitlefont CWEB} System of
     Structured Documentation}
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)}
 \vskip 24pt
 \centerline{\authorfont Donald E. Knuth and Silvio Levy}
 \vfill
@@ -394,9 +393,9 @@
 \CEE/ editing within \TEX/ text, if you place `\.|' marks before and
 after the \CEE/ material. For example, suppose you want to say something
 like this:
-$$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
-the assignment $\\{pa}\K{\AND}\|a[\T{0}]$ makes \\{pa}
-point to the zeroth element of \|a.}$$
+$$\hbox{If \PB{\\{pa}} is declared as `\PB{\&{int} ${}{*}\\{pa}$}',
+the assignment \PB{$\\{pa}\K{\AND}\|a[\T{0}]$} makes \PB{\\{pa}}
+point to the zeroth element of \PB{\|a}.}$$
 The \TEX/ text would look like this in your \.{CWEB} file:
 $$\lpile{\.{If |pa| is declared as `|int *pa|', the assignment}\cr
 \.{|pa=\&a[0]| makes |pa| point to the zeroth element of |a|.}\cr}$$
@@ -477,14 +476,17 @@
 or \.{0x}.  In \.{CWEB} it seems reasonable to let each convention hold
 in its respective realm; so in \CEE/ text you get $40_8$ by typing
 `\.{040}', which \.{CTANGLE} faithfully copies into the \CEE/ file (for
-the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40}$.
+the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40/}$.
 Similarly, \.{CWEAVE} prints the hexadecimal \CEE/ constant `\.{0x20}'
-as \T{\^20}. The use of italic font for octal digits and typewriter font
+as \T{\^20/}. The use of italic font for octal digits and typewriter font
 for hexadecimal digits makes the meaning of such constants clearer in
-a document. For consistency, then, you
-should type `\.{|040|}'  or `\.{|0x20|}'
-in the \TEX/ part of the section.
+a document. For consistency, then, you should type `\.{|040|}'  or
+`\.{|0x20|}' in the \TEX/ part of the section.
 
+And if you type a binary constant like `\.{0b00101010}', \.{CWEAVE} prints
+it as $\T{\\00101010/}$. In all numeric literals you may add \.' separators
+for improved readability.
+
 \section Control codes.
 A \.{CWEB} {\sl control code\/}
 is a two-character combination of which the first is `\.@'.
@@ -761,11 +763,11 @@
 them by standard ASCII alphanumeric characters or
 \.{\_}, in order to generate legal \CEE/ code.  It does this by means
 of a transliteration table, which by default associates the string
-\.{Xab} to the character with ASCII code \T{\^}$ab$ (where $a$ and $b$ are
+\.{Xab} to the character with ASCII code \T{\^/}$ab$ (where $a$ and $b$ are
 hexadecimal digits, and $a\ge8$).  By placing the
 construction \.{@l\ ab\ newstring} in limbo, you are telling
 \.{CTANGLE} to replace this character by \.{newstring} instead.
-For example, the ISO Latin-1 code for the letter `\"u' is \T{\^FC}
+For example, the ISO Latin-1 code for the letter `\"u' is \T{\^FC/}
 (or \.{'\char`\\374'}),
 and \.{CTANGLE} will normally change this code to the
 three-character sequence \.{XFC} if it
@@ -1042,7 +1044,7 @@
 
 \option e Enclose \CEE/ material formatted by \.{CWEAVE} in
 brackets \.{\\PB\{...\}}, so that special hooks can be used.
-(On by default; has no effect on \.{CTANGLE}.)
+(On by default.) (Has no effect on \.{CTANGLE}.)
 
 \option f Force line breaks after each \CEE/ statement formatted
 by \.{CWEAVE}. (On by default; \.{-f} saves paper but looks less \CEE/-like
@@ -1051,14 +1053,19 @@
 \option h Print a happy message at the conclusion of a successful
 run. (On by default.)
 
+\option k Keep single quotes (\.') in numeric literals in the
+\CEE//\CPLUSPLUS/ output. (Off by default.) (\.{CTANGLE} only.)
+
 \option p Give progress reports as the program runs. (On by default.)
 
 \option s Show statistics about memory usage after the program
 runs to completion. (Off by default.)
-If you
-have large \.{CWEB} files or sections, you may need to see
-how close you come to exceeding the capacity of \.{CTANGLE} and/or \.{CWEAVE}.
+If you have large \.{CWEB} files or sections, you may need to see how close
+you come to exceeding the capacity of \.{CTANGLE} and/or \.{CWEAVE}.
 
+\option t Treat \&{typename} in a template like \&{typedef}.
+(Off by default.) (Has no effect on \.{CTANGLE}.)
+
 \option x Include indexes and a table of contents in the \TEX/ file
 output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)
 
@@ -1155,7 +1162,7 @@
 Alternatively, thanks to H\`an Th\^e\kern-.3em\raise.3ex\hbox{\'{}} Th\`anh
 and Andreas Scherer, you can generate \.{cob.pdf} in one step by simply
 saying `\.{pdftex}~\.{cob}'.
-A third way to create PDF output from \.{CWEB} input is to say
+And a third way to create PDF output from \.{CWEB} input is to say
 `\.{xetex}~\.{cob}'.
 
 A more elaborate system called \.{CTWILL}, which extends the usual cross
@@ -1211,10 +1218,7 @@
 the change file is exhausted. This procedure is called only when
 |changing| is |true|; hence error messages will be reported correctly.
 
-@<Predecl...@>=
-static void prime_the_change_buffer(void);@/
-
-@ @c
+ at c
 static void
 prime_the_change_buffer(void)
 {
@@ -1224,6 +1228,8 @@
   @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>@;
 }
 
+@ @<Predecl...@>=@+static void prime_the_change_buffer(void);
+
 @ While looking for a line that begins with \.{@@x} in the change file, we
 allow lines that begin with \.{@@}, as long as they don't begin with \.{@@y},
 \.{@@z}, or \.{@@i} (which would probably mean that the change file is fouled up).
@@ -1268,13 +1274,13 @@
 
 Here's the portion of the \CEE/ code generated by \.{CTANGLE} that corresponds
 to the source on the preceding page.  Notice that sections~29, 30 and~31
-have been tangled into section~28.
+have been tangled into section~27.
 
 \vskip6pt
 \begingroup \def\tt{\eighttt} \baselineskip9pt
 \verbatim
-/*:24*//*28:*/
-#line 234 "common.w"
+/*:23*//*27:*/
+#line 227 "common.w"
 
 static void
 prime_the_change_buffer(void)
@@ -1281,7 +1287,7 @@
 {
 change_limit= change_buffer;
 /*29:*/
-#line 248 "common.w"
+#line 243 "common.w"
 
 while(true){
 change_line++;
@@ -1298,10 +1304,10 @@
 }
 
 /*:29*/
-#line 239 "common.w"
+#line 232 "common.w"
 
 /*30:*/
-#line 265 "common.w"
+#line 260 "common.w"
 
 do{
 change_line++;
@@ -1313,10 +1319,10 @@
 }while(limit==buffer);
 
 /*:30*/
-#line 240 "common.w"
+#line 233 "common.w"
 
 /*31:*/
-#line 275 "common.w"
+#line 270 "common.w"
 
 {
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -1324,11 +1330,11 @@
 }
 
 /*:31*/
-#line 241 "common.w"
+#line 234 "common.w"
 
 }
 
-/*:28*//*33:*/
+/*:27*//*32:*/
 !endgroup
 \endgroup
 \vfill\eject
@@ -1349,11 +1355,7 @@
 \PB{\\{changing}} is \PB{\\{true}}; hence error messages will be reported
 correctly.
 
-\Y\B\4\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\6
-\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
-\fi
-
-\M{28}\B\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\1\1\2\2\6
+\Y\B\1\1\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\2\2\6
 ${}\{{}$\1\6
 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
 change file ends }\6
@@ -1365,6 +1367,10 @@
 \4${}\}{}$\2\par
 \fi
 
+\M{28}\B\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\5
+\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
+\fi
+
 \M{29}While looking for a line that begins with \.{@x} in the change file, we
 allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
 \.{@z}, or \.{@i} (which would probably mean that the change file is fouled
@@ -1392,7 +1398,7 @@
 \\{err\_print}(\.{"!!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
 \4${}\}{}$\2\6
 \4${}\}{}$\2\par
-\U28.\fi
+\U27.\fi
 
 \M{30}Here we are looking at lines following the \.{@x}.
 
@@ -1408,7 +1414,7 @@
 \4${}\}{}$\2\6
 \4${}\}{}$\2\5
 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U28.\fi
+\U27.\fi
 !endgroup
 \endgroup
 \vfil\eject
@@ -1427,11 +1433,7 @@
 \PB{\\{changing}} is \PB{\\{true}}; hence error messages will be reported
 correctly.
 
-\Y\B\4\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\6
-\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
-\fi
-
-\M{28}\B\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\1\1\2\2\6
+\Y\B\1\1\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\2\2\6
 ${}\{{}$\1\6
 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
 change file ends }\6
@@ -1443,6 +1445,10 @@
 \4${}\}{}$\2\par
 \fi
 
+\M{28}\B\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\5
+\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
+\fi
+
 \M{29}While looking for a line that begins with \.{@x} in the change file, we
 allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
 \.{@z}, or \.{@i} (which would probably mean that the change file is fouled
@@ -1470,7 +1476,7 @@
 \\{err\_print}(\.{"!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
 \4${}\}{}$\2\6
 \4${}\}{}$\2\par
-\U28.\fi
+\U27.\fi
 
 \M{30}Here we are looking at lines following the \.{@x}.
 
@@ -1486,7 +1492,7 @@
 \4${}\}{}$\2\6
 \4${}\}{}$\2\5
 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U28.\fi
+\U27.\fi
 
 \M{31}\B\X31:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
 and \PB{\\{change\_limit}}\X${}\E{}$\6
@@ -1496,7 +1502,7 @@
 ${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39(\&{size\_t})(\\{limit}-%
 \\{buffer}+\T{1}));{}$\6
 \4${}\}{}$\2\par
-\Us28\ET33.\fi
+\Us27\ET32.\fi
 \vfil\eject\titletrue
 \rightskip=0pt % get out of C mode (cf. \B)
 \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
@@ -1591,7 +1597,7 @@
   \.{ { }\\titlefalse \% include headline on the contents page}\cr
   \.{ { }\\def\\rheader\{\\mainfont The \{\\tt CWEAVE\}{ }processor\\hfil\}}\cr
   \.{ { }\\centerline\{\\titlefont The \{\\ttitlefont CWEAVE\}{ }processor\}}\cr
-  \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
 Redefining \.{\\rheader}, which is the headline for right-hand pages,
 suffices in this case to put the desired information at the top of the
 contents page.

Added: trunk/Build/source/texk/web2c/cwebdir/iso_types.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/iso_types.w	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/iso_types.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,95 @@
+ at q This file defines type names introduced in modern dialects @>
+ at q of C and C++ as special entities for TeX formatting @>
+
+ at q C99 and C11 underscore keywords @>
+ at q http://en.cppreference.com/w/c/keyword @>
+
+ at s _Alignas alignas
+ at s _Alignof alignof
+ at s _Atomic int
+ at s _Bool bool
+ at s _Complex complex
+ at s _Generic class
+ at s _Imaginary imaginary
+ at s _Noreturn noreturn
+ at s _Static_assert static_assert
+ at s _Thread_local thread_local
+
+ at q C99 and C11 core language atomic types @>
+ at q http://en.cppreference.com/w/c/atomic @>
+
+ at s atomic_bool bool
+ at s atomic_char char
+ at s atomic_schar char
+ at s atomic_uchar char
+ at s atomic_short short
+ at s atomic_ushort short
+ at s atomic_int int
+ at s atomic_uint int
+ at s atomic_long long
+ at s atomic_ulong long
+ at s atomic_llong long
+ at s atomic_ullong long
+ at s atomic_char8_t char8_t
+ at s atomic_char16_t char16_t
+ at s atomic_char32_t char32_t
+ at s atomic_wchar_t wchar_t
+ at s atomic_int_least8_t int
+ at s atomic_uint_least8_t int
+ at s atomic_int_least16_t int
+ at s atomic_uint_least16_t int
+ at s atomic_int_least32_t int
+ at s atomic_uint_least32_t int
+ at s atomic_int_least64_t int
+ at s atomic_uint_least64_t int
+ at s atomic_int_fast8_t int
+ at s atomic_uint_fast8_t int
+ at s atomic_int_fast16_t int
+ at s atomic_uint_fast16_t int
+ at s atomic_int_fast32_t int
+ at s atomic_uint_fast32_t int
+ at s atomic_int_fast64_t int
+ at s atomic_uint_fast64_t int
+ at s atomic_intptr_t int
+ at s atomic_uintptr_t int
+ at s atomic_ptrdiff_t ptrdiff_t
+ at s atomic_size_t size_t
+ at s atomic_intmax_t int
+ at s atomic_uintmax_t int
+
+ at q C99 preprocessor @>
+
+ at s _Pragma pragma
+
+ at q Integral types of C99 and C++, see @>
+ at q http://en.cppreference.com/w/c/types/integer and @>
+ at q http://en.cppreference.com/w/cpp/types/integer @>
+
+ at s int8_t int
+ at s int16_t int
+ at s int32_t int
+ at s int64_t int
+ at s int_fast8_t int
+ at s int_fast16_t int
+ at s int_fast32_t int
+ at s int_fast64_t int
+ at s int_least8_t int
+ at s int_least16_t int
+ at s int_least32_t int
+ at s int_least64_t int
+ at s intmax_t int
+ at s intptr_t int
+ at s uint8_t int
+ at s uint16_t int
+ at s uint32_t int
+ at s uint64_t int
+ at s uint_fast8_t int
+ at s uint_fast16_t int
+ at s uint_fast32_t int
+ at s uint_fast64_t int
+ at s uint_least8_t int
+ at s uint_least16_t int
+ at s uint_least32_t int
+ at s uint_least64_t int
+ at s uintmax_t int
+ at s uintptr_t int


Property changes on: trunk/Build/source/texk/web2c/cwebdir/iso_types.w
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot	2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:43+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -30,15 +30,15 @@
 msgstr ""
 
 #: ctang-texlive.ch:39
-msgid "This is CTANGLE, Version 4.2"
+msgid "This is CTANGLE, Version 4.3"
 msgstr ""
 
 #: ctwill-texlive.ch:39
-msgid "This is CTWILL, Version 4.2"
+msgid "This is CTWILL, Version 4.3"
 msgstr ""
 
 #: cweav-texlive.ch:39
-msgid "This is CWEAVE, Version 4.2"
+msgid "This is CWEAVE, Version 4.3"
 msgstr ""
 
 #: comm-texlive.ch:512

Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot	2021-04-16 12:49:28 UTC (rev 58884)
@@ -523,15 +523,15 @@
 msgstr ""
 
 #: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
 msgstr ""
 
 #: cweav-twill.ch:61
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
 msgstr ""
 
 #: cweav-i18n.ch:17 cweav-twill.ch:42
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
 msgstr ""
 
 #: cweav-i18n.ch:301 cweav-i18n.ch:309

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po	2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:43+0100\n"
-"PO-Revision-Date: 2021-02-06 15:58+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
+"PO-Revision-Date: 2021-04-13 16:46+0200\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: German\n"
 "Language: de\n"
@@ -32,16 +32,16 @@
 msgstr "%s: Benötige ein bis drei Dateiargumente.\n"
 
 #: ctang-texlive.ch:39
-msgid "This is CTANGLE, Version 4.2"
-msgstr "Dies ist CTANGLE, Version 4.2"
+msgid "This is CTANGLE, Version 4.3"
+msgstr "Dies ist CTANGLE, Version 4.3"
 
 #: ctwill-texlive.ch:39
-msgid "This is CTWILL, Version 4.2"
-msgstr "Dies ist CTWILL, Version 4.2"
+msgid "This is CTWILL, Version 4.3"
+msgstr "Dies ist CTWILL, Version 4.3"
 
 #: cweav-texlive.ch:39
-msgid "This is CWEAVE, Version 4.2"
-msgstr "Dies ist CWEAVE, Version 4.2"
+msgid "This is CWEAVE, Version 4.3"
+msgstr "Dies ist CWEAVE, Version 4.3"
 
 #: comm-texlive.ch:512
 #, c-format

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po	2021-04-16 12:49:28 UTC (rev 58884)
@@ -603,16 +603,16 @@
 msgstr "Sortieren:"
 
 #: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CTANGLE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CTANGLE (Version 4.3 [CWEBbin 2021])"
 
 #: cweav-twill.ch:61
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CTWILL (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CTWILL (Version 4.3 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:17 cweav-twill.ch:42
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CWEAVE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CWEAVE (Version 4.3 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:301 cweav-i18n.ch:309
 msgid "buffer"

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po	2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:10+0200\n"
-"PO-Revision-Date: 2021-02-06 15:58+0100\n"
+"POT-Creation-Date: 2021-03-24 12:04+0100\n"
+"PO-Revision-Date: 2021-03-24 12:04+0100\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: German\n"
 "Language: de\n"
@@ -55,6 +55,10 @@
 msgid "+h          print success message on completion"
 msgstr "+h          schreibe die Erfolgsmeldung am Ende"
 
+#: help.h:66
+msgid "+k          keep separators in numeric literals in the output"
+msgstr "+k          konserviere '-Trenner in Zahlen in der Ausgabe"
+
 #: help.h:61 help.h:81 help.h:107
 msgid "+p          print progress report messages"
 msgstr "+p          schreibe die Fortschrittsmeldungen"
@@ -67,13 +71,17 @@
 msgid "+/-v        shortcut for '+bhp'; also '--verbose'"
 msgstr "+/-v        Kurzform für '+bhp'; auch '--verbose'"
 
-#: help.h:64 help.h:90 help.h:117
+#: help.h:64 help.h:85 help.h:112
+msgid "-c          ignore temporary output irrespective of changes"
+msgstr "-c          ignoriere temporäre Ausgabe unabhängig von Änderungen"
+
+#: help.h:66 help.h:93 help.h:121
 msgid "+s          print usage statistics"
 msgstr "+s          melde die Verbrauchsstatistik"
 
-#: help.h:65 help.h:91 help.h:118
-msgid "-t          ignore temporary output irrespective of changes"
-msgstr "-t          ignoriere temporäre Ausgabe unabhängig von Änderungen"
+#: help.h:95 help.h:124
+msgid "+t          treat 'typename' in a template like 'typedef'"
+msgstr "+t          behandle 'typename' in Templates wie 'typedef'"
 
 #: help.h:66 help.h:92 help.h:119
 msgid "--help      display this help and exit"

Modified: trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po	2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:25+0100\n"
-"PO-Revision-Date: 2021-02-06 15:57+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
+"PO-Revision-Date: 2021-04-13 16:47+0200\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: Italian\n"
 "Language: it\n"
@@ -598,16 +598,16 @@
 msgstr "Ordinamento:"
 
 #: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CTANGLE (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CTANGLE (Versione 4.3 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:17
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CWEAVE (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CWEAVE (Versione 4.3 [CWEBbin 2021])"
 
 #: cweav-twill.ch:68
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CTWILL (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CTWILL (Versione 4.3 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:301 cweav-i18n.ch:309
 msgid "buffer"

Modified: trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot	2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:10+0200\n"
+"POT-Creation-Date: 2021-03-24 12:04+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -54,6 +54,10 @@
 msgid "+h          print success message on completion"
 msgstr ""
 
+#: help.h:66
+msgid "+k          keep separators in numeric literals in the output"
+msgstr ""
+
 #: help.h:61 help.h:81 help.h:107
 msgid "+p          print progress report messages"
 msgstr ""
@@ -66,12 +70,16 @@
 msgid "+/-v        shortcut for '+bhp'; also '--verbose'"
 msgstr ""
 
-#: help.h:64 help.h:90 help.h:117
+#: help.h:64 help.h:85 help.h:112
+msgid "-c          ignore temporary output irrespective of changes"
+msgstr ""
+
+#: help.h:66 help.h:93 help.h:121
 msgid "+s          print usage statistics"
 msgstr ""
 
-#: help.h:65 help.h:91 help.h:118
-msgid "-t          ignore temporary output irrespective of changes"
+#: help.h:95 help.h:124
+msgid "+t          treat 'typename' in a template like 'typedef'"
 msgstr ""
 
 #: help.h:66 help.h:92 help.h:119

Modified: trunk/Build/source/texk/web2c/cwebdir/prod-twill.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/prod-twill.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/prod-twill.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,9 +26,8 @@
 production number refers to the notes at the end of this section,
 which deal with various exceptional cases.
 
-We use \\{in}, \\{out}, \\{back} and
-\\{bsp} as shorthands for |indent|, |outdent|, |backup| and
-|break_space|, respectively.
+We use \\{in}, \\{out}, \\{back}, \\{bsp}, and \\{din} as shorthands for
+|indent|, |outdent|, |backup|, |break_space|, and |dindent|, respectively.
 
 \begingroup \lineskip=4pt
 \def\alt #1 #2
@@ -38,9 +37,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip
 \prodno=0 \midcol=2.5in
@@ -58,7 +57,7 @@
 & stmt; \ /$\ast\,$comment$\,*$/\cr
 \+& |exp| \altt|lbrace| |int_like| |decl|
     & |fn_decl| \altt|lbrace| |int_like| |decl|
-        \hfill $F=E^*\,|in|\,|in|$ & \malt {\\{main}()$\{$}
+        \hfill $F=E^*\,\\{din}$ & \malt {\\{main}()$\{$}
            {\\{main}$(\\{ac},\\{av})$ \&{int} \\{ac};} \cr
 \+& |exp| |unop| & |exp| & |x++|\cr
 \+& |exp| \alt |binop| |ubinop| |exp| & |exp| & \malt {|x/y|} {|x+y|} \cr
@@ -65,7 +64,7 @@
 \+& |exp| |comma| |exp| & |exp| \hfill $EC\,|opt|9\,E$& |f(x,y)|\cr
 \+& |exp| \alt {|lpar| |rpar|} |cast| |colon| &
     |exp| \alt {|lpar| |rpar|} |cast| |base| &
-     \malt \&C|()|: {\&C|int i)|:} \cr
+     \malt \&C|()|: {\&C|(int i)|:} \cr
 \+& |exp| |semi| & |stmt| & |x=0;|\cr
 \+& |exp| |colon| & |tag| \hfill $E^*C$ & |found:|\cr
 \+& |exp| |rbrace| & |stmt| |rbrace| & end of \&{enum} list\cr
@@ -118,7 +117,7 @@
      $D=D$\alt $B$ $C$ \unskip$E$ & \malt {\&{int} $f(\&{int}\ x=2)$} |int b:1| \cr
 \+& |decl_head| |cast| & |decl_head| & |int f(int)|\cr
 \+& |decl_head| \altt|int_like| |lbrace| |decl| & |fn_decl|
-                   \altt|int_like| |lbrace| |decl| \hfill $F=D\,|in|\,|in|$
+                   \altt|int_like| |lbrace| |decl| \hfill $F=D\,\\{din}$
                              & |long time () {|\cr
 \+& |decl_head| |semi| & |decl| & |int n;|\cr
 \+& |decl| |decl| & |decl| \hfill $D_1\,|force|\,D_2$ & |int n;double x;|\cr
@@ -161,24 +160,24 @@
 \+& |else_like| |colon| & |else_like| |base| & \&{try} :\cr
 \+& |else_like| |lbrace| & |else_head| |lbrace| & \&{else} $\{$\cr
 \+& |else_like| |stmt| & |stmt| \hfill
-       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
 \+& |else_head| \alt|stmt| |exp|  & |stmt| \hfill
-      $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & |else{x=0;}|\cr
+      $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & $\!\!$|else{x=0;}|\cr
 \+& |if_clause| |lbrace| & |if_head| |lbrace| & |if (x) {|\cr
 \+& |if_clause| |stmt| |else_like| |if_like| & |if_like| \hfill
     $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E\,\.\ I$ &
-     |if (x) y; else if|\cr
+     $\!\!$|if (x) y; else if|\cr
 \+& |if_clause| |stmt| |else_like| & |else_like| \hfill
     $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E$ &
-   |if (x) y; else|\cr
+   $\!\!$|if (x) y; else|\cr
 \+& |if_clause| |stmt| & |else_like| |stmt| & |if (x)|\cr
 \+& |if_head| \alt|stmt| |exp| |else_like| |if_like| & |if_like| \hfill
     $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E\,\.\ I$ &
-     |if (x){y;}else if|\cr
+     $\!\!$|if (x){y;}else if|\cr
 \+& |if_head| \alt|stmt| |exp| |else_like| & |else_like| \hfill
     $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E$ &
-   |if (x){y;}else|\cr
-\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & |if (x){y;}|\cr
+   $\!\!$|if (x){y;}else|\cr
+\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & $\!\!$|if (x){y;}|\cr
 \advance\midcol20pt
 \+& |do_like| |stmt| |else_like| |semi| & |stmt| \hfill
       $D\,\\{bsp}\,|noop|\,|cancel|\,S\,|cancel|\,|noop|\,\\{bsp}\,ES$%
@@ -191,7 +190,7 @@
     $C$\alt $C$ $E$ \\{in}\,\\{in} & |catch (...)|\cr
 \+& |tag| |tag| & |tag| \hfill $T_1\,\\{bsp}\,T_2$ & |case 0: case 1:|\cr
 \+& |tag| \altt|stmt| |decl| |function| & \altt|stmt| |decl| |function|
-       \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & |case 0: z=0;|\cr
+       \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & $\!\!$|case 0: z=0;|\cr
 \+\dagit& |stmt| \altt|stmt| |decl| |function| &
    \altt|stmt| |decl| |function|
       \hfill $S\,$\altt$|force|\,S$ $|big_force|\,D$ $|big_force|\,F$ &
@@ -198,11 +197,11 @@
       |x=1;y=2;|\cr
 \+& |semi| & |stmt| \hfill \.\ $S$& empty statement\cr
 \+\dagit& |lproc| \altt |if_like| |else_like| |define_like| & |lproc| &
-         \maltt {{\bf \#include}} {\bf\#else} {\bf\#define} \cr
-\+& |lproc| |rproc| & |insert| & {\bf\#endif} \cr
+         \maltt {\#\&{include}} \#\&{else} \#\&{define} \cr
+\+& |lproc| |rproc| & |insert| & \#\&{endif} \cr
 \+& |lproc| \alt {|exp| [|exp|]} |function| |rproc| & |insert| \hfill
     $I$\.\ \alt {$E{[\.{\ \\5}E]}$} {$F$} &
- \malt{{\bf\#define} $a$\enspace 1} {{\bf\#define} $a$\enspace$\{\,b;\,\}$} \cr
+ \malt{\#\&{define} $a$\enspace 1} {\#\&{define} $a$\enspace$\{\,b;\,\}$} \cr
 \+& |section_scrap| |semi| & |stmt|\hfill $MS$ |force|
    &$\langle\,$section name$\,\rangle$;\cr
 \+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
@@ -265,9 +264,58 @@
     \malt |?x:| |?f():| \cr
 \+& |begin_arg| |end_arg| & |exp| & \.{@@[}\&{char}$*$\.{@@]}\cr
 \+& |any_other| |end_arg| & |end_arg| &    \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |decl_head| & |attr| & |alignas(struct s *)| \cr
+\+& |alignas_like| |exp| & |attr| & |alignas(8)| \cr
+\+& |lbrack| |lbrack| & |attr_head| & attribute begins \cr
+\+& |lbrack| & |lpar| & |[| elsewhere \cr
+\+& |rbrack| & |rpar| & |]| elsewhere \cr
+\+& |attr_head| |rbrack| |rbrack| & |attr| & $[[\ldots]]$ \cr
+\+& |attr_head| |exp| & |attr_head| & $[[$|deprecated| \cr
+\+& |attr_head| |using_like| |exp| |colon| & |attr_head| & $[[$|using NS:| \cr
+\+& |attr| \alt|lbrace| |stmt| & \alt|lbrace| |stmt| \hfill $A\.\ $ \alt $S$ $L$ &
+  |[[likely]] {|\cr
+\+& |attr| |tag| & |tag| \hfill $A\.\ T$ & |[[likely]] case 0:| \cr
+\+& |attr| |semi| & |stmt| & |[[fallthrough]];| \cr
+\+& |attr| |attr| & |attr| \hfill $A\.\ A$ & |alignas(x)| $[[\ldots]]$ \cr
+\+& |attr| |decl_head| & |decl_head| & |[[nodiscard]] f()| \cr
+\+& |decl_head| |attr| & |decl_head| & |(int x [[deprecated]])|\cr
+\+& |using_like| & |int_like| & \&{using} not in attributes \cr
+\+& |struct_like| |attr| & |struct_like| \hfill $S\.\ A$ &
+  |struct [[deprecated]]|\cr
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\+& |attr| |typedef_like| & |typedef_like| \hfill $A\.\ T$ &
+  |[[deprecated]] typedef| \cr
+\+& |raw_int| |lbrack| & |exp| & |int[3]| \cr
+\+& |attr_head| |comma| & |attr_head| & $[[$|x, y| \cr
+\+& |if_head| |attr| & |if_head| \hfill $I\.\ A$ & |if (x) [[unlikely]] {| \cr
+\+& |lbrack| |lbrack| |rbrack| |rbrack| & |exp| & |[[]]| \cr
+\+& |attr| |function| & |function| \hfill $A\.\ F$ &
+  attribute and function \cr
+\+& |default_like| |colon| & |case_like| |colon| & |default:| \cr
+\+& |default_like| & |exp| & |f()=default;| \cr
+\+& |struct_like| |struct_like| & |struct_like| \hfill $S\.\ S$ &
+  |enum class| \cr
+\+& |exp| |colcol| |int_like| & |int_like| & $\\{std}\DC\&{atomic}$ \cr
+\advance\midcol-60pt
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |comma| &
+  |langle| \hfill $LS$\alt $E^{**}$ $I^{**}$ $C$ & $\langle$\&{typename} $t,$\cr
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |prerangle| &
+  |cast| \hfill $LS$\alt $E^{**}$ $I^{**}$ $P$ &
+  \hbox{$\langle$\&{typename} $t\rangle$} \hss \cr
+\advance\midcol60pt
+\+& |template_like| |cast| |struct_like| & |struct_like| \hfill $T\.\ CS$ &
+  |template<@t\dots@>> class| \cr
+\+& |tag| |rbrace| & |decl| |rbrace| & @q{@>|public: }| \cr
+\+& |fn_decl| |attr| & |fn_decl| \hfill $F\.\ A$ & |void f() noexcept| \cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
 \yskip
 \yskip
 \yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
 \parindent=0pt
 \dag{\bf Notes}
 \yskip
@@ -296,6 +344,9 @@
 
 Rule 123: The mathness of the |colon| or |base| changes to `yes'.
 
+Rules 153, 154: |make_reserved| is called only if the \.{+t} option is given
+to \.{CWEAVE}.
+
 Rule 200: The |exp| must not be immediately followed by |lpar| or~|exp|.
 
 Rule 202: The |raw_int| must be immediately followed by |semi| or |comma|.

Modified: trunk/Build/source/texk/web2c/cwebdir/prod.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/prod.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/prod.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,9 +26,8 @@
 production number refers to the notes at the end of this section,
 which deal with various exceptional cases.
 
-We use \\{in}, \\{out}, \\{back} and
-\\{bsp} as shorthands for |indent|, |outdent|, |backup| and
-|break_space|, respectively.
+We use \\{in}, \\{out}, \\{back}, \\{bsp}, and \\{din} as shorthands for
+|indent|, |outdent|, |backup|, |break_space|, and |dindent|, respectively.
 
 \begingroup \lineskip=4pt
 \def\alt #1 #2
@@ -38,9 +37,9 @@
 {$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
    \strut\hbox{#3}\cr}\!\Biggr\}$ }
 \def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
 \def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
    \strut\hbox{#3}\hfill\cr}$}
 \yskip
 \prodno=0 \midcol=2.5in
@@ -58,7 +57,7 @@
 & stmt; \ /$\ast\,$comment$\,*$/\cr
 \+& |exp| \altt|lbrace| |int_like| |decl|
     & |fn_decl| \altt|lbrace| |int_like| |decl|
-        \hfill $F=E^*\,|in|\,|in|$ & \malt {\\{main}()$\{$}
+        \hfill $F=E^*\,\\{din}$ & \malt {\\{main}()$\{$}
            {\\{main}$(\\{ac},\\{av})$ \&{int} \\{ac};} \cr
 \+& |exp| |unop| & |exp| & |x++|\cr
 \+& |exp| \alt |binop| |ubinop| |exp| & |exp| & \malt {|x/y|} {|x+y|} \cr
@@ -65,7 +64,7 @@
 \+& |exp| |comma| |exp| & |exp| \hfill $EC\,|opt|9\,E$& |f(x,y)|\cr
 \+& |exp| \alt {|lpar| |rpar|} |cast| |colon| &
     |exp| \alt {|lpar| |rpar|} |cast| |base| &
-     \malt \&C|()|: {\&C|int i)|:} \cr
+     \malt \&C|()|: {\&C|(int i)|:} \cr
 \+& |exp| |semi| & |stmt| & |x=0;|\cr
 \+& |exp| |colon| & |tag| \hfill $E^*C$ & |found:|\cr
 \+& |exp| |rbrace| & |stmt| |rbrace| & end of \&{enum} list\cr
@@ -118,7 +117,7 @@
      $D=D$\alt $B$ $C$ \unskip$E$ & \malt {\&{int} $f(\&{int}\ x=2)$} |int b:1| \cr
 \+& |decl_head| |cast| & |decl_head| & |int f(int)|\cr
 \+& |decl_head| \altt|int_like| |lbrace| |decl| & |fn_decl|
-                   \altt|int_like| |lbrace| |decl| \hfill $F=D\,|in|\,|in|$
+                   \altt|int_like| |lbrace| |decl| \hfill $F=D\,\\{din}$
                              & |long time () {|\cr
 \+& |decl_head| |semi| & |decl| & |int n;|\cr
 \+& |decl| |decl| & |decl| \hfill $D_1\,|force|\,D_2$ & |int n;double x;|\cr
@@ -161,24 +160,24 @@
 \+& |else_like| |colon| & |else_like| |base| & \&{try} :\cr
 \+& |else_like| |lbrace| & |else_head| |lbrace| & \&{else} $\{$\cr
 \+& |else_like| |stmt| & |stmt| \hfill
-       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+       $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
 \+& |else_head| \alt|stmt| |exp|  & |stmt| \hfill
-      $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & |else{x=0;}|\cr
+      $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & $\!\!$|else{x=0;}|\cr
 \+& |if_clause| |lbrace| & |if_head| |lbrace| & |if (x) {|\cr
 \+& |if_clause| |stmt| |else_like| |if_like| & |if_like| \hfill
     $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E\,\.\ I$ &
-     |if (x) y; else if|\cr
+     $\!\!$|if (x) y; else if|\cr
 \+& |if_clause| |stmt| |else_like| & |else_like| \hfill
     $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E$ &
-   |if (x) y; else|\cr
+   $\!\!$|if (x) y; else|\cr
 \+& |if_clause| |stmt| & |else_like| |stmt| & |if (x)|\cr
 \+& |if_head| \alt|stmt| |exp| |else_like| |if_like| & |if_like| \hfill
     $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E\,\.\ I$ &
-     |if (x){y;}else if|\cr
+     $\!\!$|if (x){y;}else if|\cr
 \+& |if_head| \alt|stmt| |exp| |else_like| & |else_like| \hfill
     $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E$ &
-   |if (x){y;}else|\cr
-\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & |if (x){y;}|\cr
+   $\!\!$|if (x){y;}else|\cr
+\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & $\!\!$|if (x){y;}|\cr
 \advance\midcol20pt
 \+& |do_like| |stmt| |else_like| |semi| & |stmt| \hfill
       $D\,\\{bsp}\,|noop|\,|cancel|\,S\,|cancel|\,|noop|\,\\{bsp}\,ES$%
@@ -191,7 +190,7 @@
     $C$\alt $C$ $E$ \\{in}\,\\{in} & |catch (...)|\cr
 \+& |tag| |tag| & |tag| \hfill $T_1\,\\{bsp}\,T_2$ & |case 0: case 1:|\cr
 \+& |tag| \altt|stmt| |decl| |function| & \altt|stmt| |decl| |function|
-       \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & |case 0: z=0;|\cr
+       \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & $\!\!$|case 0: z=0;|\cr
 \+\dagit& |stmt| \altt|stmt| |decl| |function| &
    \altt|stmt| |decl| |function|
       \hfill $S\,$\altt$|force|\,S$ $|big_force|\,D$ $|big_force|\,F$ &
@@ -198,11 +197,11 @@
       |x=1;y=2;|\cr
 \+& |semi| & |stmt| \hfill \.\ $S$& empty statement\cr
 \+\dagit& |lproc| \altt |if_like| |else_like| |define_like| & |lproc| &
-         \maltt {{\bf \#include}} {\bf\#else} {\bf\#define} \cr
-\+& |lproc| |rproc| & |insert| & {\bf\#endif} \cr
+         \maltt {\#\&{include}} \#\&{else} \#\&{define} \cr
+\+& |lproc| |rproc| & |insert| & \#\&{endif} \cr
 \+& |lproc| \alt {|exp| [|exp|]} |function| |rproc| & |insert| \hfill
     $I$\.\ \alt {$E{[\.{\ \\5}E]}$} {$F$} &
- \malt{{\bf\#define} $a$\enspace 1} {{\bf\#define} $a$\enspace$\{\,b;\,\}$} \cr
+ \malt{\#\&{define} $a$\enspace 1} {\#\&{define} $a$\enspace$\{\,b;\,\}$} \cr
 \+& |section_scrap| |semi| & |stmt|\hfill $MS$ |force|
    &$\langle\,$section name$\,\rangle$;\cr
 \+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
@@ -270,9 +269,58 @@
     \malt |?x:| |?f():| \cr
 \+& |begin_arg| |end_arg| & |exp| & \.{@@[}\&{char}$*$\.{@@]}\cr
 \+& |any_other| |end_arg| & |end_arg| &    \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |decl_head| & |attr| & |alignas(struct s *)| \cr
+\+& |alignas_like| |exp| & |attr| & |alignas(8)| \cr
+\+& |lbrack| |lbrack| & |attr_head| & attribute begins \cr
+\+& |lbrack| & |lpar| & |[| elsewhere \cr
+\+& |rbrack| & |rpar| & |]| elsewhere \cr
+\+& |attr_head| |rbrack| |rbrack| & |attr| & $[[\ldots]]$ \cr
+\+& |attr_head| |exp| & |attr_head| & $[[$|deprecated| \cr
+\+& |attr_head| |using_like| |exp| |colon| & |attr_head| & $[[$|using NS:| \cr
+\+& |attr| \alt|lbrace| |stmt| & \alt|lbrace| |stmt| \hfill $A\.\ $ \alt $S$ $L$ &
+  |[[likely]] {|\cr
+\+& |attr| |tag| & |tag| \hfill $A\.\ T$ & |[[likely]] case 0:| \cr
+\+& |attr| |semi| & |stmt| & |[[fallthrough]];| \cr
+\+& |attr| |attr| & |attr| \hfill $A\.\ A$ & |alignas(x)| $[[\ldots]]$ \cr
+\+& |attr| |decl_head| & |decl_head| & |[[nodiscard]] f()| \cr
+\+& |decl_head| |attr| & |decl_head| & |(int x [[deprecated]])|\cr
+\+& |using_like| & |int_like| & \&{using} not in attributes \cr
+\+& |struct_like| |attr| & |struct_like| \hfill $S\.\ A$ &
+  |struct [[deprecated]]|\cr
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\+& |attr| |typedef_like| & |typedef_like| \hfill $A\.\ T$ &
+  |[[deprecated]] typedef| \cr
+\+& |raw_int| |lbrack| & |exp| & |int[3]| \cr
+\+& |attr_head| |comma| & |attr_head| & $[[$|x, y| \cr
+\+& |if_head| |attr| & |if_head| \hfill $I\.\ A$ & |if (x) [[unlikely]] {| \cr
+\+& |lbrack| |lbrack| |rbrack| |rbrack| & |exp| & |[[]]| \cr
+\+& |attr| |function| & |function| \hfill $A\.\ F$ &
+  attribute and function \cr
+\+& |default_like| |colon| & |case_like| |colon| & |default:| \cr
+\+& |default_like| & |exp| & |f()=default;| \cr
+\+& |struct_like| |struct_like| & |struct_like| \hfill $S\.\ S$ &
+  |enum class| \cr
+\+& |exp| |colcol| |int_like| & |int_like| & $\\{std}\DC\&{atomic}$ \cr
+\advance\midcol-60pt
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |comma| &
+  |langle| \hfill $LS$\alt $E^{**}$ $I^{**}$ $C$ & $\langle$\&{typename} $t,$\cr
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |prerangle| &
+  |cast| \hfill $LS$\alt $E^{**}$ $I^{**}$ $P$ &
+  \hbox{$\langle$\&{typename} $t\rangle$} \hss \cr
+\advance\midcol60pt
+\+& |template_like| |cast| |struct_like| & |struct_like| \hfill $T\.\ CS$ &
+  |template<@t\dots@>> class| \cr
+\+& |tag| |rbrace| & |decl| |rbrace| & @q{@>|public: }| \cr
+\+& |fn_decl| |attr| & |fn_decl| \hfill $F\.\ A$ & |void f() noexcept| \cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
 \yskip
 \yskip
 \yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
 \parindent=0pt
 \dag{\bf Notes}
 \yskip
@@ -304,4 +352,7 @@
 
 Rule 123: The mathness of the |colon| or |base| changes to `yes'.
 
+Rules 153, 154: |make_reserved| is called only if the \.{+t} option is given
+to \.{CWEAVE}.
+
 \endgroup

Added: trunk/Build/source/texk/web2c/cwebdir/refsort.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/refsort.ch	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/refsort.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,44 @@
+Changes for the REFSORT utility from the CTWILL tarball.
+
+This minimal set of changes tries to satisfy the GCC compiler.
+
+This file is not copyrighted and can be used freely.
+
+ at x
+\datethis
+ at y
+\datethis
+\let\maybe=\iffalse % print only sections that change
+ at z
+
+ at x standard C library interface
+#include "stdio.h"
+#include "strings.h"
+#include "ctype.h"
+ at y
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+ at z
+
+ at x declare return type
+main()
+ at y
+int main()
+ at z
+
+ at x variable not used
+{ register int k;
+ at y
+{
+ at z
+
+ at x add 'Index.' section
+  for (;*p;p++) *q++=*p;
+}
+ at y
+  for (;*p;p++) *q++=*p;
+}
+
+@* Index.
+ at z


Property changes on: trunk/Build/source/texk/web2c/cwebdir/refsort.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/refsort.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/refsort.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/refsort.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -40,9 +40,9 @@
 
 @d abort(c,m) { fprintf(stderr,"%s!\n%s",m,buf); return c; }
 @c
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
+#include "stdio.h"
+#include "strings.h"
+#include "ctype.h"
 @#
 typedef struct {
   char key[max_key];
@@ -54,7 +54,7 @@
 char buf[max_size]; /* current line of input */
 char *input_status; /* |NULL| if end of input reached, else |buf| */
 @#
-int main()
+main()
 {
   register char *p,*q;
   register int n; /* current number of items */
@@ -86,7 +86,7 @@
 }
 
 @ @<Output the current group@>=
-{
+{ register int k;
   for (y=sorted;y<sorted+n;y++) printf("%s\n",(*y)->entry);
   printf("\\donewithpage%s\n",cur_page);
 }
@@ -162,4 +162,3 @@
   for (;*p;p++) *q++=*p;
 }
 
-@* Index.

Modified: trunk/Build/source/texk/web2c/cwebdir/system.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/system.bux	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/system.bux	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,13 +1,16 @@
 @$memcmp "<string.h>" \zip@>
 @$memcpy "<string.h>" \zip@>
 @$strcat "<string.h>" \zip@>
+@$strchr "<string.h>" \zip@>
 @$strcmp "<string.h>" \zip@>
 @$strcpy "<string.h>" \zip@>
 @$strlen "<string.h>" \zip@>
 @$strncmp "<string.h>" \zip@>
 @$strncpy "<string.h>" \zip@>
+@$strrchr "<string.h>" \zip@>
 
 @$BUFSIZ "<stdio.h>" \zip@>
+@$EOF "<stdio.h>" \zip@>
 @$fclose "<stdio.h>" \zip@>
 @$feof "<stdio.h>" \zip@>
 @$fflush "<stdio.h>" \zip@>
@@ -16,6 +19,7 @@
 @$fputs "<stdio.h>" \zip@>
 @$fread "<stdio.h>" \zip@>
 @$fwrite "<stdio.h>" \zip@>
+@$getc "<stdio.h>" \zip@>
 @$printf "<stdio.h>" \zip@>
 @$putc "<stdio.h>" \zip@>
 @$putchar "<stdio.h>" \zip@>
@@ -24,6 +28,7 @@
 @$remove "<stdio.h>" \zip@>
 @$sprintf "<stdio.h>" \zip@>
 @$stdout "<stdio.h>" \zip@>
+@$ungetc "<stdio.h>" \zip@>
 
 @$getenv "<stdlib.h>" \zip@>
 @$exit "<stdlib.h>" \zip@>
@@ -43,7 +48,14 @@
 @$bool "<stdbool.h>" \zip@>
 @$false "<stdbool.h>" \zip@>
 @$true "<stdbool.h>" \zip@>
+
 @$ptrdiff_t "<stddef.h>" \zip@>
 @$size_t "<stddef.h>" \zip@>
+
 @$uint8_t "<stdint.h>" \zip@>
 @$uint16_t "<stdint.h>" \zip@>
+
+@$bindtextdomain "<locale.h>" \zip@>
+@$setlocale "<locale.h>" \zip@>
+@$LC_CTYPE "<locale.h>" \zip@>
+@$LC_MESSAGES "<locale.h>" \zip@>

Modified: trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,13 +26,12 @@
 % Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
 % Version 3.64 [2018] --- Andreas Scherer, Octobre 2018
 % Version 3.64 [2020] --- Andreas Scherer, May 2020
+% Version 4.3 [2021] --- Andreas Scherer, April 2021
 
 \ifx\undefined\botofcontents\input cwebmac.tex\fi
 
-\xdef\fmtversion{\fmtversion[2020]}
+\xdef\fmtversion{\fmtversion[2021]}
 
-\def\Cpp{\CPLUSPLUS/} % for backward compatibility
-
 \font\tenss=cmss10 \let\cmntfont\tenss % comment font
 
 \def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}

Modified: trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -234,6 +234,7 @@
 \newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
 \let\yskip=\smallskip
 \def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
 \def\note#1#2.{\par\penalty5000
   \Y\noindent{\hangindent2\em\baselineskip10pt%
     \eightrm#1~\ifacro{\pdfnote#2.}\else#2\fi.\par}}
@@ -400,7 +401,7 @@
 \def\startsection{\titletrue
   \line{\smash{\titlefont\title}\quad\hrulefill}\bigskip
   \let\startsection=\stsec\stsec}
-\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
 \def\A{\note{See also section}} % xref for doubly defined section name
 \def\As{\note{See also sections}} % xref for multiply defined section name
 \def\B{\iftenpoint\ninepoint\fi
@@ -415,7 +416,7 @@
 %\let\SHC\C % "// short comments" treated like "/* ordinary comments */"
 \def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
 \def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
-\def\D{\defin{\#define}} % macro definition
+\def\D{\defin{{\rm\#}define}} % macro definition
 \let\E=\equiv % equivalence sign
 \def\ET{ and~} % conjunction between two section numbers
 \def\ETs{, and~} % conjunction between the last two of several section numbers
@@ -469,7 +470,8 @@
   \hbox{$\def\?{\kern.2em}%$%
     \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
     \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
-    \let\~=\oct \let\^=\hex {#1}$}}%$%
+    \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+    \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
 \def\U{\note{This code is used in section}} % xref for use of a section
 \def\Us{\note{This code is used in sections}} % xref for uses of a section
 \let\V=\lor % logical or
@@ -484,16 +486,16 @@
 
 %\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
 %\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
 \def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
         \hbox{\strut\kern2pt\.{#1}\kern2pt}}
       \hrule}\vrule\kern2pt}} % verbatim string
 
-\def\TeX{{\ifmmode\it\fi
-   \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
-
 % now here's the mini-index formatting control
 \newcount\nrefs % total number of references in partial page
 \newcount\baseno % smallest section number in partial page
@@ -639,7 +641,26 @@
 
 \hsize=\pagewd \vsize=\maxdimen \output={\twillout}
 
+%\let\page=\pagebody \raggedbottom
+% \def\page{\box255 }\normalbottom % faster, but loses plain TeX footnotes
+%\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
+ %\shipout\vbox{
+  %\vbox to\fullpageht{
+  %\iftitle\global\titlefalse
+  %\else\hbox to\pagewd{\vbox to10pt{}\ifodd\pageno #3\else#2\fi}\fi
+  %\vfill#1}} % parameter #1 is the page itself
+  %\global\advance\pageno by1}
+%\def\topofcontents{\centerline{\titlefont\title}\vskip.7in
+  %\vfill} % this material will start the table of contents page
+%\def\startpdf{\ifpdftex\pdfcatalog{/PageMode /UseOutlines}\else
+    %\ifpdf{\special{pdf: docview << /PageMode /UseOutlines >>}}\fi\fi}
+%\def\botofcontents{\vfill
+  %\centerline{\covernote}} % this material will end the table of contents page
+%\def\covernote{}
 \def\contentspagenumber{0} % default page number for table of contents
+%\newdimen\pageshift \pageshift=\hoffset
+   %% shift righthand pages wrt lefthand ones (changed in version 3.70)
+%\def\setpage{\hsize\pagewd\vsize\pageht} % use after changing page size
 \def\contentsfile{\jobname.toc} % file that gets table of contents info
 \def\readcontents{\input \contentsfile}
 \def\readsections{\input \jobname.scn}
@@ -675,6 +696,28 @@
   \let\(=\let \let\)=\let \let\[=\let \let\]=\let \let\/=\let
   \pdfoutline goto num #3 count -\expnumber{chunk#2.#3} {#5}}}
 \let\con=\end % no table of contents
+%\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+  %\rightskip 0pt \hyphenpenalty 50 \tolerance 200
+  %\setpage \output={\normaloutput\page\lheader\rheader}
+  %\titletrue % prepare to output the table of contents
+  %\pageno=\contentspagenumber
+  %\def\grouptitle{TABLE OF CONTENTS}
+  %\message{Table of contents:}
+  %\topofcontents \startpdf
+  %\line{\hfil Section\hbox to3em{\hss Page}}
+  %\let\ZZ=\contentsline
+  %\readcontents\relax % read the contents info
+  %\botofcontents \end} % print the contents page(s) and terminate
+%\def\contentsline#1#2#3#4#5{\ifnum#2=0 \smallbreak\fi
+    %\line{\consetup{#2}#1
+      %\rm\leaders\hbox to .5em{.\hfil}\hfil
+      %\ \ifacro\pdflink{#3}{\romannumeral#3}\else#3\fi\hbox to3em{\hss#4}}}
+%\def\consetup#1{\ifcase#1 \bf % depth -1 (@**)
+  %\or % depth 0 (@*)
+  %\or \hskip2em % depth 1 (@*1)
+  %\or \hskip4em \or \hskip6em \or \hskip8em \or \hskip10em % depth 2,3,4,5
+  %\else \hskip12em \fi} % depth 6 or more
 \def\datethis{} \def\datecontentspage{}
 
 % To produce only a subset of pages, put the page numbers on separate

Added: trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,9 @@
+% special TeX strings from 'ctwill.w':
+\def\copyxTeX{\\{copy\_\TEX/}}
+\def\skipxTeX{\\{skip\_\TEX/}}
+\def\TeXxstring{\\{\TEX/\_string}}
+
+\pageno=101 % dummy page number
+\preinx % pre-index text on full pagewidth
+\noindent Some introductory words about this full index.
+\inx % two-column index


Property changes on: trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/texk/web2c/cwebdir/twinx.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx.ch	                        (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx.ch	2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,156 @@
+Changes for the TWINX utility from the CTWILL tarball.
+
+This minimal set of changes tries to satisfy the GCC compiler
+and it fixes a few minor issues. See the comments after '@x'.
+
+This file is not copyrighted and can be used freely.
+
+Limbo.
+
+ at x l.1
+\datethis
+ at y
+\datethis
+\let\maybe=\iffalse % print only sections that change
+ at z
+
+Section 1.
+
+ at x l.10 Standard C interface.
+#include <stdio.h>
+ at y
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+ at z
+
+ at x l.15
+main(argc,argv)
+  int argc;
+  char *argv[];
+ at y
+int main(
+  int argc,
+  char *argv[])
+ at z
+
+ at x l.21
+    f=fopen(*++argv,"r");
+    if (!f)
+ at y
+    if((f=fopen(*++argv,"r"))==NULL)
+ at z
+
+ at x l.28
+      f=fopen(*argv,"r");
+      if (!f)
+ at y
+      if((f=fopen(*argv,"r"))==NULL)
+ at z
+
+Section 3.
+
+ at x l.49 Document minor change in behavior.
+@ @<Scan file |f|...@>=
+ at y
+@ For your convenience, \.{TWINX} grabs the first ``word'' in \.{\\title} and
+turns it into uppercase form.
+
+@<Scan file |f|...@>=
+ at z
+
+ at x l.57 FIX: Fetch only the first word from the '\title'.
+    for (p=buf+11,q=title;*p && *p!='}';p++) *q++=*p;
+ at y
+    for (p=buf+11,q=title;*p&&*p!=' '&&*p!='}';p++) *q++=toupper(*p);
+ at z
+
+Section 4.
+
+ at x l.96
+@<Type...@>=
+ at y
+ at s node_struct int
+
+@<Type...@>=
+ at z
+
+ at x l.102 Compiler warning.
+  char *id;
+ at y
+  const char *id;
+ at z
+
+Section 5.
+
+ at x l.115
+char *save_string(s)
+  char *s;
+ at y
+char *save_string(
+  char *s)
+ at z
+
+Section 6.
+
+ at x l.145
+node *new_node()
+ at y
+node *new_node(void)
+ at z
+
+Section 11.
+
+ at x l.216 FIX: Don't count masked braces.
+    if (*p=='{') bal++;
+    else if (*p=='}') bal--;
+ at y
+    switch (*p) {
+    case '\\': *q++=*p++; break;
+    case '{': bal++; break;
+    case '}': bal--; break;
+    }
+ at z
+
+Section 17.
+
+ at x l.347
+int compare(p,q)
+  node *p,*q;
+ at y
+int compare(
+  node *p, node *q)
+ at z
+
+Section 19.
+
+ at x l.379 Compiler warning.
+  for (j=1;collate[j];j++) ord[collate[j]]=j;
+ at y
+  for (j=1;collate[j];j++) ord[(int)collate[j]]=j;
+ at z
+
+Section 20.
+
+ at x l.390
+collapse(p,q)
+  node *p,*q;
+ at y
+void collapse(
+  node *p, node *q)
+ at z
+
+Section 22.
+
+ at x l.414 Compiler warning.
+{@+register char *p=x->id;
+ at y
+{@+register const char *p=x->id;
+ at z
+
+ at x l.434 FIX: Don't mask already masked underscore.
+    if (*p=='_') putchar('\\');
+ at y
+    if (*p=='_'&&*(p-1)!='\\') putchar('\\');
+ at z


Property changes on: trunk/Build/source/texk/web2c/cwebdir/twinx.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/twinx.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx.w	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx.w	2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,16 +8,13 @@
 
 @c
 #include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
 @<Type definitions@>@;
 @<Global variables@>@;
 @<Procedures@>@;
 @#
-int main(
-  int argc,
-  char *argv[])
+main(argc,argv)
+  int argc;
+  char *argv[];
 { @<Local variables@>;
   @<Initialize the data structures@>;
   while (--argc) {
@@ -102,7 +99,7 @@
   struct node_struct *n;
 } mixed;
 typedef struct node_struct {
-  const char *id;
+  char *id;
   mixed data;
   struct node_struct *next;
 } node;
@@ -115,8 +112,8 @@
 @d string_block_size 8192 /* number of bytes per string block */
 
 @<Proc...@>=
-char *save_string(
-  char *s)
+char *save_string(s)
+  char *s;
 {
   register char *p,*q; register int l;
   for (p=s;*p;p++) ;
@@ -145,7 +142,7 @@
 @d nodes_per_block 340
 
 @<Proc...@>=
-node *new_node(void)
+node *new_node()
 {
   if (next_node==bad_node) {
     next_node=(node*)calloc(nodes_per_block,sizeof(node));
@@ -347,8 +344,8 @@
 two characters of the |id| field).
 
 @<Proc...@>=
-int compare(
-  node *p, node *q)
+int compare(p,q)
+  node *p,*q;
 {@+register unsigned char *pp,*qq;
   for (pp=(unsigned char*)p->id+3,qq=(unsigned char*)q->id+3;
       *pp&&ord[*pp]==ord[*qq];pp++,qq++) ;
@@ -379,7 +376,7 @@
 !\42#$%&'()*+,-./:;<=>?@@[\\]^`{|~_\
 abcdefghijklmnopqrstuvwxyz0123456789");
 {@+register int j;
-  for (j=1;collate[j];j++) ord[(int)collate[j]]=j;
+  for (j=1;collate[j];j++) ord[collate[j]]=j;
   ord[128]=j; /* this affects the ordering of |sentinel.id| */
   for (j='A';j<='Z';j++) ord[j]=ord[tolower(j)];
 }
@@ -390,8 +387,8 @@
 |q->data.n| should not be considered an active pointer.
 
 @<Proc...@>=
-void collapse(
-  node *p, node *q)
+collapse(p,q)
+  node *p,*q;
 {@+register node *x;
   for (x=q->data.n;x->next;x=x->next) ;
   x->next=p->data.n;
@@ -414,7 +411,7 @@
 }
 
 @ @<Output |x->id|...@>=
-{@+register const char *p=x->id;
+{@+register char *p=x->id;
   if (*p==' ') {
     if (*(p+1)!=' ') goto unknown;
     goto known;

Modified: trunk/Build/source/texk/web2c/help.h
===================================================================
--- trunk/Build/source/texk/web2c/help.h	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/help.h	2021-04-16 12:49:28 UTC (rev 58884)
@@ -61,9 +61,10 @@
     "+p          print progress report messages",
     "+/-q        shortcut for '-bhp'; also '--quiet' (default)",
     "+/-v        shortcut for '+bhp'; also '--verbose'",
+    "-c          ignore temporary output irrespective of changes",
     "-dN         set 'kpathsea_debug' to N (0..127)",
+    "+k          keep separators in numeric literals in the output",
     "+s          print usage statistics",
-    "-t          ignore temporary output irrespective of changes",
     "--help      display this help and exit",
     "--version   output version information and exit",
     NULL
@@ -82,6 +83,7 @@
     "+p          print progress report messages",
     "+/-q        shortcut for '-bhp'; also '--quiet' (default)",
     "+/-v        shortcut for '+bhp'; also '--verbose'",
+    "-c          ignore temporary output irrespective of changes",
     "-dN         set 'kpathsea_debug' to N (0..127)",
     "-e          do not enclose C material in \\PB{...}",
     "-f          do not force a newline after every C statement in output",
@@ -90,7 +92,7 @@
     "-x          omit indices, section names, table of contents",
     "+lX         use macros for language X as of Xcwebmac.tex",
     "+s          print usage statistics",
-    "-t          ignore temporary output irrespective of changes",
+    "+t          treat 'typename' in a template like 'typedef'",
     "--help      display this help and exit",
     "--version   output version information and exit",
     NULL
@@ -109,6 +111,7 @@
     "+p          print progress report messages",
     "+/-q        shortcut for '-bhp'; also '--quiet' (default)",
     "+/-v        shortcut for '+bhp'; also '--verbose'",
+    "-c          ignore temporary output irrespective of changes",
     "-dN         set 'kpathsea_debug' to N (0..127)",
     "-e          do not enclose C material in \\PB{...}",
     "-f          do not force a newline after every C statement in output",
@@ -118,7 +121,7 @@
     "+P          \\input ctproofmac.tex instead of ctwimac.tex",
     "+/-lX       use macros for language X as of Xct{wi|proof}mac.tex",
     "+s          print usage statistics",
-    "-t          ignore temporary output irrespective of changes",
+    "+t          treat 'typename' in a template like 'typedef'",
     "--help      display this help and exit",
     "--version   output version information and exit",
     NULL

Modified: trunk/Build/source/texk/web2c/man/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/man/ChangeLog	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/ChangeLog	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,12 @@
+2021-04-16  Andreas Scherer  <https://ascherer.github.io>
+
+	* ctwill.man,
+	* cweb.man: CWEB 4.3 release.
+
+2021-03-07  Andreas Scherer  <https://ascherer.github.io>
+
+	* ctwill.man: Document 'ctwill-twinx' a bit more.
+
 2021-03-04  Karl Berry  <karl at freefriends.org>
 
 	* gftodvi.man: font and spacing fixes from Debian.

Modified: trunk/Build/source/texk/web2c/man/ctwill.man
===================================================================
--- trunk/Build/source/texk/web2c/man/ctwill.man	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/ctwill.man	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 2.11.4
+.\" Automatically generated by Pandoc 2.12
 .\"
-.TH "CTWILL" "1" "February 6, 2021" "Web2c @VERSION@" "General Commands Manual"
+.TH "CTWILL" "1" "April 13, 2021" "Web2c @VERSION@" "General Commands Manual"
 .hy
 .SH NAME
 .PP
@@ -48,7 +48,7 @@
 change file to apply, you can use `\f[B]-\f[R]' as the second argument.
 .PP
 \f[B]ctwill\f[R] is exactly like \f[B]cweave\f[R] except that it
-produces much better documentation, for which you must work harder.
+produces much better documentation, for which you must work much harder.
 You should run \f[B]ctwill\f[R] twice, once to prime the pump and once
 to get decent answers.
 Moreover, you must run the output twice through TeX.
@@ -60,9 +60,14 @@
 foo\f[R] will produce alphabetized output.
 .PP
 The \f[B]ctwill-twinx\f[R] program compiles a master index for a set of related
-programs that have been processed by \f[B]ctwill\f[R].
+programs that have been processed by \f[B]ctwill\f[R] (\f[I]not\f[R] by
+\f[B]cweave\f[R], mind you!).
 The individual programs should define their names with a line of the
 form \f[B]\[rs]def\[rs]title{NAME}\f[R].
+For your convenience, \f[B]ctwill-twinx\f[R] grabs the first \[lq]word\[rq] in
+\f[B]\[rs]title\f[R] and turns it into uppercase form.
+You should adapt file \f[B]twinx-startup.tex\f[R] for the first page of
+the master index.
 .PP
 The mini-indexes list identifiers that are used but not defined on each
 two-page spread.
@@ -106,13 +111,13 @@
 to be a drop-in replacement for the original package.
 There are, however, a few differences worth noting:
 .IP \[bu] 2
-This version is based on the most recent version of CWEB (4.2).
+This version is based on the most recent version of CWEB (4.3).
 .IP \[bu] 2
 In TeX\ Live the utility programs are prefixed with \f[B]ctwill-\f[R]
 and the macro files with \f[B]ct\f[R] for technical reasons.
 .IP \[bu] 2
 Options \f[B]--help\f[R], \f[B]--quiet\f[R], \f[B]--verbose\f[R],
-\f[B]--version\f[R], and flags \f[B]-i\f[R], \f[B]-o\f[R], \f[B]-t\f[R],
+\f[B]--version\f[R], and flags \f[B]-c\f[R], \f[B]-i\f[R], \f[B]-o\f[R],
 and \f[B]+lX\f[R] are new in CWEBbin and TeX\ Live.
 .IP \[bu] 2
 Option \f[B]+lX\f[R] is accompanied by example wrapper files for
@@ -153,6 +158,8 @@
 \f[B]+v\f[R]/\f[B]-v\f[R]: shortcut for \f[B]+bhp\f[R]; also
 \f[B]--verbose\f[R]
 .IP \[bu] 2
+\f[B]-c\f[R]: ignore temporary output irrespective of changes
+.IP \[bu] 2
 \f[B]-e\f[R]: do not enclose C/C++\ material in \f[B]\[rs]PB{\&...}\f[R]
 .IP \[bu] 2
 \f[B]-f\f[R]: do not force a newline after every C/C++\ statement in
@@ -162,8 +169,6 @@
 .IP \[bu] 2
 \f[B]-o\f[R]: suppress separation of declarations and statements
 .IP \[bu] 2
-\f[B]-t\f[R]: ignore temporary output irrespective of changes
-.IP \[bu] 2
 \f[B]-x\f[R]: omit indices, section names, table of contents
 .IP \[bu] 2
 \f[B]+P\f[R]: \f[B]\[rs]input ctproofmac.tex\f[R] instead of
@@ -174,6 +179,9 @@
 .IP \[bu] 2
 \f[B]+s\f[R]: print usage statistics
 .IP \[bu] 2
+\f[B]+t\f[R]: treat \f[B]typename\f[R] in a template like
+\f[B]typedef\f[R]
+.IP \[bu] 2
 \f[B]--help\f[R]: display help message and exit
 .IP \[bu] 2
 \f[B]--version\f[R]: output version information and exit

Modified: trunk/Build/source/texk/web2c/man/cweb.man
===================================================================
--- trunk/Build/source/texk/web2c/man/cweb.man	2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/cweb.man	2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 2.11.4
+.\" Automatically generated by Pandoc 2.12
 .\"
-.TH "CWEB" "1" "September 23, 2020" "Web2c @VERSION@" "General Commands Manual"
+.TH "CWEB" "1" "April 13, 2021" "Web2c @VERSION@" "General Commands Manual"
 .hy
 .SH NAME
 .PP
@@ -55,7 +55,7 @@
 There are, however, a few differences worth noting:
 .IP \[bu] 2
 Options \f[B]--help\f[R], \f[B]--quiet\f[R], \f[B]--verbose\f[R],
-\f[B]--version\f[R], and flags \f[B]-i\f[R], \f[B]-o\f[R], \f[B]-t\f[R],
+\f[B]--version\f[R], and flags \f[B]-c\f[R], \f[B]-i\f[R], \f[B]-o\f[R],
 and \f[B]+lX\f[R] are new in CWEBbin and TeX\ Live.
 .IP \[bu] 2
 Option \f[B]+lX\f[R] is accompanied by several wrapper files for
@@ -95,16 +95,20 @@
 \f[B]+v\f[R]/\f[B]-v\f[R]: shortcut for \f[B]+bhp\f[R]; also
 \f[B]--verbose\f[R]
 .IP \[bu] 2
+\f[B]-c\f[R]: ignore temporary output irrespective of changes
+.IP \[bu] 2
 \f[B]+s\f[R]: print usage statistics
 .IP \[bu] 2
-\f[B]-t\f[R]: ignore temporary output irrespective of changes
-.IP \[bu] 2
 \f[B]--help\f[R]: display help message and exit
 .IP \[bu] 2
 \f[B]--version\f[R]: output version information and exit
 .PP
-There are six other options applicable to \f[B]cweave\f[R] only:
+There is one other option applicable to \f[B]ctangle\f[R] only:
 .IP \[bu] 2
+\f[B]+k\f[R]: keep separators in numeric literals in the output
+.PP
+There are seven other options applicable to \f[B]cweave\f[R] only:
+.IP \[bu] 2
 \f[B]-e\f[R]: do not enclose C/C++\ material in \f[B]\[rs]PB{\&...}\f[R]
 .IP \[bu] 2
 \f[B]-f\f[R]: do not force a newline after every C/C++\ statement in
@@ -118,6 +122,9 @@
 .IP \[bu] 2
 \f[B]+lX\f[R]/\f[B]-lX\f[R]: use macros for language \f[I]X\f[R] as of
 \f[I]X\f[R]\f[B]cwebmac.tex\f[R]
+.IP \[bu] 2
+\f[B]+t\f[R]: treat \f[B]typename\f[R] in a template like
+\f[B]typedef\f[R]
 .SH ENVIRONMENT
 .PP
 The environment variable CWEBINPUTS is used to search for the input



More information about the tex-live-commits mailing list.