texlive[59061] Build/source/texk/web2c: [CWEB] New release 4.3.1.

commits+ascherer at tug.org commits+ascherer at tug.org
Mon May 3 15:03:46 CEST 2021


Revision: 59061
          http://tug.org/svn/texlive?view=revision&revision=59061
Author:   ascherer
Date:     2021-05-03 15:03:46 +0200 (Mon, 03 May 2021)
Log Message:
-----------
[CWEB] New release 4.3.1.

This release is almost the same as CWEB 4.3 of 2021-04-16, but

* it fixes the indexing bug in CWEAVE/CTWILL that got retracted
* it extracts and collects all additions made in CTWILL, so that the
  section numbers of CWEAVE are retained up to {U+00A7}272 and new material is
  described in the (first) appendix, including the CTWILL user manual
* it provides fully revised and (hopefully) corrected mini-indexes for
  CTWILL, if it is processed by itself (to be published in package
  'knuth-pdf' on CTAN)

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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/ChangeLog	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,3 +1,12 @@
+2021-04-13  Andreas Scherer  <https://ascherer.github.io>
+
+	* ctangleboot.cin,
+	* cwebboot.cin: 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 +17,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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/Makefile.in	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/am/cweb.am	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/ctangleboot.cin	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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
@@ -73,7 +79,7 @@
 #define harmless_message 1
 #define error_message 2
 #define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_harmless if(history==spotless) history= harmless_message
 #define mark_error history= error_message
 #define confusion(s) fatal(_("! This can't happen: ") ,s)  \
  \
@@ -80,17 +86,14 @@
 
 #define show_banner flags['b']
 #define show_progress flags['p']
+#define show_happiness flags['h']
 #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,10 +505,11 @@
 }
 
 /*:58*//*63:*/
-#line 773 "cwebdir/ctangle.w"
+#line 778 "cwebdir/ctangle.w"
 {
 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['@']= '@';ccode['=']= string;
@@ -522,10 +523,9 @@
 ccode['&']= join;
 ccode['<']= ccode['(']= section_name;
 ccode['\'']= ord;
-}
 
 /*: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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebboot.cin	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 711 "cwebdir/comm-w2c.ch"
 
 #if HAVE_GETTEXT
 #include <locale.h>  
@@ -34,7 +34,7 @@
 #endif
 
 /*:89*//*91:*/
-#line 756 "cwebdir/comm-w2c.ch"
+#line 758 "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 797 "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
@@ -97,7 +103,7 @@
 #define harmless_message 1
 #define error_message 2
 #define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_harmless if(history==spotless) history= harmless_message
 #define mark_error history= error_message
 #define confusion(s) fatal(_("! This can't happen: ") ,s)  \
  \
@@ -104,17 +110,14 @@
 
 #define show_banner flags['b']
 #define show_progress flags['p']
+#define show_happiness flags['h']
 #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 1272 "cwebdir/common.w"
 
 FILE*C_file;
 FILE*tex_file;
 FILE*idx_file;
-#line 569 "cwebdir/comm-w2c.ch"
+#line 571 "cwebdir/comm-w2c.ch"
 FILE*scn_file;
 FILE*check_file;
-#line 576 "cwebdir/comm-w2c.ch"
+#line 578 "cwebdir/comm-w2c.ch"
 FILE*active_file;
 char*found_filename;
-#line 1288 "cwebdir/common.w"
+#line 1278 "cwebdir/common.w"
 
-#line 593 "cwebdir/comm-w2c.ch"
+#line 595 "cwebdir/comm-w2c.ch"
 /*:83*//*86:*/
-#line 638 "cwebdir/comm-w2c.ch"
+#line 640 "cwebdir/comm-w2c.ch"
 
 const char*use_language= "";
 
 
 /*:86*//*87:*/
-#line 651 "cwebdir/comm-w2c.ch"
+#line 653 "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 1189 "cwebdir/common.w"
 static void scan_args(void);
 
-#line 496 "cwebdir/comm-w2c.ch"
+#line 501 "cwebdir/comm-w2c.ch"
 /*:76*//*96:*/
-#line 808 "cwebdir/comm-w2c.ch"
+#line 810 "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 772 "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 720 "cwebdir/comm-w2c.ch"
 
 setlocale(LC_MESSAGES,setlocale(LC_CTYPE,""));
 texmf_locale= kpse_var_expand("${TEXMFLOCALEDIR}");
@@ -540,20 +544,18 @@
 #line 85 "cwebdir/comm-w2c.ch"
 
 /*74:*/
-#line 1148 "cwebdir/common.w"
+#line 1142 "cwebdir/common.w"
 
-#line 438 "cwebdir/comm-w2c.ch"
-make_xrefs= true;
-temporary_output= true;
-#line 1150 "cwebdir/common.w"
-show_stats= false;
+#line 448 "cwebdir/comm-w2c.ch"
+make_xrefs= check_for_change= true;
+#line 1144 "cwebdir/common.w"
 
 /*: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 595 "cwebdir/comm-w2c.ch"
 
 scan_args();
 if(program==ctangle){
@@ -584,16 +586,16 @@
 if((tex_file= fopen(check_file_name,"wb"))==NULL)
 fatal(_("! Cannot open output file "),check_file_name);
 }
-#line 1300 "cwebdir/common.w"
+#line 1290 "cwebdir/common.w"
 
-#line 628 "cwebdir/comm-w2c.ch"
+#line 630 "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 +607,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 +621,7 @@
 }
 
 /*:23*//*27:*/
-#line 231 "cwebdir/common.w"
+#line 227 "cwebdir/common.w"
 
 static void
 prime_the_change_buffer(void)
@@ -626,7 +628,7 @@
 {
 change_limit= change_buffer;
 /*29:*/
-#line 247 "cwebdir/common.w"
+#line 243 "cwebdir/common.w"
 
 while(true){
 change_line++;
@@ -639,16 +641,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 +657,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 +664,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 +675,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 +693,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 +705,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 +719,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 +727,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 +739,7 @@
 }
 
 /*:31*/
-#line 326 "cwebdir/common.w"
+#line 323 "cwebdir/common.w"
 
 changing= false;cur_line++;
 while(!input_ln(cur_file)){
@@ -744,7 +746,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 +757,7 @@
 }
 
 /*:32*//*35:*/
-#line 362 "cwebdir/common.w"
+#line 359 "cwebdir/common.w"
 
 void
 reset_input(void)
@@ -762,13 +764,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 +777,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 +792,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 +811,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 +835,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 +846,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 +869,7 @@
 }
 
 /*:40*/
-#line 413 "cwebdir/common.w"
+#line 410 "cwebdir/common.w"
 
 if(changing&&include_depth==change_depth)goto restart;
 }
@@ -879,7 +881,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 +888,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 +911,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 +920,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 +938,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 +948,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 +969,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 +976,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 +989,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 +1004,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 +1020,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 +1029,7 @@
 }
 
 /*:52*//*53:*/
-#line 732 "cwebdir/common.w"
+#line 728 "cwebdir/common.w"
 
 void
 sprint_section_name(
@@ -1040,11 +1040,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 +1049,7 @@
 }
 
 /*:53*//*54:*/
-#line 753 "cwebdir/common.w"
+#line 746 "cwebdir/common.w"
 
 void
 print_prefix_name(
@@ -1065,7 +1062,7 @@
 }
 
 /*:54*//*56:*/
-#line 779 "cwebdir/common.w"
+#line 772 "cwebdir/common.w"
 
 static int web_strcmp(
 char*j,
@@ -1083,7 +1080,7 @@
 }
 
 /*:56*//*57:*/
-#line 808 "cwebdir/common.w"
+#line 801 "cwebdir/common.w"
 
 static name_pointer
 add_section_name(
@@ -1091,7 +1088,7 @@
 int c,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
@@ -1099,7 +1096,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 +1106,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 +1119,7 @@
 name_pointer p,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 char*s;
 name_pointer q= p+1;
@@ -1130,7 +1126,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 +1133,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 +1140,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 +1155,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 +1167,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 +1186,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 +1206,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 +1213,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 +1255,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 +1279,7 @@
 }
 
 /*:63*//*66:*/
-#line 1024 "cwebdir/common.w"
+#line 1016 "cwebdir/common.w"
 
 void
 err_print(
@@ -1292,7 +1288,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 +1295,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 +1310,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 +1324,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 +1334,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 +1343,7 @@
 #line 388 "cwebdir/comm-w2c.ch"
 
 /*88:*/
-#line 662 "cwebdir/comm-w2c.ch"
+#line 664 "cwebdir/comm-w2c.ch"
 
 if(C_file)fclose(C_file);
 if(tex_file)fclose(tex_file);
@@ -1360,16 +1356,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 +1376,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 1160 "cwebdir/common.w"
 
 static void
 scan_args(void)
@@ -1403,8 +1399,8 @@
 boolean found_web= false,found_change= false,found_out= false;
 
 
-#line 462 "cwebdir/comm-w2c.ch"
-
+#line 471 "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 +1407,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 1171 "cwebdir/common.w"
 while(--argc> 0){
 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 510 "cwebdir/comm-w2c.ch"
+#line 1250 "cwebdir/common.w"
 
+#line 514 "cwebdir/comm-w2c.ch"
 {
 if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
 
 /*95:*/
-#line 799 "cwebdir/comm-w2c.ch"
+#line 801 "cwebdir/comm-w2c.ch"
 
 cb_usagehelp(program==ctangle?CTANGLEHELP:
 program==cweave?CWEAVEHELP:CTWILLHELP,NULL);
@@ -1431,12 +1426,12 @@
 
 
 /*:95*/
-#line 514 "cwebdir/comm-w2c.ch"
+#line 517 "cwebdir/comm-w2c.ch"
 
 if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
 
 /*98:*/
-#line 846 "cwebdir/comm-w2c.ch"
+#line 849 "cwebdir/comm-w2c.ch"
 
 printversionandexit(cb_banner,
 program==ctwill?"Donald E. Knuth":"Silvio Levy and Donald E. Knuth",
@@ -1444,72 +1439,68 @@
 
 
 /*:98*/
-#line 517 "cwebdir/comm-w2c.ch"
+#line 520 "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 557 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1265 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 /*:81*/
 #line 532 "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 1253 "cwebdir/common.w"
 
-#line 555 "cwebdir/comm-w2c.ch"
+#line 557 "cwebdir/comm-w2c.ch"
 /*:80*/
-#line 1179 "cwebdir/common.w"
+#line 1172 "cwebdir/common.w"
 
 else{
 s= name_pos= *argv;dot_pos= NULL;
-#line 482 "cwebdir/comm-w2c.ch"
-while(*s){
+#line 488 "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 1179 "cwebdir/common.w"
 if(!found_web)/*77:*/
-#line 1206 "cwebdir/common.w"
+#line 1198 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1267 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1209 "cwebdir/common.w"
+#line 1201 "cwebdir/common.w"
 
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
@@ -1517,7 +1508,7 @@
 strcpy(web_file_name,*argv);
 *dot_pos= 0;
 }
-#line 1217 "cwebdir/common.w"
+#line 1209 "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 +1517,22 @@
 }
 
 /*:77*/
-#line 1188 "cwebdir/common.w"
+#line 1180 "cwebdir/common.w"
 
 else if(!found_change)/*78:*/
-#line 1224 "cwebdir/common.w"
+#line 1216 "cwebdir/common.w"
 
 {
 if(strcmp(*argv,"-")!=0){
 if(s-*argv> max_file_name_length-4)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1267 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1228 "cwebdir/common.w"
+#line 1220 "cwebdir/common.w"
 
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
@@ -1551,21 +1542,21 @@
 }
 
 /*:78*/
-#line 1189 "cwebdir/common.w"
+#line 1181 "cwebdir/common.w"
 
 else if(!found_out)/*79:*/
-#line 1236 "cwebdir/common.w"
+#line 1228 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1267 "cwebdir/common.w"
 
 
 /*:82*/
-#line 1239 "cwebdir/common.w"
+#line 1231 "cwebdir/common.w"
 
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
@@ -1585,36 +1576,36 @@
 }
 
 /*:79*/
-#line 1190 "cwebdir/common.w"
+#line 1182 "cwebdir/common.w"
 
 else/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 557 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1265 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 /*:81*/
-#line 1191 "cwebdir/common.w"
+#line 1183 "cwebdir/common.w"
 
 }
 }
 if(!found_web)/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 557 "cwebdir/comm-w2c.ch"
 
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1275 "cwebdir/common.w"
+#line 1265 "cwebdir/common.w"
 
-#line 563 "cwebdir/comm-w2c.ch"
+#line 565 "cwebdir/comm-w2c.ch"
 /*:81*/
-#line 1194 "cwebdir/common.w"
+#line 1186 "cwebdir/common.w"
 
 }
 
 /*:75*//*97:*/
-#line 812 "cwebdir/comm-w2c.ch"
+#line 814 "cwebdir/comm-w2c.ch"
 
 static void cb_usage(const_string str)
 {
@@ -1635,6 +1626,7 @@
 textdomain("web2c-help");
 
 while(*message){
+
 printf("%s\n",strcmp("",*message)?_(*message):*message);
 ++message;
 }
@@ -1647,11 +1639,10 @@
 }
 
 /*:97*//*99:*/
-#line 854 "cwebdir/comm-w2c.ch"
+#line 857 "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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ChangeLog	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,3 +1,72 @@
+2021-04-13  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile,
+	* README,
+	* comm-{mac,mini,ql,w2c}.ch,
+	* comm-w2c.h,
+	* common.bux,
+	* common.c,
+	* common.h,
+	* common.w,
+	* ctang-{bs,pc,ql,vms,w2c,w32}.ch,
+	* ctangle.c,
+	* ctangle.w,
+	* ctwill.bux,
+	* ctwill-{mini,w2c}.ch,
+	* cweav-{bs,pc,ql,vms,w2c,w32}.ch,
+	* cweave.w,
+	* cwebmac.tex,
+	* cwebman-w2c.ch,
+	* cwebman.tex,
+	* po/cweb[-tl].pot,
+	* po/de/cweb[-tl].po,
+	* po/it/cweb.po,
+	* system.bux: CWEB 4.3 and CWEBbin 2021.
+
+2021-03-26  Andreas Scherer  <https://ascherer.github.io>
+
+	* common.w,
+	* ctangle.c,
+	* ctangle.w,
+	* ctwill-mini.ch,
+	* ctwill-w2c.ch,
+	* cweav-w2c.ch,
+	* cweave.w,
+	* prod-twill.w,
+	* prod.w: Parameter indentation for modern function headers.
+
+2021-03-19  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile,
+	* README,
+	* comm-{bs,mac}.ch,
+	* comm-w2c.h,
+	* common.h,
+	* common.w,
+	* ctang-w2c.ch,
+	* ctangle.c,
+	* ctangle.w,
+	* ctwill-mini.ch,
+	* ctwill-w2c.ch,
+	* cweav-bs.ch,
+	* cweav-w2c.ch,
+	* cweave.w,
+	* cwebmac.tex,
+	* cwebman.tex,
+	* prod-twill.w,
+	* prod.w: Incorporate C++ material by @texdraft.
+
+2021-03-09  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile,
+	* refsort.ch,
+	* twinx.ch: Patch refsort and twinx with changefiles.
+
+	* resort.w,
+	* twinx.w: Revert to original form from the CTWILL tarball.
+
+	* twinx-startup.tex: Add example template for 'twinx'.
+
 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/Makefile	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/README	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 May 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 +
@@ -239,8 +239,8 @@
 @z
 
 @x
-  kk=getenv("CWEBINPUTS");
-  if (kk!=NULL) {
+  if ((kk=getenv("CWEBINPUTS"))!=NULL) {
+ at .CWEBINPUTS@>
     if ((l=strlen(kk))>max_file_name_length-2) too_long();
     strcpy(temp_file_name,kk);
   }
@@ -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| */
@@ -433,10 +443,9 @@
 @z
 
 @x
-show_banner=show_happiness=show_progress=make_xrefs=true;@/
+show_banner=show_happiness=show_progress=make_xrefs=true;
 @y
-make_xrefs=true;@/
-temporary_output=true; /* Check temporary output for changes */
+make_xrefs=check_for_change=true;
 @z
 
 @x
@@ -459,7 +468,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 +475,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 +508,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 +520,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 +627,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 +831,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 +857,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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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);@/
@@ -193,7 +197,7 @@
 @d harmless_message 1 /* |history| value when non-serious info was printed */
 @d error_message 2 /* |history| value when an error was noted */
 @d fatal_message 3 /* |history| value when we had to stop prematurely */
- at d mark_harmless {if (history==spotless) history=harmless_message;}
+ at d mark_harmless if (history==spotless) history=harmless_message
 @d mark_error history=error_message
 @d confusion(s) fatal(_("! This can't happen: "),s)
 @.This can't happen@>
@@ -210,10 +214,10 @@
 @ Code related to command line arguments:
 @d show_banner flags['b'] /* should the banner line be printed? */
 @d show_progress flags['p'] /* should progress reports be printed? */
+ at d show_happiness flags['h'] /* should lack of errors be announced? */
 @d show_stats flags['s'] /* should statistics be printed at end of run? */
- at 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/common.c	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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
@@ -61,7 +67,7 @@
 #define harmless_message 1
 #define error_message 2
 #define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_harmless if(history==spotless) history= harmless_message
 #define mark_error history= error_message
 #define confusion(s) fatal("! This can't happen: ",s)  \
  \
@@ -68,16 +74,13 @@
 
 #define show_banner flags['b']
 #define show_progress flags['p']
+#define show_happiness flags['h']
 #define show_stats flags['s']
-#define show_happiness flags['h']
 #define make_xrefs flags['x'] \
 
 #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 1272 "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 1189 "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,23 @@
 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 1279 "common.w"
 
 scan_args();
 if(program==ctangle){
@@ -443,12 +446,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 +473,7 @@
 }
 
 /*:23*//*27:*/
-#line 231 "common.w"
+#line 227 "common.w"
 
 static void
 prime_the_change_buffer(void)
@@ -477,7 +480,7 @@
 {
 change_limit= change_buffer;
 /*29:*/
-#line 247 "common.w"
+#line 243 "common.w"
 
 while(true){
 change_line++;
@@ -494,10 +497,10 @@
 }
 
 /*:29*/
-#line 236 "common.w"
+#line 232 "common.w"
 
 /*30:*/
-#line 264 "common.w"
+#line 260 "common.w"
 
 do{
 change_line++;
@@ -509,10 +512,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 +523,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 +541,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 +551,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 +569,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 +581,7 @@
 }
 
 /*:31*/
-#line 326 "common.w"
+#line 323 "common.w"
 
 changing= false;cur_line++;
 while(!input_ln(cur_file)){
@@ -594,7 +597,7 @@
 }
 
 /*:32*//*35:*/
-#line 362 "common.w"
+#line 359 "common.w"
 
 void
 reset_input(void)
@@ -601,7 +604,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 +618,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 +634,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 +665,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 +688,7 @@
 }
 
 /*:40*/
-#line 413 "common.w"
+#line 410 "common.w"
 
 if(changing&&include_depth==change_depth)goto restart;
 }
@@ -706,11 +709,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=='"'){
@@ -726,8 +729,8 @@
 cur_line= 0;print_where= true;
 goto restart;
 }
-kk= getenv("CWEBINPUTS");
-if(kk!=NULL){
+if((kk= getenv("CWEBINPUTS"))!=NULL){
+
 if((l= strlen(kk))> max_file_name_length-2)too_long();
 strcpy(temp_file_name,kk);
 }
@@ -754,7 +757,7 @@
 }
 
 /*:39*/
-#line 432 "common.w"
+#line 429 "common.w"
 
 }
 return true;
@@ -761,7 +764,7 @@
 }
 
 /*:38*//*42:*/
-#line 546 "common.w"
+#line 543 "common.w"
 
 void
 check_complete(void){
@@ -775,7 +778,7 @@
 }
 
 /*:42*//*48:*/
-#line 639 "common.w"
+#line 636 "common.w"
 
 name_pointer
 id_lookup(
@@ -790,7 +793,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 +800,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 +813,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 +826,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 +842,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 +851,7 @@
 }
 
 /*:52*//*53:*/
-#line 732 "common.w"
+#line 728 "common.w"
 
 void
 sprint_section_name(
@@ -861,11 +862,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 +871,7 @@
 }
 
 /*:53*//*54:*/
-#line 753 "common.w"
+#line 746 "common.w"
 
 void
 print_prefix_name(
@@ -886,7 +884,7 @@
 }
 
 /*:54*//*56:*/
-#line 779 "common.w"
+#line 772 "common.w"
 
 static int web_strcmp(
 char*j,
@@ -904,7 +902,7 @@
 }
 
 /*:56*//*57:*/
-#line 808 "common.w"
+#line 801 "common.w"
 
 static name_pointer
 add_section_name(
@@ -912,7 +910,7 @@
 int c,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
@@ -928,14 +926,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 +939,7 @@
 name_pointer p,
 char*first,
 char*last,
-int ispref)
+boolean ispref)
 {
 char*s;
 name_pointer q= p+1;
@@ -959,14 +956,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 +971,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 +998,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 +1023,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 +1040,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 +1059,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 +1083,7 @@
 }
 
 /*:63*//*66:*/
-#line 1024 "common.w"
+#line 1016 "common.w"
 
 void
 err_print(
@@ -1095,7 +1092,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 +1103,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 +1112,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 +1125,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 +1146,7 @@
 }
 
 /*:68*//*70:*/
-#line 1102 "common.w"
+#line 1096 "common.w"
 void
 fatal(
 const char*s,const char*t)
@@ -1158,7 +1157,7 @@
 }
 
 /*:70*//*71:*/
-#line 1113 "common.w"
+#line 1107 "common.w"
 void
 overflow(
 const char*t)
@@ -1168,7 +1167,7 @@
 
 
 /*:71*//*75:*/
-#line 1167 "common.w"
+#line 1160 "common.w"
 
 static void
 scan_args(void)
@@ -1182,35 +1181,32 @@
 strcpy(change_file_name,"/dev/null");
 while(--argc> 0){
 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 1258 "common.w"
+#line 1250 "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 1172 "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 1198 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 1276 "common.w"
+#line 1266 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1209 "common.w"
+#line 1201 "common.w"
 
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
@@ -1227,21 +1223,21 @@
 }
 
 /*:77*/
-#line 1188 "common.w"
+#line 1180 "common.w"
 
 else if(!found_change)/*78:*/
-#line 1224 "common.w"
+#line 1216 "common.w"
 
 {
 if(strcmp(*argv,"-")!=0){
 if(s-*argv> max_file_name_length-4)
 /*82:*/
-#line 1276 "common.w"
+#line 1266 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1228 "common.w"
+#line 1220 "common.w"
 
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
@@ -1251,20 +1247,20 @@
 }
 
 /*:78*/
-#line 1189 "common.w"
+#line 1181 "common.w"
 
 else if(!found_out)/*79:*/
-#line 1236 "common.w"
+#line 1228 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
 /*82:*/
-#line 1276 "common.w"
+#line 1266 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
 /*:82*/
-#line 1239 "common.w"
+#line 1231 "common.w"
 
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
@@ -1284,10 +1280,10 @@
 }
 
 /*:79*/
-#line 1190 "common.w"
+#line 1182 "common.w"
 
 else/*81:*/
-#line 1264 "common.w"
+#line 1254 "common.w"
 
 {
 if(program==ctangle)
@@ -1301,12 +1297,12 @@
 }
 
 /*:81*/
-#line 1191 "common.w"
+#line 1183 "common.w"
 
 }
 }
 if(!found_web)/*81:*/
-#line 1264 "common.w"
+#line 1254 "common.w"
 
 {
 if(program==ctangle)
@@ -1320,7 +1316,7 @@
 }
 
 /*:81*/
-#line 1194 "common.w"
+#line 1186 "common.w"
 
 }
 

Modified: trunk/Build/source/texk/web2c/cwebdir/common.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.h	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/common.h	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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);@/
@@ -175,7 +179,7 @@
 @d harmless_message 1 /* |history| value when non-serious info was printed */
 @d error_message 2 /* |history| value when an error was noted */
 @d fatal_message 3 /* |history| value when we had to stop prematurely */
- at d mark_harmless {if (history==spotless) history=harmless_message;}
+ at d mark_harmless if (history==spotless) history=harmless_message
 @d mark_error history=error_message
 @d confusion(s) fatal("! This can't happen: ",s)
 @.This can't happen@>
@@ -192,8 +196,8 @@
 @ Code related to command line arguments:
 @d show_banner flags['b'] /* should the banner line be printed? */
 @d show_progress flags['p'] /* should progress reports be printed? */
+ at d show_happiness flags['h'] /* should lack of errors be announced? */
 @d show_stats flags['s'] /* should statistics be printed at end of run? */
- at d show_happiness flags['h'] /* should lack of errors be announced? */
 @d make_xrefs flags['x'] /* should cross references be output? */
 
 @<Common code...@>=
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/common.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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;
@@ -448,10 +445,10 @@
 @d too_long() {include_depth--;
         err_print("! Include file name too long"); goto restart;}
 
- at .CWEBINPUTS@>@<Try to open...@>= {
+@<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=='"') {
@@ -467,8 +464,8 @@
     cur_line=0; print_where=true;
     goto restart; /* success */
   }
-  kk=getenv("CWEBINPUTS");
-  if (kk!=NULL) {
+  if ((kk=getenv("CWEBINPUTS"))!=NULL) {
+ at .CWEBINPUTS@>
     if ((l=strlen(kk))>max_file_name_length-2) too_long();
     strcpy(temp_file_name,kk);
   }
@@ -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");
@@ -704,7 +702,7 @@
 to additional chunks in the same way. Null links are represented by
 |name_dir|.
 
- at d first_chunk(p)  ((p)->byte_start+2)
+ at d first_chunk(p) ((p)->byte_start+2)
 @d prefix_length(p) (int)((eight_bits)*((p)->byte_start)*256 +
                 (eight_bits)*((p)->byte_start+1))
 @d set_prefix_length(p,m) (*((p)->byte_start)=(m)/256,
@@ -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.
@@ -1146,8 +1140,7 @@
 should be set before calling |common_init|.
 
 @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>=
-show_banner=show_happiness=show_progress=make_xrefs=true;@/
-show_stats=false;
+show_banner=show_happiness=show_progress=make_xrefs=true;
 
 @ We now must look at the command line arguments and set the file names
 accordingly.  At least one file name must be present: the \.{CWEB}
@@ -1179,14 +1172,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 +1248,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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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;
@@ -464,7 +464,7 @@
   fatal(_("! Cannot open output file "),check_file_name);
 @.Cannot open output file@>
 
-@* Put ``version'' information in a single spot.
+@* Print ``version'' information.
 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/ctang-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.c	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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
@@ -63,7 +69,7 @@
 #define harmless_message 1
 #define error_message 2
 #define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_harmless if(history==spotless) history= harmless_message
 #define mark_error history= error_message
 #define confusion(s) fatal("! This can't happen: ",s)  \
  \
@@ -70,16 +76,13 @@
 
 #define show_banner flags['b']
 #define show_progress flags['p']
+#define show_happiness flags['h']
 #define show_stats flags['s']
-#define show_happiness flags['h']
 #define make_xrefs flags['x'] \
 
 #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,10 +480,11 @@
 }
 
 /*:58*//*63:*/
-#line 773 "ctangle.w"
+#line 778 "ctangle.w"
 {
 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['@']= '@';ccode['=']= string;
@@ -497,10 +498,9 @@
 ccode['&']= join;
 ccode['<']= ccode['(']= section_name;
 ccode['\'']= ord;
-}
 
 /*: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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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}' */
@@ -773,20 +778,20 @@
 @ @<Set ini...@>= {
   int c; /* must be |int| so the |for| loop will end */
   for (c=0; c<256; c++) ccode[c]=ignore;
-  ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']
-   =ccode['*']=new_section;
-  ccode['@@']='@@'; ccode['=']=string;
-  ccode['d']=ccode['D']=definition;
-  ccode['f']=ccode['F']=ccode['s']=ccode['S']=format_code;
-  ccode['c']=ccode['C']=ccode['p']=ccode['P']=begin_C;
-  ccode['^']=ccode[':']=ccode['.']=ccode['t']=ccode['T']=
-   ccode['q']=ccode['Q']=control_text;
-  ccode['h']=ccode['H']=output_defs_code;
-  ccode['l']=ccode['L']=translit_code;
-  ccode['&']=join;
-  ccode['<']=ccode['(']=section_name;
-  ccode['\'']=ord;
 }
+ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']
+  =ccode['*']=new_section;
+ccode['@@']='@@'; ccode['=']=string;
+ccode['d']=ccode['D']=definition;
+ccode['f']=ccode['F']=ccode['s']=ccode['S']=format_code;
+ccode['c']=ccode['C']=ccode['p']=ccode['P']=begin_C;
+ccode['^']=ccode[':']=ccode['.']=ccode['t']=ccode['T']=
+ccode['q']=ccode['Q']=control_text;
+ccode['h']=ccode['H']=output_defs_code;
+ccode['l']=ccode['L']=translit_code;
+ccode['&']=join;
+ccode['<']=ccode['(']=section_name;
+ccode['\'']=ord;
 
 @ The |skip_ahead| procedure reads through the input at fairly high speed
 until finding the next non-ignorable control code, which it returns.
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -14,111 +14,110 @@
 @z
 
 @x
- at d banner "This is CTWILL, Version 4.2"
+A kind of ``user manual'' for \.{CTWILL} can be found in the appendix
+{\bf 272.~Mogrify \.{CWEAVE} into \.{CTWILL}} and beyond, together
+with additional material specific to \.{CTWILL}. % FIXME
+Until then, \.{CWEAVE}'s sequence of sections will be preserved.
+
+The ``banner line'' defined here should be changed whenever \.{CTWILL} is
 @y
+A kind of ``user manual'' for \.{CTWILL} can be found in section~\&{293}
+and beyond, together with additional material specific to \.{CTWILL}. % FIXME
 \bigskip
 {\font\itt=cmitt10 \font\bit=cmbxti10
-\noindent \bit Editor's Note: \it Although {\itt CTWILL} is based on
-{\itt cweave.w}, new and modified material is incorporated all over the place,
-without taking special care to keep the original section numbering intact.
+\noindent \bit Editor's Note: \it This heavily redacted version of
+{\itt ctwill.pdf} had to meddle with the section numbering of
+{\itt cweave.w}, spreading tabular material over several sections
+and splitting long sections into smaller chunks in order to
+fix overful pages---both horizontally and vertically---, to make
+the overall appearance of the {\itt CTWILL} documentation most
+pleasing to the readers'~eyes.
 \smallskip
-\noindent Moreover, this heavily redacted version of {\itt ctwill.pdf} had to
-meddle with the section numbering even more, spreading tabular material over
-several sections and splitting long sections into smaller chunks in order to
-fix overful pages---both horizontally and vertically---, to make the overall
-appearance of the {\itt CTWILL} documentation most pleasing to the
-readers'~eyes.
-\smallskip
 \noindent Please do not try to compare this {\itt ctwill.pdf} to the one
 created by {\itt CWEAVE} instead of {\itt CTWILL}; the section numbering will
-be even more ``off'' from {\itt cweave.w}.  Care has been taken to give a
+be quite ``off'' from {\itt cweave.w}.  Care has been taken to give a
 faithful overall rendering of {\itt CTWILL}'s code, though. \hfill
----Enjoy!\bigskip}
-
- at d banner "This is CTWILL, Version 4.2"
+---Enjoy!\par}
+\bigskip
+The ``banner line'' defined here should be changed whenever \.{CTWILL} is
+ at -banner@>
+@$banner {CTWILL}1 =\.{"This\ is\ CTWILL"}@>
 @z
 
 Section 2.
 
 @x
-@ Here is a sort of user manual for \.{CTWILL}---which is exactly like
+@ \.{CWEAVE} has a fairly straightforward outline.  It operates in
 @y
-@* \.{CTWILL} user manual.
-Here is a sort of user manual for \.{CTWILL}---which is exactly like
+ at r @ \.{CWEAVE} has a fairly straightforward outline.  It operates in
+@%
+@$show_banner {CTWILL}14 =\\{flags}[\.{'b'}]@>
+@$show_progress {CTWILL}14 =\\{flags}[\.{'p'}]@>
 @z
 
- at x
-give it the necessary hints in other places via your change file.
- at y
-give it the necessary hints in other places via your change file.
- at -f@>
- at -x@>
- at z
+Section 4.
 
-Section 3.
-
 @x
-The current meaning of every identifier is initially `\.{\\uninitialized}'.
- at y
-@ The current meaning of every identifier is initially `\.{\\uninitialized}'.
- at z
+ at d _(S) gettext(S)
 
- at x
-must have fewer than 50 characters. If the \TeX\ part starts
+@<Include files@>=
 @y
-must have fewer than 50 characters.
+ at d _(S) gettext(S)
+ at -S@>
 
- at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
-
-@ If the \TeX\ part starts
+@<Include files@>=
+ at -A@>
+ at -HAVE_GETTEXT@>
 @z
 
-Section 4.
+Section 5.
 
 @x
- at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
+ at d compress(c) if (loc++<=limit) return c
 @y
+ at d compress(c) if (loc++<=limit) return c
+ at -c@>
 @z
 
-Section 5.
+Section 6.
 
 @x
-@ \.{CWEAVE} has a fairly straightforward outline.  It operates in
+@ Code related to input routines:
 @y
-@* Introduction (continued). \.{CWEAVE} has a fairly straightforward outline.
-It operates in
+ at r @ Code related to input routines:
+ at -c@>
 @z
 
 Section 7.
 
 @x
-internationalization.
+ at d cur_line line[include_depth] /* number of current line in current file */
 @y
-internationalization.
- at -A@>
- at -HAVE_GETTEXT@>
- at -S@>
+ at d cur_line line[include_depth] /* number of current line in current file */
+ at -cur_file@>
+ at -cur_file_name@>
+ at -cur_line@>
+@$cur_file {CTWILL}7 =\\{file}[\\{include\_depth}]@>
+@$cur_file_name {CTWILL}7 =\hfil\break\\{file\_name}[\\{include\_depth}]@>
+@$cur_line {CTWILL}7 =\\{line}[\\{include\_depth}]@>
 @z
 
-Section 9.
+Section 10.
 
 @x
-@ Code related to input routines:
- at y
-@ Code related to input routines:
- at -c@>
- at z
-
-Section 13.
-
- at x
 @ Code related to identifier and section name storage:
 @y
 @ Code related to identifier and section name storage:
 @-c@>
+ at -llink@>
+ at -rlink@>
+ at -root@>
+@$llink {CTWILL}10 =\\{link}@>
+@$rlink {CTWILL}10 =\\{dummy}.\\{Rlink}@>
+@$root {CTWILL}10 =\\{name\_dir}$\MG$\\{rlink}@>
 @z
 
-Section 15.
+Section 12.
 
 @x
 @ Code related to error handling:
@@ -127,15 +126,27 @@
 @-s@>
 @z
 
-Section 17.
+Section 14.
 
 @x
 extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
 @y
 extern const char *use_language; /* prefix to \.{ctwimac.tex} in \TEX/ output */
+ at -show_banner@>
+ at -show_progress@>
+ at -show_happiness@>
+ at -show_stats@>
+ at -make_xrefs@>
+ at -check_for_change@>
+@$show_banner {CTWILL}14 =\\{flags}[\.{'b'}]@>
+@$show_progress {CTWILL}14 =\\{flags}[\.{'p'}]@>
+@$show_happiness {CTWILL}14 =\\{flags}[\.{'h'}]@>
+@$show_stats {CTWILL}14 =\\{flags}[\.{'s'}]@>
+@$make_xrefs {CTWILL}14 =\\{flags}[\.{'x'}]@>
+@$check_for_change {CTWILL}14 =\\{flags}[\.{'c'}]@>
 @z
 
-Section 18.
+Section 15.
 
 @x
 @ Code related to output:
@@ -144,44 +155,74 @@
 @-a@>
 @-b@>
 @-c@>
+ at -update_terminal@>
+ at -new_line@>
+@$update_terminal {CTWILL}15 =\\{fflush}(\\{stdout})@>
+@$new_line {CTWILL}15 =\\{putchar}(\.{'\\n'})@>
 @z
 
-Section 23.
+Section 16.
 
 @x
+@ The procedure that gets everything rolling:
+ at y
+ at r @ The procedure that gets everything rolling:
+ at z
+
+Section 17.
+
+ at x
+ at d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
+ at y
+ at d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
+ at -long_buf_size@>
+@$long_buf_size {CTWILL}17 =$\\{buf\_size}+\\{longest\_name}$@>
+ at z
+
+Section 20.
+
+ at x
 @* Data structures exclusive to {\tt CWEAVE}.
 @y
 @* Data structures exclusive to {\tt CWEAVE}.
 @-a@>
+ at -ilk@>
+@$ilk {CTWILL}20 =\\{dummy}.\\{Ilk}@>
 @z
 
-Section 25.
+Section 21.
 
 @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 22.
 
 @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 24.
 
 @x
-@ The |new_meaning| routine changes the current ``permanent meaning''
+ at d file_flag (3*cite_flag)
 @y
- at r @ The |new_meaning| routine changes the current ``permanent meaning''
+ at -file_flag@>
+ at -def_flag@>
+ at -xref@>
+@$file_flag {CTWILL}24 =$\T{3}*\\{cite\_flag}{}$@>
+@$def_flag {CTWILL}24 =$\T{2}*\\{cite\_flag}{}$@>
+@$xref {CTWILL}24 =\\{equiv\_or\_xref}@>
+ at d file_flag (3*cite_flag)
 @z
 
-Section 35.
+Section 25.
 
 @x
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -189,34 +230,41 @@
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
 @-a@>
 @-c@>
+ at -p@>
+ at -no_xref@>
+@$no_xref {CTWILL}25 =$\R\\{make\_xrefs}$@>
 @z
 
-Section 44.
+Section 36.
 
 @x
-@ We have to get \CEE/'s
+ at d underline '\n' /* this code will be intercepted without confusion */
 @y
- at r @ We have to get \CEE/'s
+ at d underline '\n' /* this code will be intercepted without confusion */
+ at -begin_comment@>
+ at -underline@>
+@$begin_comment {CTWILL}36 =\.{'\\t'}@>
+@$underline {CTWILL}36 =\.{'\\n'}@>
 @z
 
-Section 45.
+Section 37.
 
 @x
-id_lookup("goto",NULL,case_like);
+@ Control codes are converted to \.{CWEAVE}'s internal
 @y
-@ @<Store all...@>=
-id_lookup("goto",NULL,case_like);
+ at r @ Control codes are converted to \.{CWEAVE}'s internal
 @z
 
-Section 49.
+Section 41.
 
 @x
-@ Control codes are converted to \.{CWEAVE}'s internal
+    if (loc++ <=limit) { int c=ccode[(eight_bits)*loc++];
 @y
- at r @ Control codes are converted to \.{CWEAVE}'s internal
+    if (loc++ <=limit) { int c=ccode[(eight_bits)*loc++];
+ at -c@>
 @z
 
-Section 55.
+Section 43.
 
 @x
 \yskip\hang |xref_roman|, |xref_wildcard|, |xref_typewriter|, |TeX_string|,
@@ -241,7 +289,7 @@
 preceded by \.{@@(} instead of \.{@@<}.\par}
 @z
 
-Section 56.
+Section 44.
 
 @x
 @ As one might expect, |get_next| consists mostly of a big switch
@@ -248,43 +296,122 @@
 @y
 @ As one might expect, |get_next| consists mostly of a big switch
 @-c@>
+@$c {CTWILL}44 \&{eight\_bits}@>
 @z
 
-Section 63.
+Section 46.
 
 @x
-@ The following code assigns values to the combinations \.{++},
+ at d left_preproc ord /* begins a preprocessor command */
 @y
-@ The following code assigns values to the combinations \.{++},
- at -c@>
+ at -left_preproc@>
+@$left_preproc {CTWILL}46 =\\{ord}@>
+ at d left_preproc ord /* begins a preprocessor command */
 @z
 
-Section 66.
+Section 51.
 
 @x
-@<Get a string@>= {
+              if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
 @y
-@<Get a string@>= {@+
+              if (*(loc+1)=='*') {@+loc++;@+compress(minus_gt_ast);@+}
 @z
 
-Section 70.
+ at x
+            else if (*loc=='.' && *(loc+1)=='.') {
+              loc++;@+compress(dot_dot_dot);
+            } break;
+ at y
+            else if (*loc=='.' && *(loc+1)=='.') {@+
+              loc++;@+compress(dot_dot_dot);@+
+            } break;
+ at z
 
+Section 52.
+
 @x
-@ @<Put section name...@>=
+  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;
+}
 @y
- at r @ @<Put section name...@>=
+  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;
+}
 @z
 
-Section 84.
+Section 53.
 
 @x
+ at d gather_digits_while(t) while (t || *loc=='\'')
+ at y
+ at d gather_digits_while(t) while (t || *loc=='\'')
+ at -t@>
+ at z
+
+Section 55.
+
+ at x
+@ @<Get a bin...@>={
+ at y
+ at r @ @<Get a bin...@>={
+ at z
+
+Section 58.
+
+ at x
+@ @<Get a wide...@>={
+ at y
+ at r @ @<Get a wide...@>={
+ at z
+
+Section 63.
+
+ at x
+@ @<If end of name...@>=
+ at y
+ at r @ @<If end of name...@>=
+ at z
+
+Section 72.
+
+ 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
+
+ at 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 73.
+
+ 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.
 @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
+Thus, it handles \CEE/ text with embedded comments.
 @z
 
-Section 91.
+Section 80.
 
 @x
 @ Finally, when the \TEX/ and definition parts have been treated, we have
@@ -294,16 +421,19 @@
 \hfil\break|next_control>=begin_C|.
 @z
 
-Section 97.
+Section 86.
 
 @x
 @ The |flush_buffer| routine empties the buffer up to a given breakpoint,
 @y
 @ The |flush_buffer| routine empties the buffer up to a given breakpoint,
+ at -b@>
 @-c@>
+ at -tex_new_line@>
+@$tex_new_line {CTWILL}86 =$\\{putc}(\.{'\\n'},\39\\{active\_file})$@>
 @z
 
-Section 99.
+Section 88.
 
 @x
 @ When we are copying \TEX/ source material, we retain line breaks
@@ -311,24 +441,27 @@
 @r @ When we are copying \TEX/ source material, we retain line breaks
 @z
 
-Section 101.
+Section 89.
 
 @x
-@ When we wish to append one character |c| to the output buffer, we write
+ at d proofing flags['P']
 @y
-@ When we wish to append one character |c| to the output buffer, we write
- at -c@>
+ at d proofing flags['P']
+ at -proofing@>
+@$proofing {CTWILL}89 =\\{flags}[\.{'P'}]@>
 @z
 
-Section 105.
+Section 90.
 
 @x
-@ We get to this section only in the unusual case that the entire output line
+@ When we wish to append one character |c| to the output buffer, we write
 @y
- at r @ We get to this section only in the unusual case that the entire output line
+@ When we wish to append one character |c| to the output buffer, we write
+ at -c@>
+ at -s@>
 @z
 
-Section 111.
+Section 100.
 
 @x
 @ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
@@ -336,18 +469,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 101.
 
-Section 112.
-
 @x
 @ The |copy_comment| function issues a warning if more braces are opened than
 @y
@@ -356,16 +479,12 @@
 @z
 
 @x
-int bal at t\2\2@>) /* brace balance */
-{
-  char c; /* current character being copied */
+      } else {
 @y
-int bal at t\2\2@>) /* brace balance */
-{@+
-  char c; /* current character being copied */
+      } @+ else {
 @z
 
-Section 117.
+Section 106.
 
 @x
 @ Here is a list of the category codes that scraps can have.
@@ -373,7 +492,7 @@
 @r @ Here is a list of the category codes that scraps can have.
 @z
 
-Section 121.
+Section 110--111.
 
 @x
 @ The token lists for translated \TEX/ output contain some special control
@@ -382,8 +501,6 @@
 @-n@>
 @z
 
-Section 122.
-
 @x
 \yskip\noindent All of these tokens are removed from the \TEX/ output that
 @y
@@ -391,7 +508,7 @@
 @-n@>
 @z
 
-Section 123.
+Section 112--117.
 
 @x
 @ The raw input is converted into scraps according to the following table,
@@ -409,12 +526,20 @@
 \yskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 124.
+ at x
+\./&|binop|: \./&yes\cr
+ at y
+\./&|binop|: \./&yes\cr}
 
+@ Cont.
+
+\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
+ at z
+
 @x
-\.>&|prerangle|: \.{\\rangle}&yes\cr
+\.{complex}&|int_like|: \stars&yes\cr
 @y
-\.>&|prerangle|: \.{\\rangle}&yes\cr}
+\.{complex}&|int_like|: \stars&yes\cr}
 
 @ Cont.
 
@@ -421,24 +546,20 @@
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 125.
-
 @x
-\.{continue}&|case_like|: \stars&maybe\cr
+\.{friend}&|int_like|: \stars&maybe\cr
 @y
-\.{continue}&|case_like|: \stars&maybe\cr}
+\.{friend}&|int_like|: \stars&maybe\cr}
 
- at r @ Cont.
+@ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 126.
-
 @x
-\.{long}&|raw_int|: \stars&maybe\cr
+\.{static\_cast}&|raw_int|: \stars&maybe\cr
 @y
-\.{long}&|raw_int|: \stars&maybe\cr}
+\.{static\_cast}&|raw_int|: \stars&maybe\cr}
 
 @ Cont.
 
@@ -445,24 +566,23 @@
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Section 127.
-
 @x
-\.{try}&|else_like|: \stars&maybe\cr
+\.{xor\_eq}&|alfop|: \stars&yes\cr
 @y
-\.{try}&|else_like|: \stars&maybe\cr}
+\.{xor\_eq}&|alfop|: \stars&yes\cr}
 
- at r @ Cont.
+@ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
 @z
 
-Sections 128--135.
+Sections 118--126.
 
 @x l.7 line numbers refer to 'prod.w'
 @ Here is a table of all the productions.  Each production that
 @y
 @* Table of all productions.  Each production that
+ at -time@>
 @z
 
 TeX reports 'extra \fi' when running on twilled 'ctwill.w'.
@@ -473,6 +593,8 @@
 \newcount\prodno \newdimen\midcol \let\+\relax
 @z
 
+Section 119.
+
 @x l.78
 \+& |lpar| |rpar| & |exp| \hfill $L\.{\\,}R$ & functions, declarations\cr
 @y
@@ -489,9 +611,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
@@ -504,6 +626,8 @@
   \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
 @z
 
+Section 120.
+
 @x l.45
          |int_like| \alt|raw_int| |struct_like| & |extern "Ada" int|\cr
 @y
@@ -519,9 +643,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
@@ -534,6 +658,8 @@
   \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
 @z
 
+Section 121.
+
 @x l.75
               \&{struct} \&{name\_info} $\{$\cr
 @y
@@ -540,7 +666,7 @@
               \&{struct} \&{name\_info} $\{$\cr
 \endgroup
 
- at r @ Cont. at -z@>@-in@>
+ at r @ Cont. at -z@>@-in@>@-x@>
 \begingroup \lineskip=4pt
 \def\alt #1 #2
 {$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
@@ -549,11 +675,11 @@
 {$\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@>
+\yskip at -in@>@-x@>
 \prodno=47 \midcol=2.5in
 \def\theprodno{\number\prodno \global\advance\prodno by1\enspace}
 \def\dagit{\dag\theprodno}
@@ -564,10 +690,12 @@
   \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
 @z
 
+Section 122.
+
 @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 +707,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
@@ -595,6 +723,8 @@
 \advance\midcol20pt
 @z
 
+Section 123.
+
 @x l.211
 \+& |prerangle| & |binop| \hfill \.> & $>$ not in template\cr
 @y
@@ -610,9 +740,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
@@ -625,6 +755,8 @@
   \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
 @z
 
+Section 124.
+
 @x l.232
 \+\dagit& |new_exp| & |exp| & |new int;|\cr
 @y
@@ -632,6 +764,12 @@
 \endgroup
 
 @ Cont.
+ at -deprecated@>
+ at -fallthrough@>
+ at -likely@>
+ at -nodiscard@>
+ at -unlikely@>
+ at -s@>
 \begingroup \lineskip=4pt
 \def\alt #1 #2
 {$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
@@ -640,9 +778,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 +807,61 @@
 @y
 @z
 
- at x l.272
-\+& |any_other| |end_arg| & |end_arg| &    \&{char}$*$\.{@@]}\cr
+Section 125.
+
+ 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@>
+ at -y@>
+\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
+
+Section 126.
+
+ 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 +873,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 127.
 
 @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,26 +894,46 @@
 the category codes |pp->cat|, |(pp+1)->cat|, $\,\ldots\,$
 @z
 
-Section 139.
+Section 128.
 
 @x
-@ Token lists in |@!tok_mem| are composed of the following kinds of
+@ @d trans trans_plus.Trans /* translation texts of scraps */
 @y
-@ Token lists in |@!tok_mem| are composed of the following kinds of
- at -p@>
+@ @d trans trans_plus.Trans /* translation texts of scraps */
+ at -trans@>
+@$trans {CTWILL}128 =\\{trans\_plus}.\\{Trans}@>
 @z
 
-Section 141.
+Section 129.
 
 @x
-@ @<Print token |r|...@>=
+null_scrap.trans=&tok_start[0];
+scrap_base=scrap_info+1;
 @y
- at r @ @<Print token |r|...@>=
+null_scrap.trans=&tok_start[0];@/
+scrap_base=scrap_info+1;@/
 @z
 
-Section 142.
+Section 130.
 
 @x
+@ Token lists in |@!tok_mem| are composed of the following kinds of
+ at y
+@ Token lists in |@!tok_mem| are composed of the following kinds of
+ at -p@>
+ at -res_flag@>
+ at -section_flag@>
+ at -tok_flag@>
+ at -inner_tok_flag@>
+@$res_flag {CTWILL}130 =$\T{2}*\\{id\_flag}$@>
+@$section_flag {CTWILL}130 =$\T{3}*\\{id\_flag}$@>
+@$tok_flag {CTWILL}130 =$\T{3}*\\{id\_flag}$@>
+@$inner_tok_flag {CTWILL}130 =$\T{4}*\\{id\_flag}$@>
+ at z
+
+Section 133.
+
+ 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 +946,7 @@
 @-pp@>
 @z
 
-Section 143.
+Section 134.
 
 @x
 The code below is an exact translation of the production rules into
@@ -746,19 +953,39 @@
 @y
 @r @ The code below is an exact translation of the production rules into
 @-a@>
+ at -c@>
+ at -p@>
 @z
 
-Section 146.
+Section 137--138.
 
 @x
 @ Let us consider the big switch for productions now, before looking
 @y
 @r @ Let us consider the big switch for productions now, before looking
+ at -cat1@>
+ at -cat2@>
+ at -cat3@>
+@$cat1 {CTWILL}137 =$(\\{pp}+\T{1})\MG\\{cat}$@>
+@$cat2 {CTWILL}137 =$(\\{pp}+\T{2})\MG\\{cat}$@>
+@$cat3 {CTWILL}137 =$(\\{pp}+\T{3})\MG\\{cat}$@>
 @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
+
+ at x
   switch (pp->cat) {
     case exp: @<Cases for |exp|@>@; @+break;
     case lpar: @<Cases for |lpar|@>@; @+break;
@@ -807,6 +1034,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 +1049,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,99 +1097,147 @@
     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 139.
 
 @x
-of identifiers in case labels.
+should say, for example, `\.{@@!@@\^\\\&\{operator\} \$+\{=\}\$@@>}' (or,
+more properly alpha\-betized,
+`\.{@@!@@:operator+=\}\{\\\&\{operator\} \$+\{=\}\$@@>}').
+ at y
+should say, for example, `\.{@@!@@\^\\\&\{operator\}} \.{\$+\{=\}\$@@>}'
+(or, properly alpha\-betized,
+`\.{@@!@@:operator+=\}\{\\\&\{operator\}} \.{\$+\{=\}\$@@>}').
+ at -no_ident_found@>
+ at -case_found@>
+ at -operator_found@>
+@$no_ident_found {CTWILL}139 =\hfil\break(\&{token\_pointer}) 0@>
+@$case_found {CTWILL}139 =\hfil\break(\&{token\_pointer}) 1@>
+@$operator_found {CTWILL}139 =\hfil\break(\&{token\_pointer}) 2@>
+ at z
 
-If the first identifier is the keyword `\&{operator}', we give up;
+Section 141.
+
+ at x
+the |for| loop below.
+
+We use the fact that |make_underlined| has been called immediately preceding
+|make_reserved|, hence |tok_loc| has been set.
 @y
-of identifiers in case labels.
-If the first identifier is the keyword `\&{operator}', we give up;
+the |for| loop below.
+We use the fact that |make_underlined| has been called immediately preceding
+|make_reserved|, hence |tok_loc| has been set.
 @z
 
-Section 150.
+ 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 142.
+
 @x
-@ The scraps currently being parsed must be inspected for any
+@ In the following situations we want to mark the occurrence of
 @y
- at r @ The scraps currently being parsed must be inspected for any
+ at r @ In the following situations we want to mark the occurrence of
 @z
 
 @x
-|make_reserved|, hence |tok_loc| has been set.
+make_underlined(
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p)
 @y
-\hfil\break|make_reserved|, hence |tok_loc| has been set.
+make_underlined(
+scrap_pointer p)
+/* underline the entry for the first identifier in |p->trans| */
 @z
 
-Section 154.
+Section 151.
 
 @x
-@ \.{CTWILL} needs the following procedure, which appends tokens of a
+@ @<Cases for |sizeof_like|@>=
 @y
- at r @ \.{CTWILL} needs the following procedure, which appends tokens of a
+ at r @ @<Cases for |sizeof_like|@>=
 @z
 
-Section 155.
+Section 158.
 
 @x
-@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
+@ @<Cases for |struct_like|@>=
 @y
-@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
- at -b@>
+ at r @ @<Cases for |struct_like|@>=
 @z
 
+Section 172.
+
 @x
-  int l) /* 0, 1, or 2 */
-{
+ at d force_lines flags['f'] /* should each statement be on its own line? */
 @y
-  int l) /* 0, 1, or 2 */
-{@+
+ at d force_lines flags['f'] /* should each statement be on its own line? */
+ at -force_lines@>
+@$force_lines {CTWILL}172 =\\{flags}[\.{'f'}]@>
 @z
 
-Section 159.
+Section 180.
 
 @x
-@ @<Cases for |lpar|@>=
+@ @d reserve_typenames flags['t']
 @y
- at r @ @<Cases for |lpar|@>=
+ at r @ @d reserve_typenames flags['t']
 @z
 
-Section 168.
+Section 195.
 
 @x
-@ @<Cases for |decl_head|@>=
+  reduce(pp,4,attr_head,0,133);
+}
+else if (cat1==comma) squash(pp,2,attr_head,0,145);
 @y
- at r @ @<Cases for |decl_head|@>=
+  reduce(pp,4,attr_head,0,133);
+}@+
+else if (cat1==comma) squash(pp,2,attr_head,0,145);
 @z
 
-Section 173.
+Section 204.
 
 @x
-@ @<Cases for |fn_decl|@>=
+@ @<Print a snapsh...@>=
 @y
- at r @ @<Cases for |fn_decl|@>=
+@ @<Print a snapsh...@>=
+ at -n@>
+@%
+@$n {CTWILL}199 \&{short}@>
+@$n {CTWILL}200 \&{short}@>
 @z
 
-Section 208.
+Section 207.
 
 @x
-@ Here's the |squash| procedure, which
+@ If the initial sequence of scraps does not reduce to a single scrap,
 @y
- at r @ Here's the |squash| procedure, which
+ at r @ If the initial sequence of scraps does not reduce to a single scrap,
 @z
 
-Section 212.
+Section 210.
 
 @x
-@ @<Print a snapsh...@>=
+    if (next_control=='|' || next_control==begin_comment ||
+        next_control==begin_short_comment) return;
 @y
- at r @ @<Print a snapsh...@>=
+    if (next_control=='|' || next_control==begin_comment @| ||
+        next_control==begin_short_comment) return;
 @z
 
-Section 220.
+Section 212.
 
 @x
 @ The following macro is used to append a scrap whose tokens have just
@@ -967,71 +1247,290 @@
 @-c@>
 @z
 
-Section 229.
+Section 213.
 
 @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 217.
+
 @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 220.
 
 @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.
+Section 224.
 
 @x
-@<Look ahead for st...@>= {
+ at d make_pb flags['e']
 @y
-@<Look ahead for st...@>=
+ at d make_pb flags['e']
+ at -make_pb@>
+@$make_pb {CTWILL}224 =\\{flags}[\.{'e'}]@>
 @z
 
+Section 225.
+
 @x
+make_pb=true;
+
+@ @c
+ at y
+make_pb=true;
+
+ at r @ @c
+ at z
+
+Section 228.
+
+ at x
+@ @d cur_end cur_state.end_field /* current ending location in |tok_mem| */
+ at y
+@ @d cur_end cur_state.end_field /* current ending location in |tok_mem| */
+ at -cur_end@>
+ at -cur_tok@>
+ at -cur_mode@>
+@$cur_end {CTWILL}228 =\\{cur\_state}.\\{end\_field}]@>
+@$cur_tok {CTWILL}228 =\\{cur\_state}.\\{tok\_field}]@>
+@$cur_mode {CTWILL}228 =\\{cur\_state}.\\{mode\_field}]@>
+ at z
+
+Section 229.
+
+ at x
+@<Private...@>=
+ at y
+ at r @ @<Private...@>=
+ at z
+
+Section 233.
+
+ at x
+called when |stack_ptr==1|.
+ at y
+called when |stack_ptr| |==1|.
+ at z
+
+Section 237.
+
+ 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 238--239.
+
+ 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 244.
 
 @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 247.
 
 @x
 @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
@@ -1039,49 +1538,82 @@
 @r @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
 @z
 
-Section 256.
+Section 251.
 
 @x
-@ The output file will contain the control sequence \.{\\Y} between non-null
+  space_checked=true;
+ at .\\Y@>
 @y
- at r @ The output file will contain the control sequence \.{\\Y} between non-null
+  space_checked=true;
+ at .\\Y@>
+ at d usage_sentinel (struct perm_meaning *)1
+ at -usage_sentinel@>
+@$usage_sentinel {CTWILL}251 =(\&{struct} \\{perm\_meaning} ${}{*}{}$) \T{1}@>
 @z
 
-Section 259.
+Section 252.
 
 @x
-@<Translate the \T...@>= do {
+@ @d usage_sentinel (struct perm_meaning *)1
 @y
-@<Translate the \T...@>= do {@+
+ at r @
 @z
 
-Section 267.
+Section 253.
 
 @x
-|next_control>=begin_C|. We will make the global variable |this_section|
+  if (right_start_switch) {
+    out_str("\\shortpage\n"); right_start_switch=false;
+ at .\\shortpage@>
+  }
 @y
-\hfil\break|next_control>=begin_C|. We will make the global variable |this_section|
+  if (right_start_switch) {@+
+    out_str("\\shortpage\n"); right_start_switch=false;@+
+ at .\\shortpage@>
+  }
 @z
 
-Section 268.
+ at x
+  else {
+    for (sec_depth=0; xisdigit(*loc);loc++)
+      sec_depth = sec_depth*10 + (*loc) -'0';
+  }
+ at y
+  else @+
+    for (sec_depth=0; xisdigit(*loc);loc++)
+      sec_depth = sec_depth*10 + (*loc) -'0';
+ at z
 
+Section 256.
+
 @x
-@ @<Translate the \CEE/...@>=
+@ The |finish_C| procedure outputs the translation of the current
 @y
- at r @ @<Translate the \CEE/...@>=
+ at r @ The |finish_C| procedure outputs the translation of the current
 @z
 
-Section 272.
+Section 259.
 
 @x
-@ The |footnote| procedure gives cross-reference information about
+@ @<Start a format...@>= {
 @y
- at r @ The |footnote| procedure gives cross-reference information about
+ at r @ @<Start a format...@>= {
 @z
 
-Section 284.
+Section 260.
 
 @x
+|next_control>=begin_C|. We will make the global variable |this_section|
+point to the current section name, if it has a name.
+ at y
+\hfil\break|next_control>=begin_C|.
+We will make the global variable |this_section| point to
+\hfil\break the current section name, if it has a name.
+ at z
+
+Section 273.
+
+ at 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
@@ -1088,56 +1620,264 @@
 @-c@>
 @z
 
-Section 286.
+Section 275.
 
 @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 276.
 
 @x
+@ @d depth cat /* reclaims memory that is no longer needed for parsing */
+ at y
+@ @d depth cat /* reclaims memory that is no longer needed for parsing */
+ at -depth@>
+ at -head@>
+ at -sort_ptr@>
+ at -max_sorts@>
+@$depth {CTWILL}276 =\\{cat}@>
+@$head {CTWILL}276 =\\{trans\_plus}.\\{Head}@>
+@$sort_ptr {CTWILL}276 =\\{scrap\_ptr}@>
+@$max_sorts {CTWILL}276 =\\{max_scraps}@>
+ at z
+
+Section 278.
+
+ at x
 $|collate|[0]<|collate|[1]<\cdots<|collate|[100]$.
 @y
-|collate[0]| $<$|collate[1]|$<\cdots<$|collate[100]|.
+|collate[0]| ${}<{}$|collate[1]|${}<\cdots<{}$|collate[100]|.
 @z
 
-Section 296.
+Section 280.
 
 @x
-    else {char *j;
+@ Procedure |unbucket| goes through the buckets and adds nonempty lists
 @y
-    else {@+char *j;
+ at r @ Procedure |unbucket| goes through the buckets and adds nonempty lists
 @z
 
-Section 303.
+Section 283.
 
 @x
-@ Because on some systems the difference between two pointers is a |ptrdiff_t|
-rather than an |int|, we use \.{\%ld} to print these quantities.
+  next_name=sort_ptr->head;
 @y
- at r @ Because on some systems the difference between two pointers is a
-|ptrdiff_t| rather than an |int|, we use \.{\%ld} to print these quantities.
+  next_name=sort_ptr->head;@/
 @z
 
-Section 304.
+Section 284.
 
 @x
-\bigskip
-\font\itt=cmitt10
-{\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.}
+  cur_name=sort_ptr->head;
 @y
+  cur_name=sort_ptr->head;@/
 @z
 
-Section 312.
+Section 285.
 
 @x
+switch (cur_name->ilk) {@+char *j;
+ at y
+switch (cur_name->ilk) { char *j;
+ at z
+
+Section 292.
+
+ 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 293.
+
+ at x
+@** Mogrify {\tentex CWEAVE} into {\tentex CTWILL}.  The following sections
+introduce material that is specific to \.{CTWILL}.
+
+Care has been taken to keep the original section numbering of \.{CWEAVE}
+up to this point intact, so this new material should nicely integrate
+with the original ``\&{272.~Index}.''
+
+ at q Section 2->273. @>
+@* {\tentex CTWILL} user manual.
+ at y
+@** Mogrify {\tentex CWEAVE} into {\tentex CTWILL}.
+ at z
+
+ at x
+give it the necessary hints in other places via your change file.
+ at y
+give it the necessary hints in other places via your change file.
+ at -f@>
+ at -x@>
+ at z
+
+Section 294--295.
+
+ at x
+The current meaning of every identifier is initially `\.{\\uninitialized}'.
+ at y
+ at r @ The current meaning of every identifier is initially `\.{\\uninitialized}'.
+ at -printf@>
+ at z
+
+ at x
+must have fewer than 50 characters. If the \TeX\ part starts
+ at y
+must have fewer than 50 characters.
+
+ at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
+ at -s@>
+
+@ If the \TeX\ part starts
+ at z
+
+ at x
+ at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
+ at y
+ at z
+
+Section 307.
+
+ at x
+@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
+ at y
+ at r @ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
+ at -a@>
+ at -b@>
+ at -c@>
+ at z
+
+Section 311.
+
+ at x
+@ @<Append tokens for type |q|@>=
+ at y
+ at r @ @<Append tokens for type |q|@>=
+ at z
+
+ at x
+   && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at y
+   @|&& *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at z
+
+Section 316.
+
+ at x
+@ @<Write the new meaning to the \.{.aux} file@>=
+ at y
+@ @<Write the new meaning to the \.{.aux} file@>=
+@%
+@$p {CTWILL}300 \&{name\_pointer}@>
+@$q {CTWILL}300 \&{struct perm\_meaning} ${}{*}{}$@>
+ at z
+
+Section 317.
+
+ at x
+@<Flag the usage of this identifier, for the mini-index@>=
+ at y
+@<Flag the usage of this identifier, for the mini-index@>=
+@%
+@$p {CTWILL}222 \&{name\_pointer}@>
+ at z
+
+Section 321.
+
+ at x
+@ Compare this code with section |@<Output the name...@>|.
+
+@<Mini-output...@>=
+ at y
+@ @<Mini-output...@>=
+ at z
+
+Section 326.
+
+ at x
+ at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+ at y
+ at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+ at -indent_param_decl@>
+@$indent_param_decl {CTWILL}326 =\\{flags}[\.{'i'}]@>
+ at z
+
+Section 327.
+
+ at x
+ at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
+ at y
+ at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
+ at -order_decl_stmt@>
+@$order_decl_stmt {CTWILL}327 =\\{flags}[\.{'o'}]@>
+ at z
+
+Section 333.
+
+ at x
 @** Index.
 If you have read and understood the code for Phase III above, you know what
 is in this index and how it got here. All sections in which an identifier is

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -31,12 +31,13 @@
 @y
 % Here is TeX material that gets inserted after \input ctwimac
 \def\contentspagenumber{0} % default page number for table of contents
+\datethis % Put timestamp before section 1
 @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 +47,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 +76,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
@@ -91,180 +92,19 @@
 can be found in Knuth's article ``Mini-indexes for literate programs,''
 reprinted in {\sl Digital Typography\/} (1999), 225--245.
 
+A kind of ``user manual'' for \.{CTWILL} can be found in the appendix
+{\bf 272.~Mogrify \.{CWEAVE} into \.{CTWILL}} and beyond, together
+with additional material specific to \.{CTWILL}. % FIXME
+Until then, \.{CWEAVE}'s sequence of sections will be preserved.
+
 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
 
 @x
-@<Predeclaration of procedures@>
- at y
-@<Predeclaration of procedures@>
-
-@ Here is a sort of user manual for \.{CTWILL}---which is exactly like
-\.{CWEAVE} except that it produces much better documentation, for which you
-must work harder. As with \.{CWEAVE}, input comes from a source file
-\.{foo.w} and from an optional (but now almost mandatory) change file
-\.{foo.ch}; output goes to \.{foo.tex}, \.{foo.idx}, and \.{foo.scn}.
-Unlike \.{CWEAVE}, there is an additional output file, \.{foo.aux},
-which records all nonexternal definitions.  The \.{.aux} file also
-serves as an input file on subsequent runs. You should run \.{CTWILL}
-twice, once to prime the pump and once to get decent answers.
-
-Moreover, you must run the output twice through \TeX. (This double duplicity
-suggested the original name \.{TWILL}.) After `\.{tex} \.{foo}' you
-will have output that looks like final pages except that the entries
-of mini-indexes won't be alphabetized. \TeX\ will say `This is the first
-pass', and it will produce a weird file called \.{foo.ref}. Say
-$$\.{refsort < foo.ref > foo.sref}$$
-and then another `\.{tex} \.{foo}' will produce alphabetized output.
-While \TeX\ runs it emits messages filled with numeric data, indicating how
-much space is consumed by each program section. If you can decipher these
-numbers (see \.{ctwimac.tex}), you can use them to fine-tune the page
-layout. You might be tempted to do fine tuning by editing \.{foo.tex}
-directly, but it's better to incorporate all changes into \.{foo.ch}.
-
-The mini-indexes list identifiers that are used but not defined on
-each two-page spread. At the end of each section, \.{CTWILL} gives
-\TeX\ a list of identifiers used in that section and information
-about where they are defined. The macros in \.{ctwimac.tex} figure out
-which identifiers should go in each mini-index, based on how the pages
-break. (Yes, those macros are pretty hairy.)
-
-The information that \.{CTWILL} concocts from \.{foo.w} is not always
-correct. Sometimes you'll use an identifier that you don't want
-indexed; for example, your exposition might talk about |f(x)| when you
-don't mean to refer to program variables |f| or |x|. Sometimes you'll
-use an identifier that's defined in a header file, unknown to
-\.{CTWILL}. Sometimes you'll define a single identifier in several
-different places, and \.{CTWILL} won't know which definition to choose.
-But all is not lost. \.{CTWILL} guesses right most of the time, and you can
-give it the necessary hints in other places via your change file.
-
-If you think it's easy to write a completely automatic system that doesn't
-make \.{CTWILL}'s mistakes and doesn't depend so much on change files,
-please do so.
-
-\.{CTWILL} uses a very simple method to generate mini-index info. By
-understanding this method, you will understand how to fix it when things
-go wrong. Every identifier has a current ``meaning,'' consisting of its
-abstract type and the number of the section in which it was most recently
-defined. For example, if your \Cee\ program says `|char *s|' in section~3,
-the meaning of~|s| gets changed to `\&{char} $*$, \S3' while \.{CTWILL}
-is processing that section. If you refer to~|s| in section~10, and if
-|s|~hasn't been redefined in the meantime, and if section~10 doesn't
-wind up on the same two-page spread as section~3, the mini-index generated
-by section~10 will say ``|s|: \&{char}~$*$, \S3.''
-
-The current meaning of every identifier is initially `\.{\\uninitialized}'.
-Then \.{CTWILL} reads the \.{.aux} file for your job, if any; this
-\.{.aux} file contains all definitions of new meanings in the previous
-run, so it tells \.{CTWILL} about definitions that will be occurring
-in the future. If all identifiers have a unique definition, they will
-have a unique and appropriate meaning in the mini-indexes.
-
-But some identifiers, like parameters to procedures, may be defined
-several times. Others may not be defined at all, because they are
-defined elsewhere and mentioned in header files included by the \Cee\
-preprocessor. To solve this problem, \.{CTWILL} provides mechanisms by which
-the current meaning of an identifier can be temporarily or permanently
-changed.
-
-For example, the operation
-$$\.{@@\$s \{FOO\}3 \\\&\{char\} \$*\$@@>}$$
-changes the current meaning of |s| to the \TeX\ output of `\.{\\\&\{char\}}
-\.{\$*\$}' in section~3 of program {\sc FOO}. All entries in the \.{.aux}
-file are expressed in the form of this \.{@@\$} operator; therefore you
-can use a text editor to paste such entries into a \.{.ch} file, whenever
-you want to tell \.{CTWILL} about definitions that are out of order
-or from other programs.
-
-Before reading the \.{.aux} file, \.{CTWILL} actually looks for a file
-called \.{system.bux}, which will be read if present. And after
-\.{foo.aux}, a third possibility is \.{foo.bux}. The general
-convention is to put definitions of system procedures such as |printf|
-into \.{system.bux}, and to put definitions found in specifically
-foo-ish header files into \.{foo.bux}. Like the \.{.aux}
-files, \.{.bux} files should contain only \.{@@\$} specifications;
-this rule corresponds to the fact that `bux' is the plural of `\$'.
-The \.{.bux} files may also contain \.{@@i} includes.
-
-A companion operation \.{@@\%} signifies that all \.{@@\$}
-specifications from the present point to the beginning of the next
-section will define {\it temporary\/} meanings instead of permanent
-ones. Temporary meanings are placed into the
-mini-index of the current section; the permanent (current) meaning of
-the identifier will not be changed, nor will it appear in the
-mini-index of the section. If several temporary meanings are assigned
-to the same identifier in a section, all will appear in the mini-index.
-Each \.{@@\%} toggles the temporary/permanent convention; thus, after
-an even number of \.{@@\%} operations in a section, meanings specified
-by \.{@@\$} are permanent.
-
-The operation \.{@@-} followed by an identifier followed by \.{@@>}
-specifies that the identifier should not generate a mini-index entry
-in the current section (unless, of course, a temporary meaning is assigned).
-
-If \.{@@-foo@@>} appears in a section where a new permanent meaning is
-later defined by the semantics of~\Cee, the current meaning of \\{foo}
-will not be redefined; moreover, this current meaning, which may have
-been changed by \.{@@\$foo ...@@>}, will also be written to the
-\.{.aux} file. Therefore you can control what \.{CTWILL} outputs; you
-can keep it from repeatedly contaminating the \.{.aux} file with
-things you don't like.
-
-The meaning specified by \.{@@\$...@@>} generally has four components:
-an identifier (followed by space), a program name (enclosed in braces),
-a section number (followed by space), and a \TeX\ part. The \TeX\ part
-must have fewer than 50 characters. If the \TeX\ part starts
-with `\.=', the mini-index entry will contain an equals sign instead
-of a colon; for example,
-$$\.{@@\$buf\_size \{PROG\}10 =\\T\{200\}@@>}$$
-generates either `$\\{buf\_size}=200$, \S10' or
-`$\\{buf\_size}=200$, {\sc PROG}\S10', depending on whether
-`{\sc PROG}' is or isn't the title of the current program. If the
-\TeX\ part is `\.{\\zip}', the mini-index entry will contain neither
-colon nor equals, just a comma. The program name and section number
-can also be replaced by a string. For example,
-$$\.{@@\$printf "<stdio.h>" \\zip@@>}$$
-will generate a mini-index entry like `\\{printf}, \.{<stdio.h>}.'.
-
-A special ``proofmode'' is provided so that you can check \.{CTWILL}'s
-conclusions about cross-references. Run \.{CTWILL} with the
-flag \.{+P}, and \TeX\ will produce a specially formatted document
-({\it without\/} mini-indexes)
-in which you can check that your specifications are correct.
-You should always do this before generating mini-indexes, because
-mini-indexes can mask errors if page breaks are favorable but the
-errors might reveal themselves later after your program has changed.
-The proofmode output is much easier to check than the mini-indexes themselves.
-
-The control code \.{@@r} or \.{@@R} causes \.{CTWILL} to emit
-the \TeX\ macro `\.{\\shortpage}' just before starting the next
-section of the program. This causes the section to appear at the top of
-a right-hand page, if it would ordinarily have appeared near the bottom
-of a left-hand page and split across the pages. (The \.{\\shortpage} macro
-is fragile and should be used only in cases where it will not mess up
-the output; insert it only when fine-tuning a set of pages.) If the
-next section is a starred section, the behavior is slightly different
-(but still fragile): The starred section will either be postponed to
-a left-hand page, if it normally would begin on a right-hand page,
-or vice versa. In other words, \.{@@r@@*} inverts the left/right logic.
-
-\.{CTANGLE} does not recognize the operations \.{@@\$}, \.{@@\%}, \.{@@-},
-and \.{@@r}, which are unique to \.{CTWILL}. But that is no problem,
-since you use them only in change files set up for book publishing,
-which are quite different from the change files you set up for tangling.
-
-(End of user manual. We now resume the program for \.{CWEAVE}, with occasional
-outbursts of new code.)
-
- at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
- at z
-
- at x
   program=cweave;
 @y
   program=ctwill;
@@ -292,126 +132,16 @@
 @z
 
 @x
-static sixteen_bits xref_switch,section_xref_switch; /* either zero or |def_flag| */
+ at d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
 @y
-static sixteen_bits xref_switch,section_xref_switch; /* either zero or |def_flag| */
-
-@ \.{CTWILL} also has special data structures to keep track of current
-and temporary meanings. These structures were not designed for maximum
-efficiency; they were designed to be easily grafted into \.{CWEAVE}'s
-existing code without major surgery.
-
- at d max_meanings 100 /* max temporary meanings per section */
- at d max_titles 100 /* max distinct program or header names in meanings */
-
-@<Type...@>=
-typedef struct {
-  name_pointer id; /* identifier whose meaning is being recorded */
-  sixteen_bits prog_no; /* title of program or header in which defined */
-  sixteen_bits sec_no; /* section number in which defined */
-  char tex_part[max_tex_chars]; /* \TeX\ part of meaning */
-} meaning_struct;
-
-@ @<Private...@>=
-struct perm_meaning {
-  meaning_struct perm; /* current meaning of an identifier */
-  int stamp; /* last section number in which further output suppressed */
-  struct perm_meaning *link; /* another meaning to output in this section */
-} cur_meaning[max_names]; /* the current ``permanent'' meanings */
-static struct perm_meaning *top_usage; /* first meaning to output in this section */
-static meaning_struct temp_meaning_stack[max_meanings]; /* the current ``temporary'' meanings */
-static meaning_struct *temp_meaning_ptr; /* first available slot in |temp_meaning_stack| */
-static meaning_struct *max_temp_meaning_ptr; /* its maximum value so far */
-static name_pointer title_code[max_titles]; /* program names seen so far */
-static name_pointer *title_code_ptr; /* first available slot in |title_code| */
-static char ministring_buf[max_tex_chars]; /* \TeX\ code being generated */
-static char *ministring_ptr; /* first available slot in |ministring_buf| */
-static boolean ms_mode; /* are we outputting to |ministring_buf|? */
-
-@ @<Set init...@>=
-max_temp_meaning_ptr=temp_meaning_stack;
-title_code_ptr=title_code;
-ms_mode=false;
-
-@ Here's a routine that converts a program title from the buffer
-into an internal number for the |prog_no| field of a meaning.
-It advances |loc| past the title found.
-
- at c static sixteen_bits title_lookup(void)
-{
-  char *first,*last; /* boundaries */
-  int balance; /* excess of left over right */
-  register name_pointer *p;
-  first=loc;
-  if (*loc=='"') {
-    while (++loc<=limit && *loc!='"') if (*loc=='\\') loc++;
-  } else if (*loc=='{') {
-    balance=1;
-    while (++loc<=limit) {
-      if (*loc=='}' && --balance==0) break;
-      if (*loc=='{') balance++;
-    }
-  } else err_print(_("! Title should be enclosed in braces or doublequotes"));
-  last=++loc;
-  if (last>limit) err_print(_("! Title name didn't end"));
-  if (title_code_ptr==&title_code[max_titles]) overflow(_("titles"));
-  *title_code_ptr=id_lookup(first,last,title);
-  for (p=title_code;;p++) if (*p==*title_code_ptr) break;
-  if (p==title_code_ptr) title_code_ptr++;
-  return p-title_code;
-}
-
-@ @<Give a default title to the program, if necessary@>=
-if (title_code_ptr==title_code) { /* no \.{\\def\\title} found in limbo */
-  char *saveloc=loc,*savelimit=limit;
-  loc=limit+1; limit=loc;
-  *limit++='{';
-  memcpy(limit,tex_file_name,strlen(tex_file_name)-4);
-  limit+=strlen(tex_file_name)-4;
-  *limit++='}';
-  title_lookup();
-  loc=saveloc; limit=savelimit;
-}
-
-@ The |new_meaning| routine changes the current ``permanent meaning''
-when an identifier is redeclared. It gets the |tex_part| from
-|ministring_buf|.
-
- at c
-static void
-new_meaning(
-  name_pointer p)
-{
-  struct perm_meaning *q=p-name_dir+cur_meaning;
-  ms_mode=false;
-  if (q->stamp!=section_count) {
-    if (*(ministring_ptr-1)==' ') ministring_ptr--;
-    if (ministring_ptr>=&ministring_buf[max_tex_chars])
-      strcpy(ministring_buf,"\\zip"); /* ignore |tex_part| if too long */
- at .\\zip@>
-    else *ministring_ptr='\0';
-    q->perm.prog_no=0; /* |q->perm.id=p| */
-    q->perm.sec_no=section_count;
-    strcpy(q->perm.tex_part,ministring_buf);
-  }
-  @<Write the new meaning to the \.{.aux} file@>;
-}
-
-@ @<Write the new meaning to the \.{.aux} file@>=
-{@+int n=q->perm.prog_no;
-  fprintf(aux_file,"@@$%.*s %.*s",@|
-     (int)((p+1)->byte_start-p->byte_start),p->byte_start,@|
-      (int)((title_code[n]+1)->byte_start-title_code[n]->byte_start),
-         title_code[n]->byte_start);
-  if (*(title_code[n]->byte_start)=='{') fprintf(aux_file,"%d",q->perm.sec_no);
-  fprintf(aux_file," %s@@>\n",q->perm.tex_part);
-}
+ at d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
 @z
 
 @x
- at d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
+@ Here are the three procedures needed to complete |id_lookup|:
 @y
- at d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
+@ Here are the three procedures needed to complete |id_lookup|:
+ at s perm_meaning int
 @z
 
 @x
@@ -439,15 +169,6 @@
 @z
 
 @x
-id_lookup("make_pair",NULL,func_template);
- at y
-id_lookup("make_pair",NULL,func_template);
-
-@ @<Private...@>=
-static sixteen_bits int_loc, ext_loc; /* locations of special reserved words */
- at z
-
- at x
 @d ord 0207 /* control code for `\.{@@'}' */
 @d join 0210 /* control code for `\.{@@\&}' */
 @d thin_space 0211 /* control code for `\.{@@,}' */
@@ -631,58 +352,7 @@
 @y
 @.Control codes are forbidden...@>
     if (c==meaning && phase==2) @<Process a user-generated meaning@>@;
-    else if (c==suppress && phase==2) @<Suppress mini-index entry@>;
-  }
-}
-
-@ @<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 */
-  }
-}
-
-@ @<Process a user-generated meaning@>=
-{ char *first=id_first;
-  while (xisspace(*first)) first++;
-  loc=first;
-  while (xisalpha(*loc)||xisdigit(*loc)||*loc=='_') loc++;
-  if (*loc++!=' ')
-    err_print(_("! Identifier in meaning should be followed by space"));
-  else { name_pointer p=id_lookup(first,loc-1,normal);
-    sixteen_bits t; int n=0;
-    t=title_lookup();
-    if (*(loc-1)=='}')
-      while (xisdigit(*loc)) n=10*n+(*loc++)-'0';
-    if (*loc++!=' ')
-      err_print(_("! Location in meaning should be followed by space"));
-    else @<Digest the meaning of |p|, |t|, |n|@>;
-  }
-  loc=id_loc+2;
-}
-
-@ @<Digest...@>=
-{ meaning_struct *m;
-  struct perm_meaning *q=p-name_dir+cur_meaning;
-  if (temp_switch) {
-    m=temp_meaning_ptr++;
-    if (temp_meaning_ptr>max_temp_meaning_ptr) {
-      if (temp_meaning_ptr>&temp_meaning_stack[max_meanings])
-        overflow(_("temp meanings"));
-      max_temp_meaning_ptr=temp_meaning_ptr;
-    }
-  } else m=&(q->perm);
-  m->id=p;
-  m->prog_no=t;
-  m->sec_no=n;
-  if (id_loc-loc>=max_tex_chars) strcpy(m->tex_part,"\\zip");
- at .\\zip@>
-  else { char *q=m->tex_part;
-    while (loc<id_loc) *q++=*loc++;
-    *q='\0';
+    else if (c==suppress && phase==2) @<Suppress mini-index entry@>@;
 @z
 
 @x
@@ -695,7 +365,7 @@
   skip_limbo(); change_exists=false;
 @y
   skip_limbo();
-  @<Give a default title to the program, if necessary@>;
+  @<Give a default title to the program, if necessary@>@;
 @z
 
 @x
@@ -872,10 +542,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,20 +573,25 @@
 
 @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' */
 
- at c
+@<Predecl...@>=
 #if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+static void print_text(text_pointer p);
+#endif
+
+@ @c
+#if 0
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
 @z
 
 @x
   update_terminal;
 @y
-  printf("|\n"); update_terminal;
+  puts("|"); update_terminal;
 @z
 
 @x
@@ -929,10 +604,6 @@
 @x
 @ @<Predecl...@>=@+static void print_text(text_pointer p);
 @y
-@ @<Predecl...@>=
-#if 0
-static void print_text(text_pointer p);
-#endif
 @z
 
 @x
@@ -964,132 +635,9 @@
 @z
 
 @x
-  r->num=m; /* everything from |q| on is left undisturbed */
- at y
-  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
-appear between parentheses or brackets. The calling routine should set
-|ident_seen=false| first. (This is admittedly tricky.)
-
- at c boolean ident_seen;
-static boolean app_supp(
-  text_pointer p)
-{ token_pointer j;
-  text_pointer q;
-  if (ident_seen && **p>=tok_flag) {
-    q=**p-tok_flag+tok_start;
-    if (**q=='(') {
-      app('(');@+app('\\');@+app(',');@+app(')'); goto catch14;
-    }
-    if (**q=='[') {
-      app('[');@+app('\\');@+app(',');@+app(']'); goto catch14;
-    }
-  }
-  for (j=*p;j<*(p+1);j++) {
-    if (*j<tok_flag) {
-      if (*j==inserted) return false;
-      if (j==tok_loc) ident_seen=true;
-      else app(*j);
-    } else if (*j>=inner_tok_flag) confusion(_("inner"));
-    else if (app_supp(*j-tok_flag+tok_start)) goto catch14;;
-  }
-  return false;
-catch14: if (*(*(p+1)-1)=='9') return true; /* production 14 was used */
-  else return false;
-}
-
-@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
-which tries to figure out a symbolic form of definition after
-|make_underlined(pp+l)| has been called. We rely heavily on the
-existing productions, which force the translated texts to have a
-structure that's decodable even though the underlying |cat| and |mathness|
-codes have disappeared.
-
- at c static void
-make_ministring(
-  int l) /* 0, 1, or 2 */
-{
-  text_pointer q,r;
-  name_pointer cn;
-  token t;
-  int ast_count; /* asterisks preceding the expression */
-  boolean non_ast_seen; /* have we seen a non-asterisk? */
-  if (tok_loc<=operator_found) return;
-  cn=((*tok_loc)%id_flag)+name_dir;
-  @<Append the type of the declaree; |return| if it begins with \&{extern}@>;
-  null_scrap.mathness=(((pp+l)->mathness)%4)*5; big_app1(&null_scrap);
-    /* now we're ready for the mathness that follows (I think) */
-    /* (without the mod 4 times 5, comments posed a problem) */
-    /* (namely in cases like |int a(b,c)| followed by comment) */
-  ident_seen=false;@+app_supp((pp+l)->trans);
-  null_scrap.mathness=10; big_app1(&null_scrap);
-   /* now |cur_mathness==no_math| */
-  ms_mode=true; ministring_ptr=ministring_buf;
-  if (l==2) *ministring_ptr++='=';
-  make_output(); /* translate the current text into a ministring */
-  tok_ptr=*(--text_ptr); /* delete that text */
-  new_meaning(cn);
-  cur_mathness=maybe_math; /* restore it */
-}
-
-@ Here we use the fact that a |decl_head| comes from |int_like| only in
-production~27, whose translation is fairly easy to recognize. (Well,
-production 28 has been added for \CPLUSPLUS/, but we hope that doesn't
-mess us up.) And we also use other similar facts.
-
-If an identifier is given an \&{extern} definition, we don't change
-its current meaning, but we do suppress mini-index entries to its
-current meaning in other sections.
-
-@<Append the type of the declaree; |return| if it begins with \&{extern}@>=
-if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }
-else {
-  q=(pp+l-1)->trans;
-  ast_count=0;
-  non_ast_seen=false;
-  while (true) {
-    if (*(q+1)==*q+1) {
-      r=q;@+break; /* e.g. \&{struct}; we're doing production 45 or 46 */
-    }
-    if (**q<tok_flag) confusion(_("find type"));
-    r=**q-tok_flag+tok_start;
-    if ((t=*(*(q+1)-2))>=tok_flag && **(t-tok_flag+tok_start)=='*') {
-           /* production 34 */
-      if (!non_ast_seen) ast_count++; /* count immediately preceding |*|'s */
-    } else non_ast_seen=true;
-    if (*(*q+1)==' ' && *(q+1)==*q+2) break; /* production 27 */
-    if (*(*q+1)=='{' && *(*q+2)=='}' && *(*q+3)=='$' && *(*q+4)==' '@|
-       && *(q+1)==*q+5) break; /* production 27 in disguise */
-    q=r;
-  }
-  while (**r>=tok_flag) {
-    if (*(r+1)>*r+9 && *(*r+1)=='{' && *(*r+2)=='}' && *(*r+3)=='$' @|
-        && *(*r+4)==indent) q=**r-tok_flag+tok_start; /* production 49 */
-    r=**r-tok_flag+tok_start;
-  }
-  if (**r==ext_loc+res_flag) return; /* \&{extern} gives no definition */
-  @<Append tokens for type |q|@>;
-}
-
-@ @<Append tokens for type |q|@>=
-cur_mathness=no_math; /* it was |maybe_math| */
-if (*(q+1)==*q+8 && *(*q+1)==' ' && *(*q+3)==' ') {
-  app(**q);@+app(' ');@+app(*(*q+2)); /* production 46 */
-} else if ((t=*(*(q+1)-1))>=tok_flag && **(r=t-tok_flag+tok_start)=='\\'
-   && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
-else app((q-tok_start)+tok_flag);
-while (ast_count) {
-  big_app('{');@+app('*');@+app('}');@+ast_count--;
-}
-
- at z
-
- at 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 +645,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,10 +668,9 @@
   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) {
+else if (cat1==exp && cat2!=lpar && cat2!=lbrack && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
 }
 else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
@@ -1134,7 +678,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,10 +687,10 @@
   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) {
+else if (cat1==exp && cat2!=lpar && cat2!=lbrack && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1);
   make_ministring(1);
   squash(pp,2,decl_head,-1,35);
@@ -1156,10 +700,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 +709,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 +735,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 +744,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,18 +751,24 @@
   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} */
+if (cat1==define_like) { /* \#\&{define} is analogous to \&{extern} */
   make_underlined(pp+2);
   if (tok_loc>operator_found) {
-    /* no time to work out this case; I'll handle defines by brute force
+    /* no time to work out this case; I'll handle \&{define}s by brute force
        in the \.{aux} file, since they usually don't go in mini-index */
   }
 }
@@ -1241,9 +783,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 +793,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 +804,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
@@ -1343,7 +884,7 @@
       else app_scrap(p->ilk,maybe_math);
     }
   }
-  @<Flag the usage of this identifier, for the mini-index@>;
+  @<Flag the usage of this identifier, for the mini-index@>@;
 @z
 
 @x
@@ -1353,11 +894,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
@@ -1407,45 +946,11 @@
 section_count=0; format_visible=true; copy_limbo();
 @y
 temp_switch=false; temp_meaning_ptr=temp_meaning_stack;
-@<Read the \.{.aux} file, if present; then open it for output@>;
+@<Read the \.{.aux} file, if present; then open it for output@>@;
 section_count=0; format_visible=true; right_start_switch=false; copy_limbo();
 @z
 
 @x
-while (!input_has_ended) @<Translate the current section@>@;
-}
-
- at y
-while (!input_has_ended) @<Translate the current section@>@;
-}
-
-@ @<Private...@>=
-static FILE *aux_file;
-static char aux_file_name[max_file_name_length]; /* name of \.{.aux} file */
-
-@ @<Read the \.{.aux} file, if present; then open it for output@>=
-memcpy(aux_file_name,tex_file_name,strlen(tex_file_name)-4);
-strcat(aux_file_name,".bux");
-include_depth=1; /* we simulate \.{@@i} */
-strcpy(cur_file_name,aux_file_name); /* first in, third out */
-if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
-strcpy(aux_file_name+strlen(aux_file_name)-4,".aux");
-strcpy(cur_file_name,aux_file_name); /* second in, second out */
-if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
-strcpy(cur_file_name,"system.bux"); /* third in, first out */
-if ((cur_file=fopen(cur_file_name,"r"))) cur_line=0;
-else include_depth--;
-if (include_depth) { /* at least one new file was opened */
-  while (get_next()==meaning) ; /* new meaning is digested */
-  if (include_depth) err_print(_("! Only @@$ is allowed in aux and bux files"));
-  finish_line(); loc=buffer; /* now reading beginning of line 1 */
-}
-if ((aux_file=fopen(aux_file_name,"wb"))==NULL)
-  fatal(_("! Cannot open aux output file "),aux_file_name);
-
- at z
-
- at x
 static boolean group_found=false; /* has a starred section occurred? */
 
 @ @<Translate the current section@>= {
@@ -1479,15 +984,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
 
@@ -1524,15 +1029,10 @@
 }
 @y
   outer_parse();
-  if (is_macro) @<Make ministring for a new macro@>;
+  if (is_macro) @<Make ministring for a new macro@>@;
   finish_C(format_visible); format_visible=true;
   doing_format=false;
 }
-
-@ @<Private...@>=
-static boolean is_macro; /* it's a macro def, not a format def */
-static int def_diff; /* 0 iff the current macro has parameters */
-static name_pointer id_being_defined; /* the definee */
 @z
 
 @x
@@ -1551,13 +1051,13 @@
 @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);
-    def_diff=*loc-'(';
+    app_cur_id(false);
+    def_diff=(*loc!='(');
 @z
 
 @x
@@ -1570,22 +1070,6 @@
 @ @<Start a format...@>= {
   doing_format=true;
 @y
-@ @<Make ministring for a new macro@>=
-{
-  ms_mode=true; ministring_ptr=ministring_buf;
-  *ministring_ptr++='=';
-  if (def_diff) { /* parameterless */
-    scrap_pointer s=scrap_ptr;
-    text_pointer t;
-    token_pointer j;
-    while (s->cat==insert) s--;
-    if ((s-1)->cat==dead && s->cat==exp && **(t=s->trans)=='\\'
-         && *(*t+1)=='T') /* it's just a constant */
-      for (j=*t;j<*(t+1);j++) *ministring_ptr++=*j;
-    else out_str("macro");
-  } else out_str("macro (\\,)");
-  new_meaning(id_being_defined);
-}
 
 @ @<Start a format...@>= {
   doing_format=true;
@@ -1617,94 +1101,10 @@
 @y
 finish_line(); out_str("\\mini"); finish_line();
 @.\\mini@>
-@<Output information about usage of id's defined in other sections@>;
+@<Output information about usage of id's defined in other sections@>@;
 out_str("}\\FI"); finish_line();
 @.\\FI@>
 flush_buffer(out_buf,false,false); /* insert a blank line, it looks nice */
-
-@ The following code is performed for each identifier parsed during
-a section. Variable |top_usage| is always nonzero; it has the sentinel
-value~1 initially, then it points to each variable scheduled for
-possible citation. A variable is on this list if and only if its
-|link| field is nonzero. All variables mentioned in the section are
-placed on the list, unless they are reserved and their current
-\TeX\ meaning is uninitialized.
-
-@<Flag the usage of this identifier, for the mini-index@>=
-{ struct perm_meaning *q=p-name_dir+cur_meaning;
-  if (!(abnormal(p)) || strcmp(q->perm.tex_part,"\\uninitialized")!=0)
-    if (q->link==0) {
-      q->link=top_usage;
-      top_usage=q;
-    }
-}
-
-@ @<Output information about usage of id's defined in other sections@>=
-{ struct perm_meaning *q;
-  while (temp_meaning_ptr>temp_meaning_stack) {
-    out_mini(--temp_meaning_ptr);
-    q=temp_meaning_ptr->id-name_dir+cur_meaning;
-    q->stamp=section_count; /* suppress output from ``permanent'' data */
-  }
-  while (top_usage!=usage_sentinel) {
-    q=top_usage;
-    top_usage=q->link;
-    q->link=NULL;
-    if (q->stamp!=section_count) out_mini(&(q->perm));
-  }
-}
-
-@ @c static void
-out_mini(
-  meaning_struct *m)
-{ char s[60];
-  name_pointer cur_name=m->id;
-  if (m->prog_no==0) { /* reference within current program */
-    if (m->sec_no==section_count) return; /* defined in current section */
-    sprintf(s,"\\[%d",m->sec_no);
-  } else { name_pointer n=title_code[m->prog_no];
-    if (*(n->byte_start)=='{')
-      sprintf(s,"\\]%.*s%d",(int)((n+1)->byte_start-n->byte_start),n->byte_start,
-             m->sec_no);
-    else sprintf(s,"\\]%.*s",(int)((n+1)->byte_start-n->byte_start),n->byte_start);
-  }
-  out_str(s); out(' ');
-  @<Mini-output the name at |cur_name|@>;
-  out(' '); out_str(m->tex_part); finish_line();
-}
-
-@ @<Predec...@>=@+static void out_mini(meaning_struct *);
-
-@ @<Mini-output...@>=
-switch (cur_name->ilk) {
-  case normal: case func_template: if (length(cur_name)==1) 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;
- at .\\|@>
- at .\\.@>
- at .\\\\@>
-  case roman: break;
-  case wildcard: out_str("\\9"); break;
- at .\\9@>
-  case typewriter: out_str("\\."); break;
- at .\\.@>
-  case custom: {char *j; out_str("$\\");
-    for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
-      out(*j=='_'? 'x': *j=='$'? 'X': *j);
-    out('$');
-    goto name_done;
-    }
-  default: out_str("\\&");
- at .\\\&@>
-}
-out_name(cur_name,true);
-name_done:
-
 @z
 
 @x
@@ -1789,8 +1189,8 @@
   }
   out('.');
 }
-
 @y
+@ No need to tell about changed sections.
 @z
 
 @x
@@ -1809,26 +1209,26 @@
 @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
   case wildcard: out_str("\\9");@+ goto not_an_identifier;
 @y
-  case roman: out_str("  "); goto not_an_identifier;
-  case wildcard: out_str("\\9"); goto not_an_identifier;
+  case roman: out_str("  ");@+ goto not_an_identifier;
+  case wildcard: out_str("\\9");@+ goto not_an_identifier;
 @z
 
 @x
   case roman: not_an_identifier: out_name(cur_name,false); goto name_done;
-  case custom: {char *j; out_str("$\\");
+  case custom:
+    out_str("$\\");
     for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
       out(*j=='_'? 'x': *j=='$'? 'X': *j);
     out('$');
     goto name_done;
-    }
 @y
 not_an_identifier: out_name(cur_name,false); goto name_done;
   case custom: out_str("\\$"); break;
@@ -1839,11 +1239,9 @@
 out_name(cur_name,true);
 @y
 if (proofing) out_name(cur_name,true);
-else {
+else {@+char *j;
   out('{');
-  {char *j;
-    for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++) out(*j);
-  }
+  for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++) out(*j);
   out('}');
 }
 @z
@@ -1900,20 +1298,631 @@
 @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.
+ at q Section 272. @>
+@** Mogrify {\tentex CWEAVE} into {\tentex CTWILL}.  The following sections
+introduce material that is specific to \.{CTWILL}.
 
-\bigskip
-\font\itt=cmitt10
-{\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.}
+Care has been taken to keep the original section numbering of \.{CWEAVE}
+up to this point intact, so this new material should nicely integrate
+with the original ``\&{272.~Index}.''
 
+ at q Section 2->273. @>
+@* {\tentex CTWILL} user manual.
+Here is a sort of user manual for \.{CTWILL}---which is exactly like
+\.{CWEAVE} except that it produces much better documentation, for which you
+must work harder. As with \.{CWEAVE}, input comes from a source file
+\.{foo.w} and from an optional (but now almost mandatory) change file
+\.{foo.ch}; output goes to \.{foo.tex}, \.{foo.idx}, and \.{foo.scn}.
+Unlike \.{CWEAVE}, there is an additional output file, \.{foo.aux},
+which records all nonexternal definitions.  The \.{.aux} file also
+serves as an input file on subsequent runs. You should run \.{CTWILL}
+twice, once to prime the pump and once to get decent answers.
+
+Moreover, you must run the output twice through \TeX. (This double duplicity
+suggested the original name \.{TWILL}.) After `\.{tex} \.{foo}' you
+will have output that looks like final pages except that the entries
+of mini-indexes won't be alphabetized. \TeX\ will say `This is the first
+pass', and it will produce a weird file called \.{foo.ref}. Say
+$$\.{refsort < foo.ref > foo.sref}$$
+and then another `\.{tex} \.{foo}' will produce alphabetized output.
+While \TeX\ runs it emits messages filled with numeric data, indicating how
+much space is consumed by each program section. If you can decipher these
+numbers (see \.{ctwimac.tex}), you can use them to fine-tune the page
+layout. You might be tempted to do fine tuning by editing \.{foo.tex}
+directly, but it's better to incorporate all changes into \.{foo.ch}.
+
+The mini-indexes list identifiers that are used but not defined on
+each two-page spread. At the end of each section, \.{CTWILL} gives
+\TeX\ a list of identifiers used in that section and information
+about where they are defined. The macros in \.{ctwimac.tex} figure out
+which identifiers should go in each mini-index, based on how the pages
+break. (Yes, those macros are pretty hairy.)
+
+The information that \.{CTWILL} concocts from \.{foo.w} is not always
+correct. Sometimes you'll use an identifier that you don't want
+indexed; for example, your exposition might talk about |f(x)| when you
+don't mean to refer to program variables |f| or |x|. Sometimes you'll
+use an identifier that's defined in a header file, unknown to
+\.{CTWILL}. Sometimes you'll define a single identifier in several
+different places, and \.{CTWILL} won't know which definition to choose.
+But all is not lost. \.{CTWILL} guesses right most of the time, and you can
+give it the necessary hints in other places via your change file.
+
+If you think it's easy to write a completely automatic system that doesn't
+make \.{CTWILL}'s mistakes and doesn't depend so much on change files,
+please do so.
+
+\.{CTWILL} uses a very simple method to generate mini-index info. By
+understanding this method, you will understand how to fix it when things
+go wrong. Every identifier has a current ``meaning,'' consisting of its
+abstract type and the number of the section in which it was most recently
+defined. For example, if your \Cee\ program says `|char *s|' in section~3,
+the meaning of~|s| gets changed to `\&{char} $*$, \S3' while \.{CTWILL}
+is processing that section. If you refer to~|s| in section~10, and if
+|s|~hasn't been redefined in the meantime, and if section~10 doesn't
+wind up on the same two-page spread as section~3, the mini-index generated
+by section~10 will say ``|s|: \&{char}~$*$, \S3.''
+
+The current meaning of every identifier is initially `\.{\\uninitialized}'.
+Then \.{CTWILL} reads the \.{.aux} file for your job, if any; this
+\.{.aux} file contains all definitions of new meanings in the previous
+run, so it tells \.{CTWILL} about definitions that will be occurring
+in the future. If all identifiers have a unique definition, they will
+have a unique and appropriate meaning in the mini-indexes.
+
+But some identifiers, like parameters to procedures, may be defined
+several times. Others may not be defined at all, because they are
+defined elsewhere and mentioned in header files included by the \Cee\
+preprocessor. To solve this problem, \.{CTWILL} provides mechanisms by which
+the current meaning of an identifier can be temporarily or permanently
+changed.
+
+For example, the operation
+$$\.{@@\$s \{FOO\}3 \\\&\{char\} \$*\$@@>}$$
+changes the current meaning of |s| to the \TeX\ output of `\.{\\\&\{char\}}
+\.{\$*\$}' in section~3 of program {\sc FOO}. All entries in the \.{.aux}
+file are expressed in the form of this \.{@@\$} operator; therefore you
+can use a text editor to paste such entries into a \.{.ch} file, whenever
+you want to tell \.{CTWILL} about definitions that are out of order
+or from other programs.
+
+Before reading the \.{.aux} file, \.{CTWILL} actually looks for a file
+called \.{system.bux}, which will be read if present. And after
+\.{foo.aux}, a third possibility is \.{foo.bux}. The general
+convention is to put definitions of system procedures such as |printf|
+into \.{system.bux}, and to put definitions found in specifically
+foo-ish header files into \.{foo.bux}. Like the \.{.aux}
+files, \.{.bux} files should contain only \.{@@\$} specifications;
+this rule corresponds to the fact that `bux' is the plural of `\$'.
+The \.{.bux} files may also contain \.{@@i} includes.
+
+A companion operation \.{@@\%} signifies that all \.{@@\$}
+specifications from the present point to the beginning of the next
+section will define {\it temporary\/} meanings instead of permanent
+ones. Temporary meanings are placed into the
+mini-index of the current section; the permanent (current) meaning of
+the identifier will not be changed, nor will it appear in the
+mini-index of the section. If several temporary meanings are assigned
+to the same identifier in a section, all will appear in the mini-index.
+Each \.{@@\%} toggles the temporary/permanent convention; thus, after
+an even number of \.{@@\%} operations in a section, meanings specified
+by \.{@@\$} are permanent.
+
+The operation \.{@@-} followed by an identifier followed by \.{@@>}
+specifies that the identifier should not generate a mini-index entry
+in the current section (unless, of course, a temporary meaning is assigned).
+
+If \.{@@-foo@@>} appears in a section where a new permanent meaning is
+later defined by the semantics of~\Cee, the current meaning of \\{foo}
+will not be redefined; moreover, this current meaning, which may have
+been changed by \.{@@\$foo ...@@>}, will also be written to the
+\.{.aux} file. Therefore you can control what \.{CTWILL} outputs; you
+can keep it from repeatedly contaminating the \.{.aux} file with
+things you don't like.
+
+The meaning specified by \.{@@\$...@@>} generally has four components:
+an identifier (followed by space), a program name (enclosed in braces),
+a section number (followed by space), and a \TeX\ part. The \TeX\ part
+must have fewer than 50 characters. If the \TeX\ part starts
+with `\.=', the mini-index entry will contain an equals sign instead
+of a colon; for example,
+$$\.{@@\$buf\_size \{PROG\}10 =\\T\{200\}@@>}$$
+generates either `$\\{buf\_size}=200$, \S10' or
+`$\\{buf\_size}=200$, {\sc PROG}\S10', depending on whether
+`{\sc PROG}' is or isn't the title of the current program. If the
+\TeX\ part is `\.{\\zip}', the mini-index entry will contain neither
+colon nor equals, just a comma. The program name and section number
+can also be replaced by a string. For example,
+$$\.{@@\$printf "<stdio.h>" \\zip@@>}$$
+will generate a mini-index entry like `\\{printf}, \.{<stdio.h>}.'.
+
+A special ``proofmode'' is provided so that you can check \.{CTWILL}'s
+conclusions about cross-references. Run \.{CTWILL} with the
+flag \.{+P}, and \TeX\ will produce a specially formatted document
+({\it without\/} mini-indexes)
+in which you can check that your specifications are correct.
+You should always do this before generating mini-indexes, because
+mini-indexes can mask errors if page breaks are favorable but the
+errors might reveal themselves later after your program has changed.
+The proofmode output is much easier to check than the mini-indexes themselves.
+
+The control code \.{@@r} or \.{@@R} causes \.{CTWILL} to emit
+the \TeX\ macro `\.{\\shortpage}' just before starting the next
+section of the program. This causes the section to appear at the top of
+a right-hand page, if it would ordinarily have appeared near the bottom
+of a left-hand page and split across the pages. (The \.{\\shortpage} macro
+is fragile and should be used only in cases where it will not mess up
+the output; insert it only when fine-tuning a set of pages.) If the
+next section is a starred section, the behavior is slightly different
+(but still fragile): The starred section will either be postponed to
+a left-hand page, if it normally would begin on a right-hand page,
+or vice versa. In other words, \.{@@r@@*} inverts the left/right logic.
+
+\.{CTANGLE} does not recognize the operations \.{@@\$}, \.{@@\%}, \.{@@-},
+and \.{@@r}, which are unique to \.{CTWILL}. But that is no problem,
+since you use them only in change files set up for book publishing,
+which are quite different from the change files you set up for tangling.
+
+(End of user manual.)
+
+ at d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
+
+ at q Section 25->274. @>
+@* Temporary and permanent meanings.
+\.{CTWILL} has special data structures to keep track of current
+and temporary meanings. These structures were not designed for maximum
+efficiency; they were designed to be easily grafted into \.{CWEAVE}'s
+existing code without major surgery.
+
+ at d max_meanings 100 /* max temporary meanings per section */
+ at d max_titles 100 /* max distinct program or header names in meanings */
+
+@<Type...@>=
+typedef struct {
+  name_pointer id; /* identifier whose meaning is being recorded */
+  sixteen_bits prog_no; /* title of program or header in which defined */
+  sixteen_bits sec_no; /* section number in which defined */
+  char tex_part[max_tex_chars]; /* \TeX\ part of meaning */
+} meaning_struct;
+
+ at q Section 26->275. @>
+@ @<Private...@>=
+struct perm_meaning {
+  meaning_struct perm; /* current meaning of an identifier */
+  int stamp; /* last section number in which further output suppressed */
+  struct perm_meaning *link; /* another meaning to output in this section */
+} cur_meaning[max_names]; /* the current ``permanent'' meanings */
+static struct perm_meaning *top_usage; /* first meaning to output in this section */
+static meaning_struct temp_meaning_stack[max_meanings]; /* the current ``temporary'' meanings */
+static meaning_struct *temp_meaning_ptr; /* first available slot in |temp_meaning_stack| */
+static meaning_struct *max_temp_meaning_ptr; /* its maximum value so far */
+static name_pointer title_code[max_titles]; /* program names seen so far */
+static name_pointer *title_code_ptr; /* first available slot in |title_code| */
+static char ministring_buf[max_tex_chars]; /* \TeX\ code being generated */
+static char *ministring_ptr; /* first available slot in |ministring_buf| */
+static boolean ms_mode; /* are we outputting to |ministring_buf|? */
+
+ at q Section 27->276. @>
+@ @<Set init...@>=
+max_temp_meaning_ptr=temp_meaning_stack;
+title_code_ptr=title_code;
+ms_mode=false;
+
+ at q Section 277. @>
+@ @<Predec...@>=@+static void new_meaning(name_pointer);
+
+ at q Section 30->278. @>
+@ The |new_meaning| routine changes the current ``permanent meaning''
+when an identifier is redeclared. It gets the |tex_part| from
+|ministring_buf|.
+
+ at c
+static void
+new_meaning(
+  name_pointer p)
+{
+  struct perm_meaning *q=p-name_dir+cur_meaning;
+  ms_mode=false;
+  if (q->stamp!=section_count) {
+    if (*(ministring_ptr-1)==' ') ministring_ptr--;
+    if (ministring_ptr>=&ministring_buf[max_tex_chars])
+      strcpy(ministring_buf,"\\zip"); /* ignore |tex_part| if too long */
+ at .\\zip@>
+    else *ministring_ptr='\0';
+    q->perm.prog_no=0; /* |q->perm.id=p| */
+    q->perm.sec_no=section_count;
+    strcpy(q->perm.tex_part,ministring_buf);
+  }
+  @<Write the new meaning to the \.{.aux} file@>@;
+}
+
+ at q Section 75->279. @>
+@ @<Process a user-generated meaning@>=
+{ char *first=id_first;
+  while (xisspace(*first)) first++;
+  loc=first;
+  while (xisalpha(*loc)||xisdigit(*loc)||*loc=='_') loc++;
+  if (*loc++!=' ')
+    err_print(_("! Identifier in meaning should be followed by space"));
+  else {@+ int n=0;
+    name_pointer p=id_lookup(first,loc-1,normal);
+    sixteen_bits t=title_lookup();
+    if (*(loc-1)=='}')
+      while (xisdigit(*loc)) n=10*n+(*loc++)-'0';
+    if (*loc++!=' ')
+      err_print(_("! Location in meaning should be followed by space"));
+    else @<Digest the meaning of |p|, |t|, |n|@>@;
+  }
+  loc=id_loc+2;
+}
+
+ at q Section 76->280. @>
+@ @<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 */
+  }
+}
+
+ at q Section 77->281. @>
+@ @<Digest...@>=
+{ meaning_struct *m;
+  struct perm_meaning *q=p-name_dir+cur_meaning;
+  if (temp_switch) {
+    m=temp_meaning_ptr++;
+    if (temp_meaning_ptr>max_temp_meaning_ptr) {
+      if (temp_meaning_ptr>&temp_meaning_stack[max_meanings])
+        overflow(_("temp meanings"));
+      max_temp_meaning_ptr=temp_meaning_ptr;
+    }
+  } else m=&(q->perm);
+  m->id=p;
+  m->prog_no=t;
+  m->sec_no=n;
+  if (id_loc-loc>=max_tex_chars) strcpy(m->tex_part,"\\zip");
+ at .\\zip@>
+  else { char *q=m->tex_part;
+    while (loc<id_loc) *q++=*loc++;
+    *q='\0';
+  }
+}
+
+ at q Section 141->282/3. @>
+@* Make ministrings.
+ \.{CTWILL} needs the following procedure, which appends tokens of a
+translated text until coming to |tok_loc|, then suppresses text that may
+appear between parentheses or brackets. The calling routine |make_ministring|
+should set |ident_seen=false| first. (This is admittedly tricky.)
+
+@<Private var...@>=
+static boolean ident_seen;
+
+@ @c
+static boolean app_supp(
+  text_pointer p)
+{ token_pointer j;
+  if (ident_seen && **p>=tok_flag)
+    switch (**(**p-tok_flag+tok_start)) {
+    case '(': app('(');@+app('\\');@+app(',');@+app(')'); goto catch14;
+    case '[': app('[');@+app('\\');@+app(',');@+app(']'); goto catch14;
+    }
+  for (j=*p;j<*(p+1);j++) {
+    if (*j<tok_flag) {
+      if (*j==inserted) break;
+      if (j==tok_loc) ident_seen=true;
+      else app(*j);
+    } else if (*j>=inner_tok_flag) confusion(_("inner"));
+    else if (app_supp(*j-tok_flag+tok_start)) goto catch14;
+  }
+  return false;
+catch14: return *(*(p+1)-1)=='9'; /* was production 14 used? */
+}
+
+ at q Section 284. @>
+@ @<Predec...@>=@+static boolean app_supp(text_pointer);
+
+ at q Section 142->285. @>
+@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
+which tries to figure out a symbolic form of definition after
+|make_underlined(pp+l)| has been called. We rely heavily on the
+existing productions, which force the translated texts to have a
+structure that's decodable even though the underlying |cat| and |mathness|
+codes have disappeared.
+
+ at c static void
+make_ministring(
+  int l) /* 0, 1, or 2 */
+{
+  name_pointer cn;
+  if (tok_loc<=operator_found) return;
+  cn=((*tok_loc)%id_flag)+name_dir;
+  @<Append the type of the declaree; |return| if it begins with \&{extern}@>@;
+  null_scrap.mathness=(((pp+l)->mathness)%4)*5; big_app1(&null_scrap);
+    /* now we're ready for the mathness that follows (I think);
+       (without the mod 4 times 5, comments posed a problem,
+       namely in cases like |int a(b,c)| followed by comment) */
+  ident_seen=false;@+app_supp((pp+l)->trans);
+  null_scrap.mathness=10; big_app1(&null_scrap);
+   /* now |cur_mathness==no_math| */
+  ms_mode=true; ministring_ptr=ministring_buf;
+  if (l==2) *ministring_ptr++='=';
+  make_output(); /* translate the current text into a ministring */
+  tok_ptr=*(--text_ptr); /* delete that text */
+  new_meaning(cn);
+  cur_mathness=maybe_math; /* restore it */
+}
+
+ at q Section 286. @>
+@ @<Predec...@>=@+static void make_ministring(int);
+
+ at q Section 43->287. @>
+@ @<Private...@>=
+static sixteen_bits int_loc, ext_loc; /* locations of special reserved words */
+
+ at q Section 143->288. @>
+@ Here we use the fact that a |decl_head| comes from |int_like| only in
+production~27, whose translation is fairly easy to recognize. (Well,
+production 28 has been added for \CPLUSPLUS/, but we hope that doesn't
+mess us up.) And we also use other similar facts.
+
+If an identifier is given an \&{extern} definition, we don't change
+its current meaning, but we do suppress mini-index entries to its
+current meaning in other sections.
+
+@<Append the type of the declaree; |return| if it begins with \&{extern}@>=
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }
+else {
+  text_pointer q=(pp+l-1)->trans, r;
+  token t;
+  int ast_count=0; /* asterisks preceding the expression */
+  boolean non_ast_seen=false; /* have we seen a non-asterisk? */
+  while (true) {
+    if (*(q+1)==*q+1) {
+      r=q;@+break; /* e.g. \&{struct}; we're doing production 45 or 46 */
+    }
+    if (**q<tok_flag) confusion(_("find type"));
+    r=**q-tok_flag+tok_start;
+    if ((t=*(*(q+1)-2))>=tok_flag && **(t-tok_flag+tok_start)=='*') {
+           /* production 34 */
+      if (!non_ast_seen) ast_count++; /* count immediately preceding |*|'s */
+    } else non_ast_seen=true;
+    if (*(*q+1)==' ' && *(q+1)==*q+2) break; /* production 27 */
+    if (*(*q+1)=='{' && *(*q+2)=='}' && *(*q+3)=='$' && *(*q+4)==' '@|
+       && *(q+1)==*q+5) break; /* production 27 in disguise */
+    q=r;
+  }
+  while (**r>=tok_flag) {
+    if (*(r+1)>*r+9 && *(*r+1)=='{' && *(*r+2)=='}' && *(*r+3)=='$' @|
+        && *(*r+4)==indent) q=**r-tok_flag+tok_start; /* production 49 */
+    r=**r-tok_flag+tok_start;
+  }
+  if (**r==ext_loc+res_flag) return; /* \&{extern} gives no definition */
+  @<Append tokens for type |q|@>@;
+}
+
+ at q Section 144->289. @>
+@ @<Append tokens for type |q|@>=
+cur_mathness=no_math; /* it was |maybe_math| */
+if (*(q+1)==*q+8 && *(*q+1)==' ' && *(*q+3)==' ') {
+  app(**q);@+app(' ');@+app(*(*q+2)); /* production 46 */
+} else if ((t=*(*(q+1)-1))>=tok_flag && **(r=t-tok_flag+tok_start)=='\\'
+   && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+else app((q-tok_start)+tok_flag);
+while (ast_count) {
+  big_app('{');@+app('*');@+app('}');@+ast_count--;
+}
+
+ at q Section 253->290. @>
+@ @<Private...@>=
+static boolean is_macro; /* it's a macro def, not a format def */
+static boolean def_diff; /* |false| iff the current macro has parameters */
+static name_pointer id_being_defined; /* the definee */
+
+ at q Section 257->291. @>
+@ @<Make ministring for a new macro@>=
+{
+  ms_mode=true; ministring_ptr=ministring_buf;
+  *ministring_ptr++='=';
+  if (def_diff) { /* parameterless */
+    scrap_pointer s=scrap_ptr;
+    text_pointer t;
+    token_pointer j;
+    while (s->cat==insert) s--;
+    if ((s-1)->cat==dead && s->cat==exp && **(t=s->trans)=='\\'
+         && *(*t+1)=='T') /* it's just a constant */
+      for (j=*t;j<*(t+1);j++) *ministring_ptr++=*j;
+    else out_str("macro");
+  } else out_str("macro (\\,)");
+  new_meaning(id_being_defined);
+}
+
+ at q Section 246->292. @>
+@* Process {\tentex .aux} files.
+
+@<Private...@>=
+static FILE *aux_file;
+static char aux_file_name[max_file_name_length]; /* name of \.{.aux} file */
+
+ at q Section 247->293. @>
+@ @<Read the \.{.aux} file, if present; then open it for output@>=
+memcpy(aux_file_name,tex_file_name,strlen(tex_file_name)-4);
+strcat(aux_file_name,".bux");
+include_depth=1; /* we simulate \.{@@i} */
+strcpy(cur_file_name,aux_file_name); /* first in, third out */
+if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
+strcpy(aux_file_name+strlen(aux_file_name)-4,".aux");@/
+strcpy(cur_file_name,aux_file_name); /* second in, second out */
+if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
+strcpy(cur_file_name,"system.bux"); /* third in, first out */
+if ((cur_file=fopen(cur_file_name,"r"))) cur_line=0;
+else include_depth--;
+if (include_depth) { /* at least one new file was opened */
+  while (get_next()==meaning) ; /* new meaning is digested */
+  if (include_depth) err_print(_("! Only @@$ is allowed in aux and bux files"));
+  finish_line(); loc=buffer; /* now reading beginning of line 1 */
+}
+if ((aux_file=fopen(aux_file_name,"wb"))==NULL)
+  fatal(_("! Cannot open aux output file "),aux_file_name);
+
+ at q Section 31->294. @>
+@ @<Write the new meaning to the \.{.aux} file@>=
+{@+int n=q->perm.prog_no;
+  fprintf(aux_file,"@@$%.*s %.*s",@|
+    (int)length(p),p->byte_start,@|
+    (int)length(title_code[n]),title_code[n]->byte_start);
+  if (*(title_code[n]->byte_start)=='{') fprintf(aux_file,"%d",q->perm.sec_no);
+  fprintf(aux_file," %s@@>\n",q->perm.tex_part);
+}
+
+ at q Section 268->295. @>
+@* Usage of identifiers.
+The following code is performed for each identifier parsed during
+a section. Variable |top_usage| is always nonzero; it has the sentinel
+value~1 initially, then it points to each variable scheduled for
+possible citation. A variable is on this list if and only if its
+|link| field is nonzero. All variables mentioned in the section are
+placed on the list, unless they are reserved and their current
+\TeX\ meaning is uninitialized.
+
+@<Flag the usage of this identifier, for the mini-index@>=
+{ struct perm_meaning *q=p-name_dir+cur_meaning;
+  if (!(abnormal(p)) || strcmp(q->perm.tex_part,"\\uninitialized")!=0)
+    if (q->link==NULL) {
+      q->link=top_usage;
+      top_usage=q;
+    }
+}
+
+ at q Section 269->296. @>
+@ @<Output information about usage of id's defined in other sections@>=
+{ struct perm_meaning *q;
+  while (temp_meaning_ptr>temp_meaning_stack) {
+    out_mini(--temp_meaning_ptr);
+    q=temp_meaning_ptr->id-name_dir+cur_meaning;
+    q->stamp=section_count; /* suppress output from ``permanent'' data */
+  }
+  while (top_usage!=usage_sentinel) {
+    q=top_usage;
+    top_usage=q->link;
+    q->link=NULL;
+    if (q->stamp!=section_count) out_mini(&(q->perm));
+  }
+}
+
+ at q Section 270->297. @>
+@ @c static void
+out_mini(
+  meaning_struct *m)
+{ char s[60];
+  name_pointer cur_name=m->id;
+  if (m->prog_no==0) { /* reference within current program */
+    if (m->sec_no==section_count) return; /* defined in current section */
+    sprintf(s,"\\[%d",m->sec_no);
+  } else { name_pointer n=title_code[m->prog_no];
+    if (*(n->byte_start)=='{')
+      sprintf(s,"\\]%.*s%d",(int)length(n),n->byte_start,m->sec_no);
+    else sprintf(s,"\\]%.*s",(int)length(n),n->byte_start);
+  }
+  out_str(s); out(' ');
+  @<Mini-output the name at |cur_name|@>@;
+  out(' '); out_str(m->tex_part); finish_line();
+}
+
+ at q Section 271->298. @>
+@ @<Predec...@>=@+static void out_mini(meaning_struct *);
+
+ at q Section 272->299. @>
+@ Compare this code with section |@<Output the name...@>|.
+
+@<Mini-output...@>=
+switch (cur_name->ilk) {@+char *j;
+  case normal: case func_template:
+    if (is_tiny(cur_name)) out_str("\\|");
+    else {
+      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;
+ at .\\|@>
+ at .\\.@>
+ at .\\\\@>
+  case wildcard: out_str("\\9"); break;
+ at .\\9@>
+  case typewriter: out_str("\\.");
+ at .\\.@>
+  case roman: break;
+  case custom:
+    out_str("$\\");
+    for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
+      out(*j=='_'? 'x': *j=='$'? 'X': *j);
+    out('$');
+    goto name_done;
+  default: out_str("\\&");
+ at .\\\&@>
+}
+out_name(cur_name,true);
+name_done:@;
+
+ at q Section 28->300. @>
+@* Handle program title.
+Here's a routine that converts a program title from the buffer
+into an internal number for the |prog_no| field of a meaning.
+It advances |loc| past the title found.
+
+ at c static sixteen_bits title_lookup(void)
+{
+  char *first=loc,*last; /* boundaries */
+  register name_pointer *p;
+  if (*loc=='"') {
+    while (++loc<=limit && *loc!='"') if (*loc=='\\') loc++;
+  } else if (*loc=='{') {
+    int balance=1; /* excess of left over right */
+    while (++loc<=limit) {
+      if (*loc==' ' && balance==1)
+        *loc='}'; /* Skip ``version'' after module name and fall through */
+      if (*loc=='}' && --balance==0) break;
+      if (*loc=='{') balance++;
+    }
+  } else err_print(_("! Title should be enclosed in braces or doublequotes"));
+  last=++loc;
+  if (last>limit) err_print(_("! Title name didn't end"));
+  if (title_code_ptr==&title_code[max_titles]) overflow(_("titles"));
+  *title_code_ptr=id_lookup(first,last,title);
+  for (p=title_code;true;p++) if (*p==*title_code_ptr) break;
+  if (p==title_code_ptr) title_code_ptr++;
+  return p-title_code;
+}
+
+ at q Section 301. @>
+@ @<Predec...@>=@+static sixteen_bits title_lookup(void);
+
+ at q Section 29->302. @>
+@ @<Give a default title to the program, if necessary@>=
+if (title_code_ptr==title_code) { /* no \.{\\def\\title} found in limbo */
+  char *saveloc=loc,*savelimit=limit; /* save */
+  loc=limit+1; limit=loc;
+  *limit++='{';
+  memcpy(limit,tex_file_name,strlen(tex_file_name)-4);
+  limit+=strlen(tex_file_name)-4;
+  *limit++='}';
+  title_lookup();@/
+  loc=saveloc; limit=savelimit; /* restore */
+}
+
+ at q Section 303. @>
+@** 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.
+
 @* 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? */
 
@@ -1940,14 +1949,13 @@
 
 @<Update the result...@>=
 if((tex_file=fopen(tex_file_name,"r"))!=NULL) {
-  char x[BUFSIZ],y[BUFSIZ];
-  int x_size,y_size,comparison=false;
+  boolean comparison=false;
 
   if((check_file=fopen(check_file_name,"r"))==NULL)
     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;
@@ -1962,10 +1970,10 @@
 
 @<Compare the temporary output to the previous output@>=
 do {
-  x_size = fread(x,1,BUFSIZ,tex_file);
-  y_size = fread(y,1,BUFSIZ,check_file);
-  comparison = (x_size == y_size); /* Do not merge these statements! */
-  if(comparison) comparison = !memcmp(x,y,x_size);
+  char x[BUFSIZ],y[BUFSIZ];
+  int x_size = fread(x,sizeof(char),BUFSIZ,tex_file);
+  int y_size = fread(y,sizeof(char),BUFSIZ,check_file);
+  comparison = (x_size == y_size) && !memcmp(x,y,x_size);
 } while(comparison && !feof(tex_file) && !feof(check_file));
 
 @ Note the superfluous call to |remove| before |rename|.  We're using it to
@@ -1979,7 +1987,7 @@
   rename(check_file_name,tex_file_name);
 }
 
-@* Put ``version'' information in \.{COMMON}.
+@* Print ``version'' information.
 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill.bux	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,17 +1,18 @@
+@$ctangle {CTWILL}3 \&{enum} \&{cweb}@>
+@$ctwill {CTWILL}3 \&{enum} \&{cweb}@>
+@$cweave {CTWILL}3 \&{enum} \&{cweb}@>
+
 @$program {COMMON.W}18 \&{int}@>
-@$ctangle {COMMON.W}18 \&{int}@>
-@$ctwill {COMMON.W}18 \&{int}@>
-@$cweave {COMMON.W}18 \&{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 +19,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 +43,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 +72,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 +80,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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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,19 +218,8 @@
 @z
 
 
- at x Section 255.
-switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char *j;
+ at x Section 264.
+switch (cur_name->ilk) {@+char *j;
 @y
-switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char huge* j;
+switch (cur_name->ilk) {@+char huge* j;
 @z
-
-
- at x Section 255.
-  case custom: {char *j; out_str("$\\");
- at y
-  case custom: {char huge* j; out_str("$\\");
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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,19 @@
 
 @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' */
 
- at c
+@<Predecl...@>=
 #if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+static void print_text(text_pointer p);
+#endif
+
+@ @c
+#if 0
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
 @z
 
 @x
@@ -272,25 +277,18 @@
 @x
 @ @<Predecl...@>=@+static void print_text(text_pointer p);
 @y
-@ @<Predecl...@>=
-#if 0
-static void print_text(text_pointer p);
-#endif
 @z
 
 @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,10 +299,9 @@
   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) {
+else if (cat1==exp && cat2!=lpar && cat2!=lbrack && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
 }
 else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
@@ -312,7 +309,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,10 +318,10 @@
   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) {
+else if (cat1==exp && cat2!=lpar && cat2!=lbrack && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
 }
 else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
@@ -332,10 +329,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 +338,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 +357,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 +366,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 +373,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 +615,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? */
 
@@ -657,14 +652,13 @@
 
 @<Update the result...@>=
 if((tex_file=fopen(tex_file_name,"r"))!=NULL) {
-  char x[BUFSIZ],y[BUFSIZ];
-  int x_size,y_size,comparison=false;
+  boolean comparison=false;
 
   if((check_file=fopen(check_file_name,"r"))==NULL)
     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;
@@ -679,10 +673,10 @@
 
 @<Compare the temporary output to the previous output@>=
 do {
-  x_size = fread(x,1,BUFSIZ,tex_file);
-  y_size = fread(y,1,BUFSIZ,check_file);
-  comparison = (x_size == y_size); /* Do not merge these statements! */
-  if(comparison) comparison = !memcmp(x,y,x_size);
+  char x[BUFSIZ],y[BUFSIZ];
+  int x_size = fread(x,sizeof(char),BUFSIZ,tex_file);
+  int y_size = fread(y,sizeof(char),BUFSIZ,check_file);
+  comparison = (x_size == y_size) && !memcmp(x,y,x_size);
 } while(comparison && !feof(tex_file) && !feof(check_file));
 
 @ Note the superfluous call to |remove| before |rename|.  We're using it to
@@ -696,7 +690,7 @@
   rename(check_file_name,tex_file_name);
 }
 
-@* Put ``version'' information in a single spot.
+@* Print ``version'' information.
 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/cweav-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweave.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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 */
 }
 
@@ -116,8 +117,6 @@
 @d line_length 80 /* lines of \TEX/ output have at most this many characters;
   should be less than 256 */
 @d max_refs 65535 /* number of cross-references; must be less than 65536 */
- at d max_texts 10239 /* number of phrases in \CEE/ texts being parsed;
-  must be less than 10240 */
 @d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
 
 @* Data structures exclusive to {\tt CWEAVE}.
@@ -143,7 +142,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 +175,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 +232,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,12 +242,12 @@
 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;
 @d no_xref (!make_xrefs)
- at d is_tiny(p) ((p+1)->byte_start==(p)->byte_start+1)
+ at d is_tiny(p) (length(p)==1)
 @d unindexed(a) (a<res_wd_end && a->ilk>=custom)
       /* tells if uses of a name are to be indexed */
 
@@ -289,9 +292,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 +312,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 +352,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 +387,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 +410,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 +444,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 +463,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 +479,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 +488,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 +516,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 +540,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 `\.{@@.}' */
@@ -548,10 +575,12 @@
 @<Private...@>=
 static eight_bits ccode[256]; /* meaning of a char following \.{@@} */
 
-@ @<Set ini...@>=
-{int c; for (c=0; c<256; c++) ccode[c]=0;}
+@ @<Set ini...@>= {
+  int c; /* must be |int| so the |for| loop will end */
+  for (c=0; c<256; c++) ccode[c]=ignore;
+}
 ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']
-   =ccode['*']=new_section;
+  =ccode['*']=new_section;
 ccode['@@']='@@'; /* `quoted' at sign */
 ccode['=']=verbatim;
 ccode['d']=ccode['D']=definition;
@@ -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 */
@@ -2145,15 +2246,18 @@
   if (p>=text_ptr) printf("BAD");
   else for (j=*p; j<*(p+1); j++) {
     r=*j%id_flag;
-    switch (*j/id_flag) {
-      case 1: printf("\\\\{"@q}@>); print_id((name_dir+r)); printf(@q{@>"}");
-        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(">");
-        break; /* |section_flag| */
-      case 4: printf("[[%d]]",r); break; /* |tok_flag| */
-      case 5: printf("|[[%d]]|",r); break; /* |inner_tok_flag| */
+    switch (*j) {
+      case id_flag:
+        printf("\\\\{"@q}@>); print_id((name_dir+r)); putchar(@q{@>'}');
+        break;
+      case res_flag:
+        printf("\\&{"@q}@>); print_id((name_dir+r)); putchar(@q{@>'}');
+        break;
+      case section_flag:
+        putchar('<'); print_section_name((name_dir+r)); putchar('>');
+        break;
+      case tok_flag: printf("[[%d]]",r); break;
+      case inner_tok_flag: printf("|[[%d]]|",r); break;
       default: @<Print token |r| in symbolic form@>@;
     }
   }
@@ -2169,6 +2273,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 +2283,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 +2358,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 +2384,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 +2426,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 +2443,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 +2497,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 +2570,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 +2601,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 +2648,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 +2661,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 +2675,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 +2711,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 +2731,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 +2738,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 +2759,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,10 +2767,9 @@
   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) {
+else if (cat1==exp && cat2!=lpar && cat2!=lbrack && cat2!=exp && cat2!=cast) {
   make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
 }
 else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
@@ -2662,18 +2777,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 +2799,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 +2806,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 +2819,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 +2843,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 +2865,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 +2876,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 +2903,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 +2936,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 +2964,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 +2973,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 +2983,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 +3007,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 +3022,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 +3072,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 +3079,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 +3090,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 +3108,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 +3119,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 +3129,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 +3138,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,27 +3289,30 @@
 }
 
 @ 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) {
-    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->mathness %4 ==  yes_math) putchar('+');
-      else if (k_l->mathness %4 ==  no_math) putchar('-');
-      print_cat(k_l->cat);
-      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 (tracing==fully) {
+  scrap_pointer k_l; /* pointer into |scrap_info| */
+  printf("\n%d:",n);
+  for (k_l=scrap_base; k_l<=lo_ptr; k_l++) {
+    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);
+    if (k_l->mathness /4 ==  yes_math) putchar('+');
+    else if (k_l->mathness /4 ==  no_math) putchar('-');
   }
+  if (hi_ptr<=scrap_ptr) printf("..."); /* indicate that more is coming */
 }
 
 @ The |translate| function assumes that scraps have been stored in
@@ -3143,8 +3332,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 +3360,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,10 +3397,9 @@
 
 @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) {
     @<Append the scrap appropriate to |next_control|@>@;
     next_control=get_next();
@@ -3236,7 +3424,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 +3459,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 +3510,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;
@@ -3362,8 +3552,7 @@
 \TEX/ will print them properly.
 @^special string characters@>
 
-@<Append a string or...@>=
-count= -1;
+@<Append a string or...@>={@+ int count=-1; /* characters remaining before string break */
 if (next_control==constant) app_str("\\T{"@q}@>);
 @.\\T@>
 else if (next_control==string) {
@@ -3407,6 +3596,7 @@
 }
 app(@q{@>'}');
 app_scrap(exp,maybe_math);
+}
 
 @ We do not make the \TEX/ string into a scrap, because there is no
 telling what the user will be putting into it; instead we leave it
@@ -3447,8 +3637,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 +3665,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 +3683,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 +3804,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 +3890,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 +3912,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 +3923,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 +3940,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 +3974,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 +3986,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 +4018,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 +4028,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 +4109,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 +4123,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 +4257,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 +4306,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 +4315,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 +4323,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 +4345,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 +4382,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 +4427,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,11 +4484,11 @@
 
 @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;
+  xref_pointer q=cur_xref; /* cross-reference pointer variable */
+  if (q->num<=flag) return;
   finish_line(); out('\\');
 @.\\A@>
 @.\\Q@>
@@ -4298,7 +4505,7 @@
 to the first cross-reference, and the last link is a zero.
 
 @<Output all the section numbers...@>=
-q=cur_xref; if (q->xlink->num>flag) out('s'); /* plural */
+if (q->xlink->num>flag) out('s'); /* plural */
 while (true) {
   out_section(cur_xref->num-flag);
   cur_xref=cur_xref->xlink; /* point to the next cross-reference to output */
@@ -4443,7 +4650,6 @@
 @f sort_pointer int
 @d sort_pointer scrap_pointer /* ditto */
 @d sort_ptr scrap_ptr /* ditto */
- at d max_sorts max_scraps /* ditto */
 
 @<Private...@>=
 static eight_bits cur_depth; /* depth of current buckets */
@@ -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 */
@@ -4575,15 +4781,16 @@
 }
 
 @ @<Output the name...@>=
-switch (cur_name->ilk) {
-  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
-    else {char *j;
+switch (cur_name->ilk) {@+char *j;
+  case normal: case func_template:
+    if (is_tiny(cur_name)) out_str("\\|");
+    else {
       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;
 @.\\|@>
 @.\\.@>
 @.\\\\@>
@@ -4592,12 +4799,12 @@
   case typewriter: out_str("\\.");
 @.\\.@>
   case roman: not_an_identifier: out_name(cur_name,false); goto name_done;
-  case custom: {char *j; out_str("$\\");
+  case custom:
+    out_str("$\\");
     for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
       out(*j=='_'? 'x': *j=='$'? 'X': *j);
     out('$');
     goto name_done;
-    }
   default: out_str("\\&");
 @.\\\&@>
 }
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cweb.1	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,4 +1,4 @@
-.TH CWEB 1 2018-Dec-16
+.TH CWEB 1 2021-Apr-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.
@@ -129,4 +137,5 @@
 by adapting the WEB conventions to\ C and by recoding everything in CWEB.
 Knuth began using CWEB and made further refinements.
 Many other helpers are acknowledged in the CWEB manual.
+Contemporary development on https://github.com/ascherer/cweb.
 

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,7 +1,7 @@
 % standard macros for CWEB listings (in addition to plain.tex)
-% Version 4.2 --- February 2021
+% Version 4.3 --- May 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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 --- May 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 --- May 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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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.3])"
 msgstr ""
 
 #: cweav-twill.ch:61
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021.3])"
 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.3])"
 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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.3])"
+msgstr "Dies ist CTANGLE (Version 4.3 [CWEBbin 2021.3])"
 
 #: 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.3])"
+msgstr "Dies ist CTWILL (Version 4.3 [CWEBbin 2021.3])"
 
 #: 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.3])"
+msgstr "Dies ist CWEAVE (Version 4.3 [CWEBbin 2021.3])"
 
 #: 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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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.3])"
+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.3])"
+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.3])"
+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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/prod-twill.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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,14 +264,63 @@
     \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
-Rule 35: The |exp| must not be immediately followed by |lpar|, |exp|,
- or~|cast|.
+Rule 35: The |exp| must not be immediately followed by |lpar|, |lbrack|,
+|exp|, or~|cast|.
 
 Rule 48: The |exp| or |int_like| must not be immediately followed by |base|.
 
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/prod.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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,14 +269,63 @@
     \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
-Rule 35: The |exp| must not be immediately followed by |lpar|, |exp|,
- or~|cast|.
+Rule 35: The |exp| must not be immediately followed by |lpar|, |lbrack|,
+|exp|, or~|cast|.
 
 Rule 48: The |exp| or |int_like| must not be immediately followed by |base|.
 
@@ -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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/refsort.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/system.bux	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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,7 +696,43 @@
   \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\datethis{} \def\datecontentspage{}
+%\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\today{\ifcase\month\or
+  January\or February\or March\or April\or May\or June\or
+  July\or August\or September\or October\or November\or December\fi
+  \space\number\day, \number\year}
+\newcount\twodigits
+\def\hours{\twodigits=\time \divide\twodigits by 60 \printtwodigits
+  \multiply\twodigits by-60 \advance\twodigits by\time :\printtwodigits}
+\def\gobbleone1{}
+\def\printtwodigits{\advance\twodigits100
+  \expandafter\gobbleone\number\twodigits
+  \advance\twodigits-100 }
+\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
+\def\datecontentspage{}
 
 % To produce only a subset of pages, put the page numbers on separate
 % lines in a file called pages.tex

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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx.w	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/help.h	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/man/ChangeLog	2021-05-03 13:03:46 UTC (rev 59061)
@@ -1,3 +1,12 @@
+2021-04-13  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-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/man/ctwill.man	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 24, 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
@@ -246,7 +254,4 @@
 .PD 0
 .P
 .PD
-\f[B]ctwill\f[R] and its utilities \f[B]ctwill-refsort\f[R] and \f[B]ctwill-twinx\f[R]
-have been fully integrated with the CWEBbin extension that serves as the
-basis for CWEB in TeX\ Live; see the project
-page (https://github.com/ascherer/cwebbin).
+Contemporary development on https://github.com/ascherer/cwebbin.

Modified: trunk/Build/source/texk/web2c/man/cweb.man
===================================================================
--- trunk/Build/source/texk/web2c/man/cweb.man	2021-05-03 03:50:12 UTC (rev 59060)
+++ trunk/Build/source/texk/web2c/man/cweb.man	2021-05-03 13:03:46 UTC (rev 59061)
@@ -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 24, 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
@@ -165,9 +172,11 @@
 Silvio Levy designed and developed CWEB by adapting the WEB conventions
 to C and by recoding everything in CWEB.
 Knuth began using CWEB and made further refinements.
+.PD 0
+.P
+.PD
 Many other helpers are acknowledged in the CWEB manual.
 .PD 0
 .P
 .PD
-CWEB in TeX\ Live is based on the CWEBbin extension; see the project
-page (https://github.com/ascherer/cwebbin).
+Contemporary development on https://github.com/ascherer/cweb.



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