texlive[57658] Build/source/texk/web2c: CWEB - release 4.0,

commits+ascherer at tug.org commits+ascherer at tug.org
Sun Feb 7 12:02:17 CET 2021


Revision: 57658
          http://tug.org/svn/texlive?view=revision&revision=57658
Author:   ascherer
Date:     2021-02-07 12:02:17 +0100 (Sun, 07 Feb 2021)
Log Message:
-----------
CWEB - release 4.0, 2021-02-07.

In the course of the "2021 TeX tuneup", Don Knuth kindly transferred
the responsibility for CWEB to me; see the original CWEB home page
(https://www-cs-faculty.stanford.edu/~knuth/cweb.html), section
"CWEB 4.0" and the updated CWEB development project
(https://github.com/ascherer/cweb).

This first new release draws heavily on the multi-decade work collected
in my "CWEBbin" project (https://github.com/ascherer/cwebbin).  I moved
(almost) all stuff from the "*-patch.*" changefiles into the new CWEB
sources and applied all of the "*-ansi.*" changes as well.

Moreover, I made "common.h" the full interface of "common.w" in order to
avoid code redundancy.  And I tried to fix as many of the bugs reported
by email to DEK and/or tex-k at tug.org.

In total, "make; make cautiously; make fullmanual" runs flawlessly with
GCC on Linux and with LLVM on MacOS.

After the release of "CWEB 4.0", also "CWEBbin 2021" has also been fully
revised.  Thousands of lines of changefiles could be purged.  What's
left are the clearcut extensions for CWEB and the additional stuff for
integration in "TeX Live 2021".

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/ChangeLog
    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/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/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/examples/wmerge.w
    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/system.bux
    trunk/Build/source/texk/web2c/man/ctwill.man
    trunk/Build/source/texk/web2c/man/cweb.man

Removed Paths:
-------------
    trunk/Build/source/texk/web2c/cwebdir/texinputs/p+cwebmac.tex

Modified: trunk/Build/source/texk/web2c/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/ChangeLog	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/ChangeLog	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,3 +1,11 @@
+2021-02-07  Andreas Scherer  <https://ascherer.github.io>
+
+	* ctangleboot.cin,
+	* cwebboot.cin,
+	* cwebdir/*,
+	* man/ctwill.man,
+	* man/cweb.man: New CWEB 4.0 amd CWEBbin 2021.
+
 2021-02-05  Karl Berry  <karl at freefriends.org>
 
 	* mf.ch: adjust for latest fixes.

Modified: trunk/Build/source/texk/web2c/ctangleboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/ctangleboot.cin	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/ctangleboot.cin	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,15 +1,9 @@
 /*1:*/
-#line 64 "cwebdir/ctangle.w"
+#line 66 "cwebdir/ctangle.w"
 
-/*2:*/
-#line 73 "cwebdir/ctang-w2c.ch"
+/*4:*/
+#line 53 "cwebdir/comm-w2c.h"
 
-#include <string.h> 
-#line 83 "cwebdir/ctangle.w"
-
-/*:2*//*6:*/
-#line 52 "cwebdir/comm-w2c.h"
-
 #ifndef HAVE_GETTEXT
 #define HAVE_GETTEXT 0
 #endif
@@ -20,33 +14,20 @@
 #define gettext(A) A
 #endif
 
+#include <ctype.h>  
 #include <stdbool.h>  
+#include <stddef.h>  
 #include <stdint.h>  
-#include <stdio.h> 
-
-/*:6*//*62:*/
-#line 888 "cwebdir/ctangle.w"
-
-#include <ctype.h>  
 #include <stdlib.h>  
+#include <stdio.h>  
+#include <string.h>  
 
-/*:62*/
-#line 65 "cwebdir/ctangle.w"
+/*:4*/
+#line 67 "cwebdir/ctangle.w"
 
-#define banner "This is CTANGLE, Version 3.64" \
+#define banner "This is CTANGLE, Version 4.0" \
  \
 
-#define max_bytes 1000000 \
-
-#define max_toks 1000000
-#define max_names 10239 \
-
-#define max_texts 10239
-#define hash_size 8501
-#define longest_name 10000
-#define stack_size 50
-#define buf_size 1000 \
-
 #define _(S) gettext(S)  \
 
 #define and_and 04
@@ -87,15 +68,20 @@
 #define mark_harmless {if(history==spotless) history= harmless_message;}
 #define mark_error history= error_message
 #define confusion(s) fatal(_("! This can't happen: ") ,s)  \
+ \
 
+#define max_include_depth 10 \
+
 #define max_file_name_length 1024
 #define cur_file file[include_depth]
 #define cur_file_name file_name[include_depth]
-#define web_file_name file_name[0]
-#define cur_line line[include_depth] \
+#define cur_line line[include_depth]
+#define web_file file[0]
+#define web_file_name file_name[0] \
 
 #define show_banner flags['b']
 #define show_progress flags['p']
+#define show_stats flags['s']
 #define show_happiness flags['h']
 #define temporary_output flags['t']
 #define make_xrefs flags['x'] \
@@ -107,6 +93,18 @@
 #define C_printf(c,a) fprintf(C_file,c,a) 
 #define C_putc(c) putc(c,C_file)  \
 
+#define max_bytes 1000000 \
+
+#define max_toks 1000000
+#define max_names 10239 \
+
+#define max_sections 4000
+#define max_texts 10239
+#define longest_name 10000
+#define stack_size 500
+#define buf_size 1000
+#define long_buf_size (buf_size+longest_name)  \
+
 #define equiv equiv_or_xref \
 
 #define section_flag max_texts \
@@ -148,7 +146,7 @@
 
 #define isxalpha(c) ((c) =='_'||(c) =='$')  \
 
-#define ishigh(c) ((unsigned char) (c) > 0177)  \
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
  \
 
 #define compress(c) if(loc++<=limit) return(c)  \
@@ -159,10 +157,10 @@
 #define max_banner 50 \
 
 
-#line 66 "cwebdir/ctangle.w"
+#line 68 "cwebdir/ctangle.w"
 
-/*5:*/
-#line 34 "cwebdir/comm-w2c.h"
+/*3:*/
+#line 35 "cwebdir/comm-w2c.h"
 
 typedef bool boolean;
 typedef uint8_t eight_bits;
@@ -173,8 +171,8 @@
 extern cweb program;
 extern int phase;
 
-/*:5*//*7:*/
-#line 86 "cwebdir/comm-w2c.h"
+/*:3*//*5:*/
+#line 91 "cwebdir/comm-w2c.h"
 
 extern char section_text[];
 extern char*section_text_end;
@@ -181,8 +179,8 @@
 extern char*id_first;
 extern char*id_loc;
 
-/*:7*//*8:*/
-#line 101 "cwebdir/comm-w2c.h"
+/*:5*//*6:*/
+#line 105 "cwebdir/comm-w2c.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -189,8 +187,8 @@
 extern char*loc;
 extern char*limit;
 
-/*:8*//*9:*/
-#line 116 "cwebdir/comm-w2c.h"
+/*:6*//*7:*/
+#line 120 "cwebdir/comm-w2c.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -213,27 +211,14 @@
 extern name_pointer hash[];
 extern hash_pointer hash_end;
 extern hash_pointer 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 void init_node(name_pointer);
-extern void init_p(name_pointer,eight_bits);
-extern void print_prefix_name(name_pointer);
-extern void print_section_name(name_pointer);
-extern void sprint_section_name(char*,name_pointer);
+/*:7*//*9:*/
+#line 164 "cwebdir/comm-w2c.h"
 
-/*:9*//*10:*/
-#line 157 "cwebdir/comm-w2c.h"
-
 extern int history;
-extern int wrap_up(void);
-extern void err_print(const char*);
-extern void fatal(const char*,const char*);
-extern void overflow(const char*);
 
-/*:10*//*11:*/
-#line 172 "cwebdir/comm-w2c.h"
+/*:9*//*11:*/
+#line 184 "cwebdir/comm-w2c.h"
 
 extern int include_depth;
 extern FILE*file[];
@@ -242,10 +227,10 @@
 extern char tex_file_name[];
 extern char idx_file_name[];
 extern char scn_file_name[];
-extern char check_file_name[];
 extern char file_name[][max_file_name_length];
 
 extern char change_file_name[];
+extern char check_file_name[];
 extern int line[];
 extern int change_line;
 extern int change_depth;
@@ -252,12 +237,9 @@
 extern boolean input_has_ended;
 extern boolean changing;
 extern boolean web_file_open;
-extern boolean get_line(void);
-extern void check_complete(void);
-extern void reset_input(void);
 
-/*:11*//*12:*/
-#line 195 "cwebdir/comm-w2c.h"
+/*:11*//*13:*/
+#line 209 "cwebdir/comm-w2c.h"
 
 extern sixteen_bits section_count;
 extern boolean changed_section[];
@@ -264,41 +246,34 @@
 extern boolean change_pending;
 extern boolean print_where;
 
-/*:12*//*13:*/
-#line 208 "cwebdir/comm-w2c.h"
+/*:13*//*14:*/
+#line 223 "cwebdir/comm-w2c.h"
 
 extern int argc;
 extern char**argv;
 extern boolean flags[];
+extern const char*use_language;
 
-/*:13*//*14:*/
-#line 220 "cwebdir/comm-w2c.h"
+/*:14*//*15:*/
+#line 236 "cwebdir/comm-w2c.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
 extern FILE*idx_file;
 extern FILE*scn_file;
+extern FILE*active_file;
 extern FILE*check_file;
-extern FILE*active_file;
 
-/*:14*//*15:*/
-#line 230 "cwebdir/comm-w2c.h"
+/*:15*//*116:*/
+#line 473 "cwebdir/ctang-w2c.ch"
 
-extern void common_init(void);
-extern void print_stats(void);
-extern void cb_show_banner(void);
-#line 128 "cwebdir/ctangle.w"
-
-/*:15*//*108:*/
-#line 903 "cwebdir/ctang-w2c.ch"
-
 extern char cb_banner[];
 
-/*:108*/
-#line 67 "cwebdir/ctangle.w"
+/*:116*/
+#line 69 "cwebdir/ctangle.w"
 
-/*16:*/
-#line 152 "cwebdir/ctangle.w"
+/*19:*/
+#line 124 "cwebdir/ctangle.w"
 
 typedef struct{
 eight_bits*tok_start;
@@ -306,8 +281,8 @@
 }text;
 typedef text*text_pointer;
 
-/*:16*//*27:*/
-#line 296 "cwebdir/ctangle.w"
+/*:19*//*31:*/
+#line 272 "cwebdir/ctangle.w"
 
 typedef struct{
 eight_bits*end_field;
@@ -318,11 +293,11 @@
 }output_state;
 typedef output_state*stack_pointer;
 
-/*:27*/
-#line 68 "cwebdir/ctangle.w"
+/*:31*/
+#line 70 "cwebdir/ctangle.w"
 
-/*17:*/
-#line 159 "cwebdir/ctangle.w"
+/*20:*/
+#line 131 "cwebdir/ctangle.w"
 
 text text_info[max_texts];
 text_pointer text_info_end= text_info+max_texts-1;
@@ -331,13 +306,13 @@
 eight_bits*tok_mem_end= tok_mem+max_toks-1;
 eight_bits*tok_ptr;
 
-/*:17*//*23:*/
-#line 227 "cwebdir/ctangle.w"
+/*:20*//*26:*/
+#line 200 "cwebdir/ctangle.w"
 
 text_pointer last_unnamed;
 
-/*:23*//*28:*/
-#line 312 "cwebdir/ctangle.w"
+/*:26*//*32:*/
+#line 288 "cwebdir/ctangle.w"
 
 output_state cur_state;
 
@@ -345,163 +320,207 @@
 stack_pointer stack_ptr;
 stack_pointer stack_end= stack+stack_size;
 
-/*:28*//*32:*/
-#line 384 "cwebdir/ctangle.w"
+/*:32*//*37:*/
+#line 364 "cwebdir/ctangle.w"
 
 int cur_val;
 
-/*:32*//*36:*/
-#line 473 "cwebdir/ctangle.w"
+/*:37*//*42:*/
+#line 456 "cwebdir/ctangle.w"
 
 eight_bits out_state;
 boolean protect;
 
-/*:36*//*38:*/
-#line 502 "cwebdir/ctangle.w"
+/*:42*//*45:*/
+#line 488 "cwebdir/ctangle.w"
 
 name_pointer output_files[max_files];
 name_pointer*cur_out_file,*end_output_files,*an_output_file;
 char cur_section_name_char;
-char output_file_name[longest_name];
+char output_file_name[longest_name+1];
 
-/*:38*//*45:*/
-#line 599 "cwebdir/ctangle.w"
+/*:45*//*52:*/
+#line 588 "cwebdir/ctangle.w"
 
 boolean output_defs_seen= 0;
 
-/*:45*//*51:*/
-#line 710 "cwebdir/ctangle.w"
+/*:52*//*57:*/
+#line 697 "cwebdir/ctangle.w"
 
 char translit[128][translit_length];
 
-/*:51*//*56:*/
-#line 789 "cwebdir/ctangle.w"
+/*:57*//*62:*/
+#line 776 "cwebdir/ctangle.w"
 
 eight_bits ccode[256];
 
-/*:56*//*59:*/
-#line 845 "cwebdir/ctangle.w"
+/*:62*//*66:*/
+#line 836 "cwebdir/ctangle.w"
 
 boolean comment_continues= 0;
 
-/*:59*//*61:*/
-#line 884 "cwebdir/ctangle.w"
+/*:66*//*68:*/
+#line 875 "cwebdir/ctangle.w"
 
 name_pointer cur_section_name;
 int no_where;
 
-/*:61*//*75:*/
-#line 1195 "cwebdir/ctangle.w"
+/*:68*//*82:*/
+#line 1189 "cwebdir/ctangle.w"
 
 text_pointer cur_text;
 eight_bits next_control;
 
-/*:75*//*82:*/
-#line 1353 "cwebdir/ctangle.w"
+/*:82*//*90:*/
+#line 1350 "cwebdir/ctangle.w"
 
 extern sixteen_bits section_count;
 
-/*:82*/
-#line 69 "cwebdir/ctangle.w"
+/*:90*/
+#line 71 "cwebdir/ctangle.w"
 
-/*41:*/
-#line 533 "cwebdir/ctangle.w"
+/*8:*/
+#line 143 "cwebdir/comm-w2c.h"
 
-#line 264 "cwebdir/ctang-w2c.ch"
+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 void init_node(name_pointer);
+extern void init_p(name_pointer,eight_bits);
+extern void print_prefix_name(name_pointer);
+extern void print_section_name(name_pointer);
+extern void sprint_section_name(char*,name_pointer);
+
+/*:8*//*10:*/
+#line 167 "cwebdir/comm-w2c.h"
+
+extern int wrap_up(void);
+extern void err_print(const char*);
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
+
+/*:10*//*12:*/
+#line 203 "cwebdir/comm-w2c.h"
+
+extern boolean get_line(void);
+extern void check_complete(void);
+extern void reset_input(void);
+
+/*:12*//*16:*/
+#line 245 "cwebdir/comm-w2c.h"
+
+extern void common_init(void);
+extern void print_stats(void);
+extern void cb_show_banner(void);
+
+/*:16*//*29:*/
+#line 233 "cwebdir/ctangle.w"
+
+static void store_two_bytes(sixteen_bits);
+
+/*:29*//*34:*/
+#line 312 "cwebdir/ctangle.w"
+
+static void push_level(name_pointer);
+static void pop_level(int);
+
+/*:34*//*38:*/
+#line 371 "cwebdir/ctangle.w"
+
+static void get_output(void);
+
+/*:38*//*43:*/
+#line 464 "cwebdir/ctangle.w"
+
+static void flush_buffer(void);
+
+/*:43*//*48:*/
+#line 519 "cwebdir/ctangle.w"
+
 static void phase_two(void);
-#line 535 "cwebdir/ctangle.w"
 
-/*:41*//*46:*/
-#line 602 "cwebdir/ctangle.w"
+/*:48*//*53:*/
+#line 591 "cwebdir/ctangle.w"
 
-#line 351 "cwebdir/ctang-w2c.ch"
 static void output_defs(void);
-#line 604 "cwebdir/ctangle.w"
+static void out_char(eight_bits);
 
-/*:46*//*48:*/
-#line 648 "cwebdir/ctangle.w"
+/*:53*//*64:*/
+#line 800 "cwebdir/ctangle.w"
 
-#line 371 "cwebdir/ctang-w2c.ch"
-static void out_char(eight_bits);
-#line 650 "cwebdir/ctangle.w"
+static eight_bits skip_ahead(void);
+static boolean skip_comment(boolean);
 
-/*:48*//*90:*/
+/*:64*//*69:*/
+#line 887 "cwebdir/ctangle.w"
+
+static eight_bits get_next(void);
+
+/*:69*//*83:*/
+#line 1193 "cwebdir/ctangle.w"
+
+static void scan_repl(eight_bits);
+
+/*:83*//*91:*/
+#line 1357 "cwebdir/ctangle.w"
+
+static void scan_section(void);
+
+/*:91*//*99:*/
 #line 1460 "cwebdir/ctangle.w"
 
-#line 667 "cwebdir/ctang-w2c.ch"
 static void phase_one(void);
-#line 1462 "cwebdir/ctangle.w"
 
-/*:90*//*92:*/
+/*:99*//*101:*/
 #line 1478 "cwebdir/ctangle.w"
 
-#line 681 "cwebdir/ctang-w2c.ch"
 static void skip_limbo(void);
-#line 1480 "cwebdir/ctangle.w"
 
-/*:92*//*97:*/
-#line 766 "cwebdir/ctang-w2c.ch"
+/*:101*/
+#line 72 "cwebdir/ctangle.w"
 
-static eight_bits get_next(void);
-static eight_bits skip_ahead(void);
-static boolean skip_comment(boolean);
-static void flush_buffer(void);
-static void get_output(void);
-static void pop_level(int);
-static void push_level(name_pointer);
-static void scan_repl(eight_bits);
-static void scan_section(void);
-static void store_two_bytes(sixteen_bits);
 
-/*:97*/
-#line 70 "cwebdir/ctangle.w"
+/*:1*//*2:*/
+#line 81 "cwebdir/ctangle.w"
 
-
-#line 68 "cwebdir/ctang-w2c.ch"
-/*:1*//*3:*/
-#line 91 "cwebdir/ctangle.w"
-
-#line 82 "cwebdir/ctang-w2c.ch"
 int main(
 int ac,
 char**av)
-#line 95 "cwebdir/ctangle.w"
 {
 argc= ac;argv= av;
 program= ctangle;
-/*18:*/
-#line 167 "cwebdir/ctangle.w"
+/*21:*/
+#line 139 "cwebdir/ctangle.w"
 
 text_info->tok_start= tok_ptr= tok_mem;
 text_ptr= text_info+1;text_ptr->tok_start= tok_mem;
 
 
-/*:18*//*20:*/
-#line 177 "cwebdir/ctangle.w"
+/*:21*//*23:*/
+#line 149 "cwebdir/ctangle.w"
 
-#line 143 "cwebdir/ctang-w2c.ch"
 init_node(name_dir);
-#line 179 "cwebdir/ctangle.w"
 
-/*:20*//*24:*/
-#line 230 "cwebdir/ctangle.w"
+/*:23*//*27:*/
+#line 203 "cwebdir/ctangle.w"
 last_unnamed= text_info;text_info->text_link= 0;
 
-/*:24*//*39:*/
-#line 512 "cwebdir/ctangle.w"
+/*:27*//*46:*/
+#line 498 "cwebdir/ctangle.w"
 
 cur_out_file= end_output_files= output_files+max_files;
 
-/*:39*//*52:*/
-#line 713 "cwebdir/ctangle.w"
+/*:46*//*58:*/
+#line 700 "cwebdir/ctangle.w"
 
 {
 int i;
-for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned)(128+i));
+for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned int)(128+i));
 }
 
-/*:52*//*57:*/
-#line 792 "cwebdir/ctangle.w"
+/*:58*//*63:*/
+#line 779 "cwebdir/ctangle.w"
 {
 int c;
 for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -520,31 +539,30 @@
 ccode['\'']= ord;
 }
 
-/*:57*//*71:*/
-#line 1116 "cwebdir/ctangle.w"
+/*:63*//*78:*/
+#line 1110 "cwebdir/ctangle.w"
 section_text[0]= ' ';
 
-/*:71*//*109:*/
-#line 906 "cwebdir/ctang-w2c.ch"
+/*:78*//*117:*/
+#line 476 "cwebdir/ctang-w2c.ch"
 
 strncpy(cb_banner,banner,max_banner-1);
 
-/*:109*/
-#line 98 "cwebdir/ctangle.w"
-;
+/*:117*/
+#line 88 "cwebdir/ctangle.w"
+
 common_init();
-#line 90 "cwebdir/ctang-w2c.ch"
+#line 53 "cwebdir/ctang-w2c.ch"
 if(show_banner)cb_show_banner();
-#line 101 "cwebdir/ctangle.w"
+#line 91 "cwebdir/ctangle.w"
 phase_one();
 phase_two();
 return wrap_up();
 }
 
-/*:3*//*21:*/
-#line 183 "cwebdir/ctangle.w"
+/*:2*//*24:*/
+#line 155 "cwebdir/ctangle.w"
 
-#line 153 "cwebdir/ctang-w2c.ch"
 boolean names_match(
 name_pointer p,
 const char*first,
@@ -551,57 +569,46 @@
 size_t l,
 eight_bits t)
 {(void)t;
-#line 189 "cwebdir/ctangle.w"
 if(length(p)!=l)return 0;
 return!strncmp(first,p->byte_start,l);
 }
 
-/*:21*//*22:*/
-#line 198 "cwebdir/ctangle.w"
+/*:24*//*25:*/
+#line 171 "cwebdir/ctangle.w"
 
-#line 166 "cwebdir/ctang-w2c.ch"
 void
 init_node(
 name_pointer node)
-#line 202 "cwebdir/ctangle.w"
 {
-#line 174 "cwebdir/ctang-w2c.ch"
 node->equiv= (void*)text_info;
-#line 204 "cwebdir/ctangle.w"
 }
-#line 181 "cwebdir/ctang-w2c.ch"
 void
 init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
-#line 207 "cwebdir/ctangle.w"
 
-/*:22*//*26:*/
-#line 260 "cwebdir/ctangle.w"
+/*:25*//*30:*/
+#line 236 "cwebdir/ctangle.w"
 
-#line 190 "cwebdir/ctang-w2c.ch"
-static void
+void
 store_two_bytes(
 sixteen_bits x)
-#line 264 "cwebdir/ctangle.w"
 {
-#line 198 "cwebdir/ctang-w2c.ch"
+#line 65 "cwebdir/ctang-w2c.ch"
 if(tok_ptr+2> tok_mem_end)overflow(_("token"));
-#line 266 "cwebdir/ctangle.w"
+#line 242 "cwebdir/ctangle.w"
 *tok_ptr++= x>>8;
 *tok_ptr++= x&0377;
 }
 
-/*:26*//*30:*/
-#line 336 "cwebdir/ctangle.w"
+/*:30*//*35:*/
+#line 316 "cwebdir/ctangle.w"
 
-#line 206 "cwebdir/ctang-w2c.ch"
 static void
 push_level(
 name_pointer p)
-#line 340 "cwebdir/ctangle.w"
 {
-#line 214 "cwebdir/ctang-w2c.ch"
+#line 71 "cwebdir/ctang-w2c.ch"
 if(stack_ptr==stack_end)overflow(_("stack"));
-#line 342 "cwebdir/ctangle.w"
+#line 322 "cwebdir/ctangle.w"
 *stack_ptr= cur_state;
 stack_ptr++;
 if(p!=NULL){
@@ -611,14 +618,12 @@
 }
 }
 
-/*:30*//*31:*/
-#line 355 "cwebdir/ctangle.w"
+/*:35*//*36:*/
+#line 335 "cwebdir/ctangle.w"
 
-#line 222 "cwebdir/ctang-w2c.ch"
 static void
 pop_level(
 int flag)
-#line 359 "cwebdir/ctangle.w"
 {
 if(flag&&cur_repl->text_link<section_flag){
 cur_repl= cur_repl->text_link+text_info;
@@ -629,13 +634,11 @@
 if(stack_ptr> stack)cur_state= *stack_ptr;
 }
 
-/*:31*//*33:*/
-#line 391 "cwebdir/ctangle.w"
+/*:36*//*39:*/
+#line 374 "cwebdir/ctangle.w"
 
-#line 231 "cwebdir/ctang-w2c.ch"
 static void
 get_output(void)
-#line 394 "cwebdir/ctangle.w"
 {
 sixteen_bits a;
 restart:if(stack_ptr==stack)return;
@@ -654,18 +657,16 @@
 switch(a/024000){
 case 0:cur_val= a;out_char(identifier);break;
 case 1:if(a==output_defs_flag)output_defs();
-else/*34:*/
-#line 423 "cwebdir/ctangle.w"
+else/*40:*/
+#line 406 "cwebdir/ctangle.w"
 
 {
 a-= 024000;
-#line 238 "cwebdir/ctang-w2c.ch"
 if((a+name_dir)->equiv!=(void*)text_info)push_level(a+name_dir);
-#line 427 "cwebdir/ctangle.w"
 else if(a!=0){
-#line 244 "cwebdir/ctang-w2c.ch"
+#line 77 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! Not present: <"),stdout);
-#line 429 "cwebdir/ctangle.w"
+#line 412 "cwebdir/ctangle.w"
 print_section_name(a+name_dir);err_print(">");
 
 }
@@ -672,9 +673,9 @@
 goto restart;
 }
 
-/*:34*/
-#line 412 "cwebdir/ctangle.w"
-;
+/*:40*/
+#line 395 "cwebdir/ctangle.w"
+
 break;
 default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
 out_char(section_number);
@@ -682,13 +683,11 @@
 }
 }
 
-/*:33*//*37:*/
-#line 481 "cwebdir/ctangle.w"
+/*:39*//*44:*/
+#line 467 "cwebdir/ctangle.w"
 
-#line 251 "cwebdir/ctang-w2c.ch"
 static void
 flush_buffer(void)
-#line 484 "cwebdir/ctangle.w"
 {
 C_putc('\n');
 if(cur_line%100==0&&show_progress){
@@ -699,51 +698,49 @@
 cur_line++;
 }
 
-/*:37*//*42:*/
-#line 536 "cwebdir/ctangle.w"
+/*:44*//*49:*/
+#line 522 "cwebdir/ctangle.w"
 
-#line 271 "cwebdir/ctang-w2c.ch"
 static void
 phase_two(void){
-#line 539 "cwebdir/ctangle.w"
 web_file_open= 0;
 cur_line= 1;
-/*29:*/
-#line 325 "cwebdir/ctangle.w"
+/*33:*/
+#line 301 "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;
 
-/*:29*/
-#line 541 "cwebdir/ctangle.w"
-;
-/*44:*/
-#line 595 "cwebdir/ctangle.w"
+/*:33*/
+#line 527 "cwebdir/ctangle.w"
 
+/*51:*/
+#line 584 "cwebdir/ctangle.w"
+
 if(!output_defs_seen)
 output_defs();
 
-/*:44*/
-#line 542 "cwebdir/ctangle.w"
-;
+/*:51*/
+#line 528 "cwebdir/ctangle.w"
+
 if(text_info->text_link==0&&cur_out_file==end_output_files){
-#line 278 "cwebdir/ctang-w2c.ch"
+#line 89 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! No program text was specified."),stdout);mark_harmless;
-#line 545 "cwebdir/ctangle.w"
+#line 531 "cwebdir/ctangle.w"
 
 }
 else{
 if(cur_out_file==end_output_files){
 if(show_progress)
-#line 284 "cwebdir/ctang-w2c.ch"
+#line 95 "cwebdir/ctang-w2c.ch"
 printf(_("\nWriting the output file (%s):"),C_file_name);
-#line 551 "cwebdir/ctangle.w"
+#line 537 "cwebdir/ctangle.w"
 }
 else{
 if(show_progress){
-#line 290 "cwebdir/ctang-w2c.ch"
+#line 101 "cwebdir/ctang-w2c.ch"
 fputs(_("\nWriting the output files:"),stdout);
-#line 555 "cwebdir/ctangle.w"
+#line 541 "cwebdir/ctangle.w"
 
 printf(" (%s)",C_file_name);
 update_terminal;
@@ -752,16 +749,16 @@
 }
 while(stack_ptr> stack)get_output();
 flush_buffer();
-writeloop:/*43:*/
-#line 322 "cwebdir/ctang-w2c.ch"
+writeloop:/*50:*/
+#line 130 "cwebdir/ctang-w2c.ch"
 
 fclose(C_file);C_file= NULL;
-/*98:*/
-#line 786 "cwebdir/ctang-w2c.ch"
+/*106:*/
+#line 356 "cwebdir/ctang-w2c.ch"
 
 if((C_file= fopen(C_file_name,"r"))!=NULL){
-/*99:*/
-#line 793 "cwebdir/ctang-w2c.ch"
+/*107:*/
+#line 363 "cwebdir/ctang-w2c.ch"
 
 char x[BUFSIZ],y[BUFSIZ];
 int x_size,y_size,comparison= false;
@@ -770,8 +767,8 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-if(temporary_output)/*100:*/
-#line 808 "cwebdir/ctang-w2c.ch"
+if(temporary_output)/*108:*/
+#line 378 "cwebdir/ctang-w2c.ch"
 
 do{
 x_size= fread(x,1,BUFSIZ,C_file);
@@ -780,18 +777,18 @@
 if(comparison)comparison= !memcmp(x,y,x_size);
 }while(comparison&&!feof(C_file)&&!feof(check_file));
 
-/*:100*/
-#line 801 "cwebdir/ctang-w2c.ch"
+/*:108*/
+#line 371 "cwebdir/ctang-w2c.ch"
 
 
 fclose(C_file);C_file= NULL;
 fclose(check_file);check_file= NULL;
 
-/*:99*/
-#line 788 "cwebdir/ctang-w2c.ch"
+/*:107*/
+#line 358 "cwebdir/ctang-w2c.ch"
 
-/*101:*/
-#line 819 "cwebdir/ctang-w2c.ch"
+/*109:*/
+#line 389 "cwebdir/ctang-w2c.ch"
 
 if(comparison)
 remove(check_file_name);
@@ -800,14 +797,14 @@
 rename(check_file_name,C_file_name);
 }
 
-/*:101*/
-#line 789 "cwebdir/ctang-w2c.ch"
+/*:109*/
+#line 359 "cwebdir/ctang-w2c.ch"
 
 }else
 rename(check_file_name,C_file_name);
 
-/*:98*/
-#line 324 "cwebdir/ctang-w2c.ch"
+/*:106*/
+#line 132 "cwebdir/ctang-w2c.ch"
 
 for(an_output_file= end_output_files;an_output_file> cur_out_file;){
 an_output_file--;
@@ -827,15 +824,15 @@
 cur_end= (cur_repl+1)->tok_start;
 while(stack_ptr> stack)get_output();
 flush_buffer();fclose(C_file);C_file= NULL;
-/*102:*/
-#line 832 "cwebdir/ctang-w2c.ch"
+/*110:*/
+#line 402 "cwebdir/ctang-w2c.ch"
 
 if(0==strcmp("/dev/stdout",output_file_name))
-/*104:*/
-#line 859 "cwebdir/ctang-w2c.ch"
+/*112:*/
+#line 429 "cwebdir/ctang-w2c.ch"
 {
-/*107:*/
-#line 890 "cwebdir/ctang-w2c.ch"
+/*115:*/
+#line 460 "cwebdir/ctang-w2c.ch"
 
 char in_buf[BUFSIZ+1];
 int in_size,comparison= true;
@@ -843,8 +840,8 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-/*:107*/
-#line 860 "cwebdir/ctang-w2c.ch"
+/*:115*/
+#line 430 "cwebdir/ctang-w2c.ch"
 
 do{
 in_size= fread(in_buf,1,BUFSIZ,check_file);
@@ -852,8 +849,8 @@
 fprintf(stdout,"%s",in_buf);
 }while(!feof(check_file));
 fclose(check_file);check_file= NULL;
-/*103:*/
-#line 849 "cwebdir/ctang-w2c.ch"
+/*111:*/
+#line 419 "cwebdir/ctang-w2c.ch"
 
 if(comparison)
 remove(check_file_name);
@@ -862,20 +859,20 @@
 rename(check_file_name,output_file_name);
 }
 
-/*:103*/
-#line 867 "cwebdir/ctang-w2c.ch"
+/*:111*/
+#line 437 "cwebdir/ctang-w2c.ch"
 
 }
 
-/*:104*/
-#line 834 "cwebdir/ctang-w2c.ch"
+/*:112*/
+#line 404 "cwebdir/ctang-w2c.ch"
 
 else if(0==strcmp("/dev/stderr",output_file_name))
-/*105:*/
-#line 872 "cwebdir/ctang-w2c.ch"
+/*113:*/
+#line 442 "cwebdir/ctang-w2c.ch"
 {
-/*107:*/
-#line 890 "cwebdir/ctang-w2c.ch"
+/*115:*/
+#line 460 "cwebdir/ctang-w2c.ch"
 
 char in_buf[BUFSIZ+1];
 int in_size,comparison= true;
@@ -883,8 +880,8 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-/*:107*/
-#line 873 "cwebdir/ctang-w2c.ch"
+/*:115*/
+#line 443 "cwebdir/ctang-w2c.ch"
 
 do{
 in_size= fread(in_buf,1,BUFSIZ,check_file);
@@ -892,8 +889,8 @@
 fprintf(stderr,"%s",in_buf);
 }while(!feof(check_file));
 fclose(check_file);check_file= NULL;
-/*103:*/
-#line 849 "cwebdir/ctang-w2c.ch"
+/*111:*/
+#line 419 "cwebdir/ctang-w2c.ch"
 
 if(comparison)
 remove(check_file_name);
@@ -902,21 +899,21 @@
 rename(check_file_name,output_file_name);
 }
 
-/*:103*/
-#line 880 "cwebdir/ctang-w2c.ch"
+/*:111*/
+#line 450 "cwebdir/ctang-w2c.ch"
 
 }
 
-/*:105*/
-#line 836 "cwebdir/ctang-w2c.ch"
+/*:113*/
+#line 406 "cwebdir/ctang-w2c.ch"
 
 else if(0==strcmp("/dev/null",output_file_name))
-/*106:*/
-#line 885 "cwebdir/ctang-w2c.ch"
+/*114:*/
+#line 455 "cwebdir/ctang-w2c.ch"
 {
 int comparison= true;
-/*103:*/
-#line 849 "cwebdir/ctang-w2c.ch"
+/*111:*/
+#line 419 "cwebdir/ctang-w2c.ch"
 
 if(comparison)
 remove(check_file_name);
@@ -925,18 +922,18 @@
 rename(check_file_name,output_file_name);
 }
 
-/*:103*/
-#line 887 "cwebdir/ctang-w2c.ch"
+/*:111*/
+#line 457 "cwebdir/ctang-w2c.ch"
 
 }
 
-/*:106*/
-#line 838 "cwebdir/ctang-w2c.ch"
+/*:114*/
+#line 408 "cwebdir/ctang-w2c.ch"
 
 else{
 if((C_file= fopen(output_file_name,"r"))!=NULL){
-/*99:*/
-#line 793 "cwebdir/ctang-w2c.ch"
+/*107:*/
+#line 363 "cwebdir/ctang-w2c.ch"
 
 char x[BUFSIZ],y[BUFSIZ];
 int x_size,y_size,comparison= false;
@@ -945,8 +942,8 @@
 fatal(_("! Cannot open output file "),check_file_name);
 
 
-if(temporary_output)/*100:*/
-#line 808 "cwebdir/ctang-w2c.ch"
+if(temporary_output)/*108:*/
+#line 378 "cwebdir/ctang-w2c.ch"
 
 do{
 x_size= fread(x,1,BUFSIZ,C_file);
@@ -955,18 +952,18 @@
 if(comparison)comparison= !memcmp(x,y,x_size);
 }while(comparison&&!feof(C_file)&&!feof(check_file));
 
-/*:100*/
-#line 801 "cwebdir/ctang-w2c.ch"
+/*:108*/
+#line 371 "cwebdir/ctang-w2c.ch"
 
 
 fclose(C_file);C_file= NULL;
 fclose(check_file);check_file= NULL;
 
-/*:99*/
-#line 841 "cwebdir/ctang-w2c.ch"
+/*:107*/
+#line 411 "cwebdir/ctang-w2c.ch"
 
-/*103:*/
-#line 849 "cwebdir/ctang-w2c.ch"
+/*111:*/
+#line 419 "cwebdir/ctang-w2c.ch"
 
 if(comparison)
 remove(check_file_name);
@@ -975,39 +972,37 @@
 rename(check_file_name,output_file_name);
 }
 
-/*:103*/
-#line 842 "cwebdir/ctang-w2c.ch"
+/*:111*/
+#line 412 "cwebdir/ctang-w2c.ch"
 
 }else
 rename(check_file_name,output_file_name);
 }
 
-/*:102*/
-#line 343 "cwebdir/ctang-w2c.ch"
+/*:110*/
+#line 151 "cwebdir/ctang-w2c.ch"
 
 }
 strcpy(check_file_name,"");
-#line 590 "cwebdir/ctangle.w"
+#line 579 "cwebdir/ctangle.w"
 
-/*:43*/
-#line 563 "cwebdir/ctangle.w"
-;
-#line 296 "cwebdir/ctang-w2c.ch"
+/*:50*/
+#line 549 "cwebdir/ctangle.w"
+
 if(show_happiness){
 if(show_progress)new_line;
+#line 107 "cwebdir/ctang-w2c.ch"
 fputs(_("Done."),stdout);
+#line 553 "cwebdir/ctangle.w"
 }
-#line 565 "cwebdir/ctangle.w"
 }
 }
 
-/*:42*//*47:*/
-#line 605 "cwebdir/ctangle.w"
+/*:49*//*54:*/
+#line 595 "cwebdir/ctangle.w"
 
-#line 358 "cwebdir/ctang-w2c.ch"
 static void
 output_defs(void)
-#line 608 "cwebdir/ctangle.w"
 {
 sixteen_bits a;
 push_level(NULL);
@@ -1030,9 +1025,9 @@
 if(a<024000){
 cur_val= a;out_char(identifier);
 }
-#line 365 "cwebdir/ctang-w2c.ch"
+#line 159 "cwebdir/ctang-w2c.ch"
 else if(a<050000){confusion(_("macro defs have strange char"));}
-#line 631 "cwebdir/ctangle.w"
+#line 621 "cwebdir/ctangle.w"
 else{
 cur_val= a-050000;cur_section= cur_val;out_char(section_number);
 }
@@ -1045,14 +1040,12 @@
 pop_level(0);
 }
 
-/*:47*//*49:*/
-#line 651 "cwebdir/ctangle.w"
+/*:54*//*55:*/
+#line 638 "cwebdir/ctangle.w"
 
-#line 379 "cwebdir/ctang-w2c.ch"
 static void
 out_char(
 eight_bits cur_char)
-#line 655 "cwebdir/ctangle.w"
 {
 char*j,*k;
 restart:
@@ -1060,8 +1053,8 @@
 case'\n':if(protect&&out_state!=verbatim)C_putc(' ');
 if(protect||out_state==verbatim)C_putc('\\');
 flush_buffer();if(out_state!=verbatim)out_state= normal;break;
-/*53:*/
-#line 719 "cwebdir/ctangle.w"
+/*59:*/
+#line 706 "cwebdir/ctangle.w"
 
 case identifier:
 if(out_state==num_or_id)C_putc(' ');
@@ -1068,19 +1061,19 @@
 j= (cur_val+name_dir)->byte_start;
 k= (cur_val+name_dir+1)->byte_start;
 while(j<k){
-if((unsigned char)(*j)<0200)C_putc(*j);
+if((eight_bits)(*j)<0200)C_putc(*j);
 
-else C_printf("%s",translit[(unsigned char)(*j)-0200]);
+else C_printf("%s",translit[(eight_bits)(*j)-0200]);
 j++;
 }
 out_state= num_or_id;break;
 
-/*:53*/
-#line 662 "cwebdir/ctangle.w"
-;
-/*54:*/
-#line 732 "cwebdir/ctangle.w"
+/*:59*/
+#line 649 "cwebdir/ctangle.w"
 
+/*60:*/
+#line 719 "cwebdir/ctangle.w"
+
 case section_number:
 if(cur_val> 0)C_printf("/*%d:*/",cur_val);
 else if(cur_val<0)C_printf("/*:%d*/",-cur_val);
@@ -1105,12 +1098,12 @@
 }
 break;
 
-/*:54*/
-#line 663 "cwebdir/ctangle.w"
-;
-/*50:*/
-#line 404 "cwebdir/ctang-w2c.ch"
+/*:60*/
+#line 650 "cwebdir/ctangle.w"
 
+/*56:*/
+#line 668 "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;
 case minus_gt:C_putc('-');C_putc('>');out_state= normal;break;
@@ -1128,11 +1121,10 @@
 case period_ast:C_putc('.');C_putc('*');out_state= normal;break;
 case minus_gt_ast:C_putc('-');C_putc('>');C_putc('*');out_state= normal;
 break;
-#line 699 "cwebdir/ctangle.w"
 
-/*:50*/
-#line 664 "cwebdir/ctangle.w"
-;
+/*:56*/
+#line 651 "cwebdir/ctangle.w"
+
 case'=':case'>':C_putc(cur_char);C_putc(' ');
 out_state= normal;break;
 case join:out_state= unbreakable;break;
@@ -1149,14 +1141,11 @@
 }
 }
 
-#line 404 "cwebdir/ctang-w2c.ch"
-/*:49*//*58:*/
-#line 813 "cwebdir/ctangle.w"
+/*:55*//*65:*/
+#line 804 "cwebdir/ctangle.w"
 
-#line 428 "cwebdir/ctang-w2c.ch"
 static eight_bits
 skip_ahead(void)
-#line 816 "cwebdir/ctangle.w"
 {
 eight_bits c;
 while(1){
@@ -1170,13 +1159,11 @@
 }
 }
 
-/*:58*//*60:*/
-#line 848 "cwebdir/ctangle.w"
+/*:65*//*67:*/
+#line 839 "cwebdir/ctangle.w"
 
-#line 436 "cwebdir/ctang-w2c.ch"
 static boolean skip_comment(
 boolean is_long_comment)
-#line 851 "cwebdir/ctangle.w"
 {
 char c;
 while(1){
@@ -1184,9 +1171,9 @@
 if(is_long_comment){
 if(get_line())return(comment_continues= 1);
 else{
-#line 443 "cwebdir/ctang-w2c.ch"
+#line 165 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in mid-comment"));
-#line 859 "cwebdir/ctangle.w"
+#line 850 "cwebdir/ctangle.w"
 
 return(comment_continues= 0);
 }
@@ -1199,9 +1186,9 @@
 }
 if(c=='@'){
 if(ccode[(eight_bits)*loc]==new_section){
-#line 449 "cwebdir/ctang-w2c.ch"
+#line 171 "cwebdir/ctang-w2c.ch"
 err_print(_("! Section name ended in mid-comment"));loc--;
-#line 872 "cwebdir/ctangle.w"
+#line 863 "cwebdir/ctangle.w"
 
 return(comment_continues= 0);
 }
@@ -1210,13 +1197,11 @@
 }
 }
 
-/*:60*//*63:*/
-#line 900 "cwebdir/ctangle.w"
+/*:67*//*70:*/
+#line 890 "cwebdir/ctangle.w"
 
-#line 456 "cwebdir/ctang-w2c.ch"
 static eight_bits
 get_next(void)
-#line 903 "cwebdir/ctangle.w"
 {
 static int preprocessing= 0;
 eight_bits c;
@@ -1226,8 +1211,8 @@
 if(get_line()==0)return(new_section);
 else if(print_where&&!no_where){
 print_where= 0;
-/*77:*/
-#line 1225 "cwebdir/ctangle.w"
+/*85:*/
+#line 1222 "cwebdir/ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1238,14 +1223,12 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-#line 598 "cwebdir/ctang-w2c.ch"
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
-#line 1237 "cwebdir/ctangle.w"
 
-/*:77*/
-#line 912 "cwebdir/ctangle.w"
-;
+/*:85*/
+#line 902 "cwebdir/ctangle.w"
+
 }
 else return('\n');
 }
@@ -1257,8 +1240,8 @@
 else continue;
 }
 loc++;
-if(xisdigit(c)||c=='.')/*66:*/
-#line 978 "cwebdir/ctangle.w"
+if(xisdigit(c)||c=='.')/*73:*/
+#line 971 "cwebdir/ctangle.w"
 {
 id_first= loc-1;
 if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
@@ -1282,38 +1265,34 @@
 return(constant);
 }
 
-/*:66*/
-#line 924 "cwebdir/ctangle.w"
+/*:73*/
+#line 914 "cwebdir/ctangle.w"
 
-#line 463 "cwebdir/ctang-w2c.ch"
 else if(c=='\''||c=='"'
 ||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
 ||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
-#line 926 "cwebdir/ctangle.w"
-/*67:*/
-#line 1006 "cwebdir/ctangle.w"
+/*74:*/
+#line 999 "cwebdir/ctangle.w"
 {
 char delim= c;
 id_first= section_text+1;
 id_loc= section_text;*++id_loc= delim;
-#line 494 "cwebdir/ctang-w2c.ch"
 if(delim=='L'||delim=='u'||delim=='U'){
 if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
 delim= *loc++;*++id_loc= delim;
 }
-#line 1013 "cwebdir/ctangle.w"
 while(1){
 if(loc>=limit){
 if(*(limit-1)!='\\'){
-#line 503 "cwebdir/ctang-w2c.ch"
+#line 177 "cwebdir/ctang-w2c.ch"
 err_print(_("! String didn't end"));loc= limit;break;
-#line 1017 "cwebdir/ctangle.w"
+#line 1011 "cwebdir/ctangle.w"
 
 }
 if(get_line()==0){
-#line 509 "cwebdir/ctang-w2c.ch"
+#line 183 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in middle of string"));loc= buffer;break;
-#line 1021 "cwebdir/ctangle.w"
+#line 1015 "cwebdir/ctangle.w"
 
 }
 else if(++id_loc<=section_text_end)*id_loc= '\n';
@@ -1331,9 +1310,9 @@
 if(++id_loc<=section_text_end)*id_loc= c;
 }
 if(id_loc>=section_text_end){
-#line 515 "cwebdir/ctang-w2c.ch"
+#line 189 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! String too long: "),stdout);
-#line 1039 "cwebdir/ctangle.w"
+#line 1033 "cwebdir/ctangle.w"
 
 term_write(section_text+1,25);
 err_print("...");
@@ -1342,63 +1321,61 @@
 return(string);
 }
 
-/*:67*/
-#line 926 "cwebdir/ctangle.w"
+/*:74*/
+#line 918 "cwebdir/ctangle.w"
 
 else if(isalpha(c)||isxalpha(c)||ishigh(c))
-/*65:*/
-#line 972 "cwebdir/ctangle.w"
+/*72:*/
+#line 964 "cwebdir/ctangle.w"
 {
 id_first= --loc;
-#line 485 "cwebdir/ctang-w2c.ch"
 while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
 ||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
-#line 975 "cwebdir/ctangle.w"
 id_loc= loc;return(identifier);
 }
 
-/*:65*/
-#line 928 "cwebdir/ctangle.w"
+/*:72*/
+#line 920 "cwebdir/ctangle.w"
 
-else if(c=='@')/*68:*/
-#line 1050 "cwebdir/ctangle.w"
+else if(c=='@')/*75:*/
+#line 1044 "cwebdir/ctangle.w"
 {
 c= ccode[(eight_bits)*loc++];
 switch(c){
 case ignore:continue;
-#line 521 "cwebdir/ctang-w2c.ch"
+#line 195 "cwebdir/ctang-w2c.ch"
 case translit_code:err_print(_("! Use @l in limbo only"));continue;
-#line 1055 "cwebdir/ctangle.w"
+#line 1049 "cwebdir/ctangle.w"
 
 case control_text:while((c= skip_ahead())=='@');
 
 if(*(loc-1)!='>')
-#line 527 "cwebdir/ctang-w2c.ch"
+#line 201 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in control text"));
-#line 1060 "cwebdir/ctangle.w"
+#line 1054 "cwebdir/ctangle.w"
 
 continue;
 case section_name:
 cur_section_name_char= *(loc-1);
-/*70:*/
-#line 1098 "cwebdir/ctangle.w"
+/*77:*/
+#line 1092 "cwebdir/ctangle.w"
 {
 char*k;
-/*72:*/
-#line 1118 "cwebdir/ctangle.w"
+/*79:*/
+#line 1112 "cwebdir/ctangle.w"
 
 k= section_text;
 while(1){
 if(loc> limit&&get_line()==0){
-#line 545 "cwebdir/ctang-w2c.ch"
+#line 219 "cwebdir/ctang-w2c.ch"
 err_print(_("! Input ended in section name"));
-#line 1123 "cwebdir/ctangle.w"
+#line 1117 "cwebdir/ctangle.w"
 
 loc= buffer+1;break;
 }
 c= *loc;
-/*73:*/
-#line 1142 "cwebdir/ctangle.w"
+/*80:*/
+#line 1136 "cwebdir/ctangle.w"
 
 if(c=='@'){
 c= *(loc+1);
@@ -1406,23 +1383,23 @@
 loc+= 2;break;
 }
 if(ccode[(eight_bits)c]==new_section){
-#line 557 "cwebdir/ctang-w2c.ch"
+#line 231 "cwebdir/ctang-w2c.ch"
 err_print(_("! Section name didn't end"));break;
-#line 1150 "cwebdir/ctangle.w"
+#line 1144 "cwebdir/ctangle.w"
 
 }
 if(ccode[(eight_bits)c]==section_name){
-#line 563 "cwebdir/ctang-w2c.ch"
+#line 237 "cwebdir/ctang-w2c.ch"
 err_print(_("! Nesting of section names not allowed"));break;
-#line 1154 "cwebdir/ctangle.w"
+#line 1148 "cwebdir/ctangle.w"
 
 }
 *(++k)= '@';loc++;
 }
 
-/*:73*/
-#line 1127 "cwebdir/ctangle.w"
-;
+/*:80*/
+#line 1121 "cwebdir/ctangle.w"
+
 loc++;if(k<section_text_end)k++;
 if(xisspace(c)){
 c= ' ';if(*(k-1)==' ')k--;
@@ -1430,9 +1407,9 @@
 *k= c;
 }
 if(k>=section_text_end){
-#line 551 "cwebdir/ctang-w2c.ch"
+#line 225 "cwebdir/ctang-w2c.ch"
 fputs(_("\n! Section name too long: "),stdout);
-#line 1136 "cwebdir/ctangle.w"
+#line 1130 "cwebdir/ctangle.w"
 
 term_write(section_text+1,25);
 printf("...");mark_harmless;
@@ -1439,15 +1416,15 @@
 }
 if(*k==' '&&k> section_text)k--;
 
-/*:72*/
-#line 1100 "cwebdir/ctangle.w"
-;
+/*:79*/
+#line 1094 "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);
 if(cur_section_name_char=='(')
-/*40:*/
-#line 516 "cwebdir/ctangle.w"
+/*47:*/
+#line 502 "cwebdir/ctangle.w"
 
 {
 for(an_output_file= cur_out_file;
@@ -1457,41 +1434,41 @@
 if(cur_out_file> output_files)
 *--cur_out_file= cur_section_name;
 else{
-#line 258 "cwebdir/ctang-w2c.ch"
+#line 83 "cwebdir/ctang-w2c.ch"
 overflow(_("output files"));
-#line 526 "cwebdir/ctangle.w"
+#line 512 "cwebdir/ctangle.w"
 }
 }
 }
 
-/*:40*/
-#line 1106 "cwebdir/ctangle.w"
-;
+/*:47*/
+#line 1100 "cwebdir/ctangle.w"
+
 return(section_name);
 }
 
-/*:70*/
-#line 1064 "cwebdir/ctangle.w"
-;
-case string:/*74:*/
-#line 1164 "cwebdir/ctangle.w"
+/*:77*/
+#line 1058 "cwebdir/ctangle.w"
+
+case string:/*81:*/
+#line 1158 "cwebdir/ctangle.w"
 {
 id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
 while(*loc!='@'||*(loc+1)!='>')loc++;
-#line 569 "cwebdir/ctang-w2c.ch"
+#line 243 "cwebdir/ctang-w2c.ch"
 if(loc>=limit)err_print(_("! Verbatim string didn't end"));
-#line 1168 "cwebdir/ctangle.w"
+#line 1162 "cwebdir/ctangle.w"
 
 id_loc= loc;loc+= 2;
 return(string);
 }
 
-/*:74*/
-#line 1065 "cwebdir/ctangle.w"
-;
-case ord:/*69:*/
-#line 1077 "cwebdir/ctangle.w"
+/*:81*/
+#line 1059 "cwebdir/ctangle.w"
 
+case ord:/*76:*/
+#line 1071 "cwebdir/ctangle.w"
+
 id_first= loc;
 if(*loc=='\\'){
 if(*++loc=='\'')loc++;
@@ -1499,17 +1476,17 @@
 while(*loc!='\''){
 if(*loc=='@'){
 if(*(loc+1)!='@')
-#line 533 "cwebdir/ctang-w2c.ch"
+#line 207 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in ASCII constant"));
-#line 1086 "cwebdir/ctangle.w"
+#line 1080 "cwebdir/ctangle.w"
 
 else loc++;
 }
 loc++;
 if(loc> limit){
-#line 539 "cwebdir/ctang-w2c.ch"
+#line 213 "cwebdir/ctang-w2c.ch"
 err_print(_("! String didn't end"));loc= limit-1;break;
-#line 1092 "cwebdir/ctangle.w"
+#line 1086 "cwebdir/ctangle.w"
 
 }
 }
@@ -1516,15 +1493,15 @@
 loc++;
 return(ord);
 
-/*:69*/
-#line 1066 "cwebdir/ctangle.w"
-;
+/*:76*/
+#line 1060 "cwebdir/ctangle.w"
+
 default:return(c);
 }
 }
 
-/*:68*/
-#line 929 "cwebdir/ctangle.w"
+/*:75*/
+#line 921 "cwebdir/ctangle.w"
 
 else if(xisspace(c)){
 if(!preprocessing||loc> limit)continue;
@@ -1532,16 +1509,14 @@
 else return(' ');
 }
 else if(c=='#'&&loc==buffer+1)preprocessing= 1;
-mistake:/*64:*/
-#line 950 "cwebdir/ctangle.w"
+mistake:/*71:*/
+#line 942 "cwebdir/ctangle.w"
 
 switch(c){
 case'+':if(*loc=='+')compress(plus_plus);break;
 case'-':if(*loc=='-'){compress(minus_minus);}
-#line 472 "cwebdir/ctang-w2c.ch"
 else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
 else compress(minus_gt);}}break;
-#line 956 "cwebdir/ctangle.w"
 case'.':if(*loc=='*'){compress(period_ast);}
 else if(*loc=='.'&&*(loc+1)=='.'){
 loc++;compress(dot_dot_dot);
@@ -1555,30 +1530,26 @@
 else if(*loc=='<')compress(lt_lt);break;
 case'&':if(*loc=='&')compress(and_and);break;
 case'|':if(*loc=='|')compress(or_or);break;
-#line 479 "cwebdir/ctang-w2c.ch"
 case'!':if(*loc=='=')compress(non_eq);break;
-#line 970 "cwebdir/ctangle.w"
 }
 
-/*:64*/
-#line 936 "cwebdir/ctangle.w"
+/*:71*/
+#line 928 "cwebdir/ctangle.w"
 
 return(c);
 }
 }
 
-/*:63*//*76:*/
-#line 1199 "cwebdir/ctangle.w"
+/*:70*//*84:*/
+#line 1196 "cwebdir/ctangle.w"
 
-#line 583 "cwebdir/ctang-w2c.ch"
 static void
 scan_repl(
 eight_bits t)
-#line 1203 "cwebdir/ctangle.w"
 {
 sixteen_bits a;
-if(t==section_name){/*77:*/
-#line 1225 "cwebdir/ctangle.w"
+if(t==section_name){/*85:*/
+#line 1222 "cwebdir/ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1589,17 +1560,15 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-#line 598 "cwebdir/ctang-w2c.ch"
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
-#line 1237 "cwebdir/ctangle.w"
 
-/*:77*/
-#line 1205 "cwebdir/ctangle.w"
-;}
+/*:85*/
+#line 1202 "cwebdir/ctangle.w"
+}
 while(1)switch(a= get_next()){
-/*78:*/
-#line 1238 "cwebdir/ctangle.w"
+/*86:*/
+#line 1235 "cwebdir/ctangle.w"
 
 case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
 app_repl((a/0400)+0200);
@@ -1606,29 +1575,29 @@
 app_repl(a%0400);break;
 case section_name:if(t!=section_name)goto done;
 else{
-/*79:*/
-#line 1271 "cwebdir/ctangle.w"
+/*87:*/
+#line 1268 "cwebdir/ctangle.w"
 {
 char*try_loc= loc;
 while(*try_loc==' '&&try_loc<limit)try_loc++;
 if(*try_loc=='+'&&try_loc<limit)try_loc++;
 while(*try_loc==' '&&try_loc<limit)try_loc++;
-#line 617 "cwebdir/ctang-w2c.ch"
+#line 273 "cwebdir/ctang-w2c.ch"
 if(*try_loc=='=')err_print(_("! Missing `@ ' before a named section"));
-#line 1277 "cwebdir/ctangle.w"
+#line 1274 "cwebdir/ctangle.w"
 
 
 
 }
 
-/*:79*/
-#line 1244 "cwebdir/ctangle.w"
-;
+/*:87*/
+#line 1241 "cwebdir/ctangle.w"
+
 a= cur_section_name-name_dir;
 app_repl((a/0400)+0250);
 app_repl(a%0400);
-/*77:*/
-#line 1225 "cwebdir/ctangle.w"
+/*85:*/
+#line 1222 "cwebdir/ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1639,18 +1608,16 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-#line 598 "cwebdir/ctang-w2c.ch"
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
-#line 1237 "cwebdir/ctangle.w"
 
-/*:77*/
-#line 1248 "cwebdir/ctangle.w"
-;break;
+/*:85*/
+#line 1245 "cwebdir/ctangle.w"
+break;
 }
-#line 605 "cwebdir/ctang-w2c.ch"
+#line 261 "cwebdir/ctang-w2c.ch"
 case output_defs_code:if(t!=section_name)err_print(_("! Misplaced @h"));
-#line 1251 "cwebdir/ctangle.w"
+#line 1248 "cwebdir/ctangle.w"
 
 else{
 output_defs_seen= 1;
@@ -1657,8 +1624,8 @@
 a= output_defs_flag;
 app_repl((a/0400)+0200);
 app_repl(a%0400);
-/*77:*/
-#line 1225 "cwebdir/ctangle.w"
+/*85:*/
+#line 1222 "cwebdir/ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1669,27 +1636,25 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-#line 598 "cwebdir/ctang-w2c.ch"
 {int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
 app_repl(a_l%0400);}
-#line 1237 "cwebdir/ctangle.w"
 
-/*:77*/
-#line 1257 "cwebdir/ctangle.w"
-;
+/*:85*/
+#line 1254 "cwebdir/ctangle.w"
+
 }
 break;
 case constant:case string:
-/*80:*/
-#line 1282 "cwebdir/ctangle.w"
+/*88:*/
+#line 1279 "cwebdir/ctangle.w"
 
 app_repl(a);
 while(id_first<id_loc){
 if(*id_first=='@'){
 if(*(id_first+1)=='@')id_first++;
-#line 623 "cwebdir/ctang-w2c.ch"
+#line 279 "cwebdir/ctang-w2c.ch"
 else err_print(_("! Double @ should be used in string"));
-#line 1288 "cwebdir/ctangle.w"
+#line 1285 "cwebdir/ctangle.w"
 
 }
 app_repl(*id_first++);
@@ -1696,12 +1661,12 @@
 }
 app_repl(a);break;
 
-/*:80*/
-#line 1261 "cwebdir/ctangle.w"
-;
+/*:88*/
+#line 1258 "cwebdir/ctangle.w"
+
 case ord:
-/*81:*/
-#line 1298 "cwebdir/ctangle.w"
+/*89:*/
+#line 1295 "cwebdir/ctangle.w"
 {
 int c= (eight_bits)*id_first;
 if(c=='\\'){
@@ -1727,24 +1692,20 @@
 if(xisdigit(*(id_first+1)))c= *(++id_first)-'0';
 else if(xisxdigit(*(id_first+1))){
 ++id_first;
-#line 629 "cwebdir/ctang-w2c.ch"
 c= toupper((eight_bits)*id_first)-'A'+10;
-#line 1324 "cwebdir/ctangle.w"
 }
 if(xisdigit(*(id_first+1)))c= 16*c+*(++id_first)-'0';
 else if(xisxdigit(*(id_first+1))){
 ++id_first;
-#line 635 "cwebdir/ctang-w2c.ch"
 c= 16*c+toupper((eight_bits)*id_first)-'A'+10;
-#line 1329 "cwebdir/ctangle.w"
 }
 break;
 case'\\':c= '\\';break;
 case'\'':c= '\'';break;
 case'\"':c= '\"';break;
-#line 641 "cwebdir/ctang-w2c.ch"
+#line 285 "cwebdir/ctang-w2c.ch"
 default:err_print(_("! Unrecognized escape sequence"));
-#line 1335 "cwebdir/ctangle.w"
+#line 1332 "cwebdir/ctangle.w"
 
 }
 }
@@ -1757,20 +1718,20 @@
 }
 break;
 
-/*:81*/
-#line 1263 "cwebdir/ctangle.w"
-;
+/*:89*/
+#line 1260 "cwebdir/ctangle.w"
+
 case definition:case format_code:case begin_C:if(t!=section_name)goto done;
 else{
-#line 611 "cwebdir/ctang-w2c.ch"
+#line 267 "cwebdir/ctang-w2c.ch"
 err_print(_("! @d, @f and @c are ignored in C text"));continue;
-#line 1267 "cwebdir/ctangle.w"
+#line 1264 "cwebdir/ctangle.w"
 
 }
 case new_section:goto done;
 
-/*:78*/
-#line 1210 "cwebdir/ctangle.w"
+/*:86*/
+#line 1207 "cwebdir/ctangle.w"
 
 case')':app_repl(a);
 if(t==macro)app_repl(' ');
@@ -1778,19 +1739,17 @@
 default:app_repl(a);
 }
 done:next_control= (eight_bits)a;
-#line 591 "cwebdir/ctang-w2c.ch"
+#line 255 "cwebdir/ctang-w2c.ch"
 if(text_ptr> text_info_end)overflow(_("text"));
-#line 1218 "cwebdir/ctangle.w"
+#line 1215 "cwebdir/ctangle.w"
 cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
 }
 
-/*:76*//*83:*/
+/*:84*//*92:*/
 #line 1360 "cwebdir/ctangle.w"
 
-#line 648 "cwebdir/ctang-w2c.ch"
 static void
 scan_section(void)
-#line 1363 "cwebdir/ctangle.w"
 {
 name_pointer p;
 text_pointer q;
@@ -1801,7 +1760,7 @@
 }
 next_control= 0;
 while(1){
-/*84:*/
+/*93:*/
 #line 1399 "cwebdir/ctangle.w"
 
 while(next_control<definition)
@@ -1810,16 +1769,16 @@
 loc-= 2;next_control= get_next();
 }
 
-/*:84*/
+/*:93*/
 #line 1374 "cwebdir/ctangle.w"
-;
+
 if(next_control==definition){
-/*85:*/
+/*94:*/
 #line 1406 "cwebdir/ctangle.w"
 {
 while((next_control= get_next())=='\n');
 if(next_control!=identifier){
-#line 655 "cwebdir/ctang-w2c.ch"
+#line 291 "cwebdir/ctang-w2c.ch"
 err_print(_("! Definition flushed, must start with identifier"));
 #line 1410 "cwebdir/ctangle.w"
 
@@ -1835,7 +1794,7 @@
 cur_text->text_link= 0;
 }
 
-/*:85*/
+/*:94*/
 #line 1376 "cwebdir/ctangle.w"
 
 continue;
@@ -1845,7 +1804,7 @@
 }
 if(next_control==section_name){
 p= cur_section_name;
-/*86:*/
+/*95:*/
 #line 1431 "cwebdir/ctangle.w"
 
 while((next_control= get_next())=='+');
@@ -1852,36 +1811,34 @@
 if(next_control!='='&&next_control!=eq_eq)
 continue;
 
-/*:86*/
+/*:95*/
 #line 1384 "cwebdir/ctangle.w"
-;
+
 break;
 }
 return;
 }
 no_where= print_where= 0;
-/*87:*/
+/*96:*/
 #line 1436 "cwebdir/ctangle.w"
 
-/*88:*/
+/*97:*/
 #line 1441 "cwebdir/ctangle.w"
 
 store_two_bytes((sixteen_bits)(0150000+section_count));
 
 
-/*:88*/
+/*:97*/
 #line 1437 "cwebdir/ctangle.w"
-;
+
 scan_repl(section_name);
-/*89:*/
+/*98:*/
 #line 1445 "cwebdir/ctangle.w"
 
 if(p==name_dir||p==0){
 (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
 }
-#line 661 "cwebdir/ctang-w2c.ch"
 else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
-#line 1450 "cwebdir/ctangle.w"
 
 else{
 q= (text_pointer)p->equiv;
@@ -1892,22 +1849,20 @@
 cur_text->text_link= section_flag;
 
 
-/*:89*/
+/*:98*/
 #line 1439 "cwebdir/ctangle.w"
-;
 
-/*:87*/
+
+/*:96*/
 #line 1390 "cwebdir/ctangle.w"
-;
+
 }
 
-/*:83*//*91:*/
+/*:92*//*100:*/
 #line 1463 "cwebdir/ctangle.w"
 
-#line 674 "cwebdir/ctang-w2c.ch"
 static void
 phase_one(void){
-#line 1466 "cwebdir/ctangle.w"
 phase= 1;
 section_count= 0;
 reset_input();
@@ -1917,13 +1872,11 @@
 phase= 2;
 }
 
-/*:91*//*93:*/
+/*:100*//*102:*/
 #line 1481 "cwebdir/ctangle.w"
 
-#line 688 "cwebdir/ctang-w2c.ch"
 static void
 skip_limbo(void)
-#line 1484 "cwebdir/ctangle.w"
 {
 char c;
 while(1){
@@ -1934,7 +1887,7 @@
 c= *loc++;
 if(ccode[(eight_bits)c]==new_section)break;
 switch(ccode[(eight_bits)c]){
-case translit_code:/*94:*/
+case translit_code:/*103:*/
 #line 1510 "cwebdir/ctangle.w"
 
 while(xisspace(*loc)&&loc<limit)loc++;
@@ -1941,12 +1894,12 @@
 loc+= 3;
 if(loc> limit||!xisxdigit(*(loc-3))||!xisxdigit(*(loc-2))
 ||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))
-#line 707 "cwebdir/ctang-w2c.ch"
+#line 309 "cwebdir/ctang-w2c.ch"
 err_print(_("! Improper hex number following @l"));
 #line 1516 "cwebdir/ctangle.w"
 
 else{
-unsigned i;
+unsigned int i;
 char*beg;
 sscanf(loc-3,"%x",&i);
 while(xisspace(*loc)&&loc<limit)loc++;
@@ -1953,32 +1906,30 @@
 beg= loc;
 while(loc<limit&&(xisalpha(*loc)||xisdigit(*loc)||*loc=='_'))loc++;
 if(loc-beg>=translit_length)
-#line 713 "cwebdir/ctang-w2c.ch"
+#line 315 "cwebdir/ctang-w2c.ch"
 err_print(_("! Replacement string in @l too long"));
 #line 1526 "cwebdir/ctangle.w"
 
 else{
-#line 719 "cwebdir/ctang-w2c.ch"
 strncpy(translit[i-0200],beg,(size_t)(loc-beg));
-#line 1529 "cwebdir/ctangle.w"
 translit[i-0200][loc-beg]= '\0';
 }
 }
 
-/*:94*/
+/*:103*/
 #line 1494 "cwebdir/ctangle.w"
-;break;
+break;
 case format_code:case'@':break;
 case control_text:if(c=='q'||c=='Q'){
 while((c= skip_ahead())=='@');
 if(*(loc-1)!='>')
-#line 695 "cwebdir/ctang-w2c.ch"
+#line 297 "cwebdir/ctang-w2c.ch"
 err_print(_("! Double @ should be used in control text"));
 #line 1500 "cwebdir/ctangle.w"
 
 break;
 }
-#line 701 "cwebdir/ctang-w2c.ch"
+#line 303 "cwebdir/ctang-w2c.ch"
 default:err_print(_("! Double @ should be used in limbo"));
 #line 1504 "cwebdir/ctangle.w"
 
@@ -1987,24 +1938,23 @@
 }
 }
 
-/*:93*//*95:*/
+/*:102*//*104:*/
 #line 1536 "cwebdir/ctangle.w"
 
-#line 726 "cwebdir/ctang-w2c.ch"
 void
 print_stats(void){
-#line 740 "cwebdir/ctang-w2c.ch"
+#line 328 "cwebdir/ctang-w2c.ch"
 puts(_("\nMemory usage statistics:"));
 printf(_("%ld names (out of %ld)\n"),
-(long)(name_ptr-name_dir),(long)max_names);
+(ptrdiff_t)(name_ptr-name_dir),(long)max_names);
 printf(_("%ld replacement texts (out of %ld)\n"),
-(long)(text_ptr-text_info),(long)max_texts);
+(ptrdiff_t)(text_ptr-text_info),(long)max_texts);
 printf(_("%ld bytes (out of %ld)\n"),
-(long)(byte_ptr-byte_mem),(long)max_bytes);
+(ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
 printf(_("%ld tokens (out of %ld)\n"),
 #line 1547 "cwebdir/ctangle.w"
-(long)(tok_ptr-tok_mem),(long)max_toks);
+(ptrdiff_t)(tok_ptr-tok_mem),(long)max_toks);
 }
 
-#line 753 "cwebdir/ctang-w2c.ch"
-/*:95*/
+#line 341 "cwebdir/ctang-w2c.ch"
+/*:104*/

Modified: trunk/Build/source/texk/web2c/cwebboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/cwebboot.cin	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebboot.cin	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,31 +1,40 @@
 /*1:*/
-#line 58 "cwebdir/common.w"
+#line 66 "cwebdir/common.w"
 
-/*85:*/
-#line 1247 "cwebdir/comm-w2c.ch"
+/*3:*/
+#line 53 "cwebdir/comm-w2c.h"
 
-#include <stdbool.h>  
-#include <stddef.h>  
-
-/*:85*//*88:*/
-#line 1286 "cwebdir/comm-w2c.ch"
-
 #ifndef HAVE_GETTEXT
 #define HAVE_GETTEXT 0
 #endif
 
 #if HAVE_GETTEXT
-#include <locale.h>  
 #include <libintl.h> 
 #else
+#define gettext(A) A
+#endif
+
+#include <ctype.h>  
+#include <stdbool.h>  
+#include <stddef.h>  
+#include <stdint.h>  
+#include <stdlib.h>  
+#include <stdio.h>  
+#include <string.h>  
+
+/*:3*//*89:*/
+#line 710 "cwebdir/comm-w2c.ch"
+
+#if HAVE_GETTEXT
+#include <locale.h>  
+#else
 #define setlocale(A,B) ""
 #define bindtextdomain(A,B) ""
 #define textdomain(A) ""
-#define gettext(A) A
 #endif
 
-/*:88*//*90:*/
-#line 1380 "cwebdir/comm-w2c.ch"
+/*:89*//*91:*/
+#line 757 "cwebdir/comm-w2c.ch"
 
 typedef bool boolean;
 #define HAVE_BOOLEAN
@@ -34,15 +43,17 @@
 #include <w2c/config.h>  
 #include <lib/lib.h>  
 
-/*:90*//*93:*/
-#line 1419 "cwebdir/comm-w2c.ch"
+/*:91*//*94:*/
+#line 796 "cwebdir/comm-w2c.ch"
 
 #define CWEB
 #include "help.h" 
 
-/*:93*/
-#line 59 "cwebdir/common.w"
+/*:94*/
+#line 67 "cwebdir/common.w"
 
+#define _(S) gettext(S)  \
+
 #define and_and 04
 #define lt_lt 020
 #define gt_gt 021
@@ -59,12 +70,30 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define buf_size 1000
-#define longest_name 10000
-#define long_buf_size (buf_size+longest_name) 
+#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 xisupper(c) (isupper((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 length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start) 
+#define print_id(c) term_write((c) ->byte_start,length((c) ) ) 
+#define llink link
+#define rlink dummy.Rlink
+#define root name_dir->rlink \
+
+#define chunk_marker 0 \
+
+#define spotless 0
+#define harmless_message 1
+#define error_message 2
+#define fatal_message 3
+#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_error history= error_message
+#define confusion(s) fatal(_("! This can't happen: ") ,s)  \
+ \
+
 #define max_include_depth 10 \
 
 #define max_file_name_length 1024
@@ -74,6 +103,32 @@
 #define web_file file[0]
 #define web_file_name file_name[0] \
 
+#define show_banner flags['b']
+#define show_progress flags['p']
+#define show_stats flags['s']
+#define show_happiness flags['h']
+#define temporary_output flags['t']
+#define make_xrefs flags['x'] \
+
+#define 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 max_bytes 1000000 \
+
+#define max_toks 1000000
+#define max_names 10239 \
+
+#define max_sections 4000
+#define max_texts 10239
+#define longest_name 10000
+#define stack_size 500
+#define buf_size 1000
+#define long_buf_size (buf_size+longest_name)  \
+
 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
 strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) )  \
 
@@ -83,31 +138,14 @@
 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
 } \
 
-#define max_sections 10239 \
- \
-
 #define too_long() {include_depth--; \
 err_print(_("! Include file name too long") ) ;goto restart;} \
- \
 
-#define max_bytes 1000000 \
-
-#define max_names 10239 \
- \
-
-#define length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start) 
-#define print_id(c) term_write((c) ->byte_start,length((c) ) )  \
-
 #define hash_size 8501 \
 
-#define llink link
-#define rlink dummy.Rlink
-#define root name_dir->rlink \
- \
-
 #define first_chunk(p) ((p) ->byte_start+2) 
-#define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ \
-(unsigned char) *((p) ->byte_start+1) ) 
+#define prefix_length(p) (int) ((eight_bits) *((p) ->byte_start) *256+ \
+(eight_bits) *((p) ->byte_start+1) ) 
 #define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, \
 *((p) ->byte_start+1) = (m) %256)  \
 
@@ -119,37 +157,12 @@
 
 #define bad_extension 5 \
 
-#define spotless 0
-#define harmless_message 1
-#define error_message 2
-#define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
-#define mark_error history= error_message \
-
 #define RETURN_OK 0
 #define RETURN_WARN 5
 #define RETURN_ERROR 10
 #define RETURN_FAIL 20 \
 
-#define confusion(s) fatal(_("! This can't happen: ") ,s)  \
- \
-
-#define show_banner flags['b']
-#define show_progress flags['p']
-#define show_stats flags['s']
-#define show_happiness flags['h']
-#define temporary_output flags['t']
-#define make_xrefs flags['x'] \
-
 #define flag_change (**argv!='-') 
-#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 max_banner 50 \
 
 #define PATH_SEPARATOR separators[0]
@@ -156,37 +169,140 @@
 #define DIR_SEPARATOR separators[1]
 #define DEVICE_SEPARATOR separators[2] \
 
-#define _(S) gettext(S)  \
-
 #define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true)  \
 
 
-#line 60 "cwebdir/common.w"
+#line 68 "cwebdir/common.w"
 
 /*2:*/
-#line 73 "cwebdir/common.w"
+#line 35 "cwebdir/comm-w2c.h"
 
-#line 77 "cwebdir/comm-w2c.ch"
+typedef bool boolean;
 typedef uint8_t eight_bits;
 typedef uint16_t sixteen_bits;
-#line 84 "cwebdir/comm-w2c.ch"
 typedef enum{
 ctangle,cweave,ctwill
 }cweb;
+extern cweb program;
+extern int phase;
+
+/*:2*//*4:*/
+#line 91 "cwebdir/comm-w2c.h"
+
+extern char section_text[];
+extern char*section_text_end;
+extern char*id_first;
+extern char*id_loc;
+
+/*:4*//*5:*/
+#line 105 "cwebdir/comm-w2c.h"
+
+extern char buffer[];
+extern char*buffer_end;
+extern char*loc;
+extern char*limit;
+
+/*:5*//*6:*/
+#line 120 "cwebdir/comm-w2c.h"
+
+typedef struct name_info{
+char*byte_start;
+struct name_info*link;
+union{
+struct name_info*Rlink;
+
+char Ilk;
+}dummy;
+void*equiv_or_xref;
+}name_info;
+typedef name_info*name_pointer;
+typedef name_pointer*hash_pointer;
+extern char byte_mem[];
+extern char*byte_mem_end;
+extern name_info name_dir[];
+extern name_pointer name_dir_end;
+extern name_pointer name_ptr;
+extern char*byte_ptr;
+extern name_pointer hash[];
+extern hash_pointer hash_end;
+extern hash_pointer h;
+
+/*:6*//*8:*/
+#line 164 "cwebdir/comm-w2c.h"
+
+extern int history;
+
+/*:8*//*10:*/
+#line 184 "cwebdir/comm-w2c.h"
+
+extern int include_depth;
+extern FILE*file[];
+extern FILE*change_file;
+extern char C_file_name[];
+extern char tex_file_name[];
+extern char idx_file_name[];
+extern char scn_file_name[];
+extern char file_name[][max_file_name_length];
+
+extern char change_file_name[];
+extern char check_file_name[];
+extern int line[];
+extern int change_line;
+extern int change_depth;
+extern boolean input_has_ended;
+extern boolean changing;
+extern boolean web_file_open;
+
+/*:10*//*12:*/
+#line 209 "cwebdir/comm-w2c.h"
+
+extern sixteen_bits section_count;
+extern boolean changed_section[];
+extern boolean change_pending;
+extern boolean print_where;
+
+/*:12*//*13:*/
+#line 223 "cwebdir/comm-w2c.h"
+
+extern int argc;
+extern char**argv;
+extern boolean flags[];
+extern const char*use_language;
+
+/*:13*//*14:*/
+#line 236 "cwebdir/comm-w2c.h"
+
+extern FILE*C_file;
+extern FILE*tex_file;
+extern FILE*idx_file;
+extern FILE*scn_file;
+extern FILE*active_file;
+extern FILE*check_file;
+
+/*:14*/
+#line 69 "cwebdir/common.w"
+
+/*18:*/
+#line 85 "cwebdir/common.w"
+
+#line 72 "cwebdir/comm-w2c.ch"
 cweb program;
-#line 76 "cwebdir/common.w"
+#line 87 "cwebdir/common.w"
 
-/*:2*//*6:*/
-#line 130 "cwebdir/comm-w2c.ch"
+/*:18*//*19:*/
+#line 94 "cwebdir/common.w"
+int phase;
 
+/*:19*//*21:*/
+#line 131 "cwebdir/common.w"
+
 char section_text[longest_name+1];
 char*section_text_end= section_text+longest_name;
 char*id_first;
 char*id_loc;
-#line 138 "cwebdir/common.w"
 
-/*:6*//*7:*/
-#line 159 "cwebdir/common.w"
+/*:21*//*22:*/
+#line 151 "cwebdir/common.w"
 
 char buffer[long_buf_size];
 char*buffer_end= buffer+buf_size-2;
@@ -193,9 +309,8 @@
 char*limit= buffer;
 char*loc= buffer;
 
-#line 155 "cwebdir/comm-w2c.ch"
-/*:7*//*10:*/
-#line 214 "cwebdir/common.w"
+/*:22*//*25:*/
+#line 196 "cwebdir/common.w"
 
 int include_depth;
 FILE*file[max_include_depth];
@@ -203,7 +318,7 @@
 char file_name[max_include_depth][max_file_name_length];
 
 char change_file_name[max_file_name_length];
-#line 222 "cwebdir/common.w"
+#line 204 "cwebdir/common.w"
 int line[max_include_depth];
 int change_line;
 int change_depth;
@@ -211,10 +326,15 @@
 boolean changing;
 boolean web_file_open= 0;
 
-/*:10*//*20:*/
-#line 418 "cwebdir/common.w"
+/*:25*//*26:*/
+#line 222 "cwebdir/common.w"
 
-#line 420 "cwebdir/common.w"
+char change_buffer[buf_size];
+char*change_limit;
+
+/*:26*//*37:*/
+#line 403 "cwebdir/common.w"
+
 sixteen_bits section_count;
 boolean changed_section[max_sections];
 boolean change_pending;
@@ -221,62 +341,34 @@
 
 boolean print_where= 0;
 
-/*:20*//*27:*/
-#line 594 "cwebdir/common.w"
+/*:37*//*43:*/
+#line 600 "cwebdir/common.w"
 
-typedef struct name_info{
-char*byte_start;
-/*31:*/
-#line 631 "cwebdir/common.w"
-
-struct name_info*link;
-
-/*:31*//*40:*/
-#line 730 "cwebdir/common.w"
-
-union{
-struct name_info*Rlink;
-
-char Ilk;
-}dummy;
-
-/*:40*//*55:*/
-#line 773 "cwebdir/comm-w2c.ch"
-
-void*equiv_or_xref;
-#line 1064 "cwebdir/common.w"
-
-/*:55*/
-#line 597 "cwebdir/common.w"
-
-}name_info;
-typedef name_info*name_pointer;
 char byte_mem[max_bytes];
 char*byte_mem_end= byte_mem+max_bytes-1;
 name_info name_dir[max_names];
 name_pointer name_dir_end= name_dir+max_names-1;
 
-/*:27*//*29:*/
-#line 617 "cwebdir/common.w"
+/*:43*//*44:*/
+#line 611 "cwebdir/common.w"
 
 name_pointer name_ptr;
 char*byte_ptr;
 
-/*:29*//*32:*/
-#line 644 "cwebdir/common.w"
+/*:44*//*46:*/
+#line 631 "cwebdir/common.w"
 
-typedef name_pointer*hash_pointer;
 name_pointer hash[hash_size];
 hash_pointer hash_end= hash+hash_size-1;
 hash_pointer h;
 
-/*:32*//*56:*/
-#line 1082 "cwebdir/common.w"
+/*:46*//*65:*/
+#line 1019 "cwebdir/common.w"
 
 int history= spotless;
 
-/*:56*//*67:*/
-#line 1220 "cwebdir/common.w"
+/*:65*//*73:*/
+#line 1140 "cwebdir/common.w"
 
 int argc;
 char**argv;
@@ -283,45 +375,36 @@
 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 934 "cwebdir/comm-w2c.ch"
+#line 431 "cwebdir/comm-w2c.ch"
 char scn_file_name[max_file_name_length];
 char check_file_name[max_file_name_length];
-#line 941 "cwebdir/comm-w2c.ch"
+#line 1147 "cwebdir/common.w"
 boolean flags[128];
-const char*use_language= "";
-#line 1228 "cwebdir/common.w"
 
-/*:67*//*77:*/
-#line 1370 "cwebdir/common.w"
+/*:73*//*83:*/
+#line 1288 "cwebdir/common.w"
 
 FILE*C_file;
 FILE*tex_file;
 FILE*idx_file;
-#line 1131 "cwebdir/comm-w2c.ch"
+#line 569 "cwebdir/comm-w2c.ch"
 FILE*scn_file;
 FILE*check_file;
-#line 1138 "cwebdir/comm-w2c.ch"
+#line 576 "cwebdir/comm-w2c.ch"
 FILE*active_file;
 char*found_filename;
-#line 1376 "cwebdir/common.w"
+#line 1294 "cwebdir/common.w"
 
-#line 1155 "cwebdir/comm-w2c.ch"
-/*:77*/
-#line 61 "cwebdir/common.w"
+#line 593 "cwebdir/comm-w2c.ch"
+/*:83*//*86:*/
+#line 638 "cwebdir/comm-w2c.ch"
 
-/*3:*/
-#line 83 "cwebdir/common.w"
-int phase;
+const char*use_language= "";
 
-/*:3*//*11:*/
-#line 240 "cwebdir/common.w"
 
-char change_buffer[buf_size];
-char*change_limit;
+/*:86*//*87:*/
+#line 651 "cwebdir/comm-w2c.ch"
 
-/*:11*//*86:*/
-#line 1260 "cwebdir/comm-w2c.ch"
-
 char cb_banner[max_banner];
 string texmf_locale;
 #ifndef SEPARATORS
@@ -329,141 +412,120 @@
 #endif
 char separators[]= SEPARATORS;
 
-/*:86*/
-#line 62 "cwebdir/common.w"
+/*:87*/
+#line 70 "cwebdir/common.w"
 
-/*33:*/
-#line 650 "cwebdir/common.w"
+/*7:*/
+#line 143 "cwebdir/comm-w2c.h"
 
-#line 502 "cwebdir/comm-w2c.ch"
 extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
-#line 652 "cwebdir/common.w"
+extern name_pointer id_lookup(const char*,const char*,char);
 
-/*:33*//*38:*/
-#line 703 "cwebdir/common.w"
-
-#line 532 "cwebdir/comm-w2c.ch"
+extern name_pointer section_lookup(char*,char*,int);
+extern void init_node(name_pointer);
 extern void init_p(name_pointer,eight_bits);
-#line 705 "cwebdir/common.w"
+extern void print_prefix_name(name_pointer);
+extern void print_section_name(name_pointer);
+extern void sprint_section_name(char*,name_pointer);
 
-/*:38*//*46:*/
-#line 852 "cwebdir/common.w"
+/*:7*//*9:*/
+#line 167 "cwebdir/comm-w2c.h"
 
-#line 612 "cwebdir/comm-w2c.ch"
-extern void init_node(name_pointer);
-#line 854 "cwebdir/common.w"
+extern int wrap_up(void);
+extern void err_print(const char*);
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
 
-/*:46*//*53:*/
-#line 1017 "cwebdir/common.w"
+/*:9*//*11:*/
+#line 203 "cwebdir/comm-w2c.h"
 
-#line 738 "cwebdir/comm-w2c.ch"
-static int section_name_cmp(char**,int,name_pointer);
-#line 1019 "cwebdir/common.w"
+extern boolean get_line(void);
+extern void check_complete(void);
+extern void reset_input(void);
 
-/*:53*//*57:*/
-#line 1092 "cwebdir/common.w"
+/*:11*//*15:*/
+#line 245 "cwebdir/comm-w2c.h"
 
-#line 780 "cwebdir/comm-w2c.ch"
-extern void err_print(const char*);
-#line 1094 "cwebdir/common.w"
-
-/*:57*//*60:*/
-#line 1140 "cwebdir/common.w"
-
-#line 807 "cwebdir/comm-w2c.ch"
-extern int wrap_up(void);
+extern void common_init(void);
 extern void print_stats(void);
-#line 1143 "cwebdir/common.w"
+extern void cb_show_banner(void);
 
-#line 818 "cwebdir/comm-w2c.ch"
-/*:60*//*63:*/
-#line 1173 "cwebdir/common.w"
+/*:15*//*23:*/
+#line 161 "cwebdir/common.w"
 
-#line 881 "cwebdir/comm-w2c.ch"
-extern void fatal(const char*,const char*);
-extern void overflow(const char*);
-#line 1175 "cwebdir/common.w"
+static boolean input_ln(FILE*);
 
-/*:63*//*69:*/
-#line 1251 "cwebdir/common.w"
+/*:23*//*27:*/
+#line 233 "cwebdir/common.w"
 
-#line 971 "cwebdir/comm-w2c.ch"
-static void scan_args(void);
-#line 1253 "cwebdir/common.w"
+static void prime_the_change_buffer(void);
 
-/*:69*//*83:*/
-#line 1222 "cwebdir/comm-w2c.ch"
+/*:27*//*32:*/
+#line 305 "cwebdir/common.w"
 
-boolean get_line(void);
-name_pointer id_lookup(const char*,const char*,char);
-name_pointer section_lookup(char*,char*,int);
-void check_complete(void);
-void common_init(void);
-void print_prefix_name(name_pointer);
-void print_section_name(name_pointer);
-void reset_input(void);
-void sprint_section_name(char*,name_pointer);
+static void check_change(void);
 
-/*:83*//*84:*/
-#line 1235 "cwebdir/comm-w2c.ch"
+/*:32*//*55:*/
+#line 778 "cwebdir/common.w"
 
-static boolean input_ln(FILE*);
 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 void check_change(void);
-static void prime_the_change_buffer(void);
 
-/*:84*//*98:*/
-#line 1485 "cwebdir/comm-w2c.ch"
+/*:55*//*63:*/
+#line 974 "cwebdir/common.w"
 
+static int section_name_cmp(char**,int,name_pointer);
+
+/*:63*//*75:*/
+#line 1172 "cwebdir/common.w"
+
+static void scan_args(void);
+
+/*:75*//*96:*/
+#line 809 "cwebdir/comm-w2c.ch"
+
 static void cb_usage(const_string str);
 static void cb_usagehelp(const_string*message,const_string bug_email);
-void cb_show_banner(void);
 
-/*:98*/
-#line 63 "cwebdir/common.w"
+/*:96*/
+#line 71 "cwebdir/common.w"
 
 
-/*:1*//*4:*/
-#line 89 "cwebdir/common.w"
+/*:1*//*20:*/
+#line 100 "cwebdir/common.w"
 
-#line 94 "cwebdir/comm-w2c.ch"
 void
 common_init(void)
-#line 92 "cwebdir/common.w"
 {
-#line 103 "cwebdir/comm-w2c.ch"
-/*30:*/
-#line 621 "cwebdir/common.w"
+#line 78 "cwebdir/comm-w2c.ch"
+/*45:*/
+#line 615 "cwebdir/common.w"
 
 name_dir->byte_start= byte_ptr= byte_mem;
 name_ptr= name_dir+1;
 name_ptr->byte_start= byte_mem;
+root= NULL;
 
-/*:30*//*34:*/
-#line 655 "cwebdir/common.w"
+/*:45*//*47:*/
+#line 638 "cwebdir/common.w"
 
 for(h= hash;h<=hash_end;*h++= NULL);
 
-/*:34*//*41:*/
-#line 737 "cwebdir/common.w"
+/*:47*/
+#line 78 "cwebdir/comm-w2c.ch"
 
-root= NULL;
+/*92:*/
+#line 771 "cwebdir/comm-w2c.ch"
 
-/*:41*/
-#line 103 "cwebdir/comm-w2c.ch"
-
-/*91:*/
-#line 1394 "cwebdir/comm-w2c.ch"
-
 kpse_set_program_name(argv[0],"cweb");
 
-/*:91*/
-#line 104 "cwebdir/comm-w2c.ch"
+/*:92*/
+#line 79 "cwebdir/comm-w2c.ch"
 
-/*89:*/
-#line 1342 "cwebdir/comm-w2c.ch"
+#line 85 "cwebdir/comm-w2c.ch"
+/*90:*/
+#line 719 "cwebdir/comm-w2c.ch"
 
 setlocale(LC_MESSAGES,setlocale(LC_CTYPE,""));
 texmf_locale= kpse_var_expand("${TEXMFLOCALEDIR}");
@@ -478,21 +540,24 @@
 textdomain("cweb");
 
 
-/*:89*/
-#line 105 "cwebdir/comm-w2c.ch"
+/*:90*/
+#line 85 "cwebdir/comm-w2c.ch"
 
-/*68:*/
-#line 1233 "cwebdir/common.w"
+/*74:*/
+#line 1153 "cwebdir/common.w"
 
-#line 948 "cwebdir/comm-w2c.ch"
-temporary_output= 1;
-#line 1235 "cwebdir/common.w"
+#line 438 "cwebdir/comm-w2c.ch"
+make_xrefs= true;
+temporary_output= true;
+#line 1155 "cwebdir/common.w"
+show_stats= false;
 
-/*:68*/
-#line 106 "cwebdir/comm-w2c.ch"
+/*:74*/
+#line 86 "cwebdir/comm-w2c.ch"
 
-/*78:*/
-#line 1155 "cwebdir/comm-w2c.ch"
+#line 106 "cwebdir/common.w"
+/*84:*/
+#line 593 "cwebdir/comm-w2c.ch"
 
 scan_args();
 if(program==ctangle){
@@ -523,21 +588,19 @@
 if((tex_file= fopen(check_file_name,"wb"))==NULL)
 fatal(_("! Cannot open output file "),check_file_name);
 }
-#line 1388 "cwebdir/common.w"
+#line 1306 "cwebdir/common.w"
 
-/*:78*/
-#line 107 "cwebdir/comm-w2c.ch"
+#line 628 "cwebdir/comm-w2c.ch"
+/*:84*/
+#line 106 "cwebdir/common.w"
 
-#line 96 "cwebdir/common.w"
 }
 
-/*:4*//*9:*/
-#line 172 "cwebdir/common.w"
+/*:20*//*24:*/
+#line 164 "cwebdir/common.w"
 
-#line 162 "cwebdir/comm-w2c.ch"
 static boolean input_ln(
 FILE*fp)
-#line 175 "cwebdir/common.w"
 {
 register int c= EOF;
 register char*k;
@@ -544,14 +607,14 @@
 if(feof(fp))return(0);
 limit= k= buffer;
 while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
-#line 169 "cwebdir/comm-w2c.ch"
+#line 92 "cwebdir/comm-w2c.ch"
 if((*(k++)= c)!=' '&&c!='\r')limit= k;
-#line 182 "cwebdir/common.w"
+#line 174 "cwebdir/common.w"
 if(k> buffer_end)
 if((c= getc(fp))!=EOF&&c!='\n'){
-#line 175 "cwebdir/comm-w2c.ch"
+#line 98 "cwebdir/comm-w2c.ch"
 ungetc(c,fp);loc= buffer;err_print(_("! Input line too long"));
-#line 185 "cwebdir/common.w"
+#line 177 "cwebdir/common.w"
 
 }
 if(c==EOF&&limit==buffer)return(0);
@@ -559,17 +622,15 @@
 return(1);
 }
 
-/*:9*//*12:*/
-#line 251 "cwebdir/common.w"
+/*:24*//*28:*/
+#line 236 "cwebdir/common.w"
 
-#line 201 "cwebdir/comm-w2c.ch"
 static void
 prime_the_change_buffer(void)
-#line 254 "cwebdir/common.w"
 {
 change_limit= change_buffer;
-/*13:*/
-#line 265 "cwebdir/common.w"
+/*29:*/
+#line 250 "cwebdir/common.w"
 
 while(1){
 change_line++;
@@ -576,61 +637,55 @@
 if(!input_ln(change_file))return;
 if(limit<buffer+2)continue;
 if(buffer[0]!='@')continue;
-#line 208 "cwebdir/comm-w2c.ch"
 if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
-#line 272 "cwebdir/common.w"
 if(buffer[1]=='x')break;
 if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
 loc= buffer+2;
-#line 214 "cwebdir/comm-w2c.ch"
+#line 109 "cwebdir/comm-w2c.ch"
 err_print(_("! Missing @x in change file"));
-#line 276 "cwebdir/common.w"
+#line 261 "cwebdir/common.w"
 
 }
 }
 
-/*:13*/
-#line 256 "cwebdir/common.w"
-;
-/*14:*/
-#line 282 "cwebdir/common.w"
+/*:29*/
+#line 241 "cwebdir/common.w"
 
+/*30:*/
+#line 267 "cwebdir/common.w"
+
 do{
 change_line++;
 if(!input_ln(change_file)){
-#line 220 "cwebdir/comm-w2c.ch"
+#line 115 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended after @x"));
-#line 287 "cwebdir/common.w"
+#line 272 "cwebdir/common.w"
 
 return;
 }
 }while(limit==buffer);
 
-/*:14*/
-#line 257 "cwebdir/common.w"
-;
-/*15:*/
-#line 292 "cwebdir/common.w"
+/*:30*/
+#line 242 "cwebdir/common.w"
 
+/*31:*/
+#line 277 "cwebdir/common.w"
+
 {
-#line 227 "cwebdir/comm-w2c.ch"
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
 strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
-#line 296 "cwebdir/common.w"
 }
 
-/*:15*/
-#line 258 "cwebdir/common.w"
-;
+/*:31*/
+#line 243 "cwebdir/common.w"
+
 }
 
-/*:12*//*16:*/
-#line 320 "cwebdir/common.w"
+/*:28*//*33:*/
+#line 308 "cwebdir/common.w"
 
-#line 235 "cwebdir/comm-w2c.ch"
 static void
 check_change(void)
-#line 323 "cwebdir/common.w"
 {
 int n= 0;
 if(lines_dont_match)return;
@@ -642,24 +697,22 @@
 while(1){
 changing= 1;print_where= 1;change_line++;
 if(!input_ln(change_file)){
-#line 242 "cwebdir/comm-w2c.ch"
+#line 121 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended before @y"));
-#line 335 "cwebdir/common.w"
+#line 323 "cwebdir/common.w"
 
 change_limit= change_buffer;changing= 0;
 return;
 }
 if(limit> buffer+1&&buffer[0]=='@'){
-#line 248 "cwebdir/comm-w2c.ch"
 char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
-#line 341 "cwebdir/common.w"
-/*17:*/
-#line 358 "cwebdir/common.w"
+/*34:*/
+#line 346 "cwebdir/common.w"
 
 if(xyz_code=='x'||xyz_code=='z'){
-#line 260 "cwebdir/comm-w2c.ch"
+#line 133 "cwebdir/comm-w2c.ch"
 loc= buffer+2;err_print(_("! Where is the matching @y?"));
-#line 361 "cwebdir/common.w"
+#line 349 "cwebdir/common.w"
 
 }
 else if(xyz_code=='y'){
@@ -666,9 +719,9 @@
 if(n> 0){
 loc= buffer+2;
 printf("\n! Hmm... %d ",n);
-#line 266 "cwebdir/comm-w2c.ch"
+#line 139 "cwebdir/comm-w2c.ch"
 err_print(_("of the preceding lines failed to match"));
-#line 368 "cwebdir/common.w"
+#line 356 "cwebdir/common.w"
 
 }
 change_depth= include_depth;
@@ -675,29 +728,27 @@
 return;
 }
 
-/*:17*/
-#line 342 "cwebdir/common.w"
-;
+/*:34*/
+#line 330 "cwebdir/common.w"
+
 }
-/*15:*/
-#line 292 "cwebdir/common.w"
+/*31:*/
+#line 277 "cwebdir/common.w"
 
 {
-#line 227 "cwebdir/comm-w2c.ch"
 change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
 strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
-#line 296 "cwebdir/common.w"
 }
 
-/*:15*/
-#line 344 "cwebdir/common.w"
-;
+/*:31*/
+#line 332 "cwebdir/common.w"
+
 changing= 0;cur_line++;
 while(!input_ln(cur_file)){
 if(include_depth==0){
-#line 254 "cwebdir/comm-w2c.ch"
+#line 127 "cwebdir/comm-w2c.ch"
 err_print(_("! CWEB file ended during a change"));
-#line 349 "cwebdir/common.w"
+#line 337 "cwebdir/common.w"
 
 input_has_ended= 1;return;
 }
@@ -707,19 +758,17 @@
 }
 }
 
-/*:16*//*18:*/
-#line 378 "cwebdir/common.w"
+/*:33*//*35:*/
+#line 366 "cwebdir/common.w"
 
-#line 273 "cwebdir/comm-w2c.ch"
 void
 reset_input(void)
-#line 381 "cwebdir/common.w"
 {
 limit= buffer;loc= buffer+1;buffer[0]= ' ';
-/*19:*/
-#line 393 "cwebdir/common.w"
+/*36:*/
+#line 381 "cwebdir/common.w"
 
-#line 284 "cwebdir/comm-w2c.ch"
+#line 149 "cwebdir/comm-w2c.ch"
 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);
@@ -730,11 +779,11 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 399 "cwebdir/common.w"
+#line 387 "cwebdir/common.w"
 
 
 web_file_open= 1;
-#line 300 "cwebdir/comm-w2c.ch"
+#line 165 "cwebdir/comm-w2c.ch"
 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);
@@ -745,11 +794,11 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 404 "cwebdir/common.w"
+#line 392 "cwebdir/common.w"
 
-/*:19*/
-#line 383 "cwebdir/common.w"
-;
+/*:36*/
+#line 371 "cwebdir/common.w"
+
 include_depth= 0;cur_line= 0;change_line= 0;
 change_depth= include_depth;
 changing= 1;prime_the_change_buffer();changing= !changing;
@@ -756,23 +805,21 @@
 limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
 }
 
-/*:18*//*21:*/
-#line 426 "cwebdir/common.w"
+/*:35*//*38:*/
+#line 410 "cwebdir/common.w"
 
-#line 328 "cwebdir/comm-w2c.ch"
 boolean get_line(void)
-#line 428 "cwebdir/common.w"
 {
 restart:
 if(changing&&include_depth==change_depth)
-/*25:*/
-#line 537 "cwebdir/common.w"
+/*41:*/
+#line 518 "cwebdir/common.w"
 {
 change_line++;
 if(!input_ln(change_file)){
-#line 440 "cwebdir/comm-w2c.ch"
+#line 274 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file ended without @z"));
-#line 541 "cwebdir/common.w"
+#line 522 "cwebdir/common.w"
 
 buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
 }
@@ -785,14 +832,12 @@
 }
 *limit= ' ';
 if(buffer[0]=='@'){
-#line 446 "cwebdir/comm-w2c.ch"
 if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
-#line 554 "cwebdir/common.w"
 if(buffer[1]=='x'||buffer[1]=='y'){
 loc= buffer+2;
-#line 452 "cwebdir/comm-w2c.ch"
+#line 280 "cwebdir/comm-w2c.ch"
 err_print(_("! Where is the matching @z?"));
-#line 557 "cwebdir/common.w"
+#line 538 "cwebdir/common.w"
 
 }
 else if(buffer[1]=='z'){
@@ -802,12 +847,12 @@
 }
 }
 
-/*:25*/
-#line 431 "cwebdir/common.w"
-;
+/*:41*/
+#line 415 "cwebdir/common.w"
+
 if(!changing||include_depth> change_depth){
-/*24:*/
-#line 520 "cwebdir/common.w"
+/*40:*/
+#line 501 "cwebdir/common.w"
 {
 cur_line++;
 while(!input_ln(cur_file)){
@@ -825,9 +870,9 @@
 if(change_limit> change_buffer)check_change();
 }
 
-/*:24*/
-#line 433 "cwebdir/common.w"
-;
+/*:40*/
+#line 417 "cwebdir/common.w"
+
 if(changing&&include_depth==change_depth)goto restart;
 }
 if(input_has_ended)return 0;
@@ -836,27 +881,27 @@
 loc= buffer+2;*limit= '"';
 while(*loc==' '||*loc=='\t')loc++;
 if(loc>=limit){
-#line 334 "cwebdir/comm-w2c.ch"
+#line 180 "cwebdir/comm-w2c.ch"
 err_print(_("! Include file name not given"));
-#line 443 "cwebdir/common.w"
+#line 427 "cwebdir/common.w"
 
 goto restart;
 }
 if(include_depth>=max_include_depth-1){
-#line 340 "cwebdir/comm-w2c.ch"
+#line 186 "cwebdir/comm-w2c.ch"
 err_print(_("! Too many nested includes"));
-#line 448 "cwebdir/common.w"
+#line 432 "cwebdir/common.w"
 
 goto restart;
 }
 include_depth++;
-/*23:*/
-#line 380 "cwebdir/comm-w2c.ch"
+/*39:*/
+#line 455 "cwebdir/common.w"
 {
-#line 389 "cwebdir/comm-w2c.ch"
+#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 479 "cwebdir/common.w"
+#line 460 "cwebdir/common.w"
 
 if(*loc=='"'){
 loc++;
@@ -867,7 +912,7 @@
 if(k> cur_file_name_end)too_long();
 
 *k= '\0';
-#line 396 "cwebdir/comm-w2c.ch"
+#line 230 "cwebdir/comm-w2c.ch"
 if((found_filename= kpse_find_cweb(cur_file_name))!=NULL&&
 (cur_file= fopen(found_filename,"r"))!=NULL){
 
@@ -877,45 +922,42 @@
 ((strncmp(found_filename,"./",2)==0)?2:0));
 free(found_filename);
 }else fatal(_("! Filename too long\n"),found_filename);
-#line 490 "cwebdir/common.w"
+#line 471 "cwebdir/common.w"
 cur_line= 0;print_where= 1;
 goto restart;
 }
-#line 434 "cwebdir/comm-w2c.ch"
+#line 268 "cwebdir/comm-w2c.ch"
 include_depth--;err_print(_("! Cannot open include file"));goto restart;
-#line 518 "cwebdir/common.w"
+#line 499 "cwebdir/common.w"
 }
 
-/*:23*/
-#line 452 "cwebdir/common.w"
-;
+/*:39*/
+#line 436 "cwebdir/common.w"
+
 }
 return 1;
 }
 
-#line 355 "cwebdir/comm-w2c.ch"
-/*:21*//*26:*/
-#line 569 "cwebdir/common.w"
+#line 201 "cwebdir/comm-w2c.ch"
+/*:38*//*42:*/
+#line 550 "cwebdir/common.w"
 
-#line 462 "cwebdir/comm-w2c.ch"
 void
 check_complete(void){
 if(change_limit!=change_buffer){
 strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
 limit= buffer+(ptrdiff_t)(change_limit-change_buffer);
-#line 575 "cwebdir/common.w"
 changing= 1;change_depth= include_depth;loc= buffer;
-#line 472 "cwebdir/comm-w2c.ch"
+#line 286 "cwebdir/comm-w2c.ch"
 err_print(_("! Change file entry did not match"));
-#line 577 "cwebdir/common.w"
+#line 558 "cwebdir/common.w"
 
 }
 }
 
-/*:26*//*35:*/
-#line 660 "cwebdir/common.w"
+/*:42*//*48:*/
+#line 643 "cwebdir/common.w"
 
-#line 514 "cwebdir/comm-w2c.ch"
 name_pointer
 id_lookup(
 const char*first,
@@ -923,27 +965,24 @@
 char t)
 {
 const char*i= first;
-#line 668 "cwebdir/common.w"
 int h;
 int l;
 name_pointer p;
 if(last==NULL)for(last= first;*last!='\0';last++);
-#line 526 "cwebdir/comm-w2c.ch"
 l= (int)(last-first);
-#line 673 "cwebdir/common.w"
-/*36:*/
-#line 683 "cwebdir/common.w"
+/*49:*/
+#line 666 "cwebdir/common.w"
 
-h= (unsigned char)*i;
-while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
+h= (eight_bits)*i;
+while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
 
 
-/*:36*/
-#line 673 "cwebdir/common.w"
-;
-/*37:*/
-#line 691 "cwebdir/common.w"
+/*:49*/
+#line 656 "cwebdir/common.w"
 
+/*50:*/
+#line 674 "cwebdir/common.w"
+
 p= hash[h];
 while(p&&!names_match(p,first,l,t))p= p->link;
 if(p==NULL){
@@ -951,37 +990,33 @@
 p->link= hash[h];hash[h]= p;
 }
 
-/*:37*/
-#line 674 "cwebdir/common.w"
-;
-if(p==name_ptr)/*39:*/
-#line 706 "cwebdir/common.w"
+/*:50*/
+#line 657 "cwebdir/common.w"
+
+if(p==name_ptr)/*51:*/
+#line 685 "cwebdir/common.w"
 {
-#line 539 "cwebdir/comm-w2c.ch"
+#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 709 "cwebdir/common.w"
+#line 688 "cwebdir/common.w"
 strncpy(byte_ptr,first,l);
 (++name_ptr)->byte_start= byte_ptr+= l;
-#line 546 "cwebdir/comm-w2c.ch"
 init_p(p,t);
-#line 712 "cwebdir/common.w"
 }
 
-/*:39*/
-#line 675 "cwebdir/common.w"
-;
+/*:51*/
+#line 658 "cwebdir/common.w"
+
 return(p);
 }
 
-/*:35*//*42:*/
-#line 764 "cwebdir/common.w"
+/*:48*//*52:*/
+#line 717 "cwebdir/common.w"
 
-#line 554 "cwebdir/comm-w2c.ch"
 void
 print_section_name(
 name_pointer p)
-#line 768 "cwebdir/common.w"
 {
 char*ss,*s= first_chunk(p);
 name_pointer q= p+1;
@@ -988,11 +1023,9 @@
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
 if(*ss==' '&&ss>=s){
-#line 564 "cwebdir/comm-w2c.ch"
 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;
-#line 777 "cwebdir/common.w"
 }
 s= p->byte_start;
 }
@@ -999,15 +1032,13 @@
 if(q)term_write("...",3);
 }
 
-/*:42*//*43:*/
-#line 783 "cwebdir/common.w"
+/*:52*//*53:*/
+#line 736 "cwebdir/common.w"
 
-#line 575 "cwebdir/comm-w2c.ch"
 void
 sprint_section_name(
 char*dest,
 name_pointer p)
-#line 788 "cwebdir/common.w"
 {
 char*ss,*s= first_chunk(p);
 name_pointer q= p+1;
@@ -1018,22 +1049,18 @@
 }else{
 ss++;p= name_dir;
 }
-#line 584 "cwebdir/comm-w2c.ch"
 strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
-#line 799 "cwebdir/common.w"
 s= p->byte_start;
 }
 *dest= '\0';
 }
 
-/*:43*//*44:*/
-#line 804 "cwebdir/common.w"
+/*:53*//*54:*/
+#line 757 "cwebdir/common.w"
 
-#line 592 "cwebdir/comm-w2c.ch"
 void
 print_prefix_name(
 name_pointer p)
-#line 808 "cwebdir/common.w"
 {
 char*s= first_chunk(p);
 int l= prefix_length(p);
@@ -1041,16 +1068,14 @@
 if(s+l<(p+1)->byte_start)term_write("...",3);
 }
 
-/*:44*//*45:*/
-#line 825 "cwebdir/common.w"
+/*:54*//*56:*/
+#line 783 "cwebdir/common.w"
 
-#line 602 "cwebdir/comm-w2c.ch"
 static int web_strcmp(
 char*j,
 int j_len,
 char*k,
 int k_len)
-#line 829 "cwebdir/common.w"
 {
 char*j1= j+j_len,*k1= k+k_len;
 while(k<k1&&j<j1&&*j==*k)k++,j++;
@@ -1061,10 +1086,9 @@
 else return greater;
 }
 
-/*:45*//*47:*/
-#line 855 "cwebdir/common.w"
+/*:56*//*57:*/
+#line 812 "cwebdir/common.w"
 
-#line 624 "cwebdir/comm-w2c.ch"
 static name_pointer
 add_section_name(
 name_pointer par,
@@ -1072,16 +1096,14 @@
 char*first,
 char*last,
 int ispref)
-#line 863 "cwebdir/common.w"
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
-#line 636 "cwebdir/comm-w2c.ch"
 int name_len= (int)(last-first)+ispref;
-#line 643 "cwebdir/comm-w2c.ch"
+#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 869 "cwebdir/common.w"
+#line 826 "cwebdir/common.w"
 (++name_ptr)->byte_start= byte_ptr= s+name_len;
 if(ispref){
 *(byte_ptr-1)= ' ';
@@ -1097,10 +1119,9 @@
 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
 }
 
-/*:47*//*48:*/
-#line 884 "cwebdir/common.w"
+/*:57*//*58:*/
+#line 841 "cwebdir/common.w"
 
-#line 655 "cwebdir/comm-w2c.ch"
 static void
 extend_section_name(
 name_pointer p,
@@ -1107,36 +1128,32 @@
 char*first,
 char*last,
 int ispref)
-#line 891 "cwebdir/common.w"
 {
 char*s;
 name_pointer q= p+1;
-#line 666 "cwebdir/comm-w2c.ch"
 int name_len= (int)(last-first)+ispref;
-#line 672 "cwebdir/comm-w2c.ch"
+#line 308 "cwebdir/comm-w2c.ch"
 if(name_ptr>=name_dir_end)overflow(_("name"));
-#line 896 "cwebdir/common.w"
+#line 853 "cwebdir/common.w"
 while(q->link!=name_dir)q= q->link;
 q->link= name_ptr;
 s= name_ptr->byte_start;
 name_ptr->link= name_dir;
-#line 678 "cwebdir/comm-w2c.ch"
+#line 314 "cwebdir/comm-w2c.ch"
 if(s+name_len> byte_mem_end)overflow(_("byte memory"));
-#line 901 "cwebdir/common.w"
+#line 858 "cwebdir/common.w"
 (++name_ptr)->byte_start= byte_ptr= s+name_len;
 strncpy(s,first,name_len);
 if(ispref)*(byte_ptr-1)= ' ';
 }
 
-/*:48*//*49:*/
-#line 912 "cwebdir/common.w"
+/*:58*//*59:*/
+#line 869 "cwebdir/common.w"
 
-#line 687 "cwebdir/comm-w2c.ch"
 name_pointer
 section_lookup(
 char*first,char*last,
 int ispref)
-#line 917 "cwebdir/common.w"
 {
 int c= 0;
 name_pointer p= root;
@@ -1144,11 +1161,9 @@
 name_pointer r= NULL;
 name_pointer par= NULL;
 
-#line 696 "cwebdir/comm-w2c.ch"
 int name_len= (int)(last-first)+1;
-#line 925 "cwebdir/common.w"
-/*50:*/
-#line 936 "cwebdir/common.w"
+/*60:*/
+#line 893 "cwebdir/common.w"
 
 while(p){
 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -1158,14 +1173,14 @@
 p= (c==less?p->llink:p->rlink);
 }else{
 if(r!=NULL){
-#line 702 "cwebdir/comm-w2c.ch"
+#line 320 "cwebdir/comm-w2c.ch"
 fputs(_("\n! Ambiguous prefix: matches <"),stdout);
-#line 946 "cwebdir/common.w"
+#line 903 "cwebdir/common.w"
 
 print_prefix_name(p);
-#line 708 "cwebdir/comm-w2c.ch"
+#line 326 "cwebdir/comm-w2c.ch"
 fputs(_(">\n and <"),stdout);
-#line 949 "cwebdir/common.w"
+#line 906 "cwebdir/common.w"
 print_prefix_name(r);
 err_print(">");
 return name_dir;
@@ -1178,28 +1193,28 @@
 p= q,q= NULL;
 }
 
-/*:50*/
-#line 926 "cwebdir/common.w"
-;
-/*51:*/
-#line 961 "cwebdir/common.w"
+/*:60*/
+#line 883 "cwebdir/common.w"
 
+/*61:*/
+#line 918 "cwebdir/common.w"
+
 if(r==NULL)
 return add_section_name(par,c,first,last+1,ispref);
 
-/*:51*/
-#line 927 "cwebdir/common.w"
-;
-/*52:*/
-#line 969 "cwebdir/common.w"
+/*:61*/
+#line 884 "cwebdir/common.w"
 
+/*62:*/
+#line 926 "cwebdir/common.w"
+
 switch(section_name_cmp(&first,name_len,r)){
 
 case prefix:
 if(!ispref){
-#line 714 "cwebdir/comm-w2c.ch"
+#line 332 "cwebdir/comm-w2c.ch"
 fputs(_("\n! New name is a prefix of <"),stdout);
-#line 975 "cwebdir/common.w"
+#line 932 "cwebdir/common.w"
 
 print_section_name(r);
 err_print(">");
@@ -1211,41 +1226,39 @@
 extend_section_name(r,first,last+1,ispref);
 return r;
 case bad_extension:
-#line 720 "cwebdir/comm-w2c.ch"
+#line 338 "cwebdir/comm-w2c.ch"
 fputs(_("\n! New name extends <"),stdout);
-#line 987 "cwebdir/common.w"
+#line 944 "cwebdir/common.w"
 
 print_section_name(r);
 err_print(">");
 return r;
 default:
-#line 726 "cwebdir/comm-w2c.ch"
+#line 344 "cwebdir/comm-w2c.ch"
 fputs(_("\n! Section name incompatible with <"),stdout);
-#line 993 "cwebdir/common.w"
+#line 950 "cwebdir/common.w"
 
 print_prefix_name(r);
-#line 732 "cwebdir/comm-w2c.ch"
+#line 350 "cwebdir/comm-w2c.ch"
 fputs(_(">,\n which abbreviates <"),stdout);
-#line 996 "cwebdir/common.w"
+#line 953 "cwebdir/common.w"
 print_section_name(r);
 err_print(">");
 return r;
 }
 
-/*:52*/
-#line 928 "cwebdir/common.w"
-;
+/*:62*/
+#line 885 "cwebdir/common.w"
+
 }
 
-/*:49*//*54:*/
-#line 1020 "cwebdir/common.w"
+/*:59*//*64:*/
+#line 977 "cwebdir/common.w"
 
-#line 747 "cwebdir/comm-w2c.ch"
 static int section_name_cmp(
 char**pfirst,
 int len,
 name_pointer r)
-#line 1025 "cwebdir/common.w"
 {
 char*first= *pfirst;
 name_pointer q= r+1;
@@ -1259,9 +1272,7 @@
 switch(c= web_strcmp(first,len,s,ss-s)){
 case equal:if(q==name_dir)
 if(ispref){
-#line 756 "cwebdir/comm-w2c.ch"
 *pfirst= first+(ptrdiff_t)(ss-s);
-#line 1039 "cwebdir/common.w"
 return extension;
 }else return equal;
 else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
@@ -1268,9 +1279,7 @@
 case extension:
 if(!ispref)return bad_extension;
 first+= ss-s;
-#line 762 "cwebdir/comm-w2c.ch"
 if(q!=name_dir){len-= (int)(ss-s);s= q->byte_start;r= q;continue;}
-#line 1046 "cwebdir/common.w"
 *pfirst= first;return extension;
 default:return c;
 }
@@ -1277,26 +1286,24 @@
 }
 }
 
-/*:54*//*58:*/
-#line 1095 "cwebdir/common.w"
+/*:64*//*66:*/
+#line 1029 "cwebdir/common.w"
 
-#line 788 "cwebdir/comm-w2c.ch"
 void
 err_print(
 const char*s)
-#line 1099 "cwebdir/common.w"
 {
 char*k,*l;
 printf(*s=='!'?"\n%s":"%s",s);
-if(web_file_open)/*59:*/
-#line 1115 "cwebdir/common.w"
+if(web_file_open)/*67:*/
+#line 1049 "cwebdir/common.w"
 
 {if(changing&&include_depth==change_depth)
-#line 798 "cwebdir/comm-w2c.ch"
+#line 358 "cwebdir/comm-w2c.ch"
 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 1120 "cwebdir/common.w"
+#line 1054 "cwebdir/common.w"
 l= (loc>=limit?limit:loc);
 if(l> buffer){
 for(k= buffer;k<l;k++)
@@ -1310,27 +1317,25 @@
 putchar(' ');
 }
 
-/*:59*/
-#line 1102 "cwebdir/common.w"
-;
+/*:67*/
+#line 1036 "cwebdir/common.w"
+
 update_terminal;mark_error;
 }
 
-/*:58*//*61:*/
-#line 1150 "cwebdir/common.w"
+/*:66*//*68:*/
+#line 1081 "cwebdir/common.w"
 
-#line 837 "cwebdir/comm-w2c.ch"
 int wrap_up(void){
-if(show_progress||show_happiness||(history> spotless))new_line;
-#line 1153 "cwebdir/common.w"
+if(show_progress)new_line;
 if(show_stats)
 print_stats();
-#line 844 "cwebdir/comm-w2c.ch"
-/*62:*/
-#line 1160 "cwebdir/common.w"
+#line 388 "cwebdir/comm-w2c.ch"
+/*69:*/
+#line 1091 "cwebdir/common.w"
 
 switch(history){
-#line 868 "cwebdir/comm-w2c.ch"
+#line 412 "cwebdir/comm-w2c.ch"
 case spotless:
 if(show_happiness)puts(_("(No errors were found.)"));break;
 case harmless_message:
@@ -1339,14 +1344,14 @@
 puts(_("(Pardon me, but I think I spotted something wrong.)"));break;
 case fatal_message:
 puts(_("(That was a fatal error, my friend.)"));
-#line 1168 "cwebdir/common.w"
+#line 1099 "cwebdir/common.w"
 }
 
-/*:62*/
-#line 844 "cwebdir/comm-w2c.ch"
+/*:69*/
+#line 388 "cwebdir/comm-w2c.ch"
 
-/*87:*/
-#line 1271 "cwebdir/comm-w2c.ch"
+/*88:*/
+#line 662 "cwebdir/comm-w2c.ch"
 
 if(C_file)fclose(C_file);
 if(tex_file)fclose(tex_file);
@@ -1354,10 +1359,10 @@
 if(strlen(check_file_name))
 remove(check_file_name);
 
-/*:87*/
-#line 845 "cwebdir/comm-w2c.ch"
+/*:88*/
+#line 389 "cwebdir/comm-w2c.ch"
 
-#line 852 "cwebdir/comm-w2c.ch"
+#line 396 "cwebdir/comm-w2c.ch"
 switch(history){
 case harmless_message:return RETURN_WARN;
 case error_message:return RETURN_ERROR;
@@ -1364,43 +1369,37 @@
 case fatal_message:return RETURN_FAIL;
 default:return RETURN_OK;
 }
-#line 1158 "cwebdir/common.w"
+#line 1089 "cwebdir/common.w"
 }
 
-/*:61*//*64:*/
-#line 890 "cwebdir/comm-w2c.ch"
+/*:68*//*70:*/
+#line 1107 "cwebdir/common.w"
 void
 fatal(
 const char*s,const char*t)
-#line 1182 "cwebdir/common.w"
 {
-#line 898 "cwebdir/comm-w2c.ch"
 if(*s)err_print(s);
-#line 1184 "cwebdir/common.w"
 err_print(t);
 history= fatal_message;exit(wrap_up());
 }
 
-/*:64*//*65:*/
-#line 906 "cwebdir/comm-w2c.ch"
+/*:70*//*71:*/
+#line 1118 "cwebdir/common.w"
 void
 overflow(
 const char*t)
-#line 1193 "cwebdir/common.w"
 {
-#line 914 "cwebdir/comm-w2c.ch"
+#line 425 "cwebdir/comm-w2c.ch"
 printf(_("\n! Sorry, %s capacity exceeded"),t);fatal("","");
-#line 1195 "cwebdir/common.w"
+#line 1123 "cwebdir/common.w"
 }
 
 
-/*:65*//*70:*/
-#line 1254 "cwebdir/common.w"
+/*:71*//*76:*/
+#line 1175 "cwebdir/common.w"
 
-#line 978 "cwebdir/comm-w2c.ch"
 static void
 scan_args(void)
-#line 1257 "cwebdir/common.w"
 {
 char*dot_pos;
 char*name_pos;
@@ -1407,9 +1406,8 @@
 register char*s;
 boolean found_web= 0,found_change= 0,found_out= 0;
 
-#line 1264 "cwebdir/common.w"
 
-#line 990 "cwebdir/comm-w2c.ch"
+#line 462 "cwebdir/comm-w2c.ch"
 
 #if defined DEV_NULL
 strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
@@ -1421,28 +1419,28 @@
 strcpy(change_file_name,"/dev/null");
 #endif
 
+#line 1186 "cwebdir/common.w"
 while(--argc> 0){
-#line 1266 "cwebdir/common.w"
-if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*74:*/
-#line 1068 "cwebdir/comm-w2c.ch"
+if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
+#line 510 "cwebdir/comm-w2c.ch"
 
 {
 if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
 
-/*94:*/
-#line 1423 "cwebdir/comm-w2c.ch"
+/*95:*/
+#line 800 "cwebdir/comm-w2c.ch"
 
 cb_usagehelp(program==ctangle?CTANGLEHELP:
 program==cweave?CWEAVEHELP:CTWILLHELP,NULL);
 
 
-/*:94*/
-#line 1072 "cwebdir/comm-w2c.ch"
+/*:95*/
+#line 514 "cwebdir/comm-w2c.ch"
 
 if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
 
-/*96:*/
-#line 1466 "cwebdir/comm-w2c.ch"
+/*98:*/
+#line 847 "cwebdir/comm-w2c.ch"
 
 printversionandexit(cb_banner,
 program==ctwill?"Donald E. Knuth":"Silvio Levy and Donald E. Knuth",
@@ -1449,8 +1447,8 @@
 NULL,"Contemporary development on https://github.com/ascherer/cwebbin.\n");
 
 
-/*:96*/
-#line 1075 "cwebdir/comm-w2c.ch"
+/*:98*/
+#line 517 "cwebdir/comm-w2c.ch"
 
 if(strcmp("-verbose",*argv)==0||strcmp("--verbose",*argv)==0)
 
@@ -1466,17 +1464,16 @@
 show_banner= show_progress= show_happiness= 0;
 }else
 if(*dot_pos=='d'){
-if(sscanf(++dot_pos,"%u",&kpathsea_debug)!=1)/*75:*/
-#line 1352 "cwebdir/common.w"
+if(sscanf(++dot_pos,"%u",&kpathsea_debug)!=1)/*81:*/
+#line 555 "cwebdir/comm-w2c.ch"
 
-#line 1118 "cwebdir/comm-w2c.ch"
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1363 "cwebdir/common.w"
+#line 1281 "cwebdir/common.w"
 
-#line 1125 "cwebdir/comm-w2c.ch"
-/*:75*/
-#line 1090 "cwebdir/comm-w2c.ch"
+#line 563 "cwebdir/comm-w2c.ch"
+/*:81*/
+#line 532 "cwebdir/comm-w2c.ch"
 
 while(isdigit(*dot_pos))dot_pos++;
 dot_pos--;
@@ -1485,17 +1482,17 @@
 use_language= ++dot_pos;
 break;
 }else
-#line 1103 "cwebdir/comm-w2c.ch"
+#line 1267 "cwebdir/common.w"
  flags[(eight_bits)*dot_pos]= flag_change;
-#line 1350 "cwebdir/common.w"
 }
 
-/*:74*/
-#line 1266 "cwebdir/common.w"
+#line 555 "cwebdir/comm-w2c.ch"
+/*:80*/
+#line 1187 "cwebdir/common.w"
 
 else{
 s= name_pos= *argv;dot_pos= NULL;
-#line 1011 "cwebdir/comm-w2c.ch"
+#line 482 "cwebdir/comm-w2c.ch"
 while(*s){
 if(*s=='.')dot_pos= s++;
 else if(*s==DIR_SEPARATOR||*s==DEVICE_SEPARATOR||*s=='/')
@@ -1503,21 +1500,21 @@
 else s++;
 }
 
-#line 1274 "cwebdir/common.w"
-if(!found_web)/*71:*/
-#line 1292 "cwebdir/common.w"
+#line 1195 "cwebdir/common.w"
+if(!found_web)/*77:*/
+#line 1212 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
-/*76:*/
-#line 1125 "cwebdir/comm-w2c.ch"
+/*82:*/
+#line 563 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1365 "cwebdir/common.w"
+#line 1283 "cwebdir/common.w"
 
 
-/*:76*/
-#line 1295 "cwebdir/common.w"
-;
+/*:82*/
+#line 1215 "cwebdir/common.w"
+
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
 else{
@@ -1524,7 +1521,7 @@
 strcpy(web_file_name,*argv);
 *dot_pos= 0;
 }
-#line 1303 "cwebdir/common.w"
+#line 1223 "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);
@@ -1532,52 +1529,48 @@
 found_web= 1;
 }
 
-/*:71*/
-#line 1275 "cwebdir/common.w"
+/*:77*/
+#line 1196 "cwebdir/common.w"
 
-else if(!found_change)/*72:*/
-#line 1310 "cwebdir/common.w"
+else if(!found_change)/*78:*/
+#line 1230 "cwebdir/common.w"
 
 {
-#line 1043 "cwebdir/comm-w2c.ch"
 if(strcmp(*argv,"-")!=0){
-#line 1314 "cwebdir/common.w"
 if(s-*argv> max_file_name_length-4)
-/*76:*/
-#line 1125 "cwebdir/comm-w2c.ch"
+/*82:*/
+#line 563 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1365 "cwebdir/common.w"
+#line 1283 "cwebdir/common.w"
 
 
-/*:76*/
-#line 1315 "cwebdir/common.w"
-;
+/*:82*/
+#line 1234 "cwebdir/common.w"
+
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
 else strcpy(change_file_name,*argv);
-#line 1050 "cwebdir/comm-w2c.ch"
 }
 found_change= 1;
-#line 1321 "cwebdir/common.w"
 }
 
-/*:72*/
-#line 1276 "cwebdir/common.w"
+/*:78*/
+#line 1197 "cwebdir/common.w"
 
-else if(!found_out)/*73:*/
-#line 1323 "cwebdir/common.w"
+else if(!found_out)/*79:*/
+#line 1242 "cwebdir/common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
-/*76:*/
-#line 1125 "cwebdir/comm-w2c.ch"
+/*82:*/
+#line 563 "cwebdir/comm-w2c.ch"
 fatal(_("! Filename too long\n"),*argv);
-#line 1365 "cwebdir/common.w"
+#line 1283 "cwebdir/common.w"
 
 
-/*:76*/
-#line 1326 "cwebdir/common.w"
-;
+/*:82*/
+#line 1245 "cwebdir/common.w"
+
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
 sprintf(idx_file_name,"%s.idx",*argv);
@@ -1586,9 +1579,7 @@
 }else{
 strcpy(tex_file_name,*argv);
 strcpy(C_file_name,*argv);
-#line 1057 "cwebdir/comm-w2c.ch"
 if(make_xrefs){
-#line 1336 "cwebdir/common.w"
 *dot_pos= 0;
 sprintf(idx_file_name,"%s.idx",*argv);
 sprintf(scn_file_name,"%s.scn",*argv);
@@ -1597,42 +1588,38 @@
 found_out= 1;
 }
 
-#line 1067 "cwebdir/comm-w2c.ch"
-/*:73*/
-#line 1277 "cwebdir/common.w"
+/*:79*/
+#line 1198 "cwebdir/common.w"
 
-else/*75:*/
-#line 1352 "cwebdir/common.w"
+else/*81:*/
+#line 555 "cwebdir/comm-w2c.ch"
 
-#line 1118 "cwebdir/comm-w2c.ch"
- cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
+cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1363 "cwebdir/common.w"
+#line 1281 "cwebdir/common.w"
 
-#line 1125 "cwebdir/comm-w2c.ch"
-/*:75*/
-#line 1278 "cwebdir/common.w"
-;
+#line 563 "cwebdir/comm-w2c.ch"
+/*:81*/
+#line 1199 "cwebdir/common.w"
+
 }
 }
-if(!found_web)/*75:*/
-#line 1352 "cwebdir/common.w"
+if(!found_web)/*81:*/
+#line 555 "cwebdir/comm-w2c.ch"
 
-#line 1118 "cwebdir/comm-w2c.ch"
 cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
 
-#line 1363 "cwebdir/common.w"
+#line 1281 "cwebdir/common.w"
 
-#line 1125 "cwebdir/comm-w2c.ch"
-/*:75*/
-#line 1281 "cwebdir/common.w"
-;
-#line 1283 "cwebdir/common.w"
+#line 563 "cwebdir/comm-w2c.ch"
+/*:81*/
+#line 1202 "cwebdir/common.w"
+
 }
 
-#line 1030 "cwebdir/comm-w2c.ch"
-/*:70*//*95:*/
-#line 1432 "cwebdir/comm-w2c.ch"
+#line 496 "cwebdir/comm-w2c.ch"
+/*:76*//*97:*/
+#line 813 "cwebdir/comm-w2c.ch"
 
 static void cb_usage(const_string str)
 {
@@ -1664,8 +1651,8 @@
 history= spotless;exit(wrap_up());
 }
 
-/*:95*//*97:*/
-#line 1474 "cwebdir/comm-w2c.ch"
+/*:97*//*99:*/
+#line 855 "cwebdir/comm-w2c.ch"
 
 void cb_show_banner(void)
 {
@@ -1677,4 +1664,4 @@
 
 }
 
-/*:97*/
+/*:99*/

Modified: trunk/Build/source/texk/web2c/cwebdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ChangeLog	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ChangeLog	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,3 +1,35 @@
+2021-02-07  Andreas Scherer  <https://ascherer.github.io>
+
+	* Makefile,
+	* README,
+	* comm-{amiga,bs,mac,os2,pc,ql,vms,w32}.ch,
+	* comm-w2c.ch,
+	* comm-w2c.h,
+	* common.c,
+	* common.h,
+	* common.w,
+	* ctang-{bs,pc,ql,vms,w32}.ch,
+	* ctang-man.ch,
+	* ctang-w2c.ch,
+	* ctangle.c,
+	* ctangle.w,
+	* ctwill-mini.ch,
+	* ctwill-w2c.ch,
+	* ctwill.bux,
+	* cweav-{bs,pc,ql,vms,w32}.ch,
+	* cweav-man.ch,
+	* cweav-w2c.ch,
+	* cweave.w,
+	* cweb.1,
+	* cwebmac.tex,
+	* cwebman-w2c.ch,
+	* cwebman.tex,
+	* examples/wmerge.w,
+	* po/{cweb,cweb-tl,web2c-help}.pot,
+	* po/de/{cweb,cweb-tl,web2c-help}.po,
+	* po/it/cweb.po,
+	* system.bux: New CWEB 4.0 and CWEBbin 2021.
+
 2020-07-30  Andreas Scherer  <https://ascherer.github.io>
 
 	* comm-w2c.ch,

Modified: trunk/Build/source/texk/web2c/cwebdir/Makefile
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/Makefile	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/Makefile	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,6 +1,6 @@
 # This file is part of CWEB.
 # It is distributed WITHOUT ANY WARRANTY, express or implied.
-# Version 3.64 --- February 2002
+# Version 4.0 --- February 2021
 
 # Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 

Modified: trunk/Build/source/texk/web2c/cwebdir/README
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/README	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/README	2021-02-07 11:02:17 UTC (rev 57658)
@@ -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 January 2016 by Don Knuth
+% This README file last updated February 2021 by Andreas Scherer
 
 % Copyright (C) 1987,1990,1993,2000,2016 Silvio Levy and Donald E. Knuth
 
@@ -18,9 +18,13 @@
 % there will verify and forward bug reports.
 %
 % DEK takes no responsibility for the changefiles; they should be
-% maintained independently. His job is to correct errors in
-% ctangle.w, cweave.w, prod.w, common.w, cwebmac.tex, cwebman.tex,
-% and in the files of examples/*.w, nothing more.
+% maintained independently. He even transferred the job to correct errors
+% in ctangle.w, cweave.w, prod.w, common.w, cwebmac.tex, cwebman.tex,
+% and in the files of examples/*.w to Andreas Scherer in 2021.
+% Further significant developments, including versions that neither
+% Don Knuth nor Silvio Levy themselves do maintain, are ongoing.
+% All of the really current news about CWEB is, in fact, now to be found
+% on the CWEB development page https://github.com/ascherer/cweb.
 
 This directory contains the following files:
 
@@ -30,6 +34,7 @@
 comm-bs.ch
 comm-mac.ch
 comm-man.ch
+comm-os2.ch
 comm-pc.ch
 comm-ql.ch
 comm-vms.ch
@@ -68,7 +73,7 @@
 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 239-page CWEB manual.
+The files *-man.ch are used if you want to make the full 240-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.
@@ -102,9 +107,3 @@
 are first bootstrapping to a new system, you may need to edit common.c and
 ctangle.c by hand, but the vast majority of the change-file changes are
 minor refinements that are not necessary for a rudimentary ctangle.
-
------------------------------------------
-These archival sources are maintained only to the extent of fixing
-significant bugs that were unintended at the time of writing.
-A multi-decade ongoing project to improve and extend CWEB can be found at
-  https://github.com/ascherer/cwebbin

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -4,14 +4,14 @@
 With Lattice C 5.1, use compilation switches -b0 -r0, and ignore the
 compiler warnings. With SAS 6.0, use compilation switches Code=far Data=far.
 
- at x section 69
+ at x section 75
 An omitted change file argument means that |"/dev/null"| should be used,
 @y
 An omitted change file argument means that |"nil:"| should be used,
 @z
 
- at x section 70
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
+ at x section 76
+  strcpy(change_file_name,"/dev/null");
 @y
-  if (found_change<=0) strcpy(change_file_name,"nil:");
+  strcpy(change_file_name,"nil:");
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -12,48 +12,61 @@
 (This file contributed by Barry Schwartz, trashman at crud.mn.org, 28 Jun 94;
  revised 24 Jul 94.)
 
+(Update attempt by Andreas Scherer, 31 Jan 2021.  Good luck!)
 
- at x Section 23.
-    cur_file_name[l]='/'; /* \UNIX/ pathname separator */
- at y
-    cur_file_name[l]='/'; /* A valid {\mc MSDOS} pathname separator */
- at z
 
+ at x Section 6.
+ at d chunk_marker 0
 
- at x Section 27.
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
-
-@<Definitions that...@>=
+@<Common code...@>=
 typedef struct name_info {
   char *byte_start; /* beginning of the name in |byte_mem| */
-  @<More elements of |name_info| structure@>@;
+  struct name_info *link;
+  union {
+    struct name_info *Rlink; /* right link in binary search tree for section
+      names */
+    char Ilk; /* used by identifiers in \.{CWEAVE} only */
+  } dummy;
+  void *equiv_or_xref; /* 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 */
-char byte_mem[max_bytes]; /* characters of names */
-char *byte_mem_end = byte_mem+max_bytes-1; /* end of |byte_mem| */
-name_info name_dir[max_names]; /* information about names */
-name_pointer name_dir_end = name_dir+max_names-1; /* end of |name_dir| */
+typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
+typedef name_pointer *hash_pointer;
+extern char byte_mem[]; /* characters of names */
+extern char *byte_mem_end; /* end of |byte_mem| */
 @y
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
+ at d chunk_marker 0
 
 @f huge extern
 
-@<Definitions that...@>=
+@<Common code...@>=
 typedef struct name_info {
   char huge* byte_start; /* beginning of the name in |byte_mem| */
-  @<More elements of |name_info| structure@>@;
+  struct name_info *link;
+  union {
+    struct name_info *Rlink; /* right link in binary search tree for section
+      names */
+    char Ilk; /* used by identifiers in \.{CWEAVE} only */
+  } dummy;
+  union {
+    void huge* equiv_member;
+    void huge* xref_member;
+  } 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 */
-char huge byte_mem[max_bytes]; /* characters of names */
-char huge* byte_mem_end; /* end of |byte_mem| */
-name_info name_dir[max_names]; /* information about names */
-name_pointer name_dir_end = name_dir+max_names-1;
+typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
+typedef name_pointer *hash_pointer;
+extern char huge byte_mem[]; /* characters of names */
+extern char huge* byte_mem_end; /* end of |byte_mem| */
 @z
 
 
- at x Section 29.
+ at x Section 39.
+    cur_file_name[l]='/'; /* \UNIX/ pathname separator */
+ at y
+    cur_file_name[l]='/'; /* A valid {\mc MSDOS} pathname separator */
+ at z
+
+
+ at x Section 44.
 char *byte_ptr; /* first unused position in |byte_mem| */
 @y
 char huge* byte_ptr; /* first unused position in |byte_mem| */
@@ -60,7 +73,7 @@
 @z
 
 
- at x Section 30.
+ at x Section 45.
 @ @<Init...@>=
 name_dir->byte_start=byte_ptr=byte_mem; /* position zero in both arrays */
 name_ptr=name_dir+1; /* |name_dir[0]| will be used only for error recovery */
@@ -74,72 +87,72 @@
 @z
 
 
- at x Section 42.
+ at x Section 52.
 void
-print_section_name(p)
-name_pointer p;
+print_section_name(
+name_pointer p)
 {
   char *ss, *s = first_chunk(p);
 @y
 void
-print_section_name(p)
-name_pointer p;
+print_section_name(
+name_pointer p)
 {
   char huge* ss, huge* s = first_chunk(p);
 @z
 
 
- at x Section 43.
+ at x Section 53.
 void
-sprint_section_name(dest,p)
-  char*dest;
-  name_pointer p;
+sprint_section_name(
+  char *dest,
+  name_pointer p)
 {
   char *ss, *s = first_chunk(p);
 @y
 void
-sprint_section_name(dest,p)
-  char*dest;
-  name_pointer p;
+sprint_section_name(
+  char huge* dest,
+  name_pointer p)
 {
   char huge* ss, huge* s = first_chunk(p);
 @z
 
 
- at x Section 44.
+ at x Section 54.
 void
-print_prefix_name(p)
-name_pointer p;
+print_prefix_name(
+name_pointer p)
 {
   char *s = first_chunk(p);
 @y
 void
-print_prefix_name(p)
-name_pointer p;
+print_prefix_name(
+name_pointer p)
 {
   char huge* s = first_chunk(p);
 @z
 
 
- at x Section 47.
-name_pointer
-add_section_name(par,c,first,last,ispref) /* 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; /* are we adding a prefix or a full name? */
+ at x Section 57.
+static name_pointer
+add_section_name(@t\1\1@> /* 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? */
 {
   name_pointer p=name_ptr; /* new node */
   char *s=first_chunk(p);
 @y
-name_pointer
-add_section_name(par,c,first,last,ispref) /* 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; /* are we adding a prefix or a full name? */
+static name_pointer
+add_section_name(@t\1\1@> /* 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? */
 {
   name_pointer p=name_ptr; /* new node */
   char huge* s=first_chunk(p);
@@ -146,84 +159,65 @@
 @z
 
 
- at x Section 48.
-void
-extend_section_name(p,first,last,ispref)
-name_pointer p; /* name to be extended */
-char *first; /* beginning of extension text */
-char *last; /* one beyond end of extension text */
-int ispref; /* are we adding a prefix or a full name? */
+ at x Section 58.
+static void
+extend_section_name(@t\1\1@>
+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? */
 {
   char *s;
 @y
-void
-extend_section_name(p,first,last,ispref)
-name_pointer p; /* name to be extended */
-char *first; /* beginning of extension text */
-char *last; /* one beyond end of extension text */
-int ispref; /* are we adding a prefix or a full name? */
+static void
+extend_section_name(@t\1\1@>
+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? */
 {
   char huge* s;
 @z
 
 
- at x Section 54.
-int section_name_cmp(pfirst,len,r)
-char **pfirst; /* pointer to beginning of comparison string */
-int len; /* length of string */
-name_pointer r; /* section name being compared */
+ at x Section 64.
+static int section_name_cmp(@t\1\1@>
+char **pfirst, /* pointer to beginning of comparison string */
+int len, /* length of string */
+name_pointer r at t\2\2@>) /* 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
-int section_name_cmp(pfirst,len,r)
-char **pfirst; /* pointer to beginning of comparison string */
-int len; /* length of string */
-name_pointer r; /* section name being compared */
+static int section_name_cmp(@t\1\1@>
+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 */
 {
-  char *first=*pfirst; /* beginning of comparison string */
+  char huge* first=*pfirst; /* beginning of comparison string */
   name_pointer q=r+1; /* access to subsequent chunks */
   char huge* ss, huge* s=first_chunk(r);
 @z
 
 
- at x Section 55.
-source files, respectively; here we just declare a common field
-|equiv_or_xref| as a pointer to a |char|.
-
-@<More elements of |name...@>=
-char *equiv_or_xref; /* info corresponding to names */
+ at x Section 75.
+An omitted change file argument means that |"/dev/null"| should be used,
 @y
-source files, respectively.  Here we just declare a common field
-|ptr_union| as a union of pointers to |char|, which happen to have
-different addressing attributes.
-
-@<More elements of |name...@>=
-union {
-  char *equiv_member;
-  char huge* xref_member;
-} ptr_union;  /* info corresponding to names */
+An omitted change file argument means that |"NUL"| should be used,
 @z
 
 
- at x Section 69.
-An omitted change file argument means that |"/dev/null"| should be used,
+ at x Section 76.
+  strcpy(change_file_name,"/dev/null");
 @y
-An omitted change file argument means that |"NUL"| should be used,
+  strcpy(change_file_name,"NUL");
 @z
 
 
- at x Section 70.
+ at x Section 76.
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')
 	  dot_pos=NULL,name_pos=++s;
 @z
-
-
- at x Section 70.
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
-  if (found_change<=0) strcpy(change_file_name,"NUL");
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -4,19 +4,22 @@
 (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 3.64)}
+  \centerline{(Version 4.0)}
 @y
-  \centerline{(Version 3.64 for MacOS)}
+  \centerline{(Version 4.0 for MacOS)}
 @z
 
- at x section 9: Make input_ln accept \n, \r, \n\r, or \r\n as line endings
+ at x sections 23/24: 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@>
 
- at c
-int input_ln(fp) /* copies a line into |buffer| or returns 0 */
-FILE *fp; /* what file to read from */
+@<Predecl...@>=
+static boolean input_ln(FILE *);@/
+
+@ @c
+static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns 0 */
+FILE *fp at t\2\2@>) /* 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 */
@@ -28,7 +31,7 @@
     if ((c=getc(fp))!=EOF && c!='\n') {
       ungetc(c,fp); loc=buffer; err_print("! Input line too long");
 @.Input line too long@>
-  }
+    }
   if (c==EOF && limit==buffer) return(0);  /* there was nothing after
     the last newline */
   return(1);
@@ -43,8 +46,8 @@
 @^system dependencies@>
 
 @c
-int input_ln(fp) /* copies a line into |buffer| or returns 0 */
-FILE *fp; /* what file to read from */
+static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns 0 */
+FILE *fp at t\2\2@>) /* 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 */
@@ -71,17 +74,17 @@
 }
 @z
 
- at x section 12, simply return if no change file was specified
+ at x section 28, 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@>;
+  @<Skip over comment lines in the change file; |return| if end of file@>@;
 @y
   change_limit=change_buffer; /* this value is used if the change file ends */
   if (change_file_name[0] == '\0') /* no change file specified */
     return; /* so we have reached the end of that file */
-  @<Skip over comment lines in the change file; |return| if end of file@>;
+  @<Skip over comment lines in the change file; |return| if end of file@>@;
 @z
 
- at x section 19, don't try to open a change file if none was specified
+ at x section 36, don't try to open a change file if none was specified
 if ((change_file=fopen(change_file_name,"r"))==NULL)
        fatal("! Cannot open change file ", change_file_name);
 @y
@@ -91,7 +94,7 @@
        fatal("! Cannot open change file ", change_file_name);
 @z
 
- at x section 22, declare colon as Mac's path separator
+ at x section 39, declare colon as Mac's path separator
 (Colon-separated paths are not supported.)
 The remainder of the \.{@@i} line after the file name is ignored.
 
@@ -104,20 +107,24 @@
 @d PATH_SEP ':'   /* MacOS pathname separator */
 @^system dependencies@>
 @z
-
- at x section 23, use the path separator constant
+ at x section 39, use the path separator constant
     cur_file_name[l]='/'; /* \UNIX/ pathname separator */
 @y
     cur_file_name[l]=PATH_SEP; /* pathname separator */
 @z
 
- at x section 69, explain the convention for omitted change files
+ at x section 75, explain the convention for omitted change files
 An omitted change file argument means that |"/dev/null"| should be used,
 @y
 An omitted change file argument means that no change file should be used,
 @z
 
- at x section 70, use the Metrowerks |ccommand| to access command lines
+ at x section 76, make change file name empty when it is unspecified
+  strcpy(change_file_name,"/dev/null");
+ at y
+  change_file_name[0]='\0';   /* empty string */
+ at z
+ at x section 76, use the Metrowerks |ccommand| to access command lines
   while (--argc > 0) {
 @y
   argc = ccommand (&argv); /* use Mac interface to command line */
@@ -124,18 +131,13 @@
 @^system dependencies@>
   while (--argc > 0) {
 @z
- at x section 70, use the path separator constant
+ at x section 76, 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;
 @z
- at x section 70, make change file name empty when it is unspecified
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
-  if (found_change<=0) change_file_name[0]='\0';   /* empty string */
- at z
 
- at x section 82, insert an extra module before the index
+ at x section 85, insert an extra module before the index
 @** Index.
 @y by putting the new module here, we preserve all the previous section numbers
 @ We assume an interface to \CEE/ command-line emulation as supplied by

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -4,21 +4,21 @@
 These changes tested with WATCOM C v10.0a.
 No changes to CTANGLE or CWEAVE are needed with OS/2.
 
- at x section 69
+ at x section 75
 An omitted change file argument means that |"/dev/null"| should be used,
 @y
 An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 70 (this change copied from comm-pc.ch)
+ at x section 76
+  strcpy(change_file_name,"/dev/null");
+ at y
+  strcpy(change_file_name,"NUL");
+ at z
+
+ at x section 76 (this change copied from comm-pc.ch)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')
 	  dot_pos=NULL,name_pos=++s;
 @z
-
- at x section 70
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
-  if (found_change<=0) strcpy(change_file_name,"NUL");
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -4,30 +4,30 @@
 Changes necessary for compiling with Borland C/C++
 Use compilation switches -mc -w-pro -Ff=5000
 
-Note: The change to section 27 is not necessary if using a compiler
+Note: The change to section 16 is not necessary if using a compiler
 that allows >64K arrays.
 
- at x section 27
- at d max_bytes 90000 /* the number of bytes in identifiers,
+ at x section 16
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
 @y
 @d max_bytes (unsigned)60000 /* the number of bytes in identifiers,
 @z
 
- at x section 69
+ at x section 75
 An omitted change file argument means that |"/dev/null"| should be used,
 @y
 An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 70 (this change copied from comm-bs.ch, July 94)
+ at x section 76
+  strcpy(change_file_name,"/dev/null");
+ at y
+  strcpy(change_file_name,"NUL");
+ at z
+
+ at x section 76 (this change copied from comm-bs.ch, July 94)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')
 	  dot_pos=NULL,name_pos=++s;
 @z
-
- at x section 70
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
-  if (found_change<=0) strcpy(change_file_name,"NUL");
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -10,12 +10,12 @@
 @x
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (Version 3.64)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.0)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -22,49 +22,27 @@
 @y
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (QL Version 3.64)}
+\def\title{Common code for CTANGLE and CWEAVE (QL Version 4.0)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
 @z
 
- at x
-The line number of each open file is also kept for error reporting and
-for the benefit of \.{CTANGLE}.
 
- at f line x /* make |line| an unreserved word */
- at d max_include_depth 10 /* maximum number of source files open
-  simultaneously, not counting the change file */
- at d max_file_name_length 60
- at d cur_file file[include_depth] /* current file */
- at d cur_file_name file_name[include_depth] /* current file name */
- at d cur_line line[include_depth] /* number of current line in current file */
- at d web_file file[0] /* main source file */
- at d web_file_name file_name[0] /* main source file name */
- at y
-The line number of each open file is also kept for error reporting and
-for the benefit of \.{CTANGLE}.
-
 For use on QDOS/SMSQ systems the variable |max_file_name_length| is shortened
 to 42 characters, i.e. 5 characters for the device name, 36 characters
 for the file name plus one character as string terminator. (Note that
 (current) QDOS/SMSQ file systems have a limitation of 36 characters as
 maximum length for a file name.
-
- at f line x /* make |line| an unreserved word */
- at d max_include_depth 10 /* maximum number of source files open
-  simultaneously, not counting the change file */
+ at x
+ at d max_file_name_length 1024
+ at y
 @d max_file_name_length 42
- at d cur_file file[include_depth] /* current file */
- at d cur_file_name file_name[include_depth] /* current file name */
- at d cur_line line[include_depth] /* number of current line in current file */
- at d web_file file[0] /* main source file */
- at d web_file_name file_name[0] /* main source file name */
 @z
 
 
@@ -90,99 +68,6 @@
 @^system dependencies@>
 
 If there's a third file name, it will be the output file.
-
-@<Pred...@>=
-void scan_args();
-
-@ @c
-void
-scan_args()
-{
-  char *dot_pos; /* position of |'.'| in the argument */
-  char *name_pos; /* file name beginning, sans directory */
-  register char *s; /* register for scanning strings */
-  boolean found_web=0,found_change=0,found_out=0;
-             /* have these names have been seen? */
-  boolean flag_change;
-
-  while (--argc > 0) {
-    if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
-    else {
-      s=name_pos=*argv;@+dot_pos=NULL;
-      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|@>@;
-      else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
-        else @<Print usage error message and quit@>;
-    }
-  }
-  if (!found_web) @<Print usage error message and quit@>;
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
-}
-
-@ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
-otherwise we add |".w"|. If this file can't be opened, we prepare an
-|alt_web_file_name| by adding |"web"| after the dot.
-The other file names come from adding other things
-after the dot.  We must check that there is enough room in
-|web_file_name| and the other arrays for the argument.
-
-@<Make |web_file_name|...@>=
-{
-  if (s-*argv > max_file_name_length-5)
-    @<Complain about argument length@>;
-  if (dot_pos==NULL)
-    sprintf(web_file_name,"%s.w",*argv);
-  else {
-    strcpy(web_file_name,*argv);
-    *dot_pos=0; /* string now ends where the dot was */
-  }
-  sprintf(alt_web_file_name,"%s.web",*argv);
-  sprintf(tex_file_name,"%s.tex",name_pos); /* strip off directory name */
-  sprintf(idx_file_name,"%s.idx",name_pos);
-  sprintf(scn_file_name,"%s.scn",name_pos);
-  sprintf(C_file_name,"%s.c",name_pos);
-  found_web=1;
-}
-
-@ @<Make |change_file_name|...@>=
-{
-  if (strcmp(*argv,"-")==0) found_change=-1;
-  else {
-    if (s-*argv > max_file_name_length-4)
-      @<Complain about argument length@>;
-    if (dot_pos==NULL)
-      sprintf(change_file_name,"%s.ch",*argv);
-    else strcpy(change_file_name,*argv);
-    found_change=1;
-  }
-}
-
-@ @<Override...@>=
-{
-  if (s-*argv > max_file_name_length-5)
-    @<Complain about argument length@>;
-  if (dot_pos==NULL) {
-    sprintf(tex_file_name,"%s.tex",*argv);
-    sprintf(idx_file_name,"%s.idx",*argv);
-    sprintf(scn_file_name,"%s.scn",*argv);
-    sprintf(C_file_name,"%s.c",*argv);
-  } else {
-    strcpy(tex_file_name,*argv);
-    strcpy(C_file_name,*argv);
-    if (flags['x']) { /* indexes will be generated */
-      *dot_pos=0;
-      sprintf(idx_file_name,"%s.idx",*argv);
-      sprintf(scn_file_name,"%s.scn",*argv);
-    }
-  }
-  found_out=1;
-}
 @y
 @ 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}
@@ -204,41 +89,42 @@
 routine has been written to search for the last ``dot'', so the altered
 version will search for the last |"_"| (including directory separators),
 so we have what we want.
+ at z
 
-@<Pred...@>=
-void scan_args();
 
-@ @c
-void
-scan_args()
-{
+ at x
+  char *dot_pos; /* position of |'.'| in the argument */
+ at y
   char *dot_pos; /* position of |'_'| in the argument */
-  char *name_pos; /* file name beginning, sans directory */
-  register char *s; /* register for scanning strings */
-  boolean found_web=0,found_change=0,found_out=0;
-             /* have these names have been seen? */
-  boolean flag_change;
+ at z
 
-  while (--argc > 0) {
-    if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
-    else {
-      s=name_pos=*argv;@+dot_pos=NULL;
-      while (*s) {
+
+ at x
+  strcpy(change_file_name,"/dev/null");
+ at y
+  strcpy(change_file_name,"NUL");
+ at z
+
+
+ at x
+        if (*s=='.') dot_pos=s++;
+        else if (*s=='/') dot_pos=NULL,name_pos=++s;
+        else s++;
+ at y
         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|@>@;
-      else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
-        else @<Print usage error message and quit@>;
-    }
-  }
-  if (!found_web) @<Print usage error message and quit@>;
-  if (found_change<=0) strcpy(change_file_name,"NUL");
-}
+ at z
 
+
+ at x
+@ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
+otherwise we add |".w"|. If this file can't be opened, we prepare an
+|alt_web_file_name| by adding |"web"| after the dot.
+The other file names come from adding other things
+after the dot.  We must check that there is enough room in
+|web_file_name| and the other arrays for the argument.
+ at y
 @ We use all of |*argv| for the |web_file_name| if there is a |'_'| in it,
 otherwise we add |"_w"|. If this file can't be opened, we prepare an
 |alt_web_file_name| by adding |"web"| after the dot.
@@ -250,10 +136,31 @@
 QDOS/SMSQ file names contain almost a |"_"|, so this routine will not work,
 i.e. you'll {\em have} to add the |"_w"| always.  Nevertheless I adapted
 the routine as if it would work.
+ at z
 
+
+ at x
 @<Make |web_file_name|...@>=
 {
   if (s-*argv > max_file_name_length-5)
+    @<Complain about argument length@>@;
+  if (dot_pos==NULL)
+    sprintf(web_file_name,"%s.w",*argv);
+  else {
+    strcpy(web_file_name,*argv);
+    *dot_pos=0; /* string now ends where the dot was */
+  }
+  sprintf(alt_web_file_name,"%s.web",*argv);
+  sprintf(tex_file_name,"%s.tex",name_pos); /* strip off directory name */
+  sprintf(idx_file_name,"%s.idx",name_pos);
+  sprintf(scn_file_name,"%s.scn",name_pos);
+  sprintf(C_file_name,"%s.c",name_pos);
+  found_web=1;
+}
+ at y
+@<Make |web_file_name|...@>=
+{
+  if (s-*argv > max_file_name_length-5)
     @<Complain about argument length@>;
   if (dot_pos==NULL)
     sprintf(web_file_name,"%s_w",*argv);
@@ -268,12 +175,26 @@
   sprintf(C_file_name,"%s_c",name_pos);
   found_web=1;
 }
+ at z
 
+
+ at x
 @ @<Make |change_file_name|...@>=
 {
-  if (strcmp(*argv,"-")==0) found_change=-1;
-  else {
+  if (strcmp(*argv,"-")!=0) {
     if (s-*argv > max_file_name_length-4)
+      @<Complain about argument length@>@;
+    if (dot_pos==NULL)
+      sprintf(change_file_name,"%s.ch",*argv);
+    else strcpy(change_file_name,*argv);
+  }
+  found_change=1;
+}
+ at y
+@ @<Make |change_file_name|...@>=
+{
+  if (strcmp(*argv,"-")!=0) {
+    if (s-*argv > max_file_name_length-4)
       @<Complain about argument length@>;
     if (dot_pos==NULL)
       sprintf(change_file_name,"%s_ch",*argv);
@@ -281,10 +202,34 @@
     found_change=1;
   }
 }
+ at z
 
+
+ at x
 @ @<Override...@>=
 {
   if (s-*argv > max_file_name_length-5)
+    @<Complain about argument length@>@;
+  if (dot_pos==NULL) {
+    sprintf(tex_file_name,"%s.tex",*argv);
+    sprintf(idx_file_name,"%s.idx",*argv);
+    sprintf(scn_file_name,"%s.scn",*argv);
+    sprintf(C_file_name,"%s.c",*argv);
+  } else {
+    strcpy(tex_file_name,*argv);
+    strcpy(C_file_name,*argv);
+    if (make_xrefs) { /* indexes will be generated */
+      *dot_pos=0;
+      sprintf(idx_file_name,"%s.idx",*argv);
+      sprintf(scn_file_name,"%s.scn",*argv);
+    }
+  }
+  found_out=1;
+}
+ at y
+@ @<Override...@>=
+{
+  if (s-*argv > max_file_name_length-5)
     @<Complain about argument length@>;
   if (dot_pos==NULL) {
     sprintf(tex_file_name,"%s_tex",*argv);
@@ -294,7 +239,7 @@
   } else {
     strcpy(tex_file_name,*argv);
     strcpy(C_file_name,*argv);
-    if (flags['x']) { /* indexes will be generated */
+    if (make_xrefs) { /* indexes will be generated */
       *dot_pos=0;
       sprintf(idx_file_name,"%s_idx",*argv);
       sprintf(scn_file_name,"%s_scn",*argv);

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -13,19 +13,26 @@
 (only the two changes by BL are necessary for initial bootstrapping
  via hand-editing of common.c)
 
- at x section 5 (01-FEB-1992 ST)
-#include <ctype.h>
+ at x section 3 (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| */
+#include <stdint.h> /* definition of |@!uint8_t| and |@!uint16_t| */
+#include <stdlib.h> /* definition of |@!getenv| and |@!exit| */
+#include <stdio.h> /* definition of |@!printf| and friends */
+#include <string.h> /* definition of |@!strlen|, |@!strcmp| and so on */
 @y
-#include ctype /* VMS searches Textlibraries faster */
+#include ctype /* definition of |@!isalpha|, |@!isdigit| and so on */
+               /* VMS searches text libraries faster */
+#include stdbool /* definition of |@!bool|, |@!true| and |@!false| */
+#include stddef /* definition of |@!ptrdiff_t| */
+#include stdint /* definition of |@!uint8_t| and |@!uint16_t| */
+#include stdlib /* definition of |@!getenv| and |@!exit| */
+#include stdio /* definition of |@!printf| and friends */
+#include string /* definition of |@!strlen|, |@!strcmp| and so on */
 @z
 
- at x section 8  (01-FEB-1992 ST)
-#include <stdio.h>
- at y
-#include stdio /* VMS searches Textlibraries faster */
- at z
-
- at x section 61 (01-FEB-1992 ST)
+ at 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.
 @y
@@ -37,7 +44,7 @@
 print |"%SYSTEM-F-ABORT, abort"|, if |history > harmless_message|.
 @z
 
- at x section 61 (1987 BL) (01-FEB-1992 ST) (11-JAN-1993 DEK)
+ at x section 68 (1987 BL) (01-FEB-1992 ST) (11-JAN-1993 DEK)
   if (history > harmless_message) return(1);
   else return(0);
 @y
@@ -52,7 +59,7 @@
   else exit(SS$_NORMAL);
 @z
 
- at x section 69 (01-FEB-1992 ST)
+ at x section 75 (01-FEB-1992 ST)
 An omitted change file argument means that |"/dev/null"| should be used,
 when no changes are desired.
 @y
@@ -60,14 +67,14 @@
 null device |"NL:"| should be used, when no changes are desired.
 @z
 
- at x section 70 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
+ at x section 76 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
+  strcpy(change_file_name,"/dev/null");
 @y
-  if (found_change<=) strcpy(change_file_name,"NL:");
+  strcpy(change_file_name,"NL:");
 	/* {\tt NL:} is the VAX/VMS notation for {\tt /dev/null} */
 @z
 
- at x section 82 (01-FEB-1992 ST)
+ at x section 85 (01-FEB-1992 ST)
 @** Index.
 @y
 @* VAX/VMS specific code.

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,31 +1,32 @@
- at q Changes for CWEB in TeX Live from numerous contributors. @>
- at q This file is in the Public Domain. @>
+ at q Changes for CWEB in TeX Live from numerous contributors.              @>
+ at q This file is in the Public Domain.                                    @>
 
- at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
- at q were merged with the set of change files of the CWEBbin project; @>
- at q see https://github.com/ascherer/cwebbin for the original parts. @>
+ at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber   @>
+ at q were merged with the set of change files of the CWEBbin project;      @>
+ at q see https://github.com/ascherer/cwebbin for the original parts.       @>
 
- at q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
- at q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
- at q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
- at q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
- at q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
- at q with the 'tie' processor and is used as a monolithic changefile for @>
- at q {common,ctangle,cweave}.w in TeX Live. @>
+ at q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch    @>
+ at q has been created from the elaborate set of change files               @>
+ at q {comm,ctang,cweav,cwebman}-patch.ch,                                  @>
+ at q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch,     @>
+ at q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and        @>
+ at q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+ at q and is used as a monolithic changefile for {common,ctangle,cweave}.w  @>
+ at q and cwebman.tex in TeX Live.                                          @>
 
- at q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+ at q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{Common code for CTANGLE and CWEAVE (Version 3.64)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.0)}
 @y
 \def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}} \ifacro\sanitizecommand\Kpathsea{KPATHSEA}\fi
-\def\title{Common code for CTANGLE and CWEAVE (\TeX~Live)}
+\def\title{Common code for CTANGLE and CWEAVE (4.0 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
 @y
-  \centerline{(Version 3.64 [\TeX~Live])}
+  \centerline{(Version 4.0 [\TeX~Live])}
 @z
 
 @x
@@ -37,19 +38,10 @@
 @x
 }
 @y
-}}
-\datecontentspage
+}}\datecontentspage
 @z
 
 @x
- at s not_eq normal @q unreserve a C++ keyword @>
- at y
- at s boolean int
- at s uint8_t int
- at s uint16_t int
- at z
-
- at x
 to both \.{CTANGLE} and \.{CWEAVE}, which roughly concerns the following
 @y
 to \.{CTANGLE}, \.{CWEAVE}, and \.{CTWILL},
@@ -63,107 +55,38 @@
 @z
 
 @x
-|program|.
-
- at d ctangle 0
- at d cweave 1
+ at i common.h
 @y
-|program|. And \.{CTWILL} adds some extra twists.
+ at i comm-w2c.h
 @z
 
 @x
-typedef short boolean;
+|program|.
 @y
-typedef uint8_t eight_bits;
-typedef uint16_t sixteen_bits;
+|program|. And \.{CTWILL} adds some extra twists.
 @z
 
 @x
 boolean program; /* \.{CWEAVE} or \.{CTANGLE}? */
 @y
-typedef enum {
-  @!ctangle, @!cweave, @!ctwill
-} cweb;
 cweb program; /* \.{CTANGLE} or \.{CWEAVE} or \.{CTWILL}? */
 @z
 
 @x
-void
-common_init()
+  @<Initialize pointers@>@;
 @y
-void
-common_init(void)
+  @<Initialize pointers@>@;
+  @<Set up |PROGNAME| feature and initialize the search path mechanism@>@;
 @z
 
 @x
-  @<Initialize pointers@>;
-  @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>;
-  @<Scan arguments and open output files@>;
+  @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>@;
 @y
-  @<Initialize pointers@>@;
-  @<Set up |PROGNAME| feature and initialize the search path mechanism@>@;
   @<Set locale and bind language catalogs@>@;
   @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>@;
-  @<Scan arguments and open output files@>@;
 @z
 
 @x
-\.{ctype.h} header file.
-
-@<Include files@>=
-#include <ctype.h>
- at y
-\.{ctype.h} header file, included through the \Kpathsea/ interface.
- at z
-
- at x
- at d not_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
- at y
- at d non_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
- at z
-
- at x
- at d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
- at y
- at d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
-
-@<Definitions...@>=
-char section_text[longest_name+1]; /* name being sought for */
-char *section_text_end = section_text+longest_name; /* end of |section_text| */
-char *id_first; /* where the current identifier begins in the buffer */
-char *id_loc; /* just after the current identifier in the buffer */
- at z
-
- at x
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
- at y
- at d buf_size 1000 /* for \.{CWEAVE} and \.{CTANGLE} */
- at z
-
- at x
- at d xisspace(c) (isspace(c)&&((unsigned char)c<0200))
- at d xisupper(c) (isupper(c)&&((unsigned char)c<0200))
- at y
- at d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
- at z
-
- at x
-@ @<Include files@>=
-#include <stdio.h>
- at y
-@ Most of the standard \CEE/ interface comes from \Kpathsea/.
- at z
-
- at x
-int input_ln(fp) /* copies a line into |buffer| or returns 0 */
-FILE *fp; /* what file to read from */
- at y
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns 0 */
-FILE *fp at t\2\2@>) /* what file to read from */
- at z
-
- at x
     if ((*(k++) = c) != ' ') limit = k;
 @y
     if ((*(k++) = c) != ' ' && c != '\r') limit = k;
@@ -176,39 +99,11 @@
 @z
 
 @x
- at d max_file_name_length 60
- at y
- at d max_file_name_length 1024
- at z
-
- at x
 char alt_web_file_name[max_file_name_length]; /* alternate name to try */
 @y
 @z
 
 @x
- at d lines_dont_match (change_limit-change_buffer != limit-buffer ||
-  strncmp(buffer, change_buffer, limit-buffer))
- at y
- at d lines_dont_match (change_limit-change_buffer != limit-buffer || @|
-  strncmp(buffer, change_buffer, (size_t)(limit-buffer)))
- at z
-
- at x
-void
-prime_the_change_buffer()
- at y
-static void
-prime_the_change_buffer(void)
- at z
-
- at x
-  if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
- at y
-  if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
- at z
-
- at x
     err_print("! Missing @@x in change file");
 @y
     err_print(_("! Missing @@x in change file"));
@@ -221,22 +116,6 @@
 @z
 
 @x
-  change_limit=change_buffer+(limit-buffer);
-  strncpy(change_buffer,buffer,limit-buffer+1);
- at y
-  change_limit=change_buffer+(ptrdiff_t)(limit-buffer);
-  strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
- at z
-
- at x
-void
-check_change() /* switches to |change_file| if the buffers match */
- at y
-static void
-check_change(void) /* switches to |change_file| if the buffers match */
- at z
-
- at x
       err_print("! Change file ended before @@y");
 @y
       err_print(_("! Change file ended before @@y"));
@@ -243,12 +122,6 @@
 @z
 
 @x
-      char xyz_code=xisupper(buffer[1])? tolower(buffer[1]): buffer[1];
- at y
-      char xyz_code=xisupper(buffer[1])? tolower((eight_bits)buffer[1]): buffer[1];
- at z
-
- at x
         err_print("! CWEB file ended during a change");
 @y
         err_print(_("! CWEB file ended during a change"));
@@ -267,14 +140,6 @@
 @z
 
 @x
-void
-reset_input()
- at y
-void
-reset_input(void)
- at z
-
- at x
 if ((web_file=fopen(web_file_name,"r"))==NULL) {
   strcpy(web_file_name,alt_web_file_name);
   if ((web_file=fopen(web_file_name,"r"))==NULL)
@@ -310,25 +175,6 @@
 @z
 
 @x
- at d max_sections 2000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
- at y
- at d max_sections 10239 /* number of identifiers, strings, section names;
-  must be less than 10240 */
- at z
-
- at x
-typedef unsigned short sixteen_bits;
- at y
- at z
-
- at x
-int get_line() /* inputs the next line */
- at y
-boolean get_line(void) /* inputs the next line */
- at z
-
- at x
       err_print("! Include file name not given");
 @y
       err_print(_("! Include file name not given"));
@@ -357,7 +203,7 @@
 \.{@@i} line should give a complete file name with or without
 double quotes.
 The actual file lookup is done with the help of the \Kpathsea/ library;
-see section~\X90:File lookup with \Kpathsea/\X~for details. % FIXME
+see section~\X91:File lookup with \Kpathsea/\X~for details. % FIXME
 The remainder of the \.{@@i} line after the file name is ignored.
 @^system dependencies@> @.CWEBINPUTS@>
 @z
@@ -369,18 +215,6 @@
 @z
 
 @x
-@<Include...@>=
-#include <stdlib.h> /* declaration of |getenv| and |exit| */
- at y
- at z
-
- at x
-@ @<Try to open...@>= {
- at y
-@ @.CWEBINPUTS@>@<Try to open...@>= {
- at z
-
- at 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;
@@ -441,12 +275,6 @@
 @z
 
 @x
-      if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
- at y
-      if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
- at z
-
- at x
         err_print("! Where is the matching @@z?");
 @y
         err_print(_("! Where is the matching @@z?"));
@@ -453,20 +281,6 @@
 @z
 
 @x
-void
-check_complete(){
-  if (change_limit!=change_buffer) { /* |changing| is 0 */
-    strncpy(buffer,change_buffer,change_limit-change_buffer+1);
-    limit=buffer+(int)(change_limit-change_buffer);
- at y
-void
-check_complete(void) {
-  if (change_limit!=change_buffer) { /* |changing| is 0 */
-    strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
-    limit=buffer+(ptrdiff_t)(change_limit-change_buffer);
- at z
-
- at x
     err_print("! Change file entry did not match");
 @y
     err_print(_("! Change file entry did not match"));
@@ -473,66 +287,6 @@
 @z
 
 @x
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; must be less than $2^{24}$ */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
- at y
- at d max_bytes 1000000 /* the number of bytes in identifiers,
-  index entries, and section names; must be less than $2^{24}$ */
- at d max_names 10239 /* number of identifiers, strings, section names;
-  must be less than 10240 */
- at z
-
- at x
- at d length(c) (c+1)->byte_start-(c)->byte_start /* the length of a name */
- at y
- at d length(c) (size_t)((c+1)->byte_start-(c)->byte_start) /* the length of a name */
- at z
-
- at x
- at d hash_size 353 /* should be prime */
- at y
- at d hash_size 8501 /* should be prime */
- at z
-
- at x
-extern int names_match();
- at y
-extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
- at z
-
- at x
-name_pointer
-id_lookup(first,last,t) /* looks up a string in the identifier table */
-char *first; /* first character of string */
-char *last; /* last character of string plus one */
-char t; /* the |ilk|; used by \.{CWEAVE} only */
-{
-  char *i=first; /* position in |buffer| */
- at y
-name_pointer
-id_lookup(@t\1\1@> /* 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 */
-{
-  const char *i=first; /* position in |buffer| */
- at z
-
- at x
-  l=last-first; /* compute the length */
- at y
-  l=(int)(last-first); /* compute the length */
- at z
-
- at x
-void init_p();
- at y
-extern void init_p(name_pointer,eight_bits);@/
- at z
-
- at x
   if (byte_ptr+l>byte_mem_end) overflow("byte memory");
   if (name_ptr>=name_dir_end) overflow("name");
 @y
@@ -541,102 +295,6 @@
 @z
 
 @x
-  if (program==cweave) init_p(p,t);
- at y
-  init_p(p,t);
- at z
-
- at x
-void
-print_section_name(p)
-name_pointer p;
- at y
-void
-print_section_name(
-name_pointer p)
- at z
-
- at x
-      term_write(s,ss-s); p=q->link; q=p;
-    } else {
-      term_write(s,ss+1-s); p=name_dir; q=NULL;
- at y
-      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;
- at z
-
- at x
-void
-sprint_section_name(dest,p)
-  char*dest;
-  name_pointer p;
- at y
-void
-sprint_section_name(
-  char *dest,
-  name_pointer p)
- at z
-
- at x
-    strncpy(dest,s,ss-s), dest+=ss-s;
- at y
-    strncpy(dest,s,(size_t)(ss-s)), dest+=ss-s;
- at z
-
- at x
-void
-print_prefix_name(p)
-name_pointer p;
- at y
-void
-print_prefix_name(
-name_pointer p)
- at z
-
- at x
-int web_strcmp(j,j_len,k,k_len) /* fuller comparison than |strcmp| */
-  char *j, *k; /* beginning of first and second strings */
-  int j_len, k_len; /* length of strings */
- at y
-static int web_strcmp(@t\1\1@> /* 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 */
- at z
-
- at x
-extern void init_node();
- at y
-extern void init_node(name_pointer);@/
- at z
-
- at x
-name_pointer
-add_section_name(par,c,first,last,ispref) /* 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; /* are we adding a prefix or a full name? */
- at y
-static name_pointer
-add_section_name(@t\1\1@> /* 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? */
- at z
-
- at x
-  int name_len=last-first+ispref; /* length of section name */
- at y
-  int name_len=(int)(last-first)+ispref; /* length of section name */
- at z
-
- at x
   if (s+name_len>byte_mem_end) overflow("byte memory");
   if (name_ptr+1>=name_dir_end) overflow("name");
 @y
@@ -645,28 +303,6 @@
 @z
 
 @x
-void
-extend_section_name(p,first,last,ispref)
-name_pointer p; /* name to be extended */
-char *first; /* beginning of extension text */
-char *last; /* one beyond end of extension text */
-int ispref; /* are we adding a prefix or a full name? */
- at y
-static void
-extend_section_name(@t\1\1@>
-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? */
- at z
-
- at x
-  int name_len=last-first+ispref;
- at y
-  int name_len=(int)(last-first)+ispref;
- at z
-
- at x
   if (name_ptr>=name_dir_end) overflow("name");
 @y
   if (name_ptr>=name_dir_end) overflow(_("name"));
@@ -679,118 +315,42 @@
 @z
 
 @x
-name_pointer
-section_lookup(first,last,ispref) /* find or install section name in tree */
-char *first, *last; /* first and last characters of new name */
-int ispref; /* is the new name a prefix or a full name? */
+      fputs("\n! Ambiguous prefix: matches <",stdout);
 @y
-name_pointer
-section_lookup(@t\1\1@> /* 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? */
- at z
-
- at x
-  int name_len=last-first+1;
- at y
-  int name_len=(int)(last-first)+1;
- at z
-
- at x
-      printf("\n! Ambiguous prefix: matches <");
- at y
       fputs(_("\n! Ambiguous prefix: matches <"),stdout);
 @z
 
 @x
-      printf(">\n and <");
+      fputs(">\n and <",stdout);
 @y
       fputs(_(">\n and <"),stdout);
 @z
 
 @x
-      printf("\n! New name is a prefix of <");
+      fputs("\n! New name is a prefix of <",stdout);
 @y
       fputs(_("\n! New name is a prefix of <"),stdout);
 @z
 
 @x
-      printf("\n! New name extends <");
+      fputs("\n! New name extends <",stdout);
 @y
       fputs(_("\n! New name extends <"),stdout);
 @z
 
 @x
-    printf("\n! Section name incompatible with <");
+    fputs("\n! Section name incompatible with <",stdout);
 @y
     fputs(_("\n! Section name incompatible with <"),stdout);
 @z
 
 @x
-    printf(">,\n which abbreviates <");
+    fputs(">,\n which abbreviates <",stdout);
 @y
     fputs(_(">,\n which abbreviates <"),stdout);
 @z
 
 @x
-int section_name_cmp();
- at y
-static int section_name_cmp(char **,int,name_pointer);@/
- at z
-
- at x
-int section_name_cmp(pfirst,len,r)
-char **pfirst; /* pointer to beginning of comparison string */
-int len; /* length of string */
-name_pointer r; /* section name being compared */
- at y
-static int section_name_cmp(@t\1\1@>
-char **pfirst, /* pointer to beginning of comparison string */
-int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
- at z
-
- at x
-          *pfirst=first+(ss-s);
- at y
-          *pfirst=first+(ptrdiff_t)(ss-s);
- at z
-
- at x
-      if (q!=name_dir) {len -= ss-s; s=q->byte_start; r=q; continue;}
- at y
-      if (q!=name_dir) {len -= (int)(ss-s); s=q->byte_start; r=q; continue;}
- at z
-
- at x
-|equiv_or_xref| as a pointer to a |char|.
-
-@<More elements of |name...@>=
-char *equiv_or_xref; /* info corresponding to names */
- at y
-|equiv_or_xref| as a pointer to |void|.
-
-@<More elements of |name...@>=
-void *equiv_or_xref; /* info corresponding to names */
- at z
-
- at x
-void  err_print();
- at y
-extern void err_print(const char *);@/
- at z
-
- at x
-void
-err_print(s) /* prints `\..' and location of error message */
-char *s;
- at y
-void
-err_print(@t\1\1@> /* prints `\..' and location of error message */
-const char *s at t\2\2@>)
- at z
-
- at x
   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);
@@ -801,21 +361,13 @@
 @z
 
 @x
-int wrap_up();
-extern void print_stats();
- at y
-extern int wrap_up(void);@/
-extern void print_stats(void);@/
- at z
-
- at x
-@ Some implementations may wish to pass the |history| value to the
+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.
 @^system dependencies@>
 @y
-@ On multi-tasking systems like the {\mc AMIGA} it is very convenient to
+On multi-tasking systems like the {\mc AMIGA} it is very convenient to
 know a little bit more about the reasons why a program failed.  The four
 levels of return indicated by the |history| value are very suitable for
 this purpose.  Here, for instance, we pass the operating system a status
@@ -831,16 +383,8 @@
 @z
 
 @x
-int wrap_up() {
-  putchar('\n');
+  @<Print the job |history|@>@;
 @y
-int wrap_up(void) {
-  if (show_progress || show_happiness || (history > spotless)) new_line;
- at z
-
- at x
-  @<Print the job |history|@>;
- at y
   @<Print the job |history|@>@;
   @<Remove the temporary file if not already done@>@;
 @z
@@ -858,12 +402,12 @@
 @z
 
 @x
-case spotless: if (show_happiness) printf("(No errors were found.)\n"); break;
+case spotless: if (show_happiness) puts("(No errors were found.)"); break;
 case harmless_message:
-  printf("(Did you see the warning message above?)\n"); break;
+  puts("(Did you see the warning message above?)"); break;
 case error_message:
-  printf("(Pardon me, but I think I spotted something wrong.)\n"); break;
-case fatal_message: printf("(That was a fatal error, my friend.)\n");
+  puts("(Pardon me, but I think I spotted something wrong.)"); break;
+case fatal_message: puts("(That was a fatal error, my friend.)");
 @y
 case spotless:
   if (show_happiness) puts(_("(No errors were found.)")); break;
@@ -876,39 +420,6 @@
 @z
 
 @x
-void fatal(), overflow();
- at y
-extern void fatal(const char *,const char *);@/
-extern void overflow(const char *);@/
- at z
-
- at x
- at c void
-fatal(s,t)
-  char *s,*t;
- at y
- at c void
-fatal(
-  const char *s,const char *t)
- at z
-
- at x
-  if (*s) printf(s);
- at y
-  if (*s) err_print(s);
- at z
-
- at x
- at c void
-overflow(t)
-  char *t;
- at y
- at c void
-overflow(
-  const char *t)
- at z
-
- at x
   printf("\n! Sorry, %s capacity exceeded",t); fatal("","");
 @y
   printf(_("\n! Sorry, %s capacity exceeded"),t); fatal("","");
@@ -915,20 +426,6 @@
 @z
 
 @x
- at d confusion(s) fatal("! This can't happen: ",s)
- at y
- at d confusion(s) fatal(_("! This can't happen: "),s)
- at z
-
- at x
- at d show_happiness flags['h'] /* should lack of errors be announced? */
- at y
- at d show_happiness flags['h'] /* should lack of errors be announced? */
- at d temporary_output flags['t'] /* should temporary output take precedence? */
- at d make_xrefs flags['x'] /* should cross references be output? */
- 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| */
@@ -936,19 +433,13 @@
 @z
 
 @x
-boolean flags[128]; /* an option for each 7-bit code */
+show_banner=show_happiness=show_progress=make_xrefs=true;@/
 @y
-boolean flags[128]; /* an option for each 7-bit code */
-const char *use_language=""; /* prefix of \.{cwebmac.tex} in \TEX/ output */
+make_xrefs=true;@/
+temporary_output=true; /* Check temporary output for changes */
 @z
 
 @x
-show_banner=show_happiness=show_progress=1;
- at y
-temporary_output=1; /* Check temporary output for changes */
- at z
-
- at x
 file.  It may have an extension, or it may omit the extension to get |".w"| or
 |".web"| added.  The \TEX/ output file name is formed by replacing the \.{CWEB}
 @y
@@ -966,27 +457,8 @@
 @z
 
 @x
-void scan_args();
+  strcpy(change_file_name,"/dev/null");
 @y
-static void scan_args(void);@/
- at z
-
- at x
-void
-scan_args()
- at y
-static void
-scan_args(void)
- at z
-
- at x
-  boolean flag_change;
- at y
- at z
-
- at x
-  while (--argc > 0) {
- at y
 @#
 #if defined DEV_NULL
   strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
@@ -998,7 +470,6 @@
   strcpy(change_file_name,"/dev/null");
 #endif
 @^system dependencies@>
-  while (--argc > 0) {
 @z
 
 @x
@@ -1018,11 +489,6 @@
 @z
 
 @x
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
- at z
-
- at x
 @ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
 otherwise we add |".w"|. If this file can't be opened, we prepare an
 |alt_web_file_name| by adding |"web"| after the dot.
@@ -1037,34 +503,10 @@
 @z
 
 @x
-  if (strcmp(*argv,"-")==0) found_change=-1;
-  else {
- at y
-  if (strcmp(*argv,"-")!=0) {
- at z
-
- at x
-    found_change=1;
-  }
- at y
-  }
-  found_change=1;
- at z
-
- at x
-    if (flags['x']) { /* indexes will be generated */
- at y
-    if (make_xrefs) { /* indexes will be generated */
- at z
-
- at x
-@ @<Handle flag...@>=
+@<Handle flag...@>=
 {
-  if (**argv=='-') flag_change=0;
-  else flag_change=1;
   for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
 @y
-@ @d flag_change (**argv!='-')
 @<Handle flag...@>=
 {
   if (strcmp("-help",*argv)==0 || strcmp("--help",*argv)==0)
@@ -1098,12 +540,7 @@
 @z
 
 @x
-    flags[*dot_pos]=flag_change;
- at y
-    flags[(eight_bits)*dot_pos]=flag_change;
- at z
-
- at x
+@ @<Print usage error message and quit@>=
 {
 if (program==ctangle)
   fatal(
@@ -1115,6 +552,7 @@
    ,"");
 }
 @y
+@ @<Print usage error message and quit@>=
 cb_usage(program==ctangle ? "ctangle" : program==cweave ? "cweave" : "ctwill");
 @.Usage:@>
 @z
@@ -1143,12 +581,12 @@
 @ @<Scan arguments and open output files@>=
 scan_args();
 if (program==ctangle) {
-  if ((C_file=fopen(C_file_name,"w"))==NULL)
+  if ((C_file=fopen(C_file_name,"wb"))==NULL)
     fatal("! Cannot open output file ", C_file_name);
 @.Cannot open output file@>
 }
 else {
-  if ((tex_file=fopen(tex_file_name,"w"))==NULL)
+  if ((tex_file=fopen(tex_file_name,"wb"))==NULL)
     fatal("! Cannot open output file ", tex_file_name);
 }
 @y
@@ -1185,72 +623,25 @@
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
- at y
-@ For string handling we include the {\mc ANSI C} system header file---through
-the \Kpathsea/ interface---instead of predeclaring the standard system
-functions |strlen|, |strcmp|, |strcpy|, |strncmp|, and |strncpy|.
-@^system dependencies@>
- at z
-
- at x
 @** Index.
 @y
-@** Extensions for modern \.{CWEB}.  The following sections introduce changes
-and extensions to the code that have been created by numerous contributors over
-the course of a quarter century. They make \.{CWEB} adhere to modern coding
-standards and introduce new or improved features.
+@** Extensions to \.{CWEB}.  The following sections introduce new or improved
+features that have been created by numerous contributors over the course of a
+quarter century.
 
 Care has been taken to keep the original section numbering intact, so this new
-section should have the same number as the original ``\&{82.~Index},'' and
-additional material follows below.
+material should nicely integrate with the original ``\&{85.~Index}.''
 
-@* Function declarations. Here are declarations---conforming to
-{\mc ANSI~C}---of all functions in this code that appear in \.{common.h}
-and thus should agree with \.{CTANGLE} and \.{CWEAVE}.
+@* Language setting.  This global variable is set by the argument of the
+`\.{+l}' (or `\.{-l}') command-line option.
 
-@<Predecl...@>=
-boolean get_line(void);@/
-name_pointer id_lookup(const char *,const char *,char);@/
-name_pointer section_lookup(char *,char *,int);@/
-void check_complete(void);@/
-void common_init(void);@/
-void print_prefix_name(name_pointer);@/
-void print_section_name(name_pointer);@/
-void reset_input(void);@/
-void sprint_section_name(char *,name_pointer);@/
+@<Global var...@>=
+const char *use_language=""; /* prefix of \.{cwebmac.tex} in \TEX/ output */
 
-@ The following functions are private to \.{common.w}.
 
-@<Predecl...@>=
-static boolean input_ln(FILE *);@/
-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 void check_change(void);@/
-static void prime_the_change_buffer(void);@/
+@* User communation.  The |scan_args| and |cb_show_banner| routines and the
+|bindtextdomain| argument string need a few extra variables.
 
-@* Standard C library interfaces.  This updated version of \.{CWEB} uses
-standard C types for boolean values, pointers, and objects with fixed sizes
-(|@!uint8_t|, |@!uint16_t|; already in \Kpathsea/).
-
-@<Include files@>=
-#include <stdbool.h> /* type definition of |bool| */
-#include <stddef.h> /* type definition of |ptrdiff_t| */
-
-@ The |scan_args| and |cb_show_banner| routines and the |bindtextdomain|
-argument string need a few extra variables.
-
 @d max_banner 50
 
 @d PATH_SEPARATOR   separators[0]
@@ -1257,7 +648,7 @@
 @d DIR_SEPARATOR    separators[1]
 @d DEVICE_SEPARATOR separators[2]
 
-@<Other...@>=
+@<Global var...@>=
 char cb_banner[max_banner];@/
 string texmf_locale;@/
 #ifndef SEPARATORS
@@ -1275,35 +666,12 @@
 if(strlen(check_file_name)) /* Delete the temporary file in case of a break */
    remove(check_file_name);
 
-@* Internationalization.  You may have noticed that almost all \.{"strings"}
-in the \.{CWEB} sources are placed in the context of the `|_|'~macro.
-This is just a shortcut for the `|@!gettext|' function from the ``GNU~gettext
-utilities.'' For systems that do not have this library installed, we wrap
-things for neutral behavior without internationalization.
-
- at d _(S) gettext(S)
-
-@<Include files@>=
-#ifndef HAVE_GETTEXT
-#define HAVE_GETTEXT 0
-#endif
-@#
-#if HAVE_GETTEXT
-#include <locale.h> /* |@!LC_MESSAGES|, |@!LC_CTYPE| */
-#include <libintl.h>
-#else
-#define setlocale(A,B) ""
-#define bindtextdomain(A,B) ""
-#define textdomain(A) ""
-#define gettext(A) A
-#endif
-
-@ If translation catalogs for your personal \.{LANGUAGE} are installed at the
-appropriate place, \.{CTANGLE} and \.{CWEAVE} will talk to you in your favorite
-language.  Catalog \.{cweb} contains all strings from ``plain \.{CWEB},''
-catalog \.{cweb-tl} contains a few extra strings specific to the \TeX~Live
-interface, and catalog \.{web2c-help} contains the ``\.{--help}'' texts for
-\.{CTANGLE} and \.{CWEAVE}.
+@* Internationalization.  If translation catalogs for your personal
+\.{LANGUAGE} are installed at the appropriate place, \.{CTANGLE} and \.{CWEAVE}
+will talk to you in your favorite language.  Catalog \.{cweb} contains all
+strings from ``plain \.{CWEB},'' catalog \.{cweb-tl} contains a few extra
+strings specific to the \TeX~Live interface, and catalog \.{web2c-help}
+contains the ``\.{--help}'' texts for \.{CTANGLE} and \.{CWEAVE}.
 @.cweb.mo@>
 @.cweb-tl.mo@>
 @.web2c-help.mo@>
@@ -1339,7 +707,16 @@
     e.g., \.{TEXMFLOCALEDIR=\$TEXMFMAIN/locale}\hfil\break
     or \.{TEXMFLOCALEDIR.cweb=\$TEXMFMAIN/locale}.\par}
 
-@<Set locale...@>=
+@<Include files@>=
+#if HAVE_GETTEXT
+#include <locale.h> /* |@!LC_MESSAGES|, |@!LC_CTYPE| */
+#else
+#define setlocale(A,B) ""
+#define bindtextdomain(A,B) ""
+#define textdomain(A) ""
+#endif
+
+@ @<Set locale...@>=
 setlocale(LC_MESSAGES, setlocale(LC_CTYPE, ""));
 texmf_locale = kpse_var_expand ("${TEXMFLOCALEDIR}");
 
@@ -1429,7 +806,11 @@
 \.{i18n}/\.{t10n}.  We simply filter the strings through the catalogs
 (if available).
 
- at c
+@<Predecl...@>=
+static void cb_usage (const_string str);@/
+static void cb_usagehelp (const_string *message, const_string bug_email);@/
+
+@ @c
 static void cb_usage (const_string str)
 {
   textdomain("cweb-tl");
@@ -1482,10 +863,5 @@
 @.cweb.mo@>
 }
 
-@ @<Predecl...@>=
-static void cb_usage (const_string str);@/
-static void cb_usagehelp (const_string *message, const_string bug_email);@/
-void cb_show_banner (void); /* |extern| for option \.{+b} */
-
 @** Index.
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h	2021-02-07 11:02:17 UTC (rev 57658)
@@ -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 3.64 --- February 2017 (works also with later versions)
+% Version 4.0 --- February 2021 (works also with later versions)
 
 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
 
@@ -15,23 +15,24 @@
 % entire resulting derived work is distributed under the terms of a
 % permission notice identical to this one.
 
-% Amendments to 'common.h' resulting in this extended 'comm-w2c.h' were
-% created by numerous collaborators over the course of many years.
+% Amendments to 'common.h' resulting in this updated version were created
+% by numerous collaborators over the course of many years.
 
 % Please send comments, suggestions, etc. to tex-k@@tug.org.
 
 % The next few sections contain stuff from the file |"common.w"| that has
 % to be included in both |"ctangle.w"| and |"cweave.w"|. It appears in this
-% file |"common.h"|, which needs to be updated when |"common.w"| changes.
+% file |"common.h"|, which is also included in |"common.w"| to propagate
+% possible changes from this single source consistently.
 
-First comes general stuff:
+% First comes general stuff:
 
-
 @s boolean int
 @s uint8_t int
 @s uint16_t int
 
-@<Common code for \.{CWEAVE} and \.{CTANGLE}@>=
+
+@<Common code...@>=
 typedef bool boolean;
 typedef uint8_t eight_bits;
 typedef uint16_t sixteen_bits;
@@ -60,9 +61,13 @@
 #define gettext(A) A
 #endif
 @#
-#include <stdbool.h> /* |@!bool|, |@!true|, |@!false| */
-#include <stdint.h> /* |@!uint8_t|, |@!uint16_t| */
-#include <stdio.h>
+#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| */
+#include <stdint.h> /* definition of |@!uint8_t| and |@!uint16_t| */
+#include <stdlib.h> /* definition of |@!getenv| and |@!exit| */
+#include <stdio.h> /* definition of |@!printf| and friends */
+#include <string.h> /* definition of |@!strlen|, |@!strcmp| and so on */
 
 @ Code related to the character set:
 @^ASCII code dependencies@>
@@ -84,13 +89,12 @@
 @d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
 
 @<Common code...@>=
-extern char section_text[]; /* name being sought for */
+extern char section_text[]; /* text being sought for */
 extern char *section_text_end; /* end of |section_text| */
 extern char *id_first; /* where the current identifier begins in the buffer */
 extern char *id_loc; /* just after the current identifier in the buffer */
 
 @ Code related to input routines:
-
 @d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
 @d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
 @d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
@@ -101,7 +105,7 @@
 @<Common code...@>=
 extern char buffer[]; /* where each line of input goes */
 extern char *buffer_end; /* end of |buffer| */
-extern char *loc; /* points to the next character to be read from the buffer*/
+extern char *loc; /* points to the next character to be read from the buffer */
 extern char *limit; /* points to the last character in the buffer */
 
 @ Code related to identifier and section name storage:
@@ -135,6 +139,8 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
+
+@ @<Predecl...@>=
 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 */
@@ -153,9 +159,12 @@
 @d mark_harmless {if (history==spotless) history=harmless_message;}
 @d mark_error history=error_message
 @d confusion(s) fatal(_("! This can't happen: "),s)
+ at .This can't happen@>
 
-@<Common...@>=
+@<Common code...@>=
 extern int history; /* indicates how bad this run was */
+
+@ @<Predecl...@>=
 extern int wrap_up(void); /* indicate |history| and exit */
 extern void err_print(const char *); /* print error message and context */
 extern void fatal(const char *,const char *); /* issue error message and die */
@@ -163,11 +172,14 @@
 
 @ Code related to file handling:
 @f line x /* make |line| an unreserved word */
+ at d max_include_depth 10 /* maximum number of source files open
+  simultaneously, not counting the change file */
 @d max_file_name_length 1024
 @d cur_file file[include_depth] /* current file */
 @d cur_file_name file_name[include_depth] /* current file name */
+ at d cur_line line[include_depth] /* number of current line in current file */
+ at d web_file file[0] /* main source file */
 @d web_file_name file_name[0] /* main source file name */
- at d cur_line line[include_depth] /* number of current line in current file */
 
 @<Common code...@>=
 extern int include_depth; /* current level of nesting */
@@ -177,10 +189,10 @@
 extern char tex_file_name[]; /* name of |tex_file| */
 extern char idx_file_name[]; /* name of |idx_file| */
 extern char scn_file_name[]; /* name of |scn_file| */
-extern char check_file_name[]; /* name of |check_file| */
 extern char file_name[][max_file_name_length];
   /* stack of non-change file names */
 extern char change_file_name[]; /* name of change file */
+extern char check_file_name[]; /* name of |check_file| */
 extern int line[]; /* number of current line in the stacked files */
 extern int change_line; /* number of current line in change file */
 extern int change_depth; /* where \.{@@y} originated during a change */
@@ -187,6 +199,8 @@
 extern boolean input_has_ended; /* if there is no more input */
 extern boolean changing; /* if the current line is from |change_file| */
 extern boolean web_file_open; /* if the web file is being read */
+
+@ @<Predecl...@>=
 extern boolean get_line(void); /* inputs the next line */
 extern void check_complete(void); /* checks that all changes were picked up */
 extern void reset_input(void); /* initialize to read the web file and change file */
@@ -201,6 +215,7 @@
 @ 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_stats flags['s'] /* should statistics be printed at end of run? */
 @d show_happiness flags['h'] /* should lack of errors be announced? */
 @d temporary_output flags['t'] /* should temporary output take precedence? */
 @d make_xrefs flags['x'] /* should cross references be output? */
@@ -209,6 +224,7 @@
 extern int argc; /* copy of |ac| parameter to |main| */
 extern char **argv; /* copy of |av| parameter to |main| */
 extern boolean flags[]; /* an option for each 7-bit code */
+extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
 
 @ Code relating to output:
 @d update_terminal fflush(stdout) /* empty the terminal output buffer */
@@ -215,7 +231,7 @@
 @d new_line putchar('\n') @d putxchar putchar
 @d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
 @d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file)
+ 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 */
@@ -222,12 +238,29 @@
 extern FILE *tex_file; /* where output of \.{CWEAVE} goes */
 extern FILE *idx_file; /* where index from \.{CWEAVE} goes */
 extern FILE *scn_file; /* where list of sections from \.{CWEAVE} goes */
+extern FILE *active_file; /* currently active file for \.{CWEAVE} output */
 extern FILE *check_file; /* temporary output file */
-extern FILE *active_file; /* currently active file for \.{CWEAVE} output */
 
 @ The procedure that gets everything rolling:
-
-@<Common code...@>=
+@<Predecl...@>=
 extern void common_init(void);@/
 extern void print_stats(void);@/
 extern void cb_show_banner(void);@/
+
+@ The following parameters were sufficient in the original \.{WEB} to
+handle \TEX/, so they should be sufficient for most applications of
+\.{CWEB}.
+
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
+  index entries, and section names */
+ at d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
+ at d max_names 10239 /* number of identifiers, strings, section names;
+  must be less than 10240 */
+ at d max_sections 4000 /* greater than the total number of sections */
+ at d max_texts 10239 /* number of replacement texts, must be less than 10240 */
+ at d longest_name 10000 /* file and section names and section texts shouldn't be longer than this */
+ at d stack_size 500 /* number of simultaneous levels of macro expansion */
+ at d buf_size 1000 /* for \.{CWEAVE} */
+ at d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
+
+@ End of \.{COMMON} interface.

Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -35,60 +35,32 @@
 set of programs using the __fastcall convention.
 
 @x
-@<Include files@>=
-#include <ctype.h>
+extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
 @y
-@<Include files@>=
-#include <ctype.h>
-#include <string.h>
+extern boolean __cdecl names_match(name_pointer,const char *,size_t,eight_bits);@/
 @z
 
 @x
-@ @<Predec...@>=
-extern int names_match();
+extern void init_p(name_pointer,eight_bits);@/
 @y
-@ @<Predec...@>=
-extern int __cdecl names_match();
+extern void __cdecl init_p(name_pointer,eight_bits);@/
 @z
 
- at x
-@<Pred...@>=
-void init_p();
+ at x section 75
+An omitted change file argument means that |"/dev/null"| should be used,
 @y
-@<Pred...@>=
-void __cdecl init_p();
+An omitted change file argument means that |"NUL"| should be used,
 @z
 
- at x section 69
-An omitted change file argument means that |"/dev/null"| should be used,
+ at x section 76
+  strcpy(change_file_name,"/dev/null");
 @y
-An omitted change file argument means that |"NUL"| should be used,
+  strcpy(change_file_name,"NUL");
 @z
 
- at x section 70 (this change copied from comm-bs.ch, July 94)
+ at x section 76 (this change copied from comm-bs.ch, July 94)
         else if (*s=='/') dot_pos=NULL,name_pos=++s;
 @y
         else if (*s == ':' || *s == '\\' || *s == '/')
 	  dot_pos=NULL,name_pos=++s;
 @z
-
- at x section 70
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
- at y
-  if (found_change<=0) strcpy(change_file_name,"NUL");
- at z
-
- at x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
- at y
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/common.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.c	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/common.c	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,23 +1,19 @@
 /*1:*/
-#line 58 "common.w"
+#line 66 "common.w"
 
-/*5:*/
-#line 102 "common.w"
+/*3:*/
+#line 46 "common.h"
 
-#include <ctype.h> 
-
-/*:5*//*8:*/
-#line 165 "common.w"
-
-#include <stdio.h> 
-
-/*:8*//*22:*/
-#line 471 "common.w"
-
+#include <ctype.h>  
+#include <stdbool.h>  
+#include <stddef.h>  
+#include <stdint.h>  
 #include <stdlib.h>  
+#include <stdio.h>  
+#include <string.h>  
 
-/*:22*/
-#line 59 "common.w"
+/*:3*/
+#line 67 "common.w"
 
 #define ctangle 0
 #define cweave 1 \
@@ -28,7 +24,7 @@
 #define plus_plus 013
 #define minus_minus 01
 #define minus_gt 031
-#define not_eq 032
+#define non_eq 032
 #define lt_eq 034
 #define gt_eq 035
 #define eq_eq 036
@@ -38,15 +34,33 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define buf_size 100
-#define longest_name 10000
-#define long_buf_size (buf_size+longest_name) 
-#define xisspace(c) (isspace(c) &&((unsigned char) c<0200) ) 
-#define xisupper(c) (isupper(c) &&((unsigned char) c<0200) )  \
+#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 length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start) 
+#define print_id(c) term_write((c) ->byte_start,length((c) ) ) 
+#define llink link
+#define rlink dummy.Rlink
+#define root name_dir->rlink \
+
+#define chunk_marker 0 \
+
+#define spotless 0
+#define harmless_message 1
+#define error_message 2
+#define fatal_message 3
+#define mark_harmless {if(history==spotless) history= harmless_message;}
+#define mark_error history= error_message
+#define confusion(s) fatal("! This can't happen: ",s)  \
+ \
+
 #define max_include_depth 10 \
 
-#define max_file_name_length 60
+#define max_file_name_length 1024
 #define cur_file file[include_depth]
 #define cur_file_name file_name[include_depth]
 #define cur_line line[include_depth]
@@ -53,8 +67,33 @@
 #define web_file file[0]
 #define web_file_name file_name[0] \
 
+#define show_banner flags['b']
+#define show_progress flags['p']
+#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 max_bytes 1000000 \
+
+#define max_toks 1000000
+#define max_names 10239 \
+
+#define max_sections 4000
+#define max_texts 10239
+#define longest_name 10000
+#define stack_size 500
+#define buf_size 1000
+#define long_buf_size (buf_size+longest_name)  \
+
 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
-strncmp(buffer,change_buffer,limit-buffer) )  \
+strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) )  \
 
 #define if_section_start_make_pending(b) {*limit= '!'; \
 for(loc= buffer;xisspace(*loc) ;loc++) ; \
@@ -62,30 +101,14 @@
 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
 } \
 
-#define max_sections 2000 \
- \
-
 #define too_long() {include_depth--; \
 err_print("! Include file name too long") ;goto restart;} \
 
-#define max_bytes 90000 \
+#define hash_size 8501 \
 
-#define max_names 4000 \
- \
-
-#define length(c) (c+1) ->byte_start-(c) ->byte_start
-#define print_id(c) term_write((c) ->byte_start,length((c) ) )  \
-
-#define hash_size 353 \
-
-#define llink link
-#define rlink dummy.Rlink
-#define root name_dir->rlink \
- \
-
 #define first_chunk(p) ((p) ->byte_start+2) 
-#define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ \
-(unsigned char) *((p) ->byte_start+1) ) 
+#define prefix_length(p) (int) ((eight_bits) *((p) ->byte_start) *256+ \
+(eight_bits) *((p) ->byte_start+1) ) 
 #define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, \
 *((p) ->byte_start+1) = (m) %256)  \
 
@@ -97,48 +120,139 @@
 
 #define bad_extension 5 \
 
-#define spotless 0
-#define harmless_message 1
-#define error_message 2
-#define fatal_message 3
-#define mark_harmless {if(history==spotless) history= harmless_message;}
-#define mark_error history= error_message \
+#define flag_change (**argv!='-') 
 
-#define confusion(s) fatal("! This can't happen: ",s)  \
- \
+#line 68 "common.w"
 
-#define show_banner flags['b']
-#define show_progress flags['p']
-#define show_stats flags['s']
-#define show_happiness flags['h'] \
+/*2:*/
+#line 37 "common.h"
 
-#define update_terminal fflush(stdout)  \
+typedef bool boolean;
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
+extern boolean program;
+extern int phase;
 
-#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)  \
+/*:2*//*4:*/
+#line 74 "common.h"
 
+extern char section_text[];
+extern char*section_text_end;
+extern char*id_first;
+extern char*id_loc;
 
-#line 60 "common.w"
+/*:4*//*5:*/
+#line 88 "common.h"
 
-/*2:*/
-#line 73 "common.w"
+extern char buffer[];
+extern char*buffer_end;
+extern char*loc;
+extern char*limit;
 
-typedef short boolean;
+/*:5*//*6:*/
+#line 103 "common.h"
+
+typedef struct name_info{
+char*byte_start;
+struct name_info*link;
+union{
+struct name_info*Rlink;
+
+char Ilk;
+}dummy;
+void*equiv_or_xref;
+}name_info;
+typedef name_info*name_pointer;
+typedef name_pointer*hash_pointer;
+extern char byte_mem[];
+extern char*byte_mem_end;
+extern name_info name_dir[];
+extern name_pointer name_dir_end;
+extern name_pointer name_ptr;
+extern char*byte_ptr;
+extern name_pointer hash[];
+extern hash_pointer hash_end;
+extern hash_pointer h;
+
+/*:6*//*8:*/
+#line 147 "common.h"
+
+extern int history;
+
+/*:8*//*10:*/
+#line 167 "common.h"
+
+extern int include_depth;
+extern FILE*file[];
+extern FILE*change_file;
+extern char C_file_name[];
+extern char tex_file_name[];
+extern char idx_file_name[];
+extern char scn_file_name[];
+extern char file_name[][max_file_name_length];
+
+extern char change_file_name[];
+extern int line[];
+extern int change_line;
+extern int change_depth;
+extern boolean input_has_ended;
+extern boolean changing;
+extern boolean web_file_open;
+
+/*:10*//*12:*/
+#line 191 "common.h"
+
+extern sixteen_bits section_count;
+extern boolean changed_section[];
+extern boolean change_pending;
+extern boolean print_where;
+
+/*:12*//*13:*/
+#line 204 "common.h"
+
+extern int argc;
+extern char**argv;
+extern boolean flags[];
+
+/*:13*//*14:*/
+#line 216 "common.h"
+
+extern FILE*C_file;
+extern FILE*tex_file;
+extern FILE*idx_file;
+extern FILE*scn_file;
+extern FILE*active_file;
+
+/*:14*/
+#line 69 "common.w"
+
+/*18:*/
+#line 85 "common.w"
+
 boolean program;
 
-/*:2*//*7:*/
-#line 159 "common.w"
+/*:18*//*19:*/
+#line 94 "common.w"
+int phase;
 
+/*:19*//*21:*/
+#line 131 "common.w"
+
+char section_text[longest_name+1];
+char*section_text_end= section_text+longest_name;
+char*id_first;
+char*id_loc;
+
+/*:21*//*22:*/
+#line 151 "common.w"
+
 char buffer[long_buf_size];
 char*buffer_end= buffer+buf_size-2;
 char*limit= buffer;
 char*loc= buffer;
 
-/*:7*//*10:*/
-#line 214 "common.w"
+/*:22*//*25:*/
+#line 196 "common.w"
 
 int include_depth;
 FILE*file[max_include_depth];
@@ -154,10 +268,15 @@
 boolean changing;
 boolean web_file_open= 0;
 
-/*:10*//*20:*/
-#line 418 "common.w"
+/*:25*//*26:*/
+#line 222 "common.w"
 
-typedef unsigned short sixteen_bits;
+char change_buffer[buf_size];
+char*change_limit;
+
+/*:26*//*37:*/
+#line 403 "common.w"
+
 sixteen_bits section_count;
 boolean changed_section[max_sections];
 boolean change_pending;
@@ -164,61 +283,34 @@
 
 boolean print_where= 0;
 
-/*:20*//*27:*/
-#line 594 "common.w"
+/*:37*//*43:*/
+#line 600 "common.w"
 
-typedef struct name_info{
-char*byte_start;
-/*31:*/
-#line 631 "common.w"
-
-struct name_info*link;
-
-/*:31*//*40:*/
-#line 730 "common.w"
-
-union{
-struct name_info*Rlink;
-
-char Ilk;
-}dummy;
-
-/*:40*//*55:*/
-#line 1062 "common.w"
-
-char*equiv_or_xref;
-
-/*:55*/
-#line 597 "common.w"
-
-}name_info;
-typedef name_info*name_pointer;
 char byte_mem[max_bytes];
 char*byte_mem_end= byte_mem+max_bytes-1;
 name_info name_dir[max_names];
 name_pointer name_dir_end= name_dir+max_names-1;
 
-/*:27*//*29:*/
-#line 617 "common.w"
+/*:43*//*44:*/
+#line 611 "common.w"
 
 name_pointer name_ptr;
 char*byte_ptr;
 
-/*:29*//*32:*/
-#line 644 "common.w"
+/*:44*//*46:*/
+#line 631 "common.w"
 
-typedef name_pointer*hash_pointer;
 name_pointer hash[hash_size];
 hash_pointer hash_end= hash+hash_size-1;
 hash_pointer h;
 
-/*:32*//*56:*/
-#line 1082 "common.w"
+/*:46*//*65:*/
+#line 1019 "common.w"
 
 int history= spotless;
 
-/*:56*//*67:*/
-#line 1220 "common.w"
+/*:65*//*73:*/
+#line 1140 "common.w"
 
 int argc;
 char**argv;
@@ -228,8 +320,8 @@
 char scn_file_name[max_file_name_length];
 boolean flags[128];
 
-/*:67*//*77:*/
-#line 1370 "common.w"
+/*:73*//*83:*/
+#line 1288 "common.w"
 
 FILE*C_file;
 FILE*tex_file;
@@ -237,134 +329,134 @@
 FILE*scn_file;
 FILE*active_file;
 
-/*:77*/
-#line 61 "common.w"
+/*:83*/
+#line 70 "common.w"
 
-/*3:*/
-#line 83 "common.w"
-int phase;
+/*7:*/
+#line 126 "common.h"
 
-/*:3*//*11:*/
-#line 240 "common.w"
+extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
+extern name_pointer id_lookup(const char*,const char*,char);
 
-char change_buffer[buf_size];
-char*change_limit;
+extern name_pointer section_lookup(char*,char*,int);
+extern void init_node(name_pointer);
+extern void init_p(name_pointer,eight_bits);
+extern void print_prefix_name(name_pointer);
+extern void print_section_name(name_pointer);
+extern void sprint_section_name(char*,name_pointer);
 
-/*:11*/
-#line 62 "common.w"
+/*:7*//*9:*/
+#line 150 "common.h"
 
-/*33:*/
-#line 650 "common.w"
+extern int wrap_up(void);
+extern void err_print(const char*);
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
 
-extern int names_match();
+/*:9*//*11:*/
+#line 185 "common.h"
 
-/*:33*//*38:*/
-#line 703 "common.w"
+extern boolean get_line(void);
+extern void check_complete(void);
+extern void reset_input(void);
 
-void init_p();
+/*:11*//*15:*/
+#line 224 "common.h"
 
-/*:38*//*46:*/
-#line 852 "common.w"
+extern void common_init(void);
+extern void print_stats(void);
 
-extern void init_node();
+/*:15*//*23:*/
+#line 161 "common.w"
 
-/*:46*//*53:*/
-#line 1017 "common.w"
+static boolean input_ln(FILE*);
 
-int section_name_cmp();
+/*:23*//*27:*/
+#line 233 "common.w"
 
-/*:53*//*57:*/
-#line 1092 "common.w"
+static void prime_the_change_buffer(void);
 
-void err_print();
+/*:27*//*32:*/
+#line 305 "common.w"
 
-/*:57*//*60:*/
-#line 1140 "common.w"
+static void check_change(void);
 
-int wrap_up();
-extern void print_stats();
+/*:32*//*55:*/
+#line 778 "common.w"
 
-/*:60*//*63:*/
-#line 1173 "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);
 
-void fatal(),overflow();
+/*:55*//*63:*/
+#line 974 "common.w"
 
-/*:63*//*69:*/
-#line 1251 "common.w"
+static int section_name_cmp(char**,int,name_pointer);
 
-void scan_args();
+/*:63*//*75:*/
+#line 1172 "common.w"
 
-/*:69*//*81:*/
-#line 1411 "common.w"
+static void scan_args(void);
 
-extern int strlen();
-extern int strcmp();
-extern char*strcpy();
-extern int strncmp();
-extern char*strncpy();
+/*:75*/
+#line 71 "common.w"
 
-/*:81*/
-#line 63 "common.w"
 
+/*:1*//*20:*/
+#line 100 "common.w"
 
-/*:1*//*4:*/
-#line 89 "common.w"
-
 void
-common_init()
+common_init(void)
 {
-/*30:*/
-#line 621 "common.w"
+/*45:*/
+#line 615 "common.w"
 
 name_dir->byte_start= byte_ptr= byte_mem;
 name_ptr= name_dir+1;
 name_ptr->byte_start= byte_mem;
+root= NULL;
 
-/*:30*//*34:*/
-#line 655 "common.w"
+/*:45*//*47:*/
+#line 638 "common.w"
 
 for(h= hash;h<=hash_end;*h++= NULL);
 
-/*:34*//*41:*/
-#line 737 "common.w"
+/*:47*/
+#line 104 "common.w"
 
-root= NULL;
+/*74:*/
+#line 1153 "common.w"
 
-/*:41*/
-#line 93 "common.w"
-;
-/*68:*/
-#line 1233 "common.w"
+show_banner= show_happiness= show_progress= make_xrefs= true;
+show_stats= false;
 
-show_banner= show_happiness= show_progress= 1;
+/*:74*/
+#line 105 "common.w"
 
-/*:68*/
-#line 94 "common.w"
-;
-/*78:*/
-#line 1377 "common.w"
+/*84:*/
+#line 1295 "common.w"
 
 scan_args();
 if(program==ctangle){
-if((C_file= fopen(C_file_name,"w"))==NULL)
+if((C_file= fopen(C_file_name,"wb"))==NULL)
 fatal("! Cannot open output file ",C_file_name);
 
 }
 else{
-if((tex_file= fopen(tex_file_name,"w"))==NULL)
+if((tex_file= fopen(tex_file_name,"wb"))==NULL)
 fatal("! Cannot open output file ",tex_file_name);
 }
 
-/*:78*/
-#line 95 "common.w"
-;
+/*:84*/
+#line 106 "common.w"
+
 }
 
-/*:4*//*9:*/
-#line 172 "common.w"
+/*:20*//*24:*/
+#line 164 "common.w"
 
-int input_ln(fp)
-FILE*fp;
+static boolean input_ln(
+FILE*fp)
 {
 register int c= EOF;
 register char*k;
@@ -382,15 +474,15 @@
 return(1);
 }
 
-/*:9*//*12:*/
-#line 251 "common.w"
+/*:24*//*28:*/
+#line 236 "common.w"
 
-void
-prime_the_change_buffer()
+static void
+prime_the_change_buffer(void)
 {
 change_limit= change_buffer;
-/*13:*/
-#line 265 "common.w"
+/*29:*/
+#line 250 "common.w"
 
 while(1){
 change_line++;
@@ -397,7 +489,7 @@
 if(!input_ln(change_file))return;
 if(limit<buffer+2)continue;
 if(buffer[0]!='@')continue;
-if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
+if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
 if(buffer[1]=='x')break;
 if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
 loc= buffer+2;
@@ -406,12 +498,12 @@
 }
 }
 
-/*:13*/
-#line 256 "common.w"
-;
-/*14:*/
-#line 282 "common.w"
+/*:29*/
+#line 241 "common.w"
 
+/*30:*/
+#line 267 "common.w"
+
 do{
 change_line++;
 if(!input_ln(change_file)){
@@ -421,27 +513,27 @@
 }
 }while(limit==buffer);
 
-/*:14*/
-#line 257 "common.w"
-;
-/*15:*/
-#line 292 "common.w"
+/*:30*/
+#line 242 "common.w"
 
+/*31:*/
+#line 277 "common.w"
+
 {
-change_limit= change_buffer+(limit-buffer);
-strncpy(change_buffer,buffer,limit-buffer+1);
+change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
+strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
 }
 
-/*:15*/
-#line 258 "common.w"
-;
+/*:31*/
+#line 243 "common.w"
+
 }
 
-/*:12*//*16:*/
-#line 320 "common.w"
+/*:28*//*33:*/
+#line 308 "common.w"
 
-void
-check_change()
+static void
+check_change(void)
 {
 int n= 0;
 if(lines_dont_match)return;
@@ -459,9 +551,9 @@
 return;
 }
 if(limit> buffer+1&&buffer[0]=='@'){
-char xyz_code= xisupper(buffer[1])?tolower(buffer[1]):buffer[1];
-/*17:*/
-#line 358 "common.w"
+char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
+/*34:*/
+#line 346 "common.w"
 
 if(xyz_code=='x'||xyz_code=='z'){
 loc= buffer+2;err_print("! Where is the matching @y?");
@@ -478,21 +570,21 @@
 return;
 }
 
-/*:17*/
-#line 342 "common.w"
-;
+/*:34*/
+#line 330 "common.w"
+
 }
-/*15:*/
-#line 292 "common.w"
+/*31:*/
+#line 277 "common.w"
 
 {
-change_limit= change_buffer+(limit-buffer);
-strncpy(change_buffer,buffer,limit-buffer+1);
+change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
+strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
 }
 
-/*:15*/
-#line 344 "common.w"
-;
+/*:31*/
+#line 332 "common.w"
+
 changing= 0;cur_line++;
 while(!input_ln(cur_file)){
 if(include_depth==0){
@@ -506,15 +598,15 @@
 }
 }
 
-/*:16*//*18:*/
-#line 378 "common.w"
+/*:33*//*35:*/
+#line 366 "common.w"
 
 void
-reset_input()
+reset_input(void)
 {
 limit= buffer;loc= buffer+1;buffer[0]= ' ';
-/*19:*/
-#line 393 "common.w"
+/*36:*/
+#line 381 "common.w"
 
 if((web_file= fopen(web_file_name,"r"))==NULL){
 strcpy(web_file_name,alt_web_file_name);
@@ -527,9 +619,9 @@
 if((change_file= fopen(change_file_name,"r"))==NULL)
 fatal("! Cannot open change file ",change_file_name);
 
-/*:19*/
-#line 383 "common.w"
-;
+/*:36*/
+#line 371 "common.w"
+
 include_depth= 0;cur_line= 0;change_line= 0;
 change_depth= include_depth;
 changing= 1;prime_the_change_buffer();changing= !changing;
@@ -536,15 +628,15 @@
 limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
 }
 
-/*:18*//*21:*/
-#line 426 "common.w"
+/*:35*//*38:*/
+#line 410 "common.w"
 
-int get_line()
+boolean get_line(void)
 {
 restart:
 if(changing&&include_depth==change_depth)
-/*25:*/
-#line 537 "common.w"
+/*41:*/
+#line 518 "common.w"
 {
 change_line++;
 if(!input_ln(change_file)){
@@ -561,7 +653,7 @@
 }
 *limit= ' ';
 if(buffer[0]=='@'){
-if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
+if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
 if(buffer[1]=='x'||buffer[1]=='y'){
 loc= buffer+2;
 err_print("! Where is the matching @z?");
@@ -574,12 +666,12 @@
 }
 }
 
-/*:25*/
-#line 431 "common.w"
-;
+/*:41*/
+#line 415 "common.w"
+
 if(!changing||include_depth> change_depth){
-/*24:*/
-#line 520 "common.w"
+/*40:*/
+#line 501 "common.w"
 {
 cur_line++;
 while(!input_ln(cur_file)){
@@ -597,9 +689,9 @@
 if(change_limit> change_buffer)check_change();
 }
 
-/*:24*/
-#line 433 "common.w"
-;
+/*:40*/
+#line 417 "common.w"
+
 if(changing&&include_depth==change_depth)goto restart;
 }
 if(input_has_ended)return 0;
@@ -618,8 +710,8 @@
 goto restart;
 }
 include_depth++;
-/*23:*/
-#line 474 "common.w"
+/*39:*/
+#line 455 "common.w"
 {
 char temp_file_name[max_file_name_length];
 char*cur_file_name_end= cur_file_name+max_file_name_length-1;
@@ -666,21 +758,21 @@
 include_depth--;err_print("! Cannot open include file");goto restart;
 }
 
-/*:23*/
-#line 452 "common.w"
-;
+/*:39*/
+#line 436 "common.w"
+
 }
 return 1;
 }
 
-/*:21*//*26:*/
-#line 569 "common.w"
+/*:38*//*42:*/
+#line 550 "common.w"
 
 void
-check_complete(){
+check_complete(void){
 if(change_limit!=change_buffer){
-strncpy(buffer,change_buffer,change_limit-change_buffer+1);
-limit= buffer+(int)(change_limit-change_buffer);
+strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
+limit= buffer+(ptrdiff_t)(change_limit-change_buffer);
 changing= 1;change_depth= include_depth;loc= buffer;
 err_print("! Change file entry did not match");
 
@@ -687,34 +779,34 @@
 }
 }
 
-/*:26*//*35:*/
-#line 660 "common.w"
+/*:42*//*48:*/
+#line 643 "common.w"
 
 name_pointer
-id_lookup(first,last,t)
-char*first;
-char*last;
-char t;
+id_lookup(
+const char*first,
+const char*last,
+char t)
 {
-char*i= first;
+const char*i= first;
 int h;
 int l;
 name_pointer p;
 if(last==NULL)for(last= first;*last!='\0';last++);
-l= last-first;
-/*36:*/
-#line 683 "common.w"
+l= (int)(last-first);
+/*49:*/
+#line 666 "common.w"
 
-h= (unsigned char)*i;
-while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
+h= (eight_bits)*i;
+while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
 
 
-/*:36*/
-#line 673 "common.w"
-;
-/*37:*/
-#line 691 "common.w"
+/*:49*/
+#line 656 "common.w"
 
+/*50:*/
+#line 674 "common.w"
+
 p= hash[h];
 while(p&&!names_match(p,first,l,t))p= p->link;
 if(p==NULL){
@@ -722,31 +814,31 @@
 p->link= hash[h];hash[h]= p;
 }
 
-/*:37*/
-#line 674 "common.w"
-;
-if(p==name_ptr)/*39:*/
-#line 706 "common.w"
+/*:50*/
+#line 657 "common.w"
+
+if(p==name_ptr)/*51:*/
+#line 685 "common.w"
 {
 if(byte_ptr+l> byte_mem_end)overflow("byte memory");
 if(name_ptr>=name_dir_end)overflow("name");
 strncpy(byte_ptr,first,l);
 (++name_ptr)->byte_start= byte_ptr+= l;
-if(program==cweave)init_p(p,t);
+init_p(p,t);
 }
 
-/*:39*/
-#line 675 "common.w"
-;
+/*:51*/
+#line 658 "common.w"
+
 return(p);
 }
 
-/*:35*//*42:*/
-#line 764 "common.w"
+/*:48*//*52:*/
+#line 717 "common.w"
 
 void
-print_section_name(p)
-name_pointer p;
+print_section_name(
+name_pointer p)
 {
 char*ss,*s= first_chunk(p);
 name_pointer q= p+1;
@@ -753,9 +845,9 @@
 while(p!=name_dir){
 ss= (p+1)->byte_start-1;
 if(*ss==' '&&ss>=s){
-term_write(s,ss-s);p= q->link;q= p;
+term_write(s,(size_t)(ss-s));p= q->link;q= p;
 }else{
-term_write(s,ss+1-s);p= name_dir;q= NULL;
+term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
 }
 s= p->byte_start;
 }
@@ -762,13 +854,13 @@
 if(q)term_write("...",3);
 }
 
-/*:42*//*43:*/
-#line 783 "common.w"
+/*:52*//*53:*/
+#line 736 "common.w"
 
 void
-sprint_section_name(dest,p)
-char*dest;
-name_pointer p;
+sprint_section_name(
+char*dest,
+name_pointer p)
 {
 char*ss,*s= first_chunk(p);
 name_pointer q= p+1;
@@ -779,18 +871,18 @@
 }else{
 ss++;p= name_dir;
 }
-strncpy(dest,s,ss-s),dest+= ss-s;
+strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
 s= p->byte_start;
 }
 *dest= '\0';
 }
 
-/*:43*//*44:*/
-#line 804 "common.w"
+/*:53*//*54:*/
+#line 757 "common.w"
 
 void
-print_prefix_name(p)
-name_pointer p;
+print_prefix_name(
+name_pointer p)
 {
 char*s= first_chunk(p);
 int l= prefix_length(p);
@@ -798,12 +890,14 @@
 if(s+l<(p+1)->byte_start)term_write("...",3);
 }
 
-/*:44*//*45:*/
-#line 825 "common.w"
+/*:54*//*56:*/
+#line 783 "common.w"
 
-int web_strcmp(j,j_len,k,k_len)
-char*j,*k;
-int j_len,k_len;
+static int web_strcmp(
+char*j,
+int j_len,
+char*k,
+int k_len)
 {
 char*j1= j+j_len,*k1= k+k_len;
 while(k<k1&&j<j1&&*j==*k)k++,j++;
@@ -814,20 +908,20 @@
 else return greater;
 }
 
-/*:45*//*47:*/
-#line 855 "common.w"
+/*:56*//*57:*/
+#line 812 "common.w"
 
-name_pointer
-add_section_name(par,c,first,last,ispref)
-name_pointer par;
-int c;
-char*first;
-char*last;
-int ispref;
+static name_pointer
+add_section_name(
+name_pointer par,
+int c,
+char*first,
+char*last,
+int ispref)
 {
 name_pointer p= name_ptr;
 char*s= first_chunk(p);
-int name_len= last-first+ispref;
+int name_len= (int)(last-first)+ispref;
 if(s+name_len> byte_mem_end)overflow("byte memory");
 if(name_ptr+1>=name_dir_end)overflow("name");
 (++name_ptr)->byte_start= byte_ptr= s+name_len;
@@ -845,19 +939,19 @@
 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
 }
 
-/*:47*//*48:*/
-#line 884 "common.w"
+/*:57*//*58:*/
+#line 841 "common.w"
 
-void
-extend_section_name(p,first,last,ispref)
-name_pointer p;
-char*first;
-char*last;
-int ispref;
+static void
+extend_section_name(
+name_pointer p,
+char*first,
+char*last,
+int ispref)
 {
 char*s;
 name_pointer q= p+1;
-int name_len= last-first+ispref;
+int name_len= (int)(last-first)+ispref;
 if(name_ptr>=name_dir_end)overflow("name");
 while(q->link!=name_dir)q= q->link;
 q->link= name_ptr;
@@ -869,13 +963,13 @@
 if(ispref)*(byte_ptr-1)= ' ';
 }
 
-/*:48*//*49:*/
-#line 912 "common.w"
+/*:58*//*59:*/
+#line 869 "common.w"
 
 name_pointer
-section_lookup(first,last,ispref)
-char*first,*last;
-int ispref;
+section_lookup(
+char*first,char*last,
+int ispref)
 {
 int c= 0;
 name_pointer p= root;
@@ -883,9 +977,9 @@
 name_pointer r= NULL;
 name_pointer par= NULL;
 
-int name_len= last-first+1;
-/*50:*/
-#line 936 "common.w"
+int name_len= (int)(last-first)+1;
+/*60:*/
+#line 893 "common.w"
 
 while(p){
 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -895,10 +989,10 @@
 p= (c==less?p->llink:p->rlink);
 }else{
 if(r!=NULL){
-printf("\n! Ambiguous prefix: matches <");
+fputs("\n! Ambiguous prefix: matches <",stdout);
 
 print_prefix_name(p);
-printf(">\n and <");
+fputs(">\n and <",stdout);
 print_prefix_name(r);
 err_print(">");
 return name_dir;
@@ -911,26 +1005,26 @@
 p= q,q= NULL;
 }
 
-/*:50*/
-#line 926 "common.w"
-;
-/*51:*/
-#line 961 "common.w"
+/*:60*/
+#line 883 "common.w"
 
+/*61:*/
+#line 918 "common.w"
+
 if(r==NULL)
 return add_section_name(par,c,first,last+1,ispref);
 
-/*:51*/
-#line 927 "common.w"
-;
-/*52:*/
-#line 969 "common.w"
+/*:61*/
+#line 884 "common.w"
 
+/*62:*/
+#line 926 "common.w"
+
 switch(section_name_cmp(&first,name_len,r)){
 
 case prefix:
 if(!ispref){
-printf("\n! New name is a prefix of <");
+fputs("\n! New name is a prefix of <",stdout);
 
 print_section_name(r);
 err_print(">");
@@ -942,33 +1036,33 @@
 extend_section_name(r,first,last+1,ispref);
 return r;
 case bad_extension:
-printf("\n! New name extends <");
+fputs("\n! New name extends <",stdout);
 
 print_section_name(r);
 err_print(">");
 return r;
 default:
-printf("\n! Section name incompatible with <");
+fputs("\n! Section name incompatible with <",stdout);
 
 print_prefix_name(r);
-printf(">,\n which abbreviates <");
+fputs(">,\n which abbreviates <",stdout);
 print_section_name(r);
 err_print(">");
 return r;
 }
 
-/*:52*/
-#line 928 "common.w"
-;
+/*:62*/
+#line 885 "common.w"
+
 }
 
-/*:49*//*54:*/
-#line 1020 "common.w"
+/*:59*//*64:*/
+#line 977 "common.w"
 
-int section_name_cmp(pfirst,len,r)
-char**pfirst;
-int len;
-name_pointer r;
+static int section_name_cmp(
+char**pfirst,
+int len,
+name_pointer r)
 {
 char*first= *pfirst;
 name_pointer q= r+1;
@@ -982,7 +1076,7 @@
 switch(c= web_strcmp(first,len,s,ss-s)){
 case equal:if(q==name_dir)
 if(ispref){
-*pfirst= first+(ss-s);
+*pfirst= first+(ptrdiff_t)(ss-s);
 return extension;
 }else return equal;
 else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
@@ -989,7 +1083,7 @@
 case extension:
 if(!ispref)return bad_extension;
 first+= ss-s;
-if(q!=name_dir){len-= ss-s;s= q->byte_start;r= q;continue;}
+if(q!=name_dir){len-= (int)(ss-s);s= q->byte_start;r= q;continue;}
 *pfirst= first;return extension;
 default:return c;
 }
@@ -996,17 +1090,17 @@
 }
 }
 
-/*:54*//*58:*/
-#line 1095 "common.w"
+/*:64*//*66:*/
+#line 1029 "common.w"
 
 void
-err_print(s)
-char*s;
+err_print(
+const char*s)
 {
 char*k,*l;
 printf(*s=='!'?"\n%s":"%s",s);
-if(web_file_open)/*59:*/
-#line 1115 "common.w"
+if(web_file_open)/*67:*/
+#line 1049 "common.w"
 
 {if(changing&&include_depth==change_depth)
 printf(". (l. %d of change file)\n",change_line);
@@ -1025,64 +1119,64 @@
 putchar(' ');
 }
 
-/*:59*/
-#line 1102 "common.w"
-;
+/*:67*/
+#line 1036 "common.w"
+
 update_terminal;mark_error;
 }
 
-/*:58*//*61:*/
-#line 1150 "common.w"
+/*:66*//*68:*/
+#line 1081 "common.w"
 
-int wrap_up(){
-putchar('\n');
+int wrap_up(void){
+if(show_progress)new_line;
 if(show_stats)
 print_stats();
-/*62:*/
-#line 1160 "common.w"
+/*69:*/
+#line 1091 "common.w"
 
 switch(history){
-case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
+case spotless:if(show_happiness)puts("(No errors were found.)");break;
 case harmless_message:
-printf("(Did you see the warning message above?)\n");break;
+puts("(Did you see the warning message above?)");break;
 case error_message:
-printf("(Pardon me, but I think I spotted something wrong.)\n");break;
-case fatal_message:printf("(That was a fatal error, my friend.)\n");
+puts("(Pardon me, but I think I spotted something wrong.)");break;
+case fatal_message:puts("(That was a fatal error, my friend.)");
 }
 
-/*:62*/
-#line 1155 "common.w"
-;
+/*:69*/
+#line 1086 "common.w"
+
 if(history> harmless_message)return(1);
 else return(0);
 }
 
-/*:61*//*64:*/
-#line 1179 "common.w"
+/*:68*//*70:*/
+#line 1107 "common.w"
 void
-fatal(s,t)
-char*s,*t;
+fatal(
+const char*s,const char*t)
 {
-if(*s)printf(s);
+if(*s)err_print(s);
 err_print(t);
 history= fatal_message;exit(wrap_up());
 }
 
-/*:64*//*65:*/
-#line 1190 "common.w"
+/*:70*//*71:*/
+#line 1118 "common.w"
 void
-overflow(t)
-char*t;
+overflow(
+const char*t)
 {
 printf("\n! Sorry, %s capacity exceeded",t);fatal("","");
 }
 
 
-/*:65*//*70:*/
-#line 1254 "common.w"
+/*:71*//*76:*/
+#line 1175 "common.w"
 
-void
-scan_args()
+static void
+scan_args(void)
 {
 char*dot_pos;
 char*name_pos;
@@ -1089,21 +1183,19 @@
 register char*s;
 boolean found_web= 0,found_change= 0,found_out= 0;
 
-boolean flag_change;
 
+strcpy(change_file_name,"/dev/null");
 while(--argc> 0){
-if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*74:*/
-#line 1344 "common.w"
+if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
+#line 1264 "common.w"
 
 {
-if(**argv=='-')flag_change= 0;
-else flag_change= 1;
 for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
-flags[*dot_pos]= flag_change;
+flags[(eight_bits)*dot_pos]= flag_change;
 }
 
-/*:74*/
-#line 1266 "common.w"
+/*:80*/
+#line 1187 "common.w"
 
 else{
 s= name_pos= *argv;dot_pos= NULL;
@@ -1112,19 +1204,19 @@
 else if(*s=='/')dot_pos= NULL,name_pos= ++s;
 else s++;
 }
-if(!found_web)/*71:*/
-#line 1292 "common.w"
+if(!found_web)/*77:*/
+#line 1212 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
-/*76:*/
-#line 1364 "common.w"
+/*82:*/
+#line 1282 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
-/*:76*/
-#line 1295 "common.w"
-;
+/*:82*/
+#line 1215 "common.w"
+
 if(dot_pos==NULL)
 sprintf(web_file_name,"%s.w",*argv);
 else{
@@ -1139,47 +1231,46 @@
 found_web= 1;
 }
 
-/*:71*/
-#line 1275 "common.w"
+/*:77*/
+#line 1196 "common.w"
 
-else if(!found_change)/*72:*/
-#line 1310 "common.w"
+else if(!found_change)/*78:*/
+#line 1230 "common.w"
 
 {
-if(strcmp(*argv,"-")==0)found_change= -1;
-else{
+if(strcmp(*argv,"-")!=0){
 if(s-*argv> max_file_name_length-4)
-/*76:*/
-#line 1364 "common.w"
+/*82:*/
+#line 1282 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
-/*:76*/
-#line 1315 "common.w"
-;
+/*:82*/
+#line 1234 "common.w"
+
 if(dot_pos==NULL)
 sprintf(change_file_name,"%s.ch",*argv);
 else strcpy(change_file_name,*argv);
+}
 found_change= 1;
 }
-}
 
-/*:72*/
-#line 1276 "common.w"
+/*:78*/
+#line 1197 "common.w"
 
-else if(!found_out)/*73:*/
-#line 1323 "common.w"
+else if(!found_out)/*79:*/
+#line 1242 "common.w"
 
 {
 if(s-*argv> max_file_name_length-5)
-/*76:*/
-#line 1364 "common.w"
+/*82:*/
+#line 1282 "common.w"
 fatal("! Filename too long\n",*argv);
 
 
-/*:76*/
-#line 1326 "common.w"
-;
+/*:82*/
+#line 1245 "common.w"
+
 if(dot_pos==NULL){
 sprintf(tex_file_name,"%s.tex",*argv);
 sprintf(idx_file_name,"%s.idx",*argv);
@@ -1188,7 +1279,7 @@
 }else{
 strcpy(tex_file_name,*argv);
 strcpy(C_file_name,*argv);
-if(flags['x']){
+if(make_xrefs){
 *dot_pos= 0;
 sprintf(idx_file_name,"%s.idx",*argv);
 sprintf(scn_file_name,"%s.scn",*argv);
@@ -1197,11 +1288,11 @@
 found_out= 1;
 }
 
-/*:73*/
-#line 1277 "common.w"
+/*:79*/
+#line 1198 "common.w"
 
-else/*75:*/
-#line 1352 "common.w"
+else/*81:*/
+#line 1270 "common.w"
 
 {
 if(program==ctangle)
@@ -1214,13 +1305,13 @@
 ,"");
 }
 
-/*:75*/
-#line 1278 "common.w"
-;
+/*:81*/
+#line 1199 "common.w"
+
 }
 }
-if(!found_web)/*75:*/
-#line 1352 "common.w"
+if(!found_web)/*81:*/
+#line 1270 "common.w"
 
 {
 if(program==ctangle)
@@ -1233,10 +1324,9 @@
 ,"");
 }
 
-/*:75*/
-#line 1281 "common.w"
-;
-if(found_change<=0)strcpy(change_file_name,"/dev/null");
+/*:81*/
+#line 1202 "common.w"
+
 }
 
-/*:70*/
+/*:76*/

Modified: trunk/Build/source/texk/web2c/cwebdir/common.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.h	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/common.h	2021-02-07 11:02:17 UTC (rev 57658)
@@ -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 3.64 --- February 2017 (works also with later versions)
+% Version 4.0 --- February 2021 (works also with later versions)
 
 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
 
@@ -15,26 +15,43 @@
 % entire resulting derived work is distributed under the terms of a
 % permission notice identical to this one.
 
-% Please send comments, suggestions, etc. to levy@@math.berkeley.edu.
+% Amendments to 'common.h' resulting in this updated version were created
+% by numerous collaborators over the course of many years.
 
+% Please send comments, suggestions, etc. to tex-k@@tug.org.
+
 % The next few sections contain stuff from the file |"common.w"| that has
 % to be included in both |"ctangle.w"| and |"cweave.w"|. It appears in this
-% file |"common.h"|, which needs to be updated when |"common.w"| changes.
+% file |"common.h"|, which is also included in |"common.w"| to propagate
+% possible changes from this single source consistently.
 
-First comes general stuff:
+% First comes general stuff:
 
+ at s boolean int
+ at s uint8_t int
+ at s uint16_t int
+
 @d ctangle 0
 @d cweave 1
 
-@<Common code for \.{CWEAVE} and \.{CTANGLE}@>=
-typedef short boolean;
-typedef char unsigned eight_bits;
+@<Common code...@>=
+typedef bool boolean;
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
 extern boolean program; /* \.{CWEAVE} or \.{CTANGLE}? */
 extern int phase; /* which phase are we in? */
 
-@ @<Include files@>=
-#include <stdio.h>
+@ Interface to the standard \CEE/ library:
 
+@<Include files@>=
+#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| */
+#include <stdint.h> /* definition of |@!uint8_t| and |@!uint16_t| */
+#include <stdlib.h> /* definition of |@!getenv| and |@!exit| */
+#include <stdio.h> /* definition of |@!printf| and friends */
+#include <string.h> /* definition of |@!strlen|, |@!strcmp| and so on */
+
 @ Code related to the character set:
 @^ASCII code dependencies@>
 
@@ -44,7 +61,7 @@
 @d plus_plus 013 /* `\.{++}'\,;  corresponds to MIT's {\tentex\char'13} */
 @d minus_minus 01 /* `\.{--}'\,;  corresponds to MIT's {\tentex\char'1} */
 @d minus_gt 031 /* `\.{->}'\,;  corresponds to MIT's {\tentex\char'31} */
- at d not_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
+ at d non_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
 @d lt_eq 034 /* `\.{<=}'\,;  corresponds to MIT's {\tentex\char'34} */
 @d gt_eq 035 /* `\.{>=}'\,;  corresponds to MIT's {\tentex\char'35} */
 @d eq_eq 036 /* `\.{==}'\,;  corresponds to MIT's {\tentex\char'36} */
@@ -55,28 +72,27 @@
 @d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
 
 @<Common code...@>=
-char section_text[longest_name+1]; /* name being sought for */
-char *section_text_end = section_text+longest_name; /* end of |section_text| */
-char *id_first; /* where the current identifier begins in the buffer */
-char *id_loc; /* just after the current identifier in the buffer */
+extern char section_text[]; /* text being sought for */
+extern char *section_text_end; /* end of |section_text| */
+extern char *id_first; /* where the current identifier begins in the buffer */
+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(c)&&((eight_bits)c<0200))
- at d xisdigit(c) (isdigit(c)&&((eight_bits)c<0200))
- at d xisspace(c) (isspace(c)&&((eight_bits)c<0200))
- at d xislower(c) (islower(c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper(c)&&((eight_bits)c<0200))
- at d xisxdigit(c) (isxdigit(c)&&((eight_bits)c<0200))
-
 @<Common code...@>=
 extern char buffer[]; /* where each line of input goes */
 extern char *buffer_end; /* end of |buffer| */
-extern char *loc; /* points to the next character to be read from the buffer*/
+extern char *loc; /* points to the next character to be read from the buffer */
 extern char *limit; /* points to the last character in the buffer */
 
 @ Code related to identifier and section name storage:
- at d length(c) (c+1)->byte_start-(c)->byte_start /* the length of a name */
+ at d length(c) (size_t)((c+1)->byte_start-(c)->byte_start) /* the length of a name */
 @d print_id(c) term_write((c)->byte_start,length((c))) /* print identifier */
 @d llink link /* left link in binary search tree for section names */
 @d rlink dummy.Rlink /* right link in binary search tree for section names */
@@ -93,7 +109,7 @@
       names */
     char Ilk; /* used by identifiers in \.{CWEAVE} only */
   } dummy;
-  char *equiv_or_xref; /* info corresponding to names */
+  void *equiv_or_xref; /* 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;
@@ -106,10 +122,18 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
 
+@ @<Predecl...@>=
+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 void init_node(name_pointer);@/
+extern void init_p(name_pointer,eight_bits);@/
+extern void print_prefix_name(name_pointer);@/
+extern void print_section_name(name_pointer);@/
+extern void sprint_section_name(char *,name_pointer);@/
+
 @ Code related to error handling:
 @d spotless 0 /* |history| value for normal jobs */
 @d harmless_message 1 /* |history| value when non-serious info was printed */
@@ -118,24 +142,30 @@
 @d mark_harmless {if (history==spotless) history=harmless_message;}
 @d mark_error history=error_message
 @d confusion(s) fatal("! This can't happen: ",s)
+ at .This can't happen@>
 
-@<Common...@>=
-extern history; /* indicates how bad this run was */
-extern err_print(); /* print error message and context */
-extern wrap_up(); /* indicate |history| and exit */
-extern void fatal(); /* issue error message and die */
-extern void overflow(); /* succumb because a table has overflowed */
+@<Common code...@>=
+extern int history; /* indicates how bad this run was */
 
+@ @<Predecl...@>=
+extern int wrap_up(void); /* indicate |history| and exit */
+extern void err_print(const char *); /* print error message and context */
+extern void fatal(const char *,const char *); /* issue error message and die */
+extern void overflow(const char *); /* succumb because a table has overflowed */
+
 @ Code related to file handling:
 @f line x /* make |line| an unreserved word */
- at d max_file_name_length 60
+ at d max_include_depth 10 /* maximum number of source files open
+  simultaneously, not counting the change file */
+ at d max_file_name_length 1024
 @d cur_file file[include_depth] /* current file */
 @d cur_file_name file_name[include_depth] /* current file name */
+ at d cur_line line[include_depth] /* number of current line in current file */
+ at d web_file file[0] /* main source file */
 @d web_file_name file_name[0] /* main source file name */
- at d cur_line line[include_depth] /* number of current line in current file */
 
 @<Common code...@>=
-extern include_depth; /* current level of nesting */
+extern int include_depth; /* current level of nesting */
 extern FILE *file[]; /* stack of non-change files */
 extern FILE *change_file; /* change file */
 extern char C_file_name[]; /* name of |C_file| */
@@ -145,19 +175,20 @@
 extern char file_name[][max_file_name_length];
   /* stack of non-change file names */
 extern char change_file_name[]; /* name of change file */
-extern line[]; /* number of current line in the stacked files */
-extern change_line; /* number of current line in change file */
-extern change_depth; /* where \.{@@y} originated during a change */
+extern int line[]; /* number of current line in the stacked files */
+extern int change_line; /* number of current line in change file */
+extern int change_depth; /* where \.{@@y} originated during a change */
 extern boolean input_has_ended; /* if there is no more input */
 extern boolean changing; /* if the current line is from |change_file| */
 extern boolean web_file_open; /* if the web file is being read */
-extern reset_input(); /* initialize to read the web file and change file */
-extern get_line(); /* inputs the next line */
-extern check_complete(); /* checks that all changes were picked up */
 
+@ @<Predecl...@>=
+extern boolean get_line(void); /* inputs the next line */
+extern void check_complete(void); /* checks that all changes were picked up */
+extern void reset_input(void); /* initialize to read the web file and change file */
+
 @ Code related to section numbers:
 @<Common code...@>=
-typedef unsigned short sixteen_bits;
 extern sixteen_bits section_count; /* the current section number */
 extern boolean changed_section[]; /* is the section changed? */
 extern boolean change_pending; /* is a decision about change still unclear? */
@@ -166,7 +197,9 @@
 @ 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_stats flags['s'] /* should statistics be printed at end of run? */
 @d show_happiness flags['h'] /* should lack of errors be announced? */
+ at d make_xrefs flags['x'] /* should cross references be output? */
 
 @<Common code...@>=
 extern int argc; /* copy of |ac| parameter to |main| */
@@ -178,7 +211,7 @@
 @d new_line putchar('\n') @d putxchar putchar
 @d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
 @d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file)
+ 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 */
@@ -188,6 +221,24 @@
 extern FILE *active_file; /* currently active file for \.{CWEAVE} output */
 
 @ The procedure that gets everything rolling:
+@<Predecl...@>=
+extern void common_init(void);@/
+extern void print_stats(void);@/
 
-@<Common code...@>=
-extern void common_init();
+@ The following parameters were sufficient in the original \.{WEB} to
+handle \TEX/, so they should be sufficient for most applications of
+\.{CWEB}.
+
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
+  index entries, and section names */
+ at d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
+ at d max_names 10239 /* number of identifiers, strings, section names;
+  must be less than 10240 */
+ at d max_sections 4000 /* greater than the total number of sections */
+ at d max_texts 10239 /* number of replacement texts, must be less than 10240 */
+ at d longest_name 10000 /* file and section names and section texts shouldn't be longer than this */
+ at d stack_size 500 /* number of simultaneous levels of macro expansion */
+ at d buf_size 1000 /* for \.{CWEAVE} */
+ at d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
+
+@ End of \.{COMMON} interface.

Modified: trunk/Build/source/texk/web2c/cwebdir/common.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.w	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/common.w	2021-02-07 11:02:17 UTC (rev 57658)
@@ -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 3.64 --- January 2002
+% Version 4.0 --- February 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -15,14 +15,19 @@
 % entire resulting derived work is given a different name and distributed
 % under the terms of a permission notice identical to this one.
 
+% Amendments to 'common.w' resulting in this updated version were created
+% by numerous collaborators over the course of many years.
+
+% Please send comments, suggestions, etc. to tex-k@@tug.org.
+
 \def\v{\char'174} % vertical (|) in typewriter font
 
-\def\title{Common code for CTANGLE and CWEAVE (Version 3.64)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.0)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
     {\ttitlefont CWEAVE}}
   \vskip 15pt
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -41,8 +46,11 @@
 
 \pageno=\contentspagenumber \advance\pageno by 1
 \let\maybe=\iftrue
- at s not_eq normal @q unreserve a C++ keyword @>
 
+ 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
@@ -58,20 +66,23 @@
 @c
 @<Include files@>@/
 @h
-@<Definitions that should agree with \.{CTANGLE} and \.{CWEAVE}@>@/
-@<Other definitions@>@/
+@<Common code for \.{CWEAVE} and \.{CTANGLE}@>@/
+@<Global variables@>@/
 @<Predeclaration of procedures@>@/
 
+@ The details will be filled in due course.  The interface of this module
+is included first.  It is also used by the main programs.
+
+First comes general stuff:
+
+ at i common.h
+
 @ In certain cases \.{CTANGLE} and \.{CWEAVE} should do almost, but not
 quite, the same thing.  In these cases we've written common code for
 both, differentiating between the two by means of the global variable
 |program|.
 
- at d ctangle 0
- at d cweave 1
-
-@<Definitions...@>=
-typedef short boolean;
+@<Global var...@>=
 boolean program; /* \.{CWEAVE} or \.{CTANGLE}? */
 
 @ \.{CWEAVE} operates in three phases: First it inputs the source
@@ -80,7 +91,7 @@
 Similarly, \.{CTANGLE} operates in two phases.
 The global variable |phase| tells which phase we are in.
 
-@<Other...@>= int phase; /* which phase are we in? */
+@<Global var...@>= int phase; /* which phase are we in? */
 
 @ There's an initialization procedure that gets both \.{CTANGLE} and
 \.{CWEAVE} off to a good start. We will fill in the details of this
@@ -88,11 +99,11 @@
 
 @c
 void
-common_init()
+common_init(void)
 {
-  @<Initialize pointers@>;
-  @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>;
-  @<Scan arguments and open output files@>;
+  @<Initialize pointers@>@;
+  @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>@;
+  @<Scan arguments and open output files@>@;
 }
 
 @* The character set.
@@ -99,18 +110,15 @@
 \.{CWEB} uses the conventions of \CEE/ programs found in the standard
 \.{ctype.h} header file.
 
-@<Include files@>=
-#include <ctype.h>
+A few character pairs are encoded internally as single characters,
+using the definitions in the interface sections above. These definitions
+are consistent with an extension of ASCII code originally developed at
+MIT and explained in Appendix~C of {\sl The \TEX/book\/}; thus, users
+who have such a character set can type things like \.{\char'32} and
+\.{\char'4} instead of \.{!=} and \.{\&\&}. (However, their files will
+not be too portable until more people adopt the extended code.)
 
-@ A few character pairs are encoded internally as single characters,
-using the definitions below. These definitions are consistent with
-an extension of ASCII code originally developed at MIT and explained in
-Appendix~C of {\sl The \TEX/book\/}; thus, users who have such a
-character set can type things like \.{\char'32} and \.{\char'4} instead
-of \.{!=} and \.{\&\&}. (However, their files will not be too portable
-until more people adopt the extended code.)
-
-If the character set is not ASCII, the definitions given here may conflict
+If the character set is not ASCII, the definitions given may conflict
 with existing characters; in such cases, other arbitrary codes should be
 substituted. The indexes to \.{CTANGLE} and \.{CWEAVE} mention every
 case where similar codes may have to be changed in order to
@@ -120,21 +128,11 @@
 @^ASCII code dependencies@>
 @^system dependencies@>
 
- at 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 not_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} */
+@<Global var...@>=
+char section_text[longest_name+1]; /* text being sought for */
+char *section_text_end = section_text+longest_name; /* end of |section_text| */
+char *id_first; /* where the current identifier begins in the buffer */
+char *id_loc; /* just after the current identifier in the buffer */
 
 @** Input routines.  The lowest level of input to the \.{CWEB} programs
 is performed by |input_ln|, which must be told which file to read from.
@@ -150,28 +148,22 @@
 some of \.{CWEB}'s routines use the fact that it is safe to refer to
 |*(limit+2)| without overstepping the bounds of the array.
 
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
- at d longest_name 10000
- at d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
- at d xisspace(c) (isspace(c)&&((unsigned char)c<0200))
- at d xisupper(c) (isupper(c)&&((unsigned char)c<0200))
-
-@<Definitions...@>=
+@<Global var...@>=
 char buffer[long_buf_size]; /* where each line of input goes */
 char *buffer_end=buffer+buf_size-2; /* end of |buffer| */
 char *limit=buffer; /* points to the last character in the buffer */
 char *loc=buffer; /* points to the next character to be read from the buffer */
 
-@ @<Include files@>=
-#include <stdio.h>
-
 @ 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@>
 
- at c
-int input_ln(fp) /* copies a line into |buffer| or returns 0 */
-FILE *fp; /* what file to read from */
+@<Predecl...@>=
+static boolean input_ln(FILE *);@/
+
+@ @c
+static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns 0 */
+FILE *fp at t\2\2@>) /* 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 */
@@ -183,7 +175,7 @@
     if ((c=getc(fp))!=EOF && c!='\n') {
       ungetc(c,fp); loc=buffer; err_print("! Input line too long");
 @.Input line too long@>
-  }
+    }
   if (c==EOF && limit==buffer) return(0);  /* there was nothing after
     the last newline */
   return(1);
@@ -201,17 +193,7 @@
 The line number of each open file is also kept for error reporting and
 for the benefit of \.{CTANGLE}.
 
- at f line x /* make |line| an unreserved word */
- at d max_include_depth 10 /* maximum number of source files open
-  simultaneously, not counting the change file */
- at d max_file_name_length 60
- at d cur_file file[include_depth] /* current file */
- at d cur_file_name file_name[include_depth] /* current file name */
- at d cur_line line[include_depth] /* number of current line in current file */
- at d web_file file[0] /* main source file */
- at d web_file_name file_name[0] /* main source file name */
-
-@<Definitions...@>=
+@<Global var...@>=
 int include_depth; /* current level of nesting */
 FILE *file[max_include_depth]; /* stack of non-change files */
 FILE *change_file; /* change file */
@@ -234,10 +216,10 @@
 
 Here's a shorthand expression for inequality between the two lines:
 
- at d lines_dont_match (change_limit-change_buffer != limit-buffer ||
-  strncmp(buffer, change_buffer, limit-buffer))
+ at d lines_dont_match (change_limit-change_buffer != limit-buffer || @|
+  strncmp(buffer, change_buffer, (size_t)(limit-buffer)))
 
-@<Other...@>=
+@<Global var...@>=
 char change_buffer[buf_size]; /* next line of |change_file| */
 char *change_limit; /* points to the last character in |change_buffer| */
 
@@ -248,14 +230,17 @@
 the change file is exhausted. This procedure is called only when
 |changing| is 1; hence error messages will be reported correctly.
 
- at c
-void
-prime_the_change_buffer()
+@<Predecl...@>=
+static void prime_the_change_buffer(void);@/
+
+@ @c
+static void
+prime_the_change_buffer(void)
 {
   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@>;
-  @<Skip to the next nonblank line; |return| if end of file@>;
-  @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>;
+  @<Skip over comment lines in the change file; |return| if end of file@>@;
+  @<Skip to the next nonblank line; |return| if end of file@>@;
+  @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>@;
 }
 
 @ While looking for a line that begins with \.{@@x} in the change file, we
@@ -268,7 +253,7 @@
   if (!input_ln(change_file)) return;
   if (limit<buffer+2) continue;
   if (buffer[0]!='@@') continue;
-  if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
+  if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
   if (buffer[1]=='x') break;
   if (buffer[1]=='y' || buffer[1]=='z' || buffer[1]=='i') {
     loc=buffer+2;
@@ -291,8 +276,8 @@
 
 @ @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>=
 {
-  change_limit=change_buffer+(limit-buffer);
-  strncpy(change_buffer,buffer,limit-buffer+1);
+  change_limit=change_buffer+(ptrdiff_t)(limit-buffer);
+  strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
 }
 
 @ The following procedure is used to see if the next change entry should
@@ -317,9 +302,12 @@
   if (*loc=='@@' && (xisspace(*(loc+1)) || *(loc+1)=='*')) change_pending=b;
 }
 
- at c
-void
-check_change() /* switches to |change_file| if the buffers match */
+@<Predecl...@>=
+static void check_change(void);@/
+
+@ @c
+static void
+check_change(void) /* switches to |change_file| if the buffers match */
 {
   int n=0; /* the number of discrepancies found */
   if (lines_dont_match) return;
@@ -337,11 +325,11 @@
       return;
     }
     if (limit>buffer+1 && buffer[0]=='@@') {
-      char xyz_code=xisupper(buffer[1])? tolower(buffer[1]): buffer[1];
+      char xyz_code=xisupper(buffer[1])? tolower((eight_bits)buffer[1]): buffer[1];
       @<If the current line starts with \.{@@y},
-        report any discrepancies and |return|@>;
+        report any discrepancies and |return|@>@;
     }
-    @<Move |buffer| and |limit|...@>;
+    @<Move |buffer| and |limit|...@>@;
     changing=0; cur_line++;
     while (!input_ln(cur_file)) { /* pop the stack or quit */
       if (include_depth==0) {
@@ -377,10 +365,10 @@
 
 @c
 void
-reset_input()
+reset_input(void)
 {
   limit=buffer; loc=buffer+1; buffer[0]=' ';
-  @<Open input files@>;
+  @<Open input files@>@;
   include_depth=0; cur_line=0; change_line=0;
   change_depth=include_depth;
   changing=1; prime_the_change_buffer(); changing=!changing;
@@ -412,11 +400,7 @@
 the |cur_file| has changed, we tell \.{CTANGLE} to print this
 information in the \CEE/ file by means of the |print_where| flag.
 
- at d max_sections 2000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
-
-@<Defin...@>=
-typedef unsigned short sixteen_bits;
+@<Global var...@>=
 sixteen_bits section_count; /* the current section number */
 boolean changed_section[max_sections]; /* is the section changed? */
 boolean change_pending; /* if the current change is not yet recorded in
@@ -424,13 +408,13 @@
 boolean print_where=0; /* should \.{CTANGLE} print line and file info? */
 
 @ @c
-int get_line() /* inputs the next line */
+boolean get_line(void) /* inputs the next line */
 {
   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|@>;
+    @<Read from |cur_file| and maybe turn on |changing|@>@;
     if (changing && include_depth==change_depth) goto restart;
   }
   if (input_has_ended) return 0;
@@ -449,7 +433,7 @@
       goto restart;
     }
     include_depth++; /* push input stack */
-    @<Try to open include file, abort push if unsuccessful, go to |restart|@>;
+    @<Try to open include file, abort push if unsuccessful, go to |restart|@>@;
   }
   return 1;
 }
@@ -468,10 +452,7 @@
 @d too_long() {include_depth--;
         err_print("! Include file name too long"); goto restart;}
 
-@<Include...@>=
-#include <stdlib.h> /* declaration of |getenv| and |exit| */
-
-@ @<Try to open...@>= {
+ at .CWEBINPUTS@>@<Try to open...@>= {
   char temp_file_name[max_file_name_length];
   char *cur_file_name_end=cur_file_name+max_file_name_length-1;
   char *k=cur_file_name, *kk;
@@ -550,7 +531,7 @@
     }
     *limit=' ';
     if (buffer[0]=='@@') {
-      if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
+      if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
       if (buffer[1]=='x' || buffer[1]=='y') {
         loc=buffer+2;
         err_print("! Where is the matching @@z?");
@@ -568,10 +549,10 @@
 
 @c
 void
-check_complete(){
+check_complete(void) {
   if (change_limit!=change_buffer) { /* |changing| is 0 */
-    strncpy(buffer,change_buffer,change_limit-change_buffer+1);
-    limit=buffer+(int)(change_limit-change_buffer);
+    strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
+    limit=buffer+(ptrdiff_t)(change_limit-change_buffer);
     changing=1; change_depth=include_depth; loc=buffer;
     err_print("! Change file entry did not match");
 @.Change file entry did not match@>
@@ -584,37 +565,50 @@
 Information about the names is kept in the array |name_dir|, whose
 elements are structures of type |name_info|, containing a pointer into
 the |byte_mem| array (the address where the name begins) and other data.
-A |name_pointer| variable is a pointer into |name_dir|.
+A |name_pointer| variable is a pointer into |name_dir|.  You find the
+complete layout of |name_info| in the interface sections above.
 
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; must be less than $2^{24}$ */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240 */
+The actual sequence of characters in the name pointed to by a |name_pointer
+p| appears in positions |p->byte_start| to |(p+1)->byte_start-1|, inclusive.
 
-@<Definitions that...@>=
-typedef struct name_info {
-  char *byte_start; /* beginning of the name in |byte_mem| */
-  @<More elements of |name_info| structure@>@;
-} name_info; /* contains information about an identifier or section name */
-typedef name_info *name_pointer; /* pointer into array of |name_info|s */
+The names of identifiers are found by computing a hash address |h| and
+then looking at strings of bytes signified by the |name_pointer|s
+|hash[h]|, |hash[h]->link|, |hash[h]->link->link|, \dots,
+until either finding the desired name or encountering the null pointer.
+
+The names of sections are stored in |byte_mem| together
+with the identifier names, but a hash table is not used for them because
+\.{CTANGLE} needs to be able to recognize a section name when given a prefix of
+that name. A conventional binary search tree is used to retrieve section names,
+with fields called |llink| and |rlink| (where |llink| takes the place
+of |link|).  The root of this tree is stored in |name_dir->rlink|;
+this will be the only information in |name_dir[0]|.
+
+Since the space used by |rlink| has a different function for
+identifiers than for section names, we declare it as a |union|.
+
+The last component of |name_info| is different for \.{CTANGLE} and
+\.{CWEAVE}.  In \.{CTANGLE}, if |p| is a pointer to a section name,
+|p->equiv| is a pointer to its replacement text, an element of the
+array |text_info|.  In \.{CWEAVE}, on the other hand, if
+|p| points to an identifier, |p->xref| is a pointer to its
+list of cross-references, an element of the array |xmem|.  The make-up
+of |text_info| and |xmem| is discussed in the \.{CTANGLE} and \.{CWEAVE}
+source files, respectively; here we just declare a common field
+|equiv_or_xref| as a pointer to |void|.
+
+@<Global var...@>=
 char byte_mem[max_bytes]; /* characters of names */
 char *byte_mem_end = byte_mem+max_bytes-1; /* end of |byte_mem| */
 name_info name_dir[max_names]; /* information about names */
 name_pointer name_dir_end = name_dir+max_names-1; /* end of |name_dir| */
 
-@ The actual sequence of characters in the name pointed to by a |name_pointer
-p| appears in positions |p->byte_start| to |(p+1)->byte_start-1|, inclusive.
-The |print_id| macro prints this text on the user's terminal.
-
- at d length(c) (c+1)->byte_start-(c)->byte_start /* the length of a name */
- at d print_id(c) term_write((c)->byte_start,length((c))) /* print identifier */
-
 @ The first unused position in |byte_mem| and |name_dir| is
 kept in |byte_ptr| and |name_ptr|, respectively.  Thus we
 usually have |name_ptr->byte_start==byte_ptr|, and certainly
 we want to keep |name_ptr<=name_dir_end| and |byte_ptr<=byte_mem_end|.
 
-@<Defini...@>=
+@<Global var...@>=
 name_pointer name_ptr; /* first unused position in |name_dir| */
 char *byte_ptr; /* first unused position in |byte_mem| */
 
@@ -622,15 +616,8 @@
 name_dir->byte_start=byte_ptr=byte_mem; /* position zero in both arrays */
 name_ptr=name_dir+1; /* |name_dir[0]| will be used only for error recovery */
 name_ptr->byte_start=byte_mem; /* this makes name 0 of length zero */
+root=NULL; /* the binary search tree starts out with nothing in it */
 
-@ The names of identifiers are found by computing a hash address |h| and
-then looking at strings of bytes signified by the |name_pointer|s
-|hash[h]|, |hash[h]->link|, |hash[h]->link->link|, \dots,
-until either finding the desired name or encountering the null pointer.
-
-@<More elements of |name...@>=
-struct name_info *link;
-
 @ The hash table itself
 consists of |hash_size| entries of type |name_pointer|, and is
 updated by the |id_lookup| procedure, which finds a given identifier
@@ -639,17 +626,13 @@
 \.{CWEAVE} and \.{CTANGLE}.  If there is no match for the identifier,
 it is inserted into the table.
 
- at d hash_size 353 /* should be prime */
+ at d hash_size 8501 /* should be prime */
 
-@<Defini...@>=
-typedef name_pointer *hash_pointer;
+@<Global var...@>=
 name_pointer hash[hash_size]; /* heads of hash lists */
 hash_pointer hash_end = hash+hash_size-1; /* end of |hash| */
 hash_pointer h; /* index into hash-head array */
 
-@ @<Predec...@>=
-extern int names_match();
-
 @ Initially all the hash lists are empty.
 
 @<Init...@>=
@@ -659,20 +642,20 @@
 
 @c
 name_pointer
-id_lookup(first,last,t) /* looks up a string in the identifier table */
-char *first; /* first character of string */
-char *last; /* last character of string plus one */
-char t; /* the |ilk|; used by \.{CWEAVE} only */
+id_lookup(@t\1\1@> /* 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 *i=first; /* position in |buffer| */
+  const char *i=first; /* position in |buffer| */
   int h; /* hash code */
   int l; /* length of the given identifier */
   name_pointer p; /* where the identifier is being sought */
   if (last==NULL) for (last=first; *last!='\0'; last++);
-  l=last-first; /* compute the length */
-  @<Compute the hash code |h|@>;
-  @<Compute the name location |p|@>;
-  if (p==name_ptr) @<Enter a new name into the table at position |p|@>;
+  l=(int)(last-first); /* compute the length */
+  @<Compute the hash code |h|@>@;
+  @<Compute the name location |p|@>@;
+  if (p==name_ptr) @<Enter a new name into the table at position |p|@>@;
   return(p);
 }
 
@@ -681,8 +664,8 @@
 $$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,|hash_size|.$$
 
 @<Compute the hash...@>=
-h=(unsigned char)*i;
-while (++i<last) h=(h+h+(int)((unsigned char)*i)) % hash_size;
+h=(eight_bits)*i;
+while (++i<last) h=(h+h+(int)((eight_bits)*i)) % hash_size;
 @^high-bit character handling@>
 
 @ If the identifier is new, it will be placed in position |p=name_ptr|,
@@ -699,44 +682,14 @@
 @ 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.
-
-@<Pred...@>=
-void init_p();
-
-@ @<Enter a new name...@>= {
+@<Enter a new name...@>= {
   if (byte_ptr+l>byte_mem_end) overflow("byte memory");
   if (name_ptr>=name_dir_end) overflow("name");
   strncpy(byte_ptr,first,l);
   (++name_ptr)->byte_start=byte_ptr+=l;
-  if (program==cweave) init_p(p,t);
+  init_p(p,t);
 }
 
-@ The names of sections are stored in |byte_mem| together
-with the identifier names, but a hash table is not used for them because
-\.{CTANGLE} needs to be able to recognize a section name when given a prefix of
-that name. A conventional binary search tree is used to retrieve section names,
-with fields called |llink| and |rlink| (where |llink| takes the place
-of |link|).  The root of this tree is stored in |name_dir->rlink|;
-this will be the only information in |name_dir[0]|.
-
-Since the space used by |rlink| has a different function for
-identifiers than for section names, we declare it as a |union|.
-
- at d llink link /* left link in binary search tree for section names */
- at d rlink dummy.Rlink /* right link in binary search tree for section names */
- at d root name_dir->rlink /* the root of the binary search tree
-  for section names */
-
-@<More elements of |name...@>=
-union {
-  struct name_info *Rlink; /* right link in binary search tree for section
-    names */
-  char Ilk; /* used by identifiers in \.{CWEAVE} only */
-} dummy;
-
-@ @<Init...@>=
-root=NULL; /* the binary search tree starts out with nothing in it */
-
 @ If |p| is a |name_pointer| variable, as we have seen,
 |p->byte_start| is the beginning of the area where the name
 corresponding to |p| is stored.  However, if |p| refers to a section
@@ -756,15 +709,15 @@
 |name_dir|.
 
 @d first_chunk(p)  ((p)->byte_start+2)
- at d prefix_length(p) (int)((unsigned char)*((p)->byte_start)*256 +
-                (unsigned char)*((p)->byte_start+1))
+ at 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,
                  *((p)->byte_start+1)=(m)%256)
 
 @c
 void
-print_section_name(p)
-name_pointer p;
+print_section_name(
+name_pointer p)
 {
   char *ss, *s = first_chunk(p);
   name_pointer q = p+1;
@@ -771,9 +724,9 @@
   while (p!=name_dir) {
     ss = (p+1)->byte_start-1;
     if (*ss==' ' && ss>=s) {
-      term_write(s,ss-s); p=q->link; q=p;
+      term_write(s,(size_t)(ss-s)); p=q->link; q=p;
     } else {
-      term_write(s,ss+1-s); p=name_dir; q=NULL;
+      term_write(s,(size_t)(ss+1-s)); p=name_dir; q=NULL;
     }
     s = p->byte_start;
   }
@@ -782,9 +735,9 @@
 
 @ @c
 void
-sprint_section_name(dest,p)
-  char*dest;
-  name_pointer p;
+sprint_section_name(
+  char *dest,
+  name_pointer p)
 {
   char *ss, *s = first_chunk(p);
   name_pointer q = p+1;
@@ -795,7 +748,7 @@
     } else {
       ss++; p=name_dir;
     }
-    strncpy(dest,s,ss-s), dest+=ss-s;
+    strncpy(dest,s,(size_t)(ss-s)), dest+=ss-s;
     s = p->byte_start;
   }
   *dest='\0';
@@ -803,8 +756,8 @@
 
 @ @c
 void
-print_prefix_name(p)
-name_pointer p;
+print_prefix_name(
+name_pointer p)
 {
   char *s = first_chunk(p);
   int l = prefix_length(p);
@@ -822,10 +775,17 @@
 @d prefix 3 /* the first name is a proper prefix of the second */
 @d extension 4 /* the first name is a proper extension of the second */
 
- at c
-int web_strcmp(j,j_len,k,k_len) /* fuller comparison than |strcmp| */
-  char *j, *k; /* beginning of first and second strings */
-  int j_len, k_len; /* length of strings */
+@<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);@/
+
+@ @c
+static int web_strcmp(@t\1\1@> /* 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 */
 {
   char *j1=j+j_len, *k1=k+k_len;
   while (k<k1 && j<j1 && *j==*k) k++, j++;
@@ -849,21 +809,18 @@
 |init_node| procedure, which is defined differently in \.{cweave.w}
 and \.{ctangle.w}.
 
-@<Prede...@>=
-extern void init_node();
-
-@ @c
-name_pointer
-add_section_name(par,c,first,last,ispref) /* 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; /* are we adding a prefix or a full name? */
+ at c
+static name_pointer
+add_section_name(@t\1\1@> /* 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? */
 {
   name_pointer p=name_ptr; /* new node */
   char *s=first_chunk(p);
-  int name_len=last-first+ispref; /* length of section name */
+  int name_len=(int)(last-first)+ispref; /* length of section name */
   if (s+name_len>byte_mem_end) overflow("byte memory");
   if (name_ptr+1>=name_dir_end) overflow("name");
   (++name_ptr)->byte_start=byte_ptr=s+name_len;
@@ -882,16 +839,16 @@
 }
 
 @ @c
-void
-extend_section_name(p,first,last,ispref)
-name_pointer p; /* name to be extended */
-char *first; /* beginning of extension text */
-char *last; /* one beyond end of extension text */
-int ispref; /* are we adding a prefix or a full name? */
+static void
+extend_section_name(@t\1\1@>
+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? */
 {
   char *s;
   name_pointer q=p+1;
-  int name_len=last-first+ispref;
+  int name_len=(int)(last-first)+ispref;
   if (name_ptr>=name_dir_end) overflow("name");
   while (q->link!=name_dir) q=q->link;
   q->link=name_ptr;
@@ -911,9 +868,9 @@
 
 @c
 name_pointer
-section_lookup(first,last,ispref) /* find or install section name in tree */
-char *first, *last; /* first and last characters of new name */
-int ispref; /* is the new name a prefix or a full name? */
+section_lookup(@t\1\1@> /* 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? */
 {
   int c=0; /* comparison between two names; initialized so some compilers won't complain */
   name_pointer p=root; /* current node of the search tree */
@@ -921,11 +878,11 @@
   name_pointer r=NULL; /* where a match has been found */
   name_pointer par=NULL; /* parent of |p|, if |r| is |NULL|;
             otherwise parent of |r| */
-  int name_len=last-first+1;
+  int name_len=(int)(last-first)+1;
   @<Look for matches for new name among shortest prefixes, complaining
-        if more than one is found@>;
-  @<If no match found, add new name to tree@>;
-  @<If one match found, check for compatibility and return match@>;
+        if more than one is found@>@;
+  @<If no match found, add new name to tree@>@;
+  @<If one match found, check for compatibility and return match@>@;
 }
 
 @ A legal new name matches an existing section name if and only if it
@@ -942,10 +899,10 @@
     p=(c==less?p->llink:p->rlink);
   } else { /* new name matches |p| */
     if (r!=NULL) {  /* and also |r|: illegal */
-      printf("\n! Ambiguous prefix: matches <");
+      fputs("\n! Ambiguous prefix: matches <",stdout);
 @.Ambiguous prefix ... @>
       print_prefix_name(p);
-      printf(">\n and <");
+      fputs(">\n and <",stdout);
       print_prefix_name(r);
       err_print(">");
       return name_dir; /* the unsection */
@@ -971,7 +928,7 @@
               /* compare all of |r| with new name */
   case prefix:
     if (!ispref) {
-      printf("\n! New name is a prefix of <");
+      fputs("\n! New name is a prefix of <",stdout);
 @.New name is a prefix...@>
       print_section_name(r);
       err_print(">");
@@ -983,16 +940,16 @@
         extend_section_name(r,first,last+1,ispref);
       return r;
   case bad_extension:
-      printf("\n! New name extends <");
+      fputs("\n! New name extends <",stdout);
 @.New name extends...@>
       print_section_name(r);
       err_print(">");
     return r;
   default: /* no match: illegal */
-    printf("\n! Section name incompatible with <");
+    fputs("\n! Section name incompatible with <",stdout);
 @.Section name incompatible...@>
     print_prefix_name(r);
-    printf(">,\n which abbreviates <");
+    fputs(">,\n which abbreviates <",stdout);
     print_section_name(r);
     err_print(">");
     return r;
@@ -1015,13 +972,13 @@
 @d bad_extension 5
 
 @<Predec...@>=
-int section_name_cmp();
+static int section_name_cmp(char **,int,name_pointer);@/
 
 @ @c
-int section_name_cmp(pfirst,len,r)
-char **pfirst; /* pointer to beginning of comparison string */
-int len; /* length of string */
-name_pointer r; /* section name being compared */
+static int section_name_cmp(@t\1\1@>
+char **pfirst, /* pointer to beginning of comparison string */
+int len, /* length of string */
+name_pointer r at t\2\2@>) /* section name being compared */
 {
   char *first=*pfirst; /* beginning of comparison string */
   name_pointer q=r+1; /* access to subsequent chunks */
@@ -1035,7 +992,7 @@
     switch(c=web_strcmp(first,len,s,ss-s)) {
     case equal: if (q==name_dir)
         if (ispref) {
-          *pfirst=first+(ss-s);
+          *pfirst=first+(ptrdiff_t)(ss-s);
           return extension; /* null extension */
         } else return equal;
       else return (q->byte_start==(q+1)->byte_start)? equal: prefix;
@@ -1042,7 +999,7 @@
     case extension:
       if (!ispref) return bad_extension;
       first += ss-s;
-      if (q!=name_dir) {len -= ss-s; s=q->byte_start; r=q; continue;}
+      if (q!=name_dir) {len -= (int)(ss-s); s=q->byte_start; r=q; continue;}
       *pfirst=first; return extension;
     default: return c;
     }
@@ -1049,19 +1006,6 @@
   }
 }
 
-@ The last component of |name_info| is different for \.{CTANGLE} and
-\.{CWEAVE}.  In \.{CTANGLE}, if |p| is a pointer to a section name,
-|p->equiv| is a pointer to its replacement text, an element of the
-array |text_info|.  In \.{CWEAVE}, on the other hand, if
-|p| points to an identifier, |p->xref| is a pointer to its
-list of cross-references, an element of the array |xmem|.  The make-up
-of |text_info| and |xmem| is discussed in the \.{CTANGLE} and \.{CWEAVE}
-source files, respectively; here we just declare a common field
-|equiv_or_xref| as a pointer to a |char|.
-
-@<More elements of |name...@>=
-char *equiv_or_xref; /* info corresponding to names */
-
 @** Reporting errors to the user.
 A global variable called |history| will contain one of four values
 at the end of every run: |spotless| means that no unusual messages were
@@ -1072,14 +1016,7 @@
 behavior of the program; it is simply computed for the convenience
 of systems that might want to use such information.
 
- at d spotless 0 /* |history| value for normal jobs */
- at d harmless_message 1 /* |history| value when non-serious info was printed */
- at d error_message 2 /* |history| value when an error was noted */
- at 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_error history=error_message
-
-@<Definit...@>=
+@<Global var...@>=
 int history=spotless; /* indicates how bad this run was */
 
 @ The command `|err_print("! Error message")|' will report a syntax error to
@@ -1089,17 +1026,14 @@
 will automatically supply a period. A newline is automatically supplied
 if the string begins with |"!"|.
 
-@<Predecl...@>=
-void  err_print();
-
-@ @c
+ at c
 void
-err_print(s) /* prints `\..' and location of error message */
-char *s;
+err_print(@t\1\1@> /* prints `\..' and location of error message */
+const char *s at t\2\2@>)
 {
   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;
 }
 
@@ -1135,13 +1069,10 @@
 function |wrap_up| at the end of the code.
 
 \.{CTANGLE} and \.{CWEAVE} have their own notions about how to
-print the job statistics.
+print the job statistics.  See the function(s) |print_stats| in the
+interface above and in the index.
 
-@<Prede...@>=
-int wrap_up();
-extern void print_stats();
-
-@ Some implementations may wish to pass the |history| value to the
+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.
@@ -1148,11 +1079,11 @@
 @^system dependencies@>
 
 @c
-int wrap_up() {
-  putchar('\n');
+int wrap_up(void) {
+  if (show_progress) new_line;
   if (show_stats)
     print_stats(); /* print statistics about memory usage */
-  @<Print the job |history|@>;
+  @<Print the job |history|@>@;
   if (history > harmless_message) return(1);
   else return(0);
 }
@@ -1159,28 +1090,25 @@
 
 @ @<Print the job |history|@>=
 switch (history) {
-case spotless: if (show_happiness) printf("(No errors were found.)\n"); break;
+case spotless: if (show_happiness) puts("(No errors were found.)"); break;
 case harmless_message:
-  printf("(Did you see the warning message above?)\n"); break;
+  puts("(Did you see the warning message above?)"); break;
 case error_message:
-  printf("(Pardon me, but I think I spotted something wrong.)\n"); break;
-case fatal_message: printf("(That was a fatal error, my friend.)\n");
+  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 */
 
 @ When there is no way to recover from an error, the |fatal| subroutine is
 invoked. This happens most often when |overflow| occurs.
 
-@<Predec...@>=
-void fatal(), overflow();
-
-@ The two parameters to |fatal| are strings that are essentially
+The two parameters to |fatal| are strings that are essentially
 concatenated to print the final error message.
 
 @c void
-fatal(s,t)
-  char *s,*t;
+fatal(
+  const char *s,const char *t)
 {
-  if (*s) printf(s);
+  if (*s) err_print(s);
   err_print(t);
   history=fatal_message; exit(wrap_up());
 }
@@ -1188,8 +1116,8 @@
 @ An overflow stop occurs if \.{CWEB}'s tables aren't large enough.
 
 @c void
-overflow(t)
-  char *t;
+overflow(
+  const char *t)
 {
   printf("\n! Sorry, %s capacity exceeded",t); fatal("","");
 }
@@ -1200,9 +1128,6 @@
 maintenance person, not the user. In such cases the program says
 |confusion("indication of where we are")|.
 
- at d confusion(s) fatal("! This can't happen: ",s)
- at .This can't happen@>
-
 @** Command line arguments.
 The user calls \.{CWEAVE} and \.{CTANGLE} with arguments on the command line.
 These are either file names or flags to be turned off (beginning with |"-"|)
@@ -1212,12 +1137,7 @@
 the names of those files. Most of the 128 flags are undefined but available
 for future extensions.
 
- at d show_banner flags['b'] /* should the banner line be printed? */
- at d show_progress flags['p'] /* should progress reports be printed? */
- at 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? */
-
-@<Defin...@>=
+@<Global var...@>=
 int argc; /* copy of |ac| parameter to |main| */
 char **argv; /* copy of |av| parameter to |main| */
 char C_file_name[max_file_name_length]; /* name of |C_file| */
@@ -1231,7 +1151,8 @@
 should be set before calling |common_init|.
 
 @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>=
-show_banner=show_happiness=show_progress=1;
+show_banner=show_happiness=show_progress=make_xrefs=true;@/
+show_stats=false;@/
 
 @ 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}
@@ -1249,11 +1170,11 @@
 If there's a third file name, it will be the output file.
 
 @<Pred...@>=
-void scan_args();
+static void scan_args(void);@/
 
 @ @c
-void
-scan_args()
+static void
+scan_args(void)
 {
   char *dot_pos; /* position of |'.'| in the argument */
   char *name_pos; /* file name beginning, sans directory */
@@ -1260,8 +1181,8 @@
   register char *s; /* register for scanning strings */
   boolean found_web=0,found_change=0,found_out=0;
              /* have these names been seen? */
-  boolean flag_change;
 
+  strcpy(change_file_name,"/dev/null");
   while (--argc > 0) {
     if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
     else {
@@ -1275,11 +1196,10 @@
        |web_file_name|, |tex_file_name|, and |C_file_name|@>@;
       else if (!found_change) @<Make |change_file_name| from |fname|@>@;
       else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
-        else @<Print usage error message and quit@>;
+        else @<Print usage error message and quit@>@;
     }
   }
-  if (!found_web) @<Print usage error message and quit@>;
-  if (found_change<=0) strcpy(change_file_name,"/dev/null");
+  if (!found_web) @<Print usage error message and quit@>@;
 }
 
 @ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
@@ -1292,7 +1212,7 @@
 @<Make |web_file_name|...@>=
 {
   if (s-*argv > max_file_name_length-5)
-    @<Complain about argument length@>;
+    @<Complain about argument length@>@;
   if (dot_pos==NULL)
     sprintf(web_file_name,"%s.w",*argv);
   else {
@@ -1309,21 +1229,20 @@
 
 @ @<Make |change_file_name|...@>=
 {
-  if (strcmp(*argv,"-")==0) found_change=-1;
-  else {
+  if (strcmp(*argv,"-")!=0) {
     if (s-*argv > max_file_name_length-4)
-      @<Complain about argument length@>;
+      @<Complain about argument length@>@;
     if (dot_pos==NULL)
       sprintf(change_file_name,"%s.ch",*argv);
     else strcpy(change_file_name,*argv);
-    found_change=1;
   }
+  found_change=1;
 }
 
 @ @<Override...@>=
 {
   if (s-*argv > max_file_name_length-5)
-    @<Complain about argument length@>;
+    @<Complain about argument length@>@;
   if (dot_pos==NULL) {
     sprintf(tex_file_name,"%s.tex",*argv);
     sprintf(idx_file_name,"%s.idx",*argv);
@@ -1332,7 +1251,7 @@
   } else {
     strcpy(tex_file_name,*argv);
     strcpy(C_file_name,*argv);
-    if (flags['x']) { /* indexes will be generated */
+    if (make_xrefs) { /* indexes will be generated */
       *dot_pos=0;
       sprintf(idx_file_name,"%s.idx",*argv);
       sprintf(scn_file_name,"%s.scn",*argv);
@@ -1341,12 +1260,11 @@
   found_out=1;
 }
 
-@ @<Handle flag...@>=
+@ @d flag_change (**argv!='-')
+@<Handle flag...@>=
 {
-  if (**argv=='-') flag_change=0;
-  else flag_change=1;
   for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
-    flags[*dot_pos]=flag_change;
+    flags[(eight_bits)*dot_pos]=flag_change;
 }
 
 @ @<Print usage error message and quit@>=
@@ -1367,7 +1285,7 @@
 @** Output. Here is the code that opens the output file:
 @^system dependencies@>
 
-@<Defin...@>=
+@<Global var...@>=
 FILE *C_file; /* where output of \.{CTANGLE} goes */
 FILE *tex_file; /* where output of \.{CWEAVE} goes */
 FILE *idx_file; /* where index from \.{CWEAVE} goes */
@@ -1377,42 +1295,13 @@
 @ @<Scan arguments and open output files@>=
 scan_args();
 if (program==ctangle) {
-  if ((C_file=fopen(C_file_name,"w"))==NULL)
+  if ((C_file=fopen(C_file_name,"wb"))==NULL)
     fatal("! Cannot open output file ", C_file_name);
 @.Cannot open output file@>
 }
 else {
-  if ((tex_file=fopen(tex_file_name,"w"))==NULL)
+  if ((tex_file=fopen(tex_file_name,"wb"))==NULL)
     fatal("! Cannot open output file ", tex_file_name);
 }
 
-@ The |update_terminal| procedure is called when we want
-to make sure that everything we have output to the terminal so far has
-actually left the computer's internal buffers and been sent.
-@^system dependencies@>
-
- at d update_terminal fflush(stdout) /* empty the terminal output buffer */
-
-@ Terminal output uses |putchar| and |putc| when we have to
-translate from \.{CWEB}'s code into the external character code,
-and |printf| when we just want to print strings.
-Several macros make other kinds of output convenient.
-@^system dependencies@>
- at d new_line putchar('\n') @d putxchar putchar
- at 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? */
-
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
-
 @** Index.

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -17,62 +17,15 @@
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 3.64pc/big)\n"
+ at d banner "This is CTANGLE (Version 4.0pc/big)"
 @z
 
 
- at x Section 4.
-@ The following parameters were sufficient in the original \.{TANGLE} to
-handle \TEX/,
-so they should be sufficient for most applications of \.{CTANGLE}.
-If you change |max_bytes|, |max_names| or |hash_size| you should also
-change them in the file |"common.w"|.
-
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; used in |"common.w"| */
- at d max_toks 270000 /* number of bytes in compressed \CEE/ code */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240; used in |"common.w"| */
- at d max_texts 2500 /* number of replacement texts, must be less than 10240 */
- at d hash_size 353 /* should be prime; used in |"common.w"| */
- at d longest_name 10000 /* section names shouldn't be longer than this */
- at d stack_size 50 /* number of simultaneous levels of macro expansion */
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
- at y
-@ The following parameters were sufficient in the original \.{TANGLE} to
-handle \TEX/,
-so they should be sufficient for most applications of \.{CTANGLE}.
-If you change |max_bytes|, |max_names| or |hash_size| you should also
-change them in the file |"common.w"|.
-
-(This is a modified version of \.{CTANGLE}, and in fact one of the parameters
-has been reduced in value.  The parameter |max_toks|
-has been reduced from 270000 [which
-was sufficient to handle \TEX/] to
-170000, so that \.{CTANGLE}
-may be run on {\mc MSDOS}
-systems that are tight on memory.  Consider, for
-instance, an 80286-based machine with several TSRs and drivers, trying
-to run \.{CTANGLE} from a makefile.)
-
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; used in |"common.w"| */
- at d max_toks 170000 /* number of bytes in compressed \CEE/ code */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240; used in |"common.w"| */
- at d max_texts 2500 /* number of replacement texts, must be less than 10240 */
- at d hash_size 353 /* should be prime; used in |"common.w"| */
- at d longest_name 10000 /* section names shouldn't be longer than this */
- at d stack_size 50 /* number of simultaneous levels of macro expansion */
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
- at z
-
-
 @x Section 9.
 @d chunk_marker 0
 
@@ -85,7 +38,7 @@
       names */
     char Ilk; /* used by identifiers in \.{CWEAVE} only */
   } dummy;
-  char *equiv_or_xref; /* info corresponding to names */
+  void *equiv_or_xref; /* 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;
@@ -98,9 +51,6 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
 @y
 @d chunk_marker 0
 
@@ -131,12 +81,52 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
 @z
 
 
+ at x Section 17.
+@ The following parameters were sufficient in the original \.{WEB} to
+handle \TEX/, so they should be sufficient for most applications of
+\.{CWEB}.
+
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
+  index entries, and section names */
+ at d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
+ at d max_names 10239 /* number of identifiers, strings, section names;
+  must be less than 10240 */
+ at d max_sections 4000 /* greater than the total number of sections */
+ at d max_texts 10239 /* number of replacement texts, must be less than 10240 */
+ at d longest_name 10000 /* file and section names and section texts shouldn't be longer than this */
+ at d stack_size 500 /* number of simultaneous levels of macro expansion */
+ at d buf_size 1000 /* for \.{CWEAVE} */
+ at y
+@ The following parameters were sufficient in the original \.{WEB} to
+handle \TEX/, so they should be sufficient for most applications of
+\.{CWEB}.
+
+(This is a modified version of \.{CTANGLE}, and in fact one of the parameters
+has been reduced in value.  The parameter |max_toks|
+has been reduced from 270000 [which
+was sufficient to handle \TEX/] to
+170000, so that \.{CTANGLE}
+may be run on {\mc MSDOS}
+systems that are tight on memory.  Consider, for
+instance, an 80286-based machine with several TSRs and drivers, trying
+to run \.{CTANGLE} from a makefile.)
+
+ at d max_bytes 90000 /* the number of bytes in identifiers,
+  index entries, and section names */
+ at d max_toks 170000 /* number of bytes in compressed \CEE/ code */
+ at d max_names 4000 /* number of identifiers, strings, section names;
+  must be less than 10240 */
+ at d max_sections 4000 /* greater than the total number of sections */
+ at d max_texts 2500 /* number of replacement texts, must be less than 10240 */
+ at d longest_name 10000 /* file and section names and section texts shouldn't be longer than this */
+ at d stack_size 50 /* number of simultaneous levels of macro expansion */
+ at d buf_size 100 /* for \.{CWEAVE} */
+ at z
+
+
 @x Section 16.
   eight_bits *tok_start; /* pointer into |tok_mem| */
   sixteen_bits text_link; /* relates replacement texts */
@@ -190,8 +180,8 @@
 
 
 @x Section 49.
-out_char(cur_char)
-eight_bits cur_char;
+out_char(
+eight_bits cur_char)
 {
   char *j, *k; /* pointer into |byte_mem| */
 @y

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -16,7 +16,7 @@
 }
 @y
 \def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{63}
+\def\contentspagenumber{66}
 \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-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -9,16 +9,16 @@
 alternate change files with -bs suffix instead of -pc.
 
 @x section 1
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
- at d banner "This is CTANGLE (Version 3.64pc)\n"
+ at d banner "This is CTANGLE (Version 4.0pc)"
 @z
 @x section 4
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; used in |"common.w"| */
- at d max_toks 270000 /* number of bytes in compressed \CEE/ code */
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
+  index entries, and section names */
+ at d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
 @y (note that CWEAVE itself needs only about 42K toks)
 @d max_bytes (unsigned)60000 /* the number of bytes in identifiers,
-  index entries, and section names; used in |"common.w"| */
+  index entries, and section names */
 @d max_toks (unsigned)60000 /* number of bytes in compressed \CEE/ code */
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -7,15 +7,15 @@
 
 
 @x
-\def\title{CTANGLE (Version 3.64)}
+\def\title{CTANGLE (Version 4.0)}
 @y
-\def\title{CTANGLE (QL Version 3.64)}
+\def\title{CTANGLE (QL Version 4.0)}
 @z
 
 @x section 1
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
- at d banner "This is CTANGLE (QL Version 3.64)\n"
+ at d banner "This is CTANGLE (QL Version 4.0)"
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -10,26 +10,26 @@
 (these changes not necessary for initial bootstrapping)
 
 @x section 1 (01-FEB-1992 ST)
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
- at d banner "This is CTANGLE (VAX/VMS Version 3.64)\n"
+ at d banner "This is CTANGLE (VAX/VMS Version 4.0)"
 @z
 
- at x section 6 (from common.h) (01-FEB-1992 ST)
-#include <stdio.h>
+ at x section 3 (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| */
+#include <stdint.h> /* definition of |@!uint8_t| and |@!uint16_t| */
+#include <stdlib.h> /* definition of |@!getenv| and |@!exit| */
+#include <stdio.h> /* definition of |@!printf| and friends */
+#include <string.h> /* definition of |@!strlen|, |@!strcmp| and so on */
 @y
-#include stdio /* VMS searches Textlibraries faster */
- at z
-
- at x section 62 (01-FEB-1992 ST)
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
- at y
-#include ctype /* definition of |isalpha|, |isdigit| and so on */
+#include ctype /* definition of |@!isalpha|, |@!isdigit| and so on */
                /* VMS searches text libraries faster */
+#include stdbool /* definition of |@!bool|, |@!true| and |@!false| */
+#include stddef /* definition of |@!ptrdiff_t| */
+#include stdint /* definition of |@!uint8_t| and |@!uint16_t| */
+#include stdlib /* definition of |@!getenv| and |@!exit| */
+#include stdio /* definition of |@!printf| and friends */
+#include string /* definition of |@!strlen|, |@!strcmp| and so on */
 @z
-
- at x section 63 (01-FEB-1992 ST)
- at d isxalpha(c) ((c)=='_') /* non-alpha character allowed in identifier */
- at y
- at d isxalpha(c) ((c)=='_' || (c)=='$') /* non-alpha characters allowed in id */
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,30 +1,31 @@
- at q Changes for CWEB in TeX Live from numerous contributors. @>
- at q This file is in the Public Domain. @>
+ at q Changes for CWEB in TeX Live from numerous contributors.              @>
+ at q This file is in the Public Domain.                                    @>
 
- at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
- at q were merged with the set of change files of the CWEBbin project; @>
- at q see https://github.com/ascherer/cwebbin for the original parts. @>
+ at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber   @>
+ at q were merged with the set of change files of the CWEBbin project;      @>
+ at q see https://github.com/ascherer/cwebbin for the original parts.       @>
 
- at q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
- at q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
- at q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
- at q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
- at q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
- at q with the 'tie' processor and is used as a monolithic changefile for @>
- at q {common,ctangle,cweave}.w in TeX Live. @>
+ at q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch    @>
+ at q has been created from the elaborate set of change files               @>
+ at q {comm,ctang,cweav,cwebman}-patch.ch,                                  @>
+ at q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch,     @>
+ at q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and        @>
+ at q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+ at q and is used as a monolithic changefile for {common,ctangle,cweave}.w  @>
+ at q and cwebman.tex in TeX Live.                                          @>
 
- at q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+ at q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{CTANGLE (Version 3.64)}
+\def\title{CTANGLE (Version 4.0)}
 @y
-\def\title{CTANGLE (Version 3.64 [\TeX~Live])}
+\def\title{CTANGLE (Version 4.0 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
 @y
-  \centerline{(Version 3.64 [\TeX~Live])}
+  \centerline{(Version 4.0 [\TeX~Live])}
 @z
 
 @x
@@ -36,89 +37,23 @@
 @x
 }
 @y
-}}
-\datecontentspage
+}}\datecontentspage
 @z
 
 @x
- at s not_eq normal @q unreserve a C++ keyword @>
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
- at z
-
- at x
- at d banner "This is CTANGLE (Version 3.64)\n"
- at y
- at d banner "This is CTANGLE, Version 3.64"
+ at d banner "This is CTANGLE, Version 4.0"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
+  if (show_banner) puts(banner); /* print a ``banner line'' */
 @y
-@ For string handling we include the {\mc ANSI C} system header file instead
-of predeclaring the standard system functions |@!strlen|, |@!strcmp|,
-|@!strcpy|, |@!strncmp|, and |@!strncpy|.
-@^system dependencies@>
-
-@<Include files@>=
-#include <string.h>
- at z
-
- at x
-int main (ac, av)
-int ac;
-char **av;
- at y
-int main (
-int ac,
-char **av)
- at z
-
- at x
-  if (show_banner) printf(banner); /* print a ``banner line'' */
- at y
   if (show_banner) cb_show_banner(); /* print a ``banner line'' */
 @z
 
 @x
- at d max_bytes 90000 /* the number of bytes in identifiers,
- at y
- at d max_bytes 1000000 /* the number of bytes in identifiers,
- at z
-
- at x
- at d max_toks 270000 /* number of bytes in compressed \CEE/ code */
- at d max_names 4000 /* number of identifiers, strings, section names;
- at y
- at d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
- at d max_names 10239 /* number of identifiers, strings, section names;
- at z
-
- at x
- at d max_texts 2500 /* number of replacement texts, must be less than 10240 */
- at d hash_size 353 /* should be prime; used in |"common.w"| */
- at y
- at d max_texts 10239 /* number of replacement texts, must be less than 10240 */
- at d hash_size 8501 /* should be prime; used in |"common.w"| */
- at z
-
- at x
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
- at y
- at d buf_size 1000 /* for \.{CWEAVE} and \.{CTANGLE} */
- at z
-
- at x
 @i common.h
 @y
 @i comm-w2c.h
@@ -125,74 +60,6 @@
 @z
 
 @x
-the array |text_info|, and we use a |text_pointer| variable to refer
- at y
-the array |text_info|, and we use a \&{text\_pointer} variable to refer
- at z
-
- at x
-If your machine does not support |unsigned char| you should change
-the definition of \&{eight\_bits} to |unsigned short|.
-@^system dependencies@>
- at y
- at z
-
- at x
-name_dir->equiv=(char *)text_info; /* the undefined section has no replacement text */
- at y
-init_node(name_dir); /* the undefined section has no replacement text */
- at z
-
- at x
-int names_match(p,first,l)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-{
- at y
-boolean names_match(@t\1\1@>
-name_pointer p, /* points to the proposed match */
-const char *first, /* position of first character of string */
-size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
-{@+(void)t;
- at z
-
- at x
-void
-init_node(node)
-name_pointer node;
- at y
-void
-init_node(
-name_pointer node)
- at z
-
- at x
-    node->equiv=(char *)text_info;
- at y
-    node->equiv=(void *)text_info;
- at z
-
- at x
-void
-init_p() {}
- at y
-void
-init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
- at z
-
- at x
-void
-store_two_bytes(x)
-sixteen_bits x;
- at y
-static void
-store_two_bytes(
-sixteen_bits x)
- at z
-
- at x
   if (tok_ptr+2>tok_mem_end) overflow("token");
 @y
   if (tok_ptr+2>tok_mem_end) overflow(_("token"));
@@ -199,16 +66,6 @@
 @z
 
 @x
-void
-push_level(p) /* suspends the current level */
-name_pointer p;
- at y
-static void
-push_level(@t\1\1@> /* suspends the current level */
-name_pointer p at t\2\2@>)
- at z
-
- at x
   if (stack_ptr==stack_end) overflow("stack");
 @y
   if (stack_ptr==stack_end) overflow(_("stack"));
@@ -215,44 +72,12 @@
 @z
 
 @x
-void
-pop_level(flag) /* do this when |cur_byte| reaches |cur_end| */
-int flag; /* |flag==0| means we are in |output_defs| */
+    fputs("\n! Not present: <",stdout);
 @y
-static void
-pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
-int flag at t\2\2@>) /* |flag==0| means we are in |output_defs| */
- at z
-
- at x
-void
-get_output() /* sends next token to |out_char| */
- at y
-static void
-get_output(void) /* sends next token to |out_char| */
- at z
-
- at x
-  if ((a+name_dir)->equiv!=(char *)text_info) push_level(a+name_dir);
- at y
-  if ((a+name_dir)->equiv!=(void *)text_info) push_level(a+name_dir);
- at z
-
- at x
-    printf("\n! Not present: <");
- at y
     fputs(_("\n! Not present: <"),stdout);
 @z
 
 @x
-void
-flush_buffer() /* writes one line to output file */
- at y
-static void
-flush_buffer(void) /* writes one line to output file */
- at z
-
- at x
       overflow("output files");
 @y
       overflow(_("output files"));
@@ -259,22 +84,8 @@
 @z
 
 @x
-void phase_two();
+    fputs("\n! No program text was specified.",stdout); mark_harmless;
 @y
-static void phase_two(void);@/
- at z
-
- at x
-void
-phase_two () {
- at y
-static void
-phase_two (void) {
- at z
-
- at x
-    printf("\n! No program text was specified."); mark_harmless;
- at y
     fputs(_("\n! No program text was specified."),stdout); mark_harmless;
 @z
 
@@ -285,18 +96,15 @@
 @z
 
 @x
-        printf("\nWriting the output files:");
+        fputs("\nWriting the output files:",stdout);
 @y
         fputs(_("\nWriting the output files:"),stdout);
 @z
 
 @x
-    if(show_happiness) printf("\nDone.");
+      fputs("Done.",stdout);
 @y
-    if (show_happiness) {
-      if (show_progress) new_line;
       fputs(_("Done."),stdout);
-    }
 @z
 
 @x
@@ -305,10 +113,10 @@
     an_output_file--;
     sprint_section_name(output_file_name,*an_output_file);
     fclose(C_file);
-    C_file=fopen(output_file_name,"w");
-    if (C_file ==0) fatal("! Cannot open output file:",output_file_name);
+    C_file=fopen(output_file_name,"wb");
+    if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
 @.Cannot open output file@>
-    printf("\n(%s)",output_file_name); update_terminal;
+    if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
     cur_line=1;
     stack_ptr=stack+1;
     cur_name= (*an_output_file);
@@ -346,20 +154,6 @@
 @z
 
 @x
-void output_defs();
- at y
-static void output_defs(void);@/
- at z
-
- at x
-void
-output_defs()
- at y
-static void
-output_defs(void)
- at z
-
- at x
           else if (a<050000) { confusion("macro defs have strange char");}
 @y
           else if (a<050000) { confusion(_("macro defs have strange char"));}
@@ -366,78 +160,6 @@
 @z
 
 @x
-static void out_char();
- at y
-static void out_char(eight_bits);@/
- at z
-
- at x
-static void
-out_char(cur_char)
-eight_bits cur_char;
- at y
-static void
-out_char(
-eight_bits cur_char)
- at z
-
- at x
-@ @<Cases like \.{!=}@>=
-case plus_plus: C_putc('+'); C_putc('+'); out_state=normal; break;
-case minus_minus: C_putc('-'); C_putc('-'); out_state=normal; break;
-case minus_gt: C_putc('-'); C_putc('>'); out_state=normal; break;
-case gt_gt: C_putc('>'); C_putc('>'); out_state=normal; break;
-case eq_eq: C_putc('='); C_putc('='); out_state=normal; break;
-case lt_lt: C_putc('<'); C_putc('<'); out_state=normal; break;
-case gt_eq: C_putc('>'); C_putc('='); out_state=normal; break;
-case lt_eq: C_putc('<'); C_putc('='); out_state=normal; break;
-case not_eq: C_putc('!'); C_putc('='); out_state=normal; break;
-case and_and: C_putc('&'); C_putc('&'); out_state=normal; break;
-case or_or: C_putc('|'); C_putc('|'); out_state=normal; break;
-case dot_dot_dot: C_putc('.'); C_putc('.'); C_putc('.'); out_state=normal;
-    break;
-case colon_colon: C_putc(':'); C_putc(':'); out_state=normal; break;
-case period_ast: C_putc('.'); C_putc('*'); out_state=normal; break;
-case minus_gt_ast: C_putc('-'); C_putc('>'); C_putc('*'); out_state=normal;
-    break;
- at y
-@ @<Cases like \.{!=}@>=
-case plus_plus: C_putc('+');@+C_putc('+'); out_state=normal; break;
-case minus_minus: C_putc('-');@+C_putc('-'); out_state=normal; break;
-case minus_gt: C_putc('-');@+C_putc('>'); out_state=normal; break;
-case gt_gt: C_putc('>');@+C_putc('>'); out_state=normal; break;
-case eq_eq: C_putc('=');@+C_putc('='); out_state=normal; break;
-case lt_lt: C_putc('<');@+C_putc('<'); out_state=normal; break;
-case gt_eq: C_putc('>');@+C_putc('='); out_state=normal; break;
-case lt_eq: C_putc('<');@+C_putc('='); out_state=normal; break;
-case non_eq: C_putc('!');@+C_putc('='); out_state=normal; break;
-case and_and: C_putc('&');@+C_putc('&'); out_state=normal; break;
-case or_or: C_putc('|');@+C_putc('|'); out_state=normal; break;
-case dot_dot_dot: C_putc('.');@+C_putc('.');@+C_putc('.'); out_state=normal;
-    break;
-case colon_colon: C_putc(':');@+C_putc(':'); out_state=normal; break;
-case period_ast: C_putc('.');@+C_putc('*'); out_state=normal; break;
-case minus_gt_ast: C_putc('-');@+C_putc('>');@+C_putc('*'); out_state=normal;
-    break;
- at z
-
- at x
-eight_bits
-skip_ahead() /* skip to next control code */
- at y
-static eight_bits
-skip_ahead(void) /* skip to next control code */
- at z
-
- at x
-int skip_comment(is_long_comment) /* skips over comments */
-boolean is_long_comment;
- at y
-static boolean skip_comment(@t\1\1@> /* skips over comments */
-boolean is_long_comment at t\2\2@>)
- at z
-
- at x
           err_print("! Input ended in mid-comment");
 @y
           err_print(_("! Input ended in mid-comment"));
@@ -450,54 +172,6 @@
 @z
 
 @x
-eight_bits
-get_next() /* produces the next input token */
- at y
-static eight_bits
-get_next(void) /* produces the next input token */
- at z
-
- at x
-    else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"')))
- at y
-    else if (c=='\'' || c=='"'@|
-           || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
-           || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"')))
- at z
-
- at x
-    else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); break;
- at y
-    else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); } } break;
- at z
-
- at x
-  case '!': if (*loc=='=') compress(not_eq); break;
- at y
-  case '!': if (*loc=='=') compress(non_eq); break;
- at z
-
- at x
-  while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
- at y
-  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
-      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
- at z
-
- at x
-  if (delim=='L') { /* wide character constant */
-    delim=*loc++; *++id_loc=delim;
-  }
- at y
-  if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
-    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
-    delim=*loc++; *++id_loc=delim;
-  }
- at z
-
- at x
         err_print("! String didn't end"); loc=limit; break;
 @y
         err_print(_("! String didn't end")); loc=limit; break;
@@ -510,7 +184,7 @@
 @z
 
 @x
-    printf("\n! String too long: ");
+    fputs("\n! String too long: ",stdout);
 @y
     fputs(_("\n! String too long: "),stdout);
 @z
@@ -546,7 +220,7 @@
 @z
 
 @x
-  printf("\n! Section name too long: ");
+  fputs("\n! Section name too long: ",stdout);
 @y
   fputs(_("\n! Section name too long: "),stdout);
 @z
@@ -576,16 +250,6 @@
 @z
 
 @x
-void
-scan_repl(t) /* creates a replacement text */
-eight_bits t;
- at y
-static void
-scan_repl(@t\1\1@> /* creates a replacement text */
-eight_bits t at t\2\2@>)
- at z
-
- at x
   if (text_ptr>text_info_end) overflow("text");
 @y
   if (text_ptr>text_info_end) overflow(_("text"));
@@ -592,14 +256,6 @@
 @z
 
 @x
-{int a=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a / 0400)+0200);
-  app_repl(a % 0400);}
- at y
-{int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
-  app_repl(a_l % 0400);}
- at z
-
- at x
 case output_defs_code: if (t!=section_name) err_print("! Misplaced @@h");
 @y
 case output_defs_code: if (t!=section_name) err_print(_("! Misplaced @@h"));
@@ -624,18 +280,6 @@
 @z
 
 @x
-        c=toupper(*id_first)-'A'+10;
- at y
-        c=toupper((eight_bits)*id_first)-'A'+10;
- at z
-
- at x
-        c=16*c+toupper(*id_first)-'A'+10;
- at y
-        c=16*c+toupper((eight_bits)*id_first)-'A'+10;
- at z
-
- at x
     default: err_print("! Unrecognized escape sequence");
 @y
     default: err_print(_("! Unrecognized escape sequence"));
@@ -642,14 +286,6 @@
 @z
 
 @x
-void
-scan_section()
- at y
-static void
-scan_section(void)
- at z
-
- at x
     err_print("! Definition flushed, must start with identifier");
 @y
     err_print(_("! Definition flushed, must start with identifier"));
@@ -656,40 +292,6 @@
 @z
 
 @x
-else if (p->equiv==(char *)text_info) p->equiv=(char *)cur_text;
- at y
-else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;
- at z
-
- at x
-void phase_one();
- at y
-static void phase_one(void);@/
- at z
-
- at x
-void
-phase_one() {
- at y
-static void
-phase_one(void) {
- at z
-
- at x
-void skip_limbo();
- at y
-static void skip_limbo(void);@/
- at z
-
- at x
-void
-skip_limbo()
- at y
-static void
-skip_limbo(void)
- at z
-
- at x
             err_print("! Double @@ should be used in control text");
 @y
             err_print(_("! Double @@ should be used in control text"));
@@ -714,36 +316,22 @@
 @z
 
 @x
-      strncpy(translit[i-0200],beg,loc-beg);
- at y
-      strncpy(translit[i-0200],beg,(size_t)(loc-beg));
- at z
-
- at x
-void
-print_stats() {
- at y
-void
-print_stats(void) {
- at z
-
- at x
-  printf("\nMemory usage statistics:\n");
+  puts("\nMemory usage statistics:");
   printf("%ld names (out of %ld)\n",
-          (long)(name_ptr-name_dir),(long)max_names);
+          (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf("%ld replacement texts (out of %ld)\n",
-          (long)(text_ptr-text_info),(long)max_texts);
+          (ptrdiff_t)(text_ptr-text_info),(long)max_texts);
   printf("%ld bytes (out of %ld)\n",
-          (long)(byte_ptr-byte_mem),(long)max_bytes);
+          (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
   printf("%ld tokens (out of %ld)\n",
 @y
   puts(_("\nMemory usage statistics:"));
   printf(_("%ld names (out of %ld)\n"),
-          (long)(name_ptr-name_dir),(long)max_names);
+          (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf(_("%ld replacement texts (out of %ld)\n"),
-          (long)(text_ptr-text_info),(long)max_texts);
+          (ptrdiff_t)(text_ptr-text_info),(long)max_texts);
   printf(_("%ld bytes (out of %ld)\n"),
-          (long)(byte_ptr-byte_mem),(long)max_bytes);
+          (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
   printf(_("%ld tokens (out of %ld)\n"),
 @z
 
@@ -750,31 +338,13 @@
 @x
 @** Index.
 @y
-@** Extensions for modern \.{CWEB}.  The following sections introduce changes
-and extensions to the code that have been created by numerous contributors over
-the course of a quarter century. They make \.{CWEB} adhere to modern coding
-standards and introduce new or improved features.
+@** Extensions to \.{CWEB}.  The following sections introduce new or improved
+features that have been created by numerous contributors over the course of a
+quarter century.
 
 Care has been taken to keep the original section numbering intact, so this new
-section should have the same number as the original ``\&{96.~Index},'' and
-additional material follows below.
+material should nicely integrate with the original ``\&{105.~Index}.''
 
-@* Function declarations.  Here are declarations---conforming to
-{\mc ANSI~C}---of all functions in this code, as far as they are
-not already in |"common.h"|.  These are private to \.{CTANGLE}.
-
-@<Predecl...@>=
-static eight_bits get_next(void);@/
-static eight_bits skip_ahead(void);@/
-static boolean skip_comment(boolean);@/
-static void flush_buffer(void);@/
-static void get_output(void);@/
-static void pop_level(int);@/
-static void push_level(name_pointer);@/
-static void scan_repl(eight_bits);@/
-static void scan_section(void);@/
-static void store_two_bytes(sixteen_bits);@/
-
 @* Output file update.  Most \CEE/ projects are controlled by a
 \.{Makefile} that automatically takes care of the temporal dependecies
 between the different source modules.  It is suitable that \.{CWEB} doesn't

Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -4,63 +4,41 @@
 Changes necessary for compiling with Borland C/C++
 
 @x section 1
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 @y
- at d banner "This is CTANGLE (Version 3.64win32)\n"
+ at d banner "This is CTANGLE (Version 4.0win32)"
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
 @y
+boolean __cdecl names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
 @z
 
 @x
-int names_match(p,first,l)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
- at y
-int __cdecl names_match(p,first,l)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
- at z
-
- at x
 void
-init_node(node)
-name_pointer node;
+init_node(
+name_pointer node)
 {
-    node->equiv=(char *)text_info;
+    node->equiv=(void *)text_info;
 }
 void
-init_p() {}
+init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
 @y
 void
-init_node(node)
-name_pointer node;
+init_node(
+name_pointer node)
 {
-    node->equiv=(char *)text_info;
+    node->equiv=(void *)text_info;
 }
 void __cdecl
-init_p() {}
+init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
 @z
-
- at x
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
- at y
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
-#include <string.h>
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.c	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.c	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,33 +1,22 @@
 /*1:*/
-#line 64 "ctangle.w"
+#line 66 "ctangle.w"
 
-/*6:*/
-#line 35 "common.h"
+/*4:*/
+#line 46 "common.h"
 
-#include <stdio.h> 
-
-/*:6*//*62:*/
-#line 888 "ctangle.w"
-
 #include <ctype.h>  
+#include <stdbool.h>  
+#include <stddef.h>  
+#include <stdint.h>  
 #include <stdlib.h>  
+#include <stdio.h>  
+#include <string.h>  
 
-/*:62*/
-#line 65 "ctangle.w"
+/*:4*/
+#line 67 "ctangle.w"
 
-#define banner "This is CTANGLE (Version 3.64)\n" \
+#define banner "This is CTANGLE (Version 4.0)" \
 
-#define max_bytes 90000 \
-
-#define max_toks 270000
-#define max_names 4000 \
-
-#define max_texts 2500
-#define hash_size 353
-#define longest_name 10000
-#define stack_size 50
-#define buf_size 100 \
-
 #define ctangle 0
 #define cweave 1 \
 
@@ -37,7 +26,7 @@
 #define plus_plus 013
 #define minus_minus 01
 #define minus_gt 031
-#define not_eq 032
+#define non_eq 032
 #define lt_eq 034
 #define gt_eq 035
 #define eq_eq 036
@@ -47,14 +36,14 @@
 #define period_ast 026
 #define minus_gt_ast 027 \
 
-#define xisalpha(c) (isalpha(c) &&((eight_bits) c<0200) ) 
-#define xisdigit(c) (isdigit(c) &&((eight_bits) c<0200) ) 
-#define xisspace(c) (isspace(c) &&((eight_bits) c<0200) ) 
-#define xislower(c) (islower(c) &&((eight_bits) c<0200) ) 
-#define xisupper(c) (isupper(c) &&((eight_bits) c<0200) ) 
-#define xisxdigit(c) (isxdigit(c) &&((eight_bits) c<0200) )  \
+#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 length(c) (c+1) ->byte_start-(c) ->byte_start
+#define length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start) 
 #define print_id(c) term_write((c) ->byte_start,length((c) ) ) 
 #define llink link
 #define rlink dummy.Rlink
@@ -69,16 +58,22 @@
 #define mark_harmless {if(history==spotless) history= harmless_message;}
 #define mark_error history= error_message
 #define confusion(s) fatal("! This can't happen: ",s)  \
+ \
 
-#define max_file_name_length 60
+#define max_include_depth 10 \
+
+#define max_file_name_length 1024
 #define cur_file file[include_depth]
 #define cur_file_name file_name[include_depth]
-#define web_file_name file_name[0]
-#define cur_line line[include_depth] \
+#define cur_line line[include_depth]
+#define web_file file[0]
+#define web_file_name file_name[0] \
 
 #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') 
@@ -87,6 +82,18 @@
 #define C_printf(c,a) fprintf(C_file,c,a) 
 #define C_putc(c) putc(c,C_file)  \
 
+#define max_bytes 1000000 \
+
+#define max_toks 1000000
+#define max_names 10239 \
+
+#define max_sections 4000
+#define max_texts 10239
+#define longest_name 10000
+#define stack_size 500
+#define buf_size 1000
+#define long_buf_size (buf_size+longest_name)  \
+
 #define equiv equiv_or_xref \
 
 #define section_flag max_texts \
@@ -128,7 +135,7 @@
 
 #define isxalpha(c) ((c) =='_'||(c) =='$')  \
 
-#define ishigh(c) ((unsigned char) (c) > 0177)  \
+#define ishigh(c) ((eight_bits) (c) > 0177)  \
  \
 
 #define compress(c) if(loc++<=limit) return(c)  \
@@ -137,26 +144,27 @@
 #define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
 
 
-#line 66 "ctangle.w"
+#line 68 "ctangle.w"
 
-/*5:*/
-#line 29 "common.h"
+/*3:*/
+#line 37 "common.h"
 
-typedef short boolean;
-typedef char unsigned eight_bits;
+typedef bool boolean;
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
 extern boolean program;
 extern int phase;
 
-/*:5*//*7:*/
-#line 57 "common.h"
+/*:3*//*5:*/
+#line 74 "common.h"
 
-char section_text[longest_name+1];
-char*section_text_end= section_text+longest_name;
-char*id_first;
-char*id_loc;
+extern char section_text[];
+extern char*section_text_end;
+extern char*id_first;
+extern char*id_loc;
 
-/*:7*//*8:*/
-#line 72 "common.h"
+/*:5*//*6:*/
+#line 88 "common.h"
 
 extern char buffer[];
 extern char*buffer_end;
@@ -163,8 +171,8 @@
 extern char*loc;
 extern char*limit;
 
-/*:8*//*9:*/
-#line 87 "common.h"
+/*:6*//*7:*/
+#line 103 "common.h"
 
 typedef struct name_info{
 char*byte_start;
@@ -174,7 +182,7 @@
 
 char Ilk;
 }dummy;
-char*equiv_or_xref;
+void*equiv_or_xref;
 }name_info;
 typedef name_info*name_pointer;
 typedef name_pointer*hash_pointer;
@@ -187,23 +195,16 @@
 extern name_pointer hash[];
 extern hash_pointer hash_end;
 extern hash_pointer h;
-extern name_pointer id_lookup();
-extern name_pointer section_lookup();
-extern void print_section_name(),sprint_section_name();
 
-/*:9*//*10:*/
-#line 122 "common.h"
+/*:7*//*9:*/
+#line 147 "common.h"
 
-extern history;
-extern err_print();
-extern wrap_up();
-extern void fatal();
-extern void overflow();
+extern int history;
 
-/*:10*//*11:*/
-#line 137 "common.h"
+/*:9*//*11:*/
+#line 167 "common.h"
 
-extern include_depth;
+extern int include_depth;
 extern FILE*file[];
 extern FILE*change_file;
 extern char C_file_name[];
@@ -213,34 +214,30 @@
 extern char file_name[][max_file_name_length];
 
 extern char change_file_name[];
-extern line[];
-extern change_line;
-extern change_depth;
+extern int line[];
+extern int change_line;
+extern int change_depth;
 extern boolean input_has_ended;
 extern boolean changing;
 extern boolean web_file_open;
-extern reset_input();
-extern get_line();
-extern check_complete();
 
-/*:11*//*12:*/
-#line 159 "common.h"
+/*:11*//*13:*/
+#line 191 "common.h"
 
-typedef unsigned short sixteen_bits;
 extern sixteen_bits section_count;
 extern boolean changed_section[];
 extern boolean change_pending;
 extern boolean print_where;
 
-/*:12*//*13:*/
-#line 171 "common.h"
+/*:13*//*14:*/
+#line 204 "common.h"
 
 extern int argc;
 extern char**argv;
 extern boolean flags[];
 
-/*:13*//*14:*/
-#line 183 "common.h"
+/*:14*//*15:*/
+#line 216 "common.h"
 
 extern FILE*C_file;
 extern FILE*tex_file;
@@ -248,17 +245,11 @@
 extern FILE*scn_file;
 extern FILE*active_file;
 
-/*:14*//*15:*/
-#line 192 "common.h"
-
-extern void common_init();
-#line 128 "ctangle.w"
-
 /*:15*/
-#line 67 "ctangle.w"
+#line 69 "ctangle.w"
 
-/*16:*/
-#line 152 "ctangle.w"
+/*19:*/
+#line 124 "ctangle.w"
 
 typedef struct{
 eight_bits*tok_start;
@@ -266,8 +257,8 @@
 }text;
 typedef text*text_pointer;
 
-/*:16*//*27:*/
-#line 296 "ctangle.w"
+/*:19*//*31:*/
+#line 272 "ctangle.w"
 
 typedef struct{
 eight_bits*end_field;
@@ -278,11 +269,11 @@
 }output_state;
 typedef output_state*stack_pointer;
 
-/*:27*/
-#line 68 "ctangle.w"
+/*:31*/
+#line 70 "ctangle.w"
 
-/*17:*/
-#line 159 "ctangle.w"
+/*20:*/
+#line 131 "ctangle.w"
 
 text text_info[max_texts];
 text_pointer text_info_end= text_info+max_texts-1;
@@ -291,13 +282,13 @@
 eight_bits*tok_mem_end= tok_mem+max_toks-1;
 eight_bits*tok_ptr;
 
-/*:17*//*23:*/
-#line 227 "ctangle.w"
+/*:20*//*26:*/
+#line 200 "ctangle.w"
 
 text_pointer last_unnamed;
 
-/*:23*//*28:*/
-#line 312 "ctangle.w"
+/*:26*//*32:*/
+#line 288 "ctangle.w"
 
 output_state cur_state;
 
@@ -305,143 +296,206 @@
 stack_pointer stack_ptr;
 stack_pointer stack_end= stack+stack_size;
 
-/*:28*//*32:*/
-#line 384 "ctangle.w"
+/*:32*//*37:*/
+#line 364 "ctangle.w"
 
 int cur_val;
 
-/*:32*//*36:*/
-#line 473 "ctangle.w"
+/*:37*//*42:*/
+#line 456 "ctangle.w"
 
 eight_bits out_state;
 boolean protect;
 
-/*:36*//*38:*/
-#line 502 "ctangle.w"
+/*:42*//*45:*/
+#line 488 "ctangle.w"
 
 name_pointer output_files[max_files];
 name_pointer*cur_out_file,*end_output_files,*an_output_file;
 char cur_section_name_char;
-char output_file_name[longest_name];
+char output_file_name[longest_name+1];
 
-/*:38*//*45:*/
-#line 599 "ctangle.w"
+/*:45*//*52:*/
+#line 588 "ctangle.w"
 
 boolean output_defs_seen= 0;
 
-/*:45*//*51:*/
-#line 710 "ctangle.w"
+/*:52*//*57:*/
+#line 697 "ctangle.w"
 
 char translit[128][translit_length];
 
-/*:51*//*56:*/
-#line 789 "ctangle.w"
+/*:57*//*62:*/
+#line 776 "ctangle.w"
 
 eight_bits ccode[256];
 
-/*:56*//*59:*/
-#line 845 "ctangle.w"
+/*:62*//*66:*/
+#line 836 "ctangle.w"
 
 boolean comment_continues= 0;
 
-/*:59*//*61:*/
-#line 884 "ctangle.w"
+/*:66*//*68:*/
+#line 875 "ctangle.w"
 
 name_pointer cur_section_name;
 int no_where;
 
-/*:61*//*75:*/
-#line 1195 "ctangle.w"
+/*:68*//*82:*/
+#line 1189 "ctangle.w"
 
 text_pointer cur_text;
 eight_bits next_control;
 
-/*:75*//*82:*/
-#line 1353 "ctangle.w"
+/*:82*//*90:*/
+#line 1350 "ctangle.w"
 
 extern sixteen_bits section_count;
 
-/*:82*/
-#line 69 "ctangle.w"
+/*:90*/
+#line 71 "ctangle.w"
 
-/*2:*/
-#line 77 "ctangle.w"
+/*8:*/
+#line 126 "common.h"
 
-extern int strlen();
-extern int strcmp();
-extern char*strcpy();
-extern int strncmp();
-extern char*strncpy();
+extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
+extern name_pointer id_lookup(const char*,const char*,char);
 
-/*:2*//*41:*/
-#line 533 "ctangle.w"
+extern name_pointer section_lookup(char*,char*,int);
+extern void init_node(name_pointer);
+extern void init_p(name_pointer,eight_bits);
+extern void print_prefix_name(name_pointer);
+extern void print_section_name(name_pointer);
+extern void sprint_section_name(char*,name_pointer);
 
-void phase_two();
+/*:8*//*10:*/
+#line 150 "common.h"
 
-/*:41*//*46:*/
-#line 602 "ctangle.w"
+extern int wrap_up(void);
+extern void err_print(const char*);
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
 
-void output_defs();
+/*:10*//*12:*/
+#line 185 "common.h"
 
-/*:46*//*48:*/
-#line 648 "ctangle.w"
+extern boolean get_line(void);
+extern void check_complete(void);
+extern void reset_input(void);
 
-static void out_char();
+/*:12*//*16:*/
+#line 224 "common.h"
 
-/*:48*//*90:*/
+extern void common_init(void);
+extern void print_stats(void);
+
+/*:16*//*29:*/
+#line 233 "ctangle.w"
+
+static void store_two_bytes(sixteen_bits);
+
+/*:29*//*34:*/
+#line 312 "ctangle.w"
+
+static void push_level(name_pointer);
+static void pop_level(int);
+
+/*:34*//*38:*/
+#line 371 "ctangle.w"
+
+static void get_output(void);
+
+/*:38*//*43:*/
+#line 464 "ctangle.w"
+
+static void flush_buffer(void);
+
+/*:43*//*48:*/
+#line 519 "ctangle.w"
+
+static void phase_two(void);
+
+/*:48*//*53:*/
+#line 591 "ctangle.w"
+
+static void output_defs(void);
+static void out_char(eight_bits);
+
+/*:53*//*64:*/
+#line 800 "ctangle.w"
+
+static eight_bits skip_ahead(void);
+static boolean skip_comment(boolean);
+
+/*:64*//*69:*/
+#line 887 "ctangle.w"
+
+static eight_bits get_next(void);
+
+/*:69*//*83:*/
+#line 1193 "ctangle.w"
+
+static void scan_repl(eight_bits);
+
+/*:83*//*91:*/
+#line 1357 "ctangle.w"
+
+static void scan_section(void);
+
+/*:91*//*99:*/
 #line 1460 "ctangle.w"
 
-void phase_one();
+static void phase_one(void);
 
-/*:90*//*92:*/
+/*:99*//*101:*/
 #line 1478 "ctangle.w"
 
-void skip_limbo();
+static void skip_limbo(void);
 
-/*:92*/
-#line 70 "ctangle.w"
+/*:101*/
+#line 72 "ctangle.w"
 
 
-/*:1*//*3:*/
-#line 91 "ctangle.w"
+/*:1*//*2:*/
+#line 81 "ctangle.w"
 
-int main(ac,av)
-int ac;
-char**av;
+int main(
+int ac,
+char**av)
 {
 argc= ac;argv= av;
 program= ctangle;
-/*18:*/
-#line 167 "ctangle.w"
+/*21:*/
+#line 139 "ctangle.w"
 
 text_info->tok_start= tok_ptr= tok_mem;
 text_ptr= text_info+1;text_ptr->tok_start= tok_mem;
 
 
-/*:18*//*20:*/
-#line 177 "ctangle.w"
+/*:21*//*23:*/
+#line 149 "ctangle.w"
 
-name_dir->equiv= (char*)text_info;
+init_node(name_dir);
 
-/*:20*//*24:*/
-#line 230 "ctangle.w"
+/*:23*//*27:*/
+#line 203 "ctangle.w"
 last_unnamed= text_info;text_info->text_link= 0;
 
-/*:24*//*39:*/
-#line 512 "ctangle.w"
+/*:27*//*46:*/
+#line 498 "ctangle.w"
 
 cur_out_file= end_output_files= output_files+max_files;
 
-/*:39*//*52:*/
-#line 713 "ctangle.w"
+/*:46*//*58:*/
+#line 700 "ctangle.w"
 
 {
 int i;
-for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned)(128+i));
+for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned int)(128+i));
 }
 
-/*:52*//*57:*/
-#line 792 "ctangle.w"
+/*:58*//*63:*/
+#line 779 "ctangle.w"
 {
 int c;
 for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -460,50 +514,51 @@
 ccode['\'']= ord;
 }
 
-/*:57*//*71:*/
-#line 1116 "ctangle.w"
+/*:63*//*78:*/
+#line 1110 "ctangle.w"
 section_text[0]= ' ';
 
-/*:71*/
-#line 98 "ctangle.w"
-;
+/*:78*/
+#line 88 "ctangle.w"
+
 common_init();
-if(show_banner)printf(banner);
+if(show_banner)puts(banner);
 phase_one();
 phase_two();
 return wrap_up();
 }
 
-/*:3*//*21:*/
-#line 183 "ctangle.w"
+/*:2*//*24:*/
+#line 155 "ctangle.w"
 
-int names_match(p,first,l)
-name_pointer p;
-char*first;
-int l;
-{
+boolean names_match(
+name_pointer p,
+const char*first,
+size_t l,
+eight_bits t)
+{(void)t;
 if(length(p)!=l)return 0;
 return!strncmp(first,p->byte_start,l);
 }
 
-/*:21*//*22:*/
-#line 198 "ctangle.w"
+/*:24*//*25:*/
+#line 171 "ctangle.w"
 
 void
-init_node(node)
-name_pointer node;
+init_node(
+name_pointer node)
 {
-node->equiv= (char*)text_info;
+node->equiv= (void*)text_info;
 }
 void
-init_p(){}
+init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
 
-/*:22*//*26:*/
-#line 260 "ctangle.w"
+/*:25*//*30:*/
+#line 236 "ctangle.w"
 
 void
-store_two_bytes(x)
-sixteen_bits x;
+store_two_bytes(
+sixteen_bits x)
 {
 if(tok_ptr+2> tok_mem_end)overflow("token");
 *tok_ptr++= x>>8;
@@ -510,12 +565,12 @@
 *tok_ptr++= x&0377;
 }
 
-/*:26*//*30:*/
-#line 336 "ctangle.w"
+/*:30*//*35:*/
+#line 316 "ctangle.w"
 
-void
-push_level(p)
-name_pointer p;
+static void
+push_level(
+name_pointer p)
 {
 if(stack_ptr==stack_end)overflow("stack");
 *stack_ptr= cur_state;
@@ -527,12 +582,12 @@
 }
 }
 
-/*:30*//*31:*/
-#line 355 "ctangle.w"
+/*:35*//*36:*/
+#line 335 "ctangle.w"
 
-void
-pop_level(flag)
-int flag;
+static void
+pop_level(
+int flag)
 {
 if(flag&&cur_repl->text_link<section_flag){
 cur_repl= cur_repl->text_link+text_info;
@@ -543,11 +598,11 @@
 if(stack_ptr> stack)cur_state= *stack_ptr;
 }
 
-/*:31*//*33:*/
-#line 391 "ctangle.w"
+/*:36*//*39:*/
+#line 374 "ctangle.w"
 
-void
-get_output()
+static void
+get_output(void)
 {
 sixteen_bits a;
 restart:if(stack_ptr==stack)return;
@@ -566,14 +621,14 @@
 switch(a/024000){
 case 0:cur_val= a;out_char(identifier);break;
 case 1:if(a==output_defs_flag)output_defs();
-else/*34:*/
-#line 423 "ctangle.w"
+else/*40:*/
+#line 406 "ctangle.w"
 
 {
 a-= 024000;
-if((a+name_dir)->equiv!=(char*)text_info)push_level(a+name_dir);
+if((a+name_dir)->equiv!=(void*)text_info)push_level(a+name_dir);
 else if(a!=0){
-printf("\n! Not present: <");
+fputs("\n! Not present: <",stdout);
 print_section_name(a+name_dir);err_print(">");
 
 }
@@ -580,9 +635,9 @@
 goto restart;
 }
 
-/*:34*/
-#line 412 "ctangle.w"
-;
+/*:40*/
+#line 395 "ctangle.w"
+
 break;
 default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
 out_char(section_number);
@@ -590,11 +645,11 @@
 }
 }
 
-/*:33*//*37:*/
-#line 481 "ctangle.w"
+/*:39*//*44:*/
+#line 467 "ctangle.w"
 
-void
-flush_buffer()
+static void
+flush_buffer(void)
 {
 C_putc('\n');
 if(cur_line%100==0&&show_progress){
@@ -605,33 +660,33 @@
 cur_line++;
 }
 
-/*:37*//*42:*/
-#line 536 "ctangle.w"
+/*:44*//*49:*/
+#line 522 "ctangle.w"
 
-void
-phase_two(){
+static void
+phase_two(void){
 web_file_open= 0;
 cur_line= 1;
-/*29:*/
-#line 325 "ctangle.w"
+/*33:*/
+#line 301 "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;
 
-/*:29*/
-#line 541 "ctangle.w"
-;
-/*44:*/
-#line 595 "ctangle.w"
+/*:33*/
+#line 527 "ctangle.w"
 
+/*51:*/
+#line 584 "ctangle.w"
+
 if(!output_defs_seen)
 output_defs();
 
-/*:44*/
-#line 542 "ctangle.w"
-;
+/*:51*/
+#line 528 "ctangle.w"
+
 if(text_info->text_link==0&&cur_out_file==end_output_files){
-printf("\n! No program text was specified.");mark_harmless;
+fputs("\n! No program text was specified.",stdout);mark_harmless;
 
 }
 else{
@@ -641,7 +696,7 @@
 }
 else{
 if(show_progress){
-printf("\nWriting the output files:");
+fputs("\nWriting the output files:",stdout);
 
 printf(" (%s)",C_file_name);
 update_terminal;
@@ -650,17 +705,17 @@
 }
 while(stack_ptr> stack)get_output();
 flush_buffer();
-writeloop:/*43:*/
-#line 572 "ctangle.w"
+writeloop:/*50:*/
+#line 561 "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,"w");
-if(C_file==0)fatal("! Cannot open output file:",output_file_name);
+C_file= fopen(output_file_name,"wb");
+if(C_file==0)fatal("! Cannot open output file ",output_file_name);
 
-printf("\n(%s)",output_file_name);update_terminal;
+if(show_progress){printf("\n(%s)",output_file_name);update_terminal;}
 cur_line= 1;
 stack_ptr= stack+1;
 cur_name= (*an_output_file);
@@ -671,18 +726,21 @@
 flush_buffer();
 }
 
-/*:43*/
-#line 563 "ctangle.w"
-;
-if(show_happiness)printf("\nDone.");
+/*:50*/
+#line 549 "ctangle.w"
+
+if(show_happiness){
+if(show_progress)new_line;
+fputs("Done.",stdout);
 }
 }
+}
 
-/*:42*//*47:*/
-#line 605 "ctangle.w"
+/*:49*//*54:*/
+#line 595 "ctangle.w"
 
-void
-output_defs()
+static void
+output_defs(void)
 {
 sixteen_bits a;
 push_level(NULL);
@@ -718,12 +776,12 @@
 pop_level(0);
 }
 
-/*:47*//*49:*/
-#line 651 "ctangle.w"
+/*:54*//*55:*/
+#line 638 "ctangle.w"
 
 static void
-out_char(cur_char)
-eight_bits cur_char;
+out_char(
+eight_bits cur_char)
 {
 char*j,*k;
 restart:
@@ -731,8 +789,8 @@
 case'\n':if(protect&&out_state!=verbatim)C_putc(' ');
 if(protect||out_state==verbatim)C_putc('\\');
 flush_buffer();if(out_state!=verbatim)out_state= normal;break;
-/*53:*/
-#line 719 "ctangle.w"
+/*59:*/
+#line 706 "ctangle.w"
 
 case identifier:
 if(out_state==num_or_id)C_putc(' ');
@@ -739,19 +797,19 @@
 j= (cur_val+name_dir)->byte_start;
 k= (cur_val+name_dir+1)->byte_start;
 while(j<k){
-if((unsigned char)(*j)<0200)C_putc(*j);
+if((eight_bits)(*j)<0200)C_putc(*j);
 
-else C_printf("%s",translit[(unsigned char)(*j)-0200]);
+else C_printf("%s",translit[(eight_bits)(*j)-0200]);
 j++;
 }
 out_state= num_or_id;break;
 
-/*:53*/
-#line 662 "ctangle.w"
-;
-/*54:*/
-#line 732 "ctangle.w"
+/*:59*/
+#line 649 "ctangle.w"
 
+/*60:*/
+#line 719 "ctangle.w"
+
 case section_number:
 if(cur_val> 0)C_printf("/*%d:*/",cur_val);
 else if(cur_val<0)C_printf("/*:%d*/",-cur_val);
@@ -776,12 +834,12 @@
 }
 break;
 
-/*:54*/
-#line 663 "ctangle.w"
-;
-/*50:*/
-#line 681 "ctangle.w"
+/*:60*/
+#line 650 "ctangle.w"
 
+/*56:*/
+#line 668 "ctangle.w"
+
 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;
@@ -790,7 +848,7 @@
 case lt_lt:C_putc('<');C_putc('<');out_state= normal;break;
 case gt_eq:C_putc('>');C_putc('=');out_state= normal;break;
 case lt_eq:C_putc('<');C_putc('=');out_state= normal;break;
-case not_eq:C_putc('!');C_putc('=');out_state= normal;break;
+case non_eq:C_putc('!');C_putc('=');out_state= normal;break;
 case and_and:C_putc('&');C_putc('&');out_state= normal;break;
 case or_or:C_putc('|');C_putc('|');out_state= normal;break;
 case dot_dot_dot:C_putc('.');C_putc('.');C_putc('.');out_state= normal;
@@ -800,9 +858,9 @@
 case minus_gt_ast:C_putc('-');C_putc('>');C_putc('*');out_state= normal;
 break;
 
-/*:50*/
-#line 664 "ctangle.w"
-;
+/*:56*/
+#line 651 "ctangle.w"
+
 case'=':case'>':C_putc(cur_char);C_putc(' ');
 out_state= normal;break;
 case join:out_state= unbreakable;break;
@@ -819,11 +877,11 @@
 }
 }
 
-/*:49*//*58:*/
-#line 813 "ctangle.w"
+/*:55*//*65:*/
+#line 804 "ctangle.w"
 
-eight_bits
-skip_ahead()
+static eight_bits
+skip_ahead(void)
 {
 eight_bits c;
 while(1){
@@ -837,11 +895,11 @@
 }
 }
 
-/*:58*//*60:*/
-#line 848 "ctangle.w"
+/*:65*//*67:*/
+#line 839 "ctangle.w"
 
-int skip_comment(is_long_comment)
-boolean is_long_comment;
+static boolean skip_comment(
+boolean is_long_comment)
 {
 char c;
 while(1){
@@ -871,11 +929,11 @@
 }
 }
 
-/*:60*//*63:*/
-#line 900 "ctangle.w"
+/*:67*//*70:*/
+#line 890 "ctangle.w"
 
-eight_bits
-get_next()
+static eight_bits
+get_next(void)
 {
 static int preprocessing= 0;
 eight_bits c;
@@ -885,8 +943,8 @@
 if(get_line()==0)return(new_section);
 else if(print_where&&!no_where){
 print_where= 0;
-/*77:*/
-#line 1225 "ctangle.w"
+/*85:*/
+#line 1222 "ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -897,12 +955,12 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
-app_repl(a%0400);}
+{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
+app_repl(a_l%0400);}
 
-/*:77*/
-#line 912 "ctangle.w"
-;
+/*:85*/
+#line 902 "ctangle.w"
+
 }
 else return('\n');
 }
@@ -914,8 +972,8 @@
 else continue;
 }
 loc++;
-if(xisdigit(c)||c=='.')/*66:*/
-#line 978 "ctangle.w"
+if(xisdigit(c)||c=='.')/*73:*/
+#line 971 "ctangle.w"
 {
 id_first= loc-1;
 if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
@@ -939,17 +997,20 @@
 return(constant);
 }
 
-/*:66*/
-#line 924 "ctangle.w"
+/*:73*/
+#line 914 "ctangle.w"
 
-else if(c=='\''||c=='"'||(c=='L'&&(*loc=='\''||*loc=='"')))
-/*67:*/
-#line 1006 "ctangle.w"
+else if(c=='\''||c=='"'
+||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
+||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
+/*74:*/
+#line 999 "ctangle.w"
 {
 char delim= c;
 id_first= section_text+1;
 id_loc= section_text;*++id_loc= delim;
-if(delim=='L'){
+if(delim=='L'||delim=='u'||delim=='U'){
+if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
 delim= *loc++;*++id_loc= delim;
 }
 while(1){
@@ -977,7 +1038,7 @@
 if(++id_loc<=section_text_end)*id_loc= c;
 }
 if(id_loc>=section_text_end){
-printf("\n! String too long: ");
+fputs("\n! String too long: ",stdout);
 
 term_write(section_text+1,25);
 err_print("...");
@@ -986,23 +1047,24 @@
 return(string);
 }
 
-/*:67*/
-#line 926 "ctangle.w"
+/*:74*/
+#line 918 "ctangle.w"
 
 else if(isalpha(c)||isxalpha(c)||ishigh(c))
-/*65:*/
-#line 972 "ctangle.w"
+/*72:*/
+#line 964 "ctangle.w"
 {
 id_first= --loc;
-while(isalpha(*++loc)||isdigit(*loc)||isxalpha(*loc)||ishigh(*loc));
+while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
 id_loc= loc;return(identifier);
 }
 
-/*:65*/
-#line 928 "ctangle.w"
+/*:72*/
+#line 920 "ctangle.w"
 
-else if(c=='@')/*68:*/
-#line 1050 "ctangle.w"
+else if(c=='@')/*75:*/
+#line 1044 "ctangle.w"
 {
 c= ccode[(eight_bits)*loc++];
 switch(c){
@@ -1017,12 +1079,12 @@
 continue;
 case section_name:
 cur_section_name_char= *(loc-1);
-/*70:*/
-#line 1098 "ctangle.w"
+/*77:*/
+#line 1092 "ctangle.w"
 {
 char*k;
-/*72:*/
-#line 1118 "ctangle.w"
+/*79:*/
+#line 1112 "ctangle.w"
 
 k= section_text;
 while(1){
@@ -1032,8 +1094,8 @@
 loc= buffer+1;break;
 }
 c= *loc;
-/*73:*/
-#line 1142 "ctangle.w"
+/*80:*/
+#line 1136 "ctangle.w"
 
 if(c=='@'){
 c= *(loc+1);
@@ -1051,9 +1113,9 @@
 *(++k)= '@';loc++;
 }
 
-/*:73*/
-#line 1127 "ctangle.w"
-;
+/*:80*/
+#line 1121 "ctangle.w"
+
 loc++;if(k<section_text_end)k++;
 if(xisspace(c)){
 c= ' ';if(*(k-1)==' ')k--;
@@ -1061,7 +1123,7 @@
 *k= c;
 }
 if(k>=section_text_end){
-printf("\n! Section name too long: ");
+fputs("\n! Section name too long: ",stdout);
 
 term_write(section_text+1,25);
 printf("...");mark_harmless;
@@ -1068,15 +1130,15 @@
 }
 if(*k==' '&&k> section_text)k--;
 
-/*:72*/
-#line 1100 "ctangle.w"
-;
+/*:79*/
+#line 1094 "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);
 if(cur_section_name_char=='(')
-/*40:*/
-#line 516 "ctangle.w"
+/*47:*/
+#line 502 "ctangle.w"
 
 {
 for(an_output_file= cur_out_file;
@@ -1091,17 +1153,17 @@
 }
 }
 
-/*:40*/
-#line 1106 "ctangle.w"
-;
+/*:47*/
+#line 1100 "ctangle.w"
+
 return(section_name);
 }
 
-/*:70*/
-#line 1064 "ctangle.w"
-;
-case string:/*74:*/
-#line 1164 "ctangle.w"
+/*:77*/
+#line 1058 "ctangle.w"
+
+case string:/*81:*/
+#line 1158 "ctangle.w"
 {
 id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
 while(*loc!='@'||*(loc+1)!='>')loc++;
@@ -1111,12 +1173,12 @@
 return(string);
 }
 
-/*:74*/
-#line 1065 "ctangle.w"
-;
-case ord:/*69:*/
-#line 1077 "ctangle.w"
+/*:81*/
+#line 1059 "ctangle.w"
 
+case ord:/*76:*/
+#line 1071 "ctangle.w"
+
 id_first= loc;
 if(*loc=='\\'){
 if(*++loc=='\'')loc++;
@@ -1137,15 +1199,15 @@
 loc++;
 return(ord);
 
-/*:69*/
-#line 1066 "ctangle.w"
-;
+/*:76*/
+#line 1060 "ctangle.w"
+
 default:return(c);
 }
 }
 
-/*:68*/
-#line 929 "ctangle.w"
+/*:75*/
+#line 921 "ctangle.w"
 
 else if(xisspace(c)){
 if(!preprocessing||loc> limit)continue;
@@ -1153,14 +1215,14 @@
 else return(' ');
 }
 else if(c=='#'&&loc==buffer+1)preprocessing= 1;
-mistake:/*64:*/
-#line 950 "ctangle.w"
+mistake:/*71:*/
+#line 942 "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);
@@ -1174,26 +1236,26 @@
 else if(*loc=='<')compress(lt_lt);break;
 case'&':if(*loc=='&')compress(and_and);break;
 case'|':if(*loc=='|')compress(or_or);break;
-case'!':if(*loc=='=')compress(not_eq);break;
+case'!':if(*loc=='=')compress(non_eq);break;
 }
 
-/*:64*/
-#line 936 "ctangle.w"
+/*:71*/
+#line 928 "ctangle.w"
 
 return(c);
 }
 }
 
-/*:63*//*76:*/
-#line 1199 "ctangle.w"
+/*:70*//*84:*/
+#line 1196 "ctangle.w"
 
-void
-scan_repl(t)
-eight_bits t;
+static void
+scan_repl(
+eight_bits t)
 {
 sixteen_bits a;
-if(t==section_name){/*77:*/
-#line 1225 "ctangle.w"
+if(t==section_name){/*85:*/
+#line 1222 "ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1204,15 +1266,15 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
-app_repl(a%0400);}
+{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
+app_repl(a_l%0400);}
 
-/*:77*/
-#line 1205 "ctangle.w"
-;}
+/*:85*/
+#line 1202 "ctangle.w"
+}
 while(1)switch(a= get_next()){
-/*78:*/
-#line 1238 "ctangle.w"
+/*86:*/
+#line 1235 "ctangle.w"
 
 case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
 app_repl((a/0400)+0200);
@@ -1219,8 +1281,8 @@
 app_repl(a%0400);break;
 case section_name:if(t!=section_name)goto done;
 else{
-/*79:*/
-#line 1271 "ctangle.w"
+/*87:*/
+#line 1268 "ctangle.w"
 {
 char*try_loc= loc;
 while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1232,14 +1294,14 @@
 
 }
 
-/*:79*/
-#line 1244 "ctangle.w"
-;
+/*:87*/
+#line 1241 "ctangle.w"
+
 a= cur_section_name-name_dir;
 app_repl((a/0400)+0250);
 app_repl(a%0400);
-/*77:*/
-#line 1225 "ctangle.w"
+/*85:*/
+#line 1222 "ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1250,12 +1312,12 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
-app_repl(a%0400);}
+{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
+app_repl(a_l%0400);}
 
-/*:77*/
-#line 1248 "ctangle.w"
-;break;
+/*:85*/
+#line 1245 "ctangle.w"
+break;
 }
 case output_defs_code:if(t!=section_name)err_print("! Misplaced @h");
 
@@ -1264,8 +1326,8 @@
 a= output_defs_flag;
 app_repl((a/0400)+0200);
 app_repl(a%0400);
-/*77:*/
-#line 1225 "ctangle.w"
+/*85:*/
+#line 1222 "ctangle.w"
 
 store_two_bytes(0150000);
 if(changing&&include_depth==change_depth){
@@ -1276,17 +1338,17 @@
 store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc= id_first+strlen(id_first);
-{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
-app_repl(a%0400);}
+{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
+app_repl(a_l%0400);}
 
-/*:77*/
-#line 1257 "ctangle.w"
-;
+/*:85*/
+#line 1254 "ctangle.w"
+
 }
 break;
 case constant:case string:
-/*80:*/
-#line 1282 "ctangle.w"
+/*88:*/
+#line 1279 "ctangle.w"
 
 app_repl(a);
 while(id_first<id_loc){
@@ -1299,12 +1361,12 @@
 }
 app_repl(a);break;
 
-/*:80*/
-#line 1261 "ctangle.w"
-;
+/*:88*/
+#line 1258 "ctangle.w"
+
 case ord:
-/*81:*/
-#line 1298 "ctangle.w"
+/*89:*/
+#line 1295 "ctangle.w"
 {
 int c= (eight_bits)*id_first;
 if(c=='\\'){
@@ -1330,12 +1392,12 @@
 if(xisdigit(*(id_first+1)))c= *(++id_first)-'0';
 else if(xisxdigit(*(id_first+1))){
 ++id_first;
-c= toupper(*id_first)-'A'+10;
+c= toupper((eight_bits)*id_first)-'A'+10;
 }
 if(xisdigit(*(id_first+1)))c= 16*c+*(++id_first)-'0';
 else if(xisxdigit(*(id_first+1))){
 ++id_first;
-c= 16*c+toupper(*id_first)-'A'+10;
+c= 16*c+toupper((eight_bits)*id_first)-'A'+10;
 }
 break;
 case'\\':c= '\\';break;
@@ -1354,9 +1416,9 @@
 }
 break;
 
-/*:81*/
-#line 1263 "ctangle.w"
-;
+/*:89*/
+#line 1260 "ctangle.w"
+
 case definition:case format_code:case begin_C:if(t!=section_name)goto done;
 else{
 err_print("! @d, @f and @c are ignored in C text");continue;
@@ -1364,8 +1426,8 @@
 }
 case new_section:goto done;
 
-/*:78*/
-#line 1210 "ctangle.w"
+/*:86*/
+#line 1207 "ctangle.w"
 
 case')':app_repl(a);
 if(t==macro)app_repl(' ');
@@ -1377,11 +1439,11 @@
 cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
 }
 
-/*:76*//*83:*/
+/*:84*//*92:*/
 #line 1360 "ctangle.w"
 
-void
-scan_section()
+static void
+scan_section(void)
 {
 name_pointer p;
 text_pointer q;
@@ -1392,7 +1454,7 @@
 }
 next_control= 0;
 while(1){
-/*84:*/
+/*93:*/
 #line 1399 "ctangle.w"
 
 while(next_control<definition)
@@ -1401,11 +1463,11 @@
 loc-= 2;next_control= get_next();
 }
 
-/*:84*/
+/*:93*/
 #line 1374 "ctangle.w"
-;
+
 if(next_control==definition){
-/*85:*/
+/*94:*/
 #line 1406 "ctangle.w"
 {
 while((next_control= get_next())=='\n');
@@ -1424,7 +1486,7 @@
 cur_text->text_link= 0;
 }
 
-/*:85*/
+/*:94*/
 #line 1376 "ctangle.w"
 
 continue;
@@ -1434,7 +1496,7 @@
 }
 if(next_control==section_name){
 p= cur_section_name;
-/*86:*/
+/*95:*/
 #line 1431 "ctangle.w"
 
 while((next_control= get_next())=='+');
@@ -1441,34 +1503,34 @@
 if(next_control!='='&&next_control!=eq_eq)
 continue;
 
-/*:86*/
+/*:95*/
 #line 1384 "ctangle.w"
-;
+
 break;
 }
 return;
 }
 no_where= print_where= 0;
-/*87:*/
+/*96:*/
 #line 1436 "ctangle.w"
 
-/*88:*/
+/*97:*/
 #line 1441 "ctangle.w"
 
 store_two_bytes((sixteen_bits)(0150000+section_count));
 
 
-/*:88*/
+/*:97*/
 #line 1437 "ctangle.w"
-;
+
 scan_repl(section_name);
-/*89:*/
+/*98:*/
 #line 1445 "ctangle.w"
 
 if(p==name_dir||p==0){
 (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
 }
-else if(p->equiv==(char*)text_info)p->equiv= (char*)cur_text;
+else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
 
 else{
 q= (text_pointer)p->equiv;
@@ -1479,20 +1541,20 @@
 cur_text->text_link= section_flag;
 
 
-/*:89*/
+/*:98*/
 #line 1439 "ctangle.w"
-;
 
-/*:87*/
+
+/*:96*/
 #line 1390 "ctangle.w"
-;
+
 }
 
-/*:83*//*91:*/
+/*:92*//*100:*/
 #line 1463 "ctangle.w"
 
-void
-phase_one(){
+static void
+phase_one(void){
 phase= 1;
 section_count= 0;
 reset_input();
@@ -1502,11 +1564,11 @@
 phase= 2;
 }
 
-/*:91*//*93:*/
+/*:100*//*102:*/
 #line 1481 "ctangle.w"
 
-void
-skip_limbo()
+static void
+skip_limbo(void)
 {
 char c;
 while(1){
@@ -1517,7 +1579,7 @@
 c= *loc++;
 if(ccode[(eight_bits)c]==new_section)break;
 switch(ccode[(eight_bits)c]){
-case translit_code:/*94:*/
+case translit_code:/*103:*/
 #line 1510 "ctangle.w"
 
 while(xisspace(*loc)&&loc<limit)loc++;
@@ -1527,7 +1589,7 @@
 err_print("! Improper hex number following @l");
 
 else{
-unsigned i;
+unsigned int i;
 char*beg;
 sscanf(loc-3,"%x",&i);
 while(xisspace(*loc)&&loc<limit)loc++;
@@ -1537,14 +1599,14 @@
 err_print("! Replacement string in @l too long");
 
 else{
-strncpy(translit[i-0200],beg,loc-beg);
+strncpy(translit[i-0200],beg,(size_t)(loc-beg));
 translit[i-0200][loc-beg]= '\0';
 }
 }
 
-/*:94*/
+/*:103*/
 #line 1494 "ctangle.w"
-;break;
+break;
 case format_code:case'@':break;
 case control_text:if(c=='q'||c=='Q'){
 while((c= skip_ahead())=='@');
@@ -1560,20 +1622,20 @@
 }
 }
 
-/*:93*//*95:*/
+/*:102*//*104:*/
 #line 1536 "ctangle.w"
 
 void
-print_stats(){
-printf("\nMemory usage statistics:\n");
+print_stats(void){
+puts("\nMemory usage statistics:");
 printf("%ld names (out of %ld)\n",
-(long)(name_ptr-name_dir),(long)max_names);
+(ptrdiff_t)(name_ptr-name_dir),(long)max_names);
 printf("%ld replacement texts (out of %ld)\n",
-(long)(text_ptr-text_info),(long)max_texts);
+(ptrdiff_t)(text_ptr-text_info),(long)max_texts);
 printf("%ld bytes (out of %ld)\n",
-(long)(byte_ptr-byte_mem),(long)max_bytes);
+(ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
 printf("%ld tokens (out of %ld)\n",
-(long)(tok_ptr-tok_mem),(long)max_toks);
+(ptrdiff_t)(tok_ptr-tok_mem),(long)max_toks);
 }
 
-/*:95*/
+/*:104*/

Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.w	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.w	2021-02-07 11:02:17 UTC (rev 57658)
@@ -2,9 +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 3.64 --- February 2002
-% (same as Version 3.5 except for minor corrections)
-% (also quotes backslashes in file names of #line directives)
+% Version 4.0 --- February 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -17,6 +15,11 @@
 % entire resulting derived work is given a different name and distributed
 % under the terms of a permission notice identical to this one.
 
+% Amendments to 'ctangle.w' resulting in this updated version were created
+% by numerous collaborators over the course of many years.
+
+% Please send comments, suggestions, etc. to tex-k@@tug.org.
+
 % Here is TeX material that gets inserted after \input cwebmac
 \def\hang{\hangindent 3em\indent\ignorespaces}
 \def\pb{$\.|\ldots\.|$} % C brackets (|...|)
@@ -24,11 +27,11 @@
 \mathchardef\RA="3221 % right arrow
 \mathchardef\BA="3224 % double arrow
 
-\def\title{CTANGLE (Version 3.64)}
+\def\title{CTANGLE (Version 4.0)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont The {\ttitlefont CTANGLE} processor}
   \vskip 15pt
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -46,7 +49,6 @@
 }
 \pageno=\contentspagenumber \advance\pageno by 1
 \let\maybe=\iftrue
- at s not_eq normal @q unreserve a C++ keyword @>
 
 @** Introduction.
 This is the \.{CTANGLE} program by Silvio Levy and Donald E. Knuth,
@@ -59,7 +61,7 @@
 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
 is modified.
 
- at d banner "This is CTANGLE (Version 3.64)\n"
+ at d banner "This is CTANGLE (Version 4.0)"
 
 @c
 @<Include files@>@/
@@ -69,18 +71,6 @@
 @<Global variables@>@/
 @<Predeclaration of procedures@>@/
 
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
-
 @ \.{CTANGLE} has a fairly straightforward outline.  It operates in
 two phases: First it reads the source file, saving the \CEE/ code in
 compressed form; then it shuffles and outputs the code.
@@ -89,41 +79,27 @@
 to \.{CTANGLE} and \.{CWEAVE}, before proceeding further.
 
 @c
-int main (ac, av)
-int ac;
-char **av;
+int main (
+int ac,
+char **av)
 {
   argc=ac; argv=av;
   program=ctangle;
-  @<Set initial values@>;
+  @<Set initial values@>@;
   common_init();
-  if (show_banner) printf(banner); /* print a ``banner line'' */
+  if (show_banner) puts(banner); /* print a ``banner line'' */
   phase_one(); /* read all the user's text and compress it into |tok_mem| */
   phase_two(); /* output the contents of the compressed tables */
   return wrap_up(); /* and exit gracefully */
 }
 
-@ The following parameters were sufficient in the original \.{TANGLE} to
-handle \TEX/,
-so they should be sufficient for most applications of \.{CTANGLE}.
-If you change |max_bytes|, |max_names|, or |hash_size| you should also
-change them in the file |"common.w"|.
-
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names; used in |"common.w"| */
- at d max_toks 270000 /* number of bytes in compressed \CEE/ code */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240; used in |"common.w"| */
- at d max_texts 2500 /* number of replacement texts, must be less than 10240 */
- at d hash_size 353 /* should be prime; used in |"common.w"| */
- at d longest_name 10000 /* section names and strings shouldn't be longer than this */
- at d stack_size 50 /* number of simultaneous levels of macro expansion */
- at d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
-
 @ The next few sections contain stuff from the file |"common.w"| that must
 be included in both |"ctangle.w"| and |"cweave.w"|. It appears in
-file |"common.h"|, which needs to be updated when |"common.w"| changes.
+file |"common.h"|, which is also included in |"common.w"| to propagate
+possible changes from this \.{COMMON} interface consistently.
 
+First comes general stuff:
+
 @i common.h
 
 @* Data structures exclusive to {\tt CTANGLE}.
@@ -137,7 +113,7 @@
 |tok_mem|, which tells where the corresponding text starts, and an
 integer |text_link|, which, as we shall see later, is used to connect
 pieces of text that have the same name.  All the \&{text}s are stored in
-the array |text_info|, and we use a |text_pointer| variable to refer
+the array |text_info|, and we use a \&{text\_pointer} variable to refer
 to them.
 
 The first position of |tok_mem| that is unoccupied by
@@ -145,10 +121,6 @@
 |text_info| is called |text_ptr|.  Thus we usually have the identity
 |text_ptr->tok_start==tok_ptr|.
 
-If your machine does not support |unsigned char| you should change
-the definition of \&{eight\_bits} to |unsigned short|.
-@^system dependencies@>
-
 @<Typed...@>=
 typedef struct {
   eight_bits *tok_start; /* pointer into |tok_mem| */
@@ -175,17 +147,18 @@
 @d equiv equiv_or_xref /* info corresponding to names */
 
 @ @<Set init...@>=
-name_dir->equiv=(char *)text_info; /* the undefined section has no replacement text */
+init_node(name_dir); /* the undefined section has no replacement text */
 
 @ Here's the procedure that decides whether a name of length |l|
 starting at position |first| equals the identifier pointed to by |p|:
 
 @c
-int names_match(p,first,l)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-{
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
+{@+(void)t;
   if (length(p)!=l) return 0;
   return !strncmp(first,p->byte_start,l);
 }
@@ -197,13 +170,13 @@
 
 @c
 void
-init_node(node)
-name_pointer node;
+init_node(
+name_pointer node)
 {
-    node->equiv=(char *)text_info;
+    node->equiv=(void *)text_info;
 }
 void
-init_p() {}
+init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
 
 @* Tokens.
 Replacement texts, which represent \CEE/ code in a compressed format,
@@ -257,10 +230,13 @@
 @ The following procedure is used to enter a two-byte value into
 |tok_mem| when a replacement text is being generated.
 
- at c
+@<Predecl...@>=
+static void store_two_bytes(sixteen_bits);@/
+
+@ @c
 void
-store_two_bytes(x)
-sixteen_bits x;
+store_two_bytes(
+sixteen_bits x)
 {
   if (tok_ptr+2>tok_mem_end) overflow("token");
   *tok_ptr++=x>>8; /* store high byte */
@@ -333,10 +309,14 @@
 We assume that the \CEE/ compiler can copy structures.
 @^system dependencies@>
 
- at c
-void
-push_level(p) /* suspends the current level */
-name_pointer p;
+@<Predecl...@>=
+static void push_level(name_pointer);@/
+static void pop_level(int);@/
+
+@ @c
+static void
+push_level(@t\1\1@> /* suspends the current level */
+name_pointer p at t\2\2@>)
 {
   if (stack_ptr==stack_end) overflow("stack");
   *stack_ptr=cur_state;
@@ -353,9 +333,9 @@
 text or returns the state to the most recently stacked level.
 
 @c
-void
-pop_level(flag) /* do this when |cur_byte| reaches |cur_end| */
-int flag; /* |flag==0| means we are in |output_defs| */
+static void
+pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
+int flag at t\2\2@>) /* |flag==0| 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 */
@@ -388,9 +368,12 @@
 |stack_ptr==stack|.
 @^high-bit character handling@>
 
- at c
-void
-get_output() /* sends next token to |out_char| */
+@<Predecl...@>=
+static void get_output(void);@/
+
+@ @c
+static void
+get_output(void) /* sends next token to |out_char| */
 {
   sixteen_bits a; /* value of current byte */
   restart: if (stack_ptr==stack) return;
@@ -409,7 +392,7 @@
     switch (a/024000) { /* |024000==(0250-0200)*0400| */
       case 0: cur_val=a; out_char(identifier); break;
       case 1: if (a==output_defs_flag) output_defs();
-        else @<Expand section |a-024000|, |goto restart|@>;
+        else @<Expand section |a-024000|, |goto restart|@>@;
         break;
       default: cur_val=a-050000; if (cur_val>0) cur_section=cur_val;
         out_char(section_number);
@@ -423,9 +406,9 @@
 @<Expand section |a-...@>=
 {
   a-=024000;
-  if ((a+name_dir)->equiv!=(char *)text_info) push_level(a+name_dir);
+  if ((a+name_dir)->equiv!=(void *)text_info) push_level(a+name_dir);
   else if (a!=0) {
-    printf("\n! Not present: <");
+    fputs("\n! Not present: <",stdout);
     print_section_name(a+name_dir); err_print(">");
 @.Not present: <section name>@>
   }
@@ -478,9 +461,12 @@
 During the output process, |cur_line| equals the number of the next line
 to be output.
 
- at c
-void
-flush_buffer() /* writes one line to output file */
+@<Predecl...@>=
+static void flush_buffer(void);@/
+
+@ @c
+static void
+flush_buffer(void) /* writes one line to output file */
 {
   C_putc('\n');
   if (cur_line % 100 == 0 && show_progress) {
@@ -503,7 +489,7 @@
 name_pointer output_files[max_files];
 name_pointer *cur_out_file, *end_output_files, *an_output_file;
 char cur_section_name_char; /* is it |'<'| or |'('| */
-char output_file_name[longest_name]; /* name of the file */
+char output_file_name[longest_name+1]; /* name of the file */
 
 @ We make |end_output_files| point just beyond the end of
 |output_files|. The stack pointer
@@ -531,17 +517,17 @@
 output.
 
 @<Predecl...@>=
-void phase_two();
+static void phase_two(void);@/
 
 @ @c
-void
-phase_two () {
+static void
+phase_two (void) {
   web_file_open=0;
   cur_line=1;
-  @<Initialize the output stacks@>;
-  @<Output macro definitions if appropriate@>;
+  @<Initialize the output stacks@>@;
+  @<Output macro definitions if appropriate@>@;
   if (text_info->text_link==0 && cur_out_file==end_output_files) {
-    printf("\n! No program text was specified."); mark_harmless;
+    fputs("\n! No program text was specified.",stdout); mark_harmless;
 @.No program text...@>
   }
   else {
@@ -551,7 +537,7 @@
     }
     else {
       if (show_progress) {
-        printf("\nWriting the output files:");
+        fputs("\nWriting the output files:",stdout);
 @.Writing the output...@>
         printf(" (%s)",C_file_name);
         update_terminal;
@@ -560,8 +546,11 @@
     }
     while (stack_ptr>stack) get_output();
     flush_buffer();
-writeloop:   @<Write all the named output files@>;
-    if(show_happiness) printf("\nDone.");
+writeloop:   @<Write all the named output files@>@;
+    if (show_happiness) {
+      if (show_progress) new_line;
+      fputs("Done.",stdout);
+    }
   }
 }
 
@@ -574,10 +563,10 @@
     an_output_file--;
     sprint_section_name(output_file_name,*an_output_file);
     fclose(C_file);
-    C_file=fopen(output_file_name,"w");
-    if (C_file ==0) fatal("! Cannot open output file:",output_file_name);
+    C_file=fopen(output_file_name,"wb");
+    if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
 @.Cannot open output file@>
-    printf("\n(%s)",output_file_name); update_terminal;
+    if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
     cur_line=1;
     stack_ptr=stack+1;
     cur_name= (*an_output_file);
@@ -600,11 +589,12 @@
 boolean output_defs_seen=0;
 
 @ @<Predecl...@>=
-void output_defs();
+static void output_defs(void);@/
+static void out_char(eight_bits);@/
 
 @ @c
-void
-output_defs()
+static void
+output_defs(void)
 {
   sixteen_bits a;
   push_level(NULL);
@@ -645,13 +635,10 @@
 |'\n'| (protect the newline), |string| (end the string), or |constant|
 (end the constant).
 
-@<Predecl...@>=
-static void out_char();
-
-@ @c
+ at c
 static void
-out_char(cur_char)
-eight_bits cur_char;
+out_char(
+eight_bits cur_char)
 {
   char *j, *k; /* pointer into |byte_mem| */
 restart:
@@ -659,9 +646,9 @@
       case '\n': if (protect && out_state!=verbatim) C_putc(' ');
         if (protect || out_state==verbatim) C_putc('\\');
         flush_buffer(); if (out_state!=verbatim) out_state=normal; break;
-      @/@t\4@>@<Case of an identifier@>;
-      @/@t\4@>@<Case of a section number@>;
-      @/@t\4@>@<Cases like \.{!=}@>;
+      @/@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(' ');
         out_state=normal; break;
       case join: out_state=unbreakable; break;
@@ -679,22 +666,22 @@
 }
 
 @ @<Cases like \.{!=}@>=
-case plus_plus: C_putc('+'); C_putc('+'); out_state=normal; break;
-case minus_minus: C_putc('-'); C_putc('-'); out_state=normal; break;
-case minus_gt: C_putc('-'); C_putc('>'); out_state=normal; break;
-case gt_gt: C_putc('>'); C_putc('>'); out_state=normal; break;
-case eq_eq: C_putc('='); C_putc('='); out_state=normal; break;
-case lt_lt: C_putc('<'); C_putc('<'); out_state=normal; break;
-case gt_eq: C_putc('>'); C_putc('='); out_state=normal; break;
-case lt_eq: C_putc('<'); C_putc('='); out_state=normal; break;
-case not_eq: C_putc('!'); C_putc('='); out_state=normal; break;
-case and_and: C_putc('&'); C_putc('&'); out_state=normal; break;
-case or_or: C_putc('|'); C_putc('|'); out_state=normal; break;
-case dot_dot_dot: C_putc('.'); C_putc('.'); C_putc('.'); out_state=normal;
+case plus_plus: C_putc('+');@+C_putc('+'); out_state=normal; break;
+case minus_minus: C_putc('-');@+C_putc('-'); out_state=normal; break;
+case minus_gt: C_putc('-');@+C_putc('>'); out_state=normal; break;
+case gt_gt: C_putc('>');@+C_putc('>'); out_state=normal; break;
+case eq_eq: C_putc('=');@+C_putc('='); out_state=normal; break;
+case lt_lt: C_putc('<');@+C_putc('<'); out_state=normal; break;
+case gt_eq: C_putc('>');@+C_putc('='); out_state=normal; break;
+case lt_eq: C_putc('<');@+C_putc('='); out_state=normal; break;
+case non_eq: C_putc('!');@+C_putc('='); out_state=normal; break;
+case and_and: C_putc('&');@+C_putc('&'); out_state=normal; break;
+case or_or: C_putc('|');@+C_putc('|'); out_state=normal; break;
+case dot_dot_dot: C_putc('.');@+C_putc('.');@+C_putc('.'); out_state=normal;
     break;
-case colon_colon: C_putc(':'); C_putc(':'); out_state=normal; break;
-case period_ast: C_putc('.'); C_putc('*'); out_state=normal; break;
-case minus_gt_ast: C_putc('-'); C_putc('>'); C_putc('*'); out_state=normal;
+case colon_colon: C_putc(':');@+C_putc(':'); out_state=normal; break;
+case period_ast: C_putc('.');@+C_putc('*'); out_state=normal; break;
+case minus_gt_ast: C_putc('-');@+C_putc('>');@+C_putc('*'); out_state=normal;
     break;
 
 @ When an identifier is output to the \CEE/ file, characters in the
@@ -713,7 +700,7 @@
 @ @<Set init...@>=
 {
   int i;
-  for (i=0;i<128;i++) sprintf(translit[i],"X%02X",(unsigned)(128+i));
+  for (i=0;i<128;i++) sprintf(translit[i],"X%02X",(unsigned int)(128+i));
 }
 
 @ @<Case of an identifier@>=
@@ -722,9 +709,9 @@
   j=(cur_val+name_dir)->byte_start;
   k=(cur_val+name_dir+1)->byte_start;
   while (j<k) {
-    if ((unsigned char)(*j)<0200) C_putc(*j);
+    if ((eight_bits)(*j)<0200) C_putc(*j);
 @^high-bit character handling@>
-    else C_printf("%s",translit[(unsigned char)(*j)-0200]);
+    else C_printf("%s",translit[(eight_bits)(*j)-0200]);
     j++;
   }
   out_state=num_or_id; break;
@@ -810,9 +797,13 @@
 @ The |skip_ahead| procedure reads through the input at fairly high speed
 until finding the next non-ignorable control code, which it returns.
 
- at c
-eight_bits
-skip_ahead() /* skip to next control code */
+@<Predecl...@>=
+static eight_bits skip_ahead(void);@/
+static boolean skip_comment(boolean);@/
+
+@ @c
+static eight_bits
+skip_ahead(void) /* skip to next control code */
 {
   eight_bits c; /* control code found */
   while (1) {
@@ -846,8 +837,8 @@
 boolean comment_continues=0; /* are we scanning a comment? */
 
 @ @c
-int skip_comment(is_long_comment) /* skips over comments */
-boolean is_long_comment;
+static boolean skip_comment(@t\1\1@> /* skips over comments */
+boolean is_long_comment at t\2\2@>)
 {
   char c; /* current character */
   while (1) {
@@ -885,21 +876,20 @@
 name_pointer cur_section_name; /* name of section just scanned */
 int no_where; /* suppress |print_where|? */
 
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
-
 @ As one might expect, |get_next| consists mostly of a big switch
 that branches to the various special cases that can arise.
 
 @d isxalpha(c) ((c)=='_' || (c)=='$') 
   /* non-alpha characters allowed in identifier */
- at d ishigh(c) ((unsigned char)(c)>0177)
+ at d ishigh(c) ((eight_bits)(c)>0177)
 @^high-bit character handling@>
 
- at c
-eight_bits
-get_next() /* produces the next input token */
+@<Predecl...@>=
+static eight_bits get_next(void);@/
+
+@ @c
+static eight_bits
+get_next(void) /* produces the next input token */
 {
   static int preprocessing=0;
   eight_bits c; /* the current character */
@@ -909,7 +899,7 @@
       if (get_line()==0) return(new_section);
       else if (print_where && !no_where) {
           print_where=0;
-          @<Insert the line number into |tok_mem|@>;
+          @<Insert the line number into |tok_mem|@>@;
         }
         else return ('\n');
     }
@@ -922,7 +912,9 @@
     }
     loc++;
     if (xisdigit(c) || c=='.') @<Get a constant@>@;
-    else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"')))
+    else if (c=='\'' || c=='"'@|
+           || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
+           || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"')))
         @<Get a string@>@;
     else if (isalpha(c) || isxalpha(c) || ishigh(c))
       @<Get an identifier@>@;
@@ -951,8 +943,8 @@
 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);
@@ -966,12 +958,13 @@
     else if (*loc=='<') compress(lt_lt); break;
   case '&': if (*loc=='&') compress(and_and); break;
   case '|': if (*loc=='|') compress(or_or); break;
-  case '!': if (*loc=='=') compress(not_eq); break;
+  case '!': if (*loc=='=') compress(non_eq); break;
 }
 
 @ @<Get an identifier@>= {
   id_first=--loc;
-  while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
+  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
   id_loc=loc; return(identifier);
 }
 
@@ -1007,7 +1000,8 @@
   char delim = c; /* what started the string */
   id_first = section_text+1;
   id_loc = section_text; *++id_loc=delim;
-  if (delim=='L') { /* wide character constant */
+  if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
+    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
     delim=*loc++; *++id_loc=delim;
   }
   while (1) {
@@ -1035,7 +1029,7 @@
     if (++id_loc<=section_text_end) *id_loc=c;
   }
   if (id_loc>=section_text_end) {
-    printf("\n! String too long: ");
+    fputs("\n! String too long: ",stdout);
 @.String too long@>
     term_write(section_text+1,25);
     err_print("...");
@@ -1061,9 +1055,9 @@
       continue;
     case section_name:
       cur_section_name_char=*(loc-1);
-      @<Scan the section name and make |cur_section_name| point to it@>;
-    case string: @<Scan a verbatim string@>;
-    case ord: @<Scan an ASCII constant@>;
+      @<Scan the section name and make |cur_section_name| point to it@>@;
+    case string: @<Scan a verbatim string@>@;
+    case ord: @<Scan an ASCII constant@>@;
     default: return(c);
   }
 }
@@ -1097,13 +1091,13 @@
 
 @ @<Scan the section name...@>= {
   char *k; /* pointer into |section_text| */
-  @<Put section name 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);
   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@>;
+          complain we're out of room@>@;
   return(section_name);
 }
 
@@ -1124,7 +1118,7 @@
     loc=buffer+1; break;
   }
   c=*loc;
-  @<If end of name or erroneous nesting, |break|@>;
+  @<If end of name or erroneous nesting, |break|@>@;
   loc++; if (k<section_text_end) k++;
   if (xisspace(c)) {
     c=' '; if (*(k-1)==' ') k--;
@@ -1132,7 +1126,7 @@
 *k=c;
 }
 if (k>=section_text_end) {
-  printf("\n! Section name too long: ");
+  fputs("\n! Section name too long: ",stdout);
 @.Section name too long@>
   term_write(section_text+1,25);
   printf("..."); mark_harmless;
@@ -1196,13 +1190,16 @@
 text_pointer cur_text; /* replacement text formed by |scan_repl| */
 eight_bits next_control;
 
+@ @<Predecl...@>=
+static void scan_repl(eight_bits);@/
+
 @ @c
-void
-scan_repl(t) /* creates a replacement text */
-eight_bits t;
+static void
+scan_repl(@t\1\1@> /* creates a replacement text */
+eight_bits t at t\2\2@>)
 {
   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 (1) 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
@@ -1232,8 +1229,8 @@
   store_two_bytes((sixteen_bits)cur_line);
 }
 id_loc=id_first+strlen(id_first);
-{int a=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a / 0400)+0200);
-  app_repl(a % 0400);}
+{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...@>=
 case identifier: a=id_lookup(id_first,id_loc,0)-name_dir;
@@ -1241,11 +1238,11 @@
   app_repl(a % 0400); break;
 case section_name: if (t!=section_name) goto done;
   else {
-    @<Was an `@@' missed here?@>;
+    @<Was an `@@' missed here?@>@;
     a=cur_section_name-name_dir;
     app_repl((a / 0400)+0250);
     app_repl(a % 0400);
-    @<Insert the line number into |tok_mem|@>; break;
+    @<Insert the line number into |tok_mem|@>@; break;
   }
 case output_defs_code: if (t!=section_name) err_print("! Misplaced @@h");
 @.Misplaced @@h@>
@@ -1254,13 +1251,13 @@
     a=output_defs_flag;
     app_repl((a / 0400)+0200);
     app_repl(a % 0400);
-    @<Insert the line number into |tok_mem|@>;
+    @<Insert the line number into |tok_mem|@>@;
   }
  break;
 case constant: case string:
-  @<Copy a string or verbatim construction or numerical constant@>;
+  @<Copy a string or verbatim construction or numerical constant@>@;
 case ord:
-  @<Copy an ASCII constant@>;
+  @<Copy an ASCII constant@>@;
 case definition: case format_code: case begin_C: if (t!=section_name) goto done;
   else {
     err_print("! @@d, @@f and @@c are ignored in C text"); continue;
@@ -1320,12 +1317,12 @@
       if (xisdigit(*(id_first+1))) c=*(++id_first)-'0';
       else if (xisxdigit(*(id_first+1))) {
         ++id_first;
-        c=toupper(*id_first)-'A'+10;
+        c=toupper((eight_bits)*id_first)-'A'+10;
       }
       if (xisdigit(*(id_first+1))) c=16*c+*(++id_first)-'0';
       else if (xisxdigit(*(id_first+1))) {
         ++id_first;
-        c=16*c+toupper(*id_first)-'A'+10;
+        c=16*c+toupper((eight_bits)*id_first)-'A'+10;
       }
       break;
     case '\\':c='\\';@+break;
@@ -1357,9 +1354,12 @@
 that are significant to \.{CTANGLE}: those
 that delimit a definition, the \CEE/ part of a module, or a new module.
 
- at c
-void
-scan_section()
+@<Predecl...@>=
+static void scan_section(void);@/
+
+@ @c
+static void
+scan_section(void)
 {
   name_pointer p; /* section name for the current section */
   text_pointer q; /* text for the current section */
@@ -1371,7 +1371,7 @@
   next_control=0;
   while (1) {
     @<Skip ahead until |next_control| corresponds to \.{@@d}, \.{@@<},
-      \.{@@\ } or the like@>;
+      \.{@@\ } or the like@>@;
     if (next_control == definition) {  /* \.{@@d} */
         @<Scan a definition@>@;
         continue;
@@ -1381,13 +1381,13 @@
     }
     if (next_control == section_name) { /* \.{@@<} or \.{@@(} */
       p=cur_section_name;
-      @<If section is not being defined, |continue| @>;
+      @<If section is not being defined, |continue| @>@;
       break;
     }
     return; /* \.{@@\ } or \.{@@*} */
   }
   no_where=print_where=0;
-  @<Scan the \CEE/ part of the current section@>;
+  @<Scan the \CEE/ part of the current section@>@;
 }
 
 @ At the top of this loop, if |next_control==section_name|, the
@@ -1404,7 +1404,7 @@
   }
 
 @ @<Scan a definition@>= {
-  while ((next_control=get_next())=='\n'); /*allow newline before definition */
+  while ((next_control=get_next())=='\n'); /* allow newline before definition */
   if (next_control!=identifier) {
     err_print("! Definition flushed, must start with identifier");
 @.Definition flushed...@>
@@ -1434,9 +1434,9 @@
   continue;
 
 @ @<Scan the \CEE/...@>=
-@<Insert the section number into |tok_mem|@>;
+@<Insert the section number into |tok_mem|@>@;
 scan_repl(section_name); /* now |cur_text| points to the replacement text */
-@<Update the data structure so that the replacement text is accessible@>;
+@<Update the data structure so that the replacement text is accessible@>@;
 
 @ @<Insert the section number...@>=
 store_two_bytes((sixteen_bits)(0150000+section_count));
@@ -1446,7 +1446,7 @@
 if (p==name_dir||p==0) { /* unnamed section, or bad section name */
   (last_unnamed)->text_link=cur_text-text_info; last_unnamed=cur_text;
 }
-else if (p->equiv==(char *)text_info) p->equiv=(char *)cur_text;
+else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;
   /* first section of this name */
 else {
   q=(text_pointer)p->equiv;
@@ -1458,11 +1458,11 @@
   /* mark this replacement text as a nonmacro */
 
 @ @<Predec...@>=
-void phase_one();
+static void phase_one(void);@/
 
 @ @c
-void
-phase_one() {
+static void
+phase_one(void) {
   phase=1;
   section_count=0;
   reset_input();
@@ -1476,11 +1476,11 @@
 processing is straightforward.
 
 @<Predecl...@>=
-void skip_limbo();
+static void skip_limbo(void);@/
 
 @ @c
-void
-skip_limbo()
+static void
+skip_limbo(void)
 {
   char c;
   while (1) {
@@ -1491,7 +1491,7 @@
       c=*loc++;
       if (ccode[(eight_bits)c]==new_section) break;
       switch (ccode[(eight_bits)c]) {
-        case translit_code: @<Read in transliteration of a character@>; break;
+        case translit_code: @<Read in transliteration of a character@>@; break;
         case format_code: case '@@': break;
         case control_text: if (c=='q' || c=='Q') {
           while ((c=skip_ahead())=='@@');
@@ -1515,7 +1515,7 @@
     err_print("! Improper hex number following @@l");
 @.Improper hex number...@>
   else {
-    unsigned i;
+    unsigned int i;
     char *beg;
     sscanf(loc-3,"%x",&i);
     while(xisspace(*loc)&&loc<limit) loc++;
@@ -1525,26 +1525,26 @@
       err_print("! Replacement string in @@l too long");
 @.Replacement string in @@l...@>
     else{
-      strncpy(translit[i-0200],beg,loc-beg);
+      strncpy(translit[i-0200],beg,(size_t)(loc-beg));
       translit[i-0200][loc-beg]='\0';
     }
   }
 
-@ Because on some systems the difference between two pointers is a |long|
+@ Because on some systems the difference between two pointers is a |ptrdiff_t|
 but not an |int|, we use \.{\%ld} to print these quantities.
 
 @c
 void
-print_stats() {
-  printf("\nMemory usage statistics:\n");
+print_stats(void) {
+  puts("\nMemory usage statistics:");
   printf("%ld names (out of %ld)\n",
-          (long)(name_ptr-name_dir),(long)max_names);
+          (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf("%ld replacement texts (out of %ld)\n",
-          (long)(text_ptr-text_info),(long)max_texts);
+          (ptrdiff_t)(text_ptr-text_info),(long)max_texts);
   printf("%ld bytes (out of %ld)\n",
-          (long)(byte_ptr-byte_mem),(long)max_bytes);
+          (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
   printf("%ld tokens (out of %ld)\n",
-          (long)(tok_ptr-tok_mem),(long)max_toks);
+          (ptrdiff_t)(tok_ptr-tok_mem),(long)max_toks);
 }
 
 @** Index.

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -14,7 +14,7 @@
 @z
 
 @x
- at d banner "This is CTWILL, Version 3.64"
+ at d banner "This is CTWILL, Version 4.0"
 @y
 \bigskip
 {\font\itt=cmitt10 \font\bit=cmbxti10
@@ -35,10 +35,10 @@
 faithful overall rendering of {\itt CTWILL}'s code, though. \hfill
 ---Enjoy!\bigskip}
 
- at d banner "This is CTWILL, Version 3.64"
+ at d banner "This is CTWILL, Version 4.0"
 @z
 
-Section 3.
+Section 2.
 
 @x
 @ Here is a sort of user manual for \.{CTWILL}---which is exactly like
@@ -55,7 +55,7 @@
 @-x@>
 @z
 
-Section 4.
+Section 3.
 
 @x
 The current meaning of every identifier is initially `\.{\\uninitialized}'.
@@ -73,7 +73,7 @@
 @ If the \TeX\ part starts
 @z
 
-Section 5.
+Section 4.
 
 @x
 @d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
@@ -80,25 +80,18 @@
 @y
 @z
 
-Section 7.
+Section 5.
 
 @x
-you have to change them also in the file |"common.w"|.
+@ \.{CWEAVE} has a fairly straightforward outline.  It operates in
 @y
-you have to change them also in file |"common.w"|.
+@* Introduction (continued). \.{CWEAVE} has a fairly straightforward outline.
+It operates in
 @z
 
-Section 8.
+Section 7.
 
 @x
-@ The next few sections contain stuff from the file |"common.w"| that must
- at y
- at r @ The next few sections contain stuff from the file |"common.w"| that must
- at z
-
-Section 9.
-
- at x
 internationalization.
 @y
 internationalization.
@@ -107,7 +100,7 @@
 @-S@>
 @z
 
-Section 11.
+Section 9.
 
 @x
 @ Code related to input routines:
@@ -116,7 +109,7 @@
 @-c@>
 @z
 
-Section 12.
+Section 10.
 
 @x
 @ Code related to identifier and section name storage:
@@ -125,7 +118,7 @@
 @-c@>
 @z
 
-Section 13.
+Section 12.
 
 @x
 @ Code related to error handling:
@@ -134,17 +127,25 @@
 @-s@>
 @z
 
-Section 15.
+Section 16.
 
 @x
 @ Code related to section numbers:
 @y
- at r @ Code related to section numbers:
+@ Code related to section numbers:
 @z
 
 Section 17.
 
 @x
+extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
+ at y
+extern const char *use_language; /* prefix to \.{ctwimac.tex} in \TEX/ output */
+ at z
+
+Section 18.
+
+ at x
 @ Code relating to output:
 @y
 @ Code relating to output:
@@ -153,7 +154,7 @@
 @-c@>
 @z
 
-Section 19.
+Section 23.
 
 @x
 @* Data structures exclusive to {\tt CWEAVE}.
@@ -162,7 +163,7 @@
 @-a@>
 @z
 
-Section 21.
+Section 25.
 
 @x
 @ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
@@ -172,7 +173,7 @@
 @-x@>
 @z
 
-Section 23.
+Section 27.
 
 @x
 @ \.{CTWILL} also has special data structures to keep track of current
@@ -180,7 +181,7 @@
 @r @ \.{CTWILL} also has special data structures to keep track of current
 @z
 
-Section 28.
+Section 32.
 
 @x
 @ The |new_meaning| routine changes the current ``permanent meaning''
@@ -188,7 +189,7 @@
 @r @ The |new_meaning| routine changes the current ``permanent meaning''
 @z
 
-Section 31.
+Section 35.
 
 @x
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -198,25 +199,24 @@
 @-c@>
 @z
 
-Section 39.
+Section 44.
 
 @x
-id_lookup("do",NULL,do_like);
+@ We have to get \CEE/'s
 @y
-@ @<Store all...@>=
-id_lookup("do",NULL,do_like);
+ at r @ We have to get \CEE/'s
 @z
 
-Section 40.
+Section 45.
 
 @x
-id_lookup("undef",NULL,if_like);
+id_lookup("goto",NULL,case_like);
 @y
 @ @<Store all...@>=
-id_lookup("undef",NULL,if_like);
+id_lookup("goto",NULL,case_like);
 @z
 
-Section 44.
+Section 49.
 
 @x
 @ Control codes are converted to \.{CWEAVE}'s internal
@@ -224,7 +224,7 @@
 @r @ Control codes are converted to \.{CWEAVE}'s internal
 @z
 
-Section 50.
+Section 55.
 
 @x
 \yskip\hang |xref_roman|, |xref_wildcard|, |xref_typewriter|, |TeX_string|,
@@ -249,7 +249,7 @@
 preceded by \.{@@(} instead of \.{@@<}.\par}
 @z
 
-Section 52.
+Section 56.
 
 @x
 @ As one might expect, |get_next| consists mostly of a big switch
@@ -258,7 +258,7 @@
 @-c@>
 @z
 
-Section 59.
+Section 63.
 
 @x
 @ The following code assigns values to the combinations \.{++},
@@ -267,7 +267,7 @@
 @-c@>
 @z
 
-Section 62.
+Section 66.
 
 @x
 @<Get a string@>= {
@@ -275,7 +275,7 @@
 @<Get a string@>= {@+
 @z
 
-Section 66.
+Section 70.
 
 @x
 @ @<Put section name...@>=
@@ -283,7 +283,7 @@
 @r @ @<Put section name...@>=
 @z
 
-Section 80.
+Section 84.
 
 @x
 with |next_control!='|'| and ends with |next_control>=format_code|. Thus, it
@@ -292,7 +292,7 @@
 Thus, it
 @z
 
-Section 88.
+Section 91.
 
 @x
 @ Finally, when the \TEX/ and definition parts have been treated, we have
@@ -302,7 +302,7 @@
 \hfil\break|next_control>=begin_C|.
 @z
 
-Section 94.
+Section 97.
 
 @x
 @ The |flush_buffer| routine empties the buffer up to a given breakpoint,
@@ -311,7 +311,7 @@
 @-c@>
 @z
 
-Section 95.
+Section 99.
 
 @x
 @ When we are copying \TEX/ source material, we retain line breaks
@@ -319,7 +319,7 @@
 @r @ When we are copying \TEX/ source material, we retain line breaks
 @z
 
-Section 97.
+Section 101.
 
 @x
 @ When we wish to append one character |c| to the output buffer, we write
@@ -328,7 +328,7 @@
 @-c@>
 @z
 
-Section 101.
+Section 105.
 
 @x
 @ We get to this section only in the unusual case that the entire output line
@@ -336,9 +336,15 @@
 @r @ We get to this section only in the unusual case that the entire output line
 @z
 
-Section 105.
+Section 111.
 
 @x
+@ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
+ at y
+ at r @ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
+ at z
+
+ at x
 static eight_bits
 copy_TeX(void)
 {
@@ -348,7 +354,7 @@
 {@+
 @z
 
-Section 106.
+Section 112.
 
 @x
 @ The |copy_comment| function issues a warning if more braces are opened than
@@ -357,15 +363,17 @@
 @-t@>
 @z
 
-Section 109.
-
 @x
-@ @<Copy special things when |c=='@@'...@>=
+int bal at t\2\2@>) /* brace balance */
+{
+  char c; /* current character being copied */
 @y
- at r @ @<Copy special things when |c=='@@'...@>=
+int bal at t\2\2@>) /* brace balance */
+{@+
+  char c; /* current character being copied */
 @z
 
-Section 112.
+Section 117.
 
 @x
 @ Here is a list of the category codes that scraps can have.
@@ -373,7 +381,7 @@
 @r @ Here is a list of the category codes that scraps can have.
 @z
 
-Section 115.
+Section 121.
 
 @x
 @ The token lists for translated \TEX/ output contain some special control
@@ -382,7 +390,7 @@
 @-n@>
 @z
 
-Section 116.
+Section 122.
 
 @x
 \yskip\noindent All of these tokens are removed from the \TEX/ output that
@@ -391,7 +399,7 @@
 @-n@>
 @z
 
-Section 117.
+Section 123.
 
 @x
 @ The raw input is converted into scraps according to the following table,
@@ -409,7 +417,7 @@
 \yskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 118.
+Section 124.
 
 @x
 \.>&|prerangle|: \.{\\rangle}&yes\cr
@@ -419,10 +427,9 @@
 @ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
-%\vskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 119.
+Section 125.
 
 @x
 \.{continue}&|case_like|: \stars&maybe\cr
@@ -432,10 +439,9 @@
 @r @ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
-%\vskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 120.
+Section 126.
 
 @x
 \.{long}&|raw_int|: \stars&maybe\cr
@@ -445,10 +451,9 @@
 @ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
-%\vskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Section 121.
+Section 127.
 
 @x
 \.{try}&|else_like|: \stars&maybe\cr
@@ -458,10 +463,9 @@
 @r @ Cont.
 
 \yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
-%\vskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
 @z
 
-Sections 122--129.
+Sections 128--135.
 
 @x l.7 line numbers refer to 'prod.w'
 @ Here is a table of all the productions.  Each production that
@@ -696,7 +700,7 @@
 @r @-any_other@>@-z@>@ \begingroup\dag{\bf Notes}
 @z
 
-Section 130.
+Section 136.
 
 @x
 @* Implementing the productions.
@@ -711,7 +715,7 @@
 the category codes |pp->cat|, |(pp+1)->cat|, $\,\ldots\,$
 @z
 
-Section 132.
+Section 138.
 
 @x
 @ @<Set init...@>=
@@ -719,7 +723,7 @@
 @r @ @<Set init...@>=
 @z
 
-Section 133.
+Section 139.
 
 @x
 @ Token lists in |@!tok_mem| are composed of the following kinds of
@@ -728,29 +732,9 @@
 @-p@>
 @z
 
-Section 134.
+Section 142.
 
 @x
-#ifdef DEAD_CODE /* not used in |main| */
- at y
-@ Debugging routine, use at your own risk.
- at -DEAD_CODE@>
-
- at c
-#ifdef DEAD_CODE /* not used in |main| */
- at z
-
-Section 135.
-
- at x
-@ @<Print token |r|...@>=
- at y
- at r @ @<Print token |r|...@>=
- at z
-
-Section 136.
-
- at x
 @ The production rules listed above are embedded directly into \.{CWEAVE},
 @y
 @ The production rules listed above are embedded directly into \.{CWEAVE},
@@ -763,7 +747,7 @@
 @-pp@>
 @z
 
-Section 137.
+Section 143.
 
 @x
 The code below is an exact translation of the production rules into
@@ -772,7 +756,7 @@
 @-a@>
 @z
 
-Section 139.
+Section 146.
 
 @x
 @ Let us consider the big switch for productions now, before looking
@@ -780,57 +764,57 @@
 @r @ Let us consider the big switch for productions now, before looking
 @z
 
-Section 140.
+Section 147.
 
 @x
   switch (pp->cat) {
-    case exp: @<Cases for |exp|@>; @+break;
-    case lpar: @<Cases for |lpar|@>; @+break;
-    case unop: @<Cases for |unop|@>; @+break;
-    case ubinop: @<Cases for |ubinop|@>; @+break;
-    case binop: @<Cases for |binop|@>; @+break;
-    case cast: @<Cases for |cast|@>; @+break;
-    case sizeof_like: @<Cases for |sizeof_like|@>; @+break;
-    case int_like: @<Cases for |int_like|@>; @+break;
-    case public_like: @<Cases for |public_like|@>; @+break;
-    case colcol: @<Cases for |colcol|@>; @+break;
-    case decl_head: @<Cases for |decl_head|@>; @+break;
-    case decl: @<Cases for |decl|@>; @+break;
-    case base: @<Cases for |base|@>; @+break;
-    case struct_like: @<Cases for |struct_like|@>; @+break;
-    case struct_head: @<Cases for |struct_head|@>; @+break;
-    case fn_decl: @<Cases for |fn_decl|@>; @+break;
-    case function: @<Cases for |function|@>; @+break;
-    case lbrace: @<Cases for |lbrace|@>; @+break;
-    case if_like: @<Cases for |if_like|@>; @+break;
-    case else_like: @<Cases for |else_like|@>; @+break;
-    case else_head: @<Cases for |else_head|@>; @+break;
-    case if_clause: @<Cases for |if_clause|@>; @+break;
-    case if_head: @<Cases for |if_head|@>; @+break;
-    case do_like: @<Cases for |do_like|@>; @+break;
-    case case_like: @<Cases for |case_like|@>; @+break;
-    case catch_like: @<Cases for |catch_like|@>; @+break;
-    case tag: @<Cases for |tag|@>; @+break;
-    case stmt: @<Cases for |stmt|@>; @+break;
-    case semi: @<Cases for |semi|@>; @+break;
-    case lproc: @<Cases for |lproc|@>; @+break;
-    case section_scrap: @<Cases for |section_scrap|@>; @+break;
-    case insert: @<Cases for |insert|@>; @+break;
-    case prelangle: @<Cases for |prelangle|@>; @+break;
-    case prerangle: @<Cases for |prerangle|@>; @+break;
-    case langle: @<Cases for |langle|@>; @+break;
-    case template_like: @<Cases for |template_like|@>; @+break;
-    case new_like: @<Cases for |new_like|@>; @+break;
-    case new_exp: @<Cases for |new_exp|@>; @+break;
-    case ftemplate: @<Cases for |ftemplate|@>; @+break;
-    case for_like: @<Cases for |for_like|@>; @+break;
-    case raw_ubin: @<Cases for |raw_ubin|@>; @+break;
-    case const_like: @<Cases for |const_like|@>; @+break;
-    case raw_int: @<Cases for |raw_int|@>; @+break;
-    case operator_like: @<Cases for |operator_like|@>; @+break;
-    case typedef_like: @<Cases for |typedef_like|@>; @+break;
-    case delete_like: @<Cases for |delete_like|@>; @+break;
-    case question: @<Cases for |question|@>; @+break;
+    case exp: @<Cases for |exp|@>@; @+break;
+    case lpar: @<Cases for |lpar|@>@; @+break;
+    case unop: @<Cases for |unop|@>@; @+break;
+    case ubinop: @<Cases for |ubinop|@>@; @+break;
+    case binop: @<Cases for |binop|@>@; @+break;
+    case cast: @<Cases for |cast|@>@; @+break;
+    case sizeof_like: @<Cases for |sizeof_like|@>@; @+break;
+    case int_like: @<Cases for |int_like|@>@; @+break;
+    case public_like: @<Cases for |public_like|@>@; @+break;
+    case colcol: @<Cases for |colcol|@>@; @+break;
+    case decl_head: @<Cases for |decl_head|@>@; @+break;
+    case decl: @<Cases for |decl|@>@; @+break;
+    case base: @<Cases for |base|@>@; @+break;
+    case struct_like: @<Cases for |struct_like|@>@; @+break;
+    case struct_head: @<Cases for |struct_head|@>@; @+break;
+    case fn_decl: @<Cases for |fn_decl|@>@; @+break;
+    case function: @<Cases for |function|@>@; @+break;
+    case lbrace: @<Cases for |lbrace|@>@; @+break;
+    case if_like: @<Cases for |if_like|@>@; @+break;
+    case else_like: @<Cases for |else_like|@>@; @+break;
+    case else_head: @<Cases for |else_head|@>@; @+break;
+    case if_clause: @<Cases for |if_clause|@>@; @+break;
+    case if_head: @<Cases for |if_head|@>@; @+break;
+    case do_like: @<Cases for |do_like|@>@; @+break;
+    case case_like: @<Cases for |case_like|@>@; @+break;
+    case catch_like: @<Cases for |catch_like|@>@; @+break;
+    case tag: @<Cases for |tag|@>@; @+break;
+    case stmt: @<Cases for |stmt|@>@; @+break;
+    case semi: @<Cases for |semi|@>@; @+break;
+    case lproc: @<Cases for |lproc|@>@; @+break;
+    case section_scrap: @<Cases for |section_scrap|@>@; @+break;
+    case insert: @<Cases for |insert|@>@; @+break;
+    case prelangle: @<Cases for |prelangle|@>@; @+break;
+    case prerangle: @<Cases for |prerangle|@>@; @+break;
+    case langle: @<Cases for |langle|@>@; @+break;
+    case template_like: @<Cases for |template_like|@>@; @+break;
+    case new_like: @<Cases for |new_like|@>@; @+break;
+    case new_exp: @<Cases for |new_exp|@>@; @+break;
+    case ftemplate: @<Cases for |ftemplate|@>@; @+break;
+    case for_like: @<Cases for |for_like|@>@; @+break;
+    case raw_ubin: @<Cases for |raw_ubin|@>@; @+break;
+    case const_like: @<Cases for |const_like|@>@; @+break;
+    case raw_int: @<Cases for |raw_int|@>@; @+break;
+    case operator_like: @<Cases for |operator_like|@>@; @+break;
+    case typedef_like: @<Cases for |typedef_like|@>@; @+break;
+    case delete_like: @<Cases for |delete_like|@>@; @+break;
+    case question: @<Cases for |question|@>@; @+break;
   }
   pp++; /* if no match was found, we move to the right */
 }
@@ -842,56 +826,56 @@
 }
 
 @ @<Cases for |pp->cat|@>=
-    case exp: @<Cases for |exp|@>; @+break;
-    case lpar: @<Cases for |lpar|@>; @+break;
-    case unop: @<Cases for |unop|@>; @+break;
-    case ubinop: @<Cases for |ubinop|@>; @+break;
-    case binop: @<Cases for |binop|@>; @+break;
-    case cast: @<Cases for |cast|@>; @+break;
-    case sizeof_like: @<Cases for |sizeof_like|@>; @+break;
-    case int_like: @<Cases for |int_like|@>; @+break;
-    case public_like: @<Cases for |public_like|@>; @+break;
-    case colcol: @<Cases for |colcol|@>; @+break;
-    case decl_head: @<Cases for |decl_head|@>; @+break;
-    case decl: @<Cases for |decl|@>; @+break;
-    case base: @<Cases for |base|@>; @+break;
-    case struct_like: @<Cases for |struct_like|@>; @+break;
-    case struct_head: @<Cases for |struct_head|@>; @+break;
-    case fn_decl: @<Cases for |fn_decl|@>; @+break;
-    case function: @<Cases for |function|@>; @+break;
-    case lbrace: @<Cases for |lbrace|@>; @+break;
-    case if_like: @<Cases for |if_like|@>; @+break;
-    case else_like: @<Cases for |else_like|@>; @+break;
-    case else_head: @<Cases for |else_head|@>; @+break;
-    case if_clause: @<Cases for |if_clause|@>; @+break;
-    case if_head: @<Cases for |if_head|@>; @+break;
-    case do_like: @<Cases for |do_like|@>; @+break;
-    case case_like: @<Cases for |case_like|@>; @+break;
-    case catch_like: @<Cases for |catch_like|@>; @+break;
-    case tag: @<Cases for |tag|@>; @+break;
-    case stmt: @<Cases for |stmt|@>; @+break;
-    case semi: @<Cases for |semi|@>; @+break;
-    case lproc: @<Cases for |lproc|@>; @+break;
-    case section_scrap: @<Cases for |section_scrap|@>; @+break;
-    case insert: @<Cases for |insert|@>; @+break;
-    case prelangle: @<Cases for |prelangle|@>; @+break;
-    case prerangle: @<Cases for |prerangle|@>; @+break;
-    case langle: @<Cases for |langle|@>; @+break;
-    case template_like: @<Cases for |template_like|@>; @+break;
-    case new_like: @<Cases for |new_like|@>; @+break;
-    case new_exp: @<Cases for |new_exp|@>; @+break;
-    case ftemplate: @<Cases for |ftemplate|@>; @+break;
-    case for_like: @<Cases for |for_like|@>; @+break;
-    case raw_ubin: @<Cases for |raw_ubin|@>; @+break;
-    case const_like: @<Cases for |const_like|@>; @+break;
-    case raw_int: @<Cases for |raw_int|@>; @+break;
-    case operator_like: @<Cases for |operator_like|@>; @+break;
-    case typedef_like: @<Cases for |typedef_like|@>; @+break;
-    case delete_like: @<Cases for |delete_like|@>; @+break;
-    case question: @<Cases for |question|@>; @+break;
+    case exp: @<Cases for |exp|@>@; @+break;
+    case lpar: @<Cases for |lpar|@>@; @+break;
+    case unop: @<Cases for |unop|@>@; @+break;
+    case ubinop: @<Cases for |ubinop|@>@; @+break;
+    case binop: @<Cases for |binop|@>@; @+break;
+    case cast: @<Cases for |cast|@>@; @+break;
+    case sizeof_like: @<Cases for |sizeof_like|@>@; @+break;
+    case int_like: @<Cases for |int_like|@>@; @+break;
+    case public_like: @<Cases for |public_like|@>@; @+break;
+    case colcol: @<Cases for |colcol|@>@; @+break;
+    case decl_head: @<Cases for |decl_head|@>@; @+break;
+    case decl: @<Cases for |decl|@>@; @+break;
+    case base: @<Cases for |base|@>@; @+break;
+    case struct_like: @<Cases for |struct_like|@>@; @+break;
+    case struct_head: @<Cases for |struct_head|@>@; @+break;
+    case fn_decl: @<Cases for |fn_decl|@>@; @+break;
+    case function: @<Cases for |function|@>@; @+break;
+    case lbrace: @<Cases for |lbrace|@>@; @+break;
+    case if_like: @<Cases for |if_like|@>@; @+break;
+    case else_like: @<Cases for |else_like|@>@; @+break;
+    case else_head: @<Cases for |else_head|@>@; @+break;
+    case if_clause: @<Cases for |if_clause|@>@; @+break;
+    case if_head: @<Cases for |if_head|@>@; @+break;
+    case do_like: @<Cases for |do_like|@>@; @+break;
+    case case_like: @<Cases for |case_like|@>@; @+break;
+    case catch_like: @<Cases for |catch_like|@>@; @+break;
+    case tag: @<Cases for |tag|@>@; @+break;
+    case stmt: @<Cases for |stmt|@>@; @+break;
+    case semi: @<Cases for |semi|@>@; @+break;
+    case lproc: @<Cases for |lproc|@>@; @+break;
+    case section_scrap: @<Cases for |section_scrap|@>@; @+break;
+    case insert: @<Cases for |insert|@>@; @+break;
+    case prelangle: @<Cases for |prelangle|@>@; @+break;
+    case prerangle: @<Cases for |prerangle|@>@; @+break;
+    case langle: @<Cases for |langle|@>@; @+break;
+    case template_like: @<Cases for |template_like|@>@; @+break;
+    case new_like: @<Cases for |new_like|@>@; @+break;
+    case new_exp: @<Cases for |new_exp|@>@; @+break;
+    case ftemplate: @<Cases for |ftemplate|@>@; @+break;
+    case for_like: @<Cases for |for_like|@>@; @+break;
+    case raw_ubin: @<Cases for |raw_ubin|@>@; @+break;
+    case const_like: @<Cases for |const_like|@>@; @+break;
+    case raw_int: @<Cases for |raw_int|@>@; @+break;
+    case operator_like: @<Cases for |operator_like|@>@; @+break;
+    case typedef_like: @<Cases for |typedef_like|@>@; @+break;
+    case delete_like: @<Cases for |delete_like|@>@; @+break;
+    case question: @<Cases for |question|@>@; @+break;
 @z
 
-Section 141.
+Section 148.
 
 @x
 of identifiers in case labels.
@@ -902,7 +886,7 @@
 If the first identifier is the keyword `\&{operator}', we give up;
 @z
 
-Section 142.
+Section 150.
 
 @x
 @ The scraps currently being parsed must be inspected for any
@@ -916,15 +900,15 @@
 \hfil\break|make_reserved|, hence |tok_loc| has been set.
 @z
 
-Section 147.
+Section 154.
 
 @x
-{ token_pointer j;
+@ \.{CTWILL} needs the following procedure, which appends tokens of a
 @y
-{@+ token_pointer j;
+ at r @ \.{CTWILL} needs the following procedure, which appends tokens of a
 @z
 
-Section 148.
+Section 155.
 
 @x
 @ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
@@ -941,7 +925,7 @@
 {@+
 @z
 
-Section 152.
+Section 159.
 
 @x
 @ @<Cases for |lpar|@>=
@@ -949,15 +933,15 @@
 @r @ @<Cases for |lpar|@>=
 @z
 
-Section 166.
+Section 168.
 
 @x
-@ Outdent after parameter declarations with option \.{-i}.
+@ @<Cases for |decl_head|@>=
 @y
- at r @ Outdent after parameter declarations with option \.{-i}.
+ at r @ @<Cases for |decl_head|@>=
 @z
 
-Section 199.
+Section 208.
 
 @x
 @ Here's the |squash| procedure, which
@@ -965,7 +949,7 @@
 @r @ Here's the |squash| procedure, which
 @z
 
-Section 200.
+Section 220.
 
 @x
 @ The following macro is used to append a scrap whose tokens have just
@@ -975,23 +959,31 @@
 @-c@>
 @z
 
-Section 221.
+Section 229.
 
 @x
-@ @d cur_end cur_state.end_field /* current ending location in |tok_mem| */
+@ The |outer_parse| routine is to |C_parse| as |outer_xref|
 @y
- at r @ @d cur_end cur_state.end_field /* current ending location in |tok_mem| */
+ at r @ The |outer_parse| routine is to |C_parse| as |outer_xref|
 @z
 
-Section 224.
+Section 235.
 
 @x
+@ To insert token-list |p| into the output, the |push_level| subroutine
+ at y
+ at r @ To insert token-list |p| into the output, the |push_level| subroutine
+ at z
+
+Section 237.
+
+ at x
 called when |stack_ptr==1|.
 @y
 called when |stack_ptr| |==1|.
 @z
 
-Section 227.
+Section 241.
 
 @x
   text_pointer save_text_ptr;
@@ -1002,23 +994,15 @@
   sixteen_bits save_next_control; /* values to be restored */
 @z
 
-Section 230.
+Section 244.
 
 @x
-@ An identifier of length one does not have to be enclosed in braces, and it
- at y
- at r @ An identifier of length one does not have to be enclosed in braces, and it
- at z
-
-Section 231.
-
- at x
 else @<Look ahead for strongest line break, |goto reswitch|@>
 @y
 else {@<Look ahead for strongest line break, |goto reswitch|@>}
 @z
 
-Section 232.
+Section 245.
 
 @x
 @<Look ahead for st...@>= {
@@ -1031,7 +1015,7 @@
 @y
 @z
 
-Section 233.
+Section 246.
 
 @x
 @ @<Output saved...@>=
@@ -1039,15 +1023,23 @@
 @r @ @<Output saved...@>=
 @z
 
-Section 243.
+Section 250.
 
 @x
+@ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
+ at y
+ at r @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
+ at z
+
+Section 256.
+
+ at x
 @ The output file will contain the control sequence \.{\\Y} between non-null
 @y
 @r @ The output file will contain the control sequence \.{\\Y} between non-null
 @z
 
-Section 246.
+Section 259.
 
 @x
 @<Translate the \T...@>= do {
@@ -1055,7 +1047,7 @@
 @<Translate the \T...@>= do {@+
 @z
 
-Section 254.
+Section 267.
 
 @x
 |next_control>=begin_C|. We will make the global variable |this_section|
@@ -1063,7 +1055,7 @@
 \hfil\break|next_control>=begin_C|. We will make the global variable |this_section|
 @z
 
-Section 255.
+Section 268.
 
 @x
 @ @<Translate the \CEE/...@>=
@@ -1071,7 +1063,7 @@
 @r @ @<Translate the \CEE/...@>=
 @z
 
-Section 259.
+Section 272.
 
 @x
 @ The |footnote| procedure gives cross-reference information about
@@ -1079,23 +1071,15 @@
 @r @ The |footnote| procedure gives cross-reference information about
 @z
 
-Section 263.
+Section 277.
 
 @x
-@ @<Flag the usage of this identifier, for the mini-index@>=
- at y
-@<Flag the usage of this identifier, for the mini-index@>=
- at z
-
-Section 264.
-
- at x
 @ @<Output information about usage of id's defined in other sections@>=
 @y
 @r @ @<Output information about usage of id's defined in other sections@>=
 @z
 
-Section 270.
+Section 283.
 
 @x
 the index section itself---NOT!
@@ -1106,7 +1090,7 @@
 the index section itself---NOT!
 @z
 
-Section 271.
+Section 284.
 
 @x
 @ A left-to-right radix sorting method is used, since this makes it easy to
@@ -1122,7 +1106,7 @@
 sixteen_bits k_section; /* runs through the sections */
 @z
 
-Section 273.
+Section 286.
 
 @x
 @ During the sorting phase we shall use the |cat| and |trans| arrays from
@@ -1132,7 +1116,7 @@
 @-k@>
 @z
 
-Section 276.
+Section 289.
 
 @x
 $|collate|[0]<|collate|[1]<\cdots<|collate|[100]$.
@@ -1140,7 +1124,7 @@
 |collate[0]| $<$|collate[1]|$<\cdots<$|collate[100]|.
 @z
 
-Section 283.
+Section 296.
 
 @x
     else {char *j;
@@ -1148,15 +1132,17 @@
     else {@+char *j;
 @z
 
-Section 290.
+Section 303.
 
 @x
-@ Because on some systems the difference between two pointers is a |long|
+@ Because on some systems the difference between two pointers is a |ptrdiff_t|
+rather than an |int|, we use \.{\%ld} to print these quantities.
 @y
- at r @ Because on some systems the difference between two pointers is a |long|
+ 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.
 @z
 
-Section 291.
+Section 304.
 
 @x
 \bigskip
@@ -1167,26 +1153,9 @@
 @y
 @z
 
-Section 293.
+Section 312.
 
 @x
-@* Function declarations.  Here are declarations---conforming to
- at y
-@* Function declarations.  Here are declarations---conforming to
- at -DEAD_CODE@>
- at z
-
-Section 294.
-
- at x
-extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
- at y
-extern const char *use_language; /* prefix to \.{ctwimac.tex} in \TEX/ output */
- at z
-
-Section 300.
-
- 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-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,19 +1,20 @@
- at q Changes for CWEB in TeX Live from numerous contributors. @>
- at q This file is in the Public Domain. @>
+ at q Changes for CWEB in TeX Live from numerous contributors.              @>
+ at q This file is in the Public Domain.                                    @>
 
- at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
- at q were merged with the set of change files of the CWEBbin project; @>
- at q see https://github.com/ascherer/cwebbin for the original parts. @>
+ at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber   @>
+ at q were merged with the set of change files of the CWEBbin project;      @>
+ at q see https://github.com/ascherer/cwebbin for the original parts.       @>
 
- at q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
- at q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
- at q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
- at q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
- at q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
- at q with the 'tie' processor and is used as a monolithic changefile for @>
- at q {common,ctangle,cweave}.w in TeX Live. @>
+ at q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch    @>
+ at q has been created from the elaborate set of change files               @>
+ at q {comm,ctang,cweav,cwebman}-patch.ch,                                  @>
+ at q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch,     @>
+ at q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and        @>
+ at q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+ at q and is used as a monolithic changefile for {common,ctangle,cweave}.w  @>
+ at q and cwebman.tex in TeX Live.                                          @>
 
- at q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+ at q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
 % This file is part of CWEB.
@@ -26,13 +27,6 @@
 @z
 
 @x
-% (essentially the same as version 3.6, which added
-%  recently introduced features of standard C++ to version 3.4)
-% (In November 2016 I made minor adjustments but changed no code -- DEK)
- at y
- at z
-
- at x
 % Here is TeX material that gets inserted after \input cwebmac
 @y
 % Here is TeX material that gets inserted after \input ctwimac
@@ -40,9 +34,9 @@
 @z
 
 @x
-\def\title{CWEAVE (Version 3.64)}
+\def\title{CWEAVE (Version 4.0)}
 @y
-\def\title{CTWILL (Version 3.64 [\TeX~Live])}
+\def\title{CTWILL (Version 4.0 [\TeX~Live])}
 @z
 
 @x
@@ -52,9 +46,9 @@
 @z
 
 @x
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
 @y
-  \centerline{(Version 3.64 [\TeX~Live])}
+  \centerline{(Version 4.0 [\TeX~Live])}
 @z
 
 @x
@@ -66,16 +60,10 @@
 @x
 }
 @y
-}}
-\datecontentspage
+}}\datecontentspage
 @z
 
 @x
- at s not_eq normal @q unreserve a C++ keyword @>
- at y
- at z
-
- at x
 This is the \.{CWEAVE} program by Silvio Levy and Donald E. Knuth,
 based on \.{WEAVE} by Knuth.
 We are thankful to Steve Avery,
@@ -87,7 +75,7 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @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
@@ -106,31 +94,15 @@
 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 3.64"
+ at d banner "This is CTWILL, Version 4.0"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
+@<Predeclaration of procedures@>
 @y
-@ For string handling we include the {\mc ANSI C} system header file instead
-of predeclaring the standard system functions |@!strlen|, |@!strcmp|,
-|@!strcpy|, |@!strncmp|, and |@!strncpy|.
-@^system dependencies@>
+@<Predeclaration of procedures@>
 
-@<Include files@>=
-#include <string.h>
-
 @ 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
@@ -293,16 +265,6 @@
 @z
 
 @x
-int main (ac, av)
-int ac; /* argument count */
-char **av; /* argument values */
- at y
-int main (@t\1\1@>
-int ac, /* argument count */
-char **av at t\2\2@>) /* argument values */
- at z
-
- at x
   program=cweave;
 @y
   program=ctwill;
@@ -309,66 +271,12 @@
 @z
 
 @x
-  make_xrefs=force_lines=make_pb=1; /* controlled by command-line options */
-  common_init();
-  @<Set initial values@>;
+  if (show_banner) puts(banner); /* print a ``banner line'' */
 @y
-  @<Set initial values@>;
-  common_init();
-  @<Start \TEX/ output@>;
- at z
-
- at x
-  if (show_banner) printf(banner); /* print a ``banner line'' */
- at y
   if (show_banner) cb_show_banner(); /* print a ``banner line'' */
 @z
 
 @x
- at d max_bytes 90000 /* the number of bytes in identifiers,
- at y
- at d max_bytes 1000000 /* the number of bytes in identifiers,
- at z
-
- at x
- at d max_names 4000 /* number of identifiers, strings, section names;
- at y
- at d max_names 10239 /* number of identifiers, strings, section names;
- at z
-
- at x
- at d max_sections 2000 /* greater than the total number of sections */
- at d hash_size 353 /* should be prime */
- at d buf_size 100 /* maximum length of input line, plus one */
- at y
- at d max_sections 10239 /* greater than the total number of sections */
- at d hash_size 8501 /* should be prime */
- at d buf_size 1000 /* maximum length of input line, plus one */
- at z
-
- at x
- at d max_refs 20000 /* number of cross-references; must be less than 65536 */
- at d max_toks 20000 /* number of symbols in \CEE/ texts being parsed;
- at y
- at d max_refs 65535 /* number of cross-references; must be less than 65536 */
- at d max_toks 65535 /* number of symbols in \CEE/ texts being parsed;
- at z
-
- at x
- at d max_texts 4000 /* number of phrases in \CEE/ texts being parsed;
- at y
- at d max_texts 10239 /* number of phrases in \CEE/ texts being parsed;
- at z
-
- at x
- at d max_scraps 2000 /* number of tokens in \CEE/ texts being parsed */
- at d stack_size 400 /* number of simultaneous output levels */
- at y
- at d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
- at d stack_size 2000 /* number of simultaneous output levels */
- at z
-
- at x
 @i common.h
 @y
 @i comm-w2c.h
@@ -458,7 +366,7 @@
   char *saveloc=loc,*savelimit=limit;
   loc=limit+1; limit=loc;
   *limit++='{';
-  strncpy(limit,tex_file_name,strlen(tex_file_name)-4);
+  memcpy(limit,tex_file_name,strlen(tex_file_name)-4);
   limit+=strlen(tex_file_name)-4;
   *limit++='}';
   title_lookup();
@@ -501,12 +409,6 @@
 @z
 
 @x
-xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
- at y
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
- at z
-
- at x
 @d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
 @y
 @d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
@@ -513,107 +415,8 @@
 @z
 
 @x
- at d no_xref (flags['x']==0)
- at d make_xrefs flags['x'] /* should cross references be output? */
+  p->ilk=t; init_node(p);
 @y
- at d no_xref (!make_xrefs) /* should cross references be suppressed? */
- at z
-
- at x
-void
-new_xref(p)
-name_pointer p;
- at y
-static void
-new_xref(
-name_pointer p)
- at z
-
- at x
-  append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
- at y
-  append_xref(m); xref_ptr->xlink=q; update_node(p);
- at z
-
- at x
-void
-new_section_xref(p)
-name_pointer p;
- at y
-static void
-new_section_xref(
-name_pointer p)
- at z
-
- at x
-  if (r==xmem) p->xref=(char*)xref_ptr;
- at y
-  if (r==xmem) update_node(p);
- at z
-
- at x
-void
-set_file_flag(p)
-name_pointer p;
- at y
-static void
-set_file_flag(
-name_pointer p)
- at z
-
- at x
-  p->xref = (char *)xref_ptr;
- at y
-  update_node(p);
- at z
-
- at x
-further details about them will be explained later. A |text_pointer| variable
-is an index into |tok_start|.
- at y
-further details about them will be explained later. A \&{text\_pointer}
-variable is an index into |tok_start|.
- at z
-
- at x
-tok_ptr=tok_mem+1; text_ptr=tok_start+1; tok_start[0]=tok_mem+1;
-tok_start[1]=tok_mem+1;
-max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
- at y
-tok_ptr=max_tok_ptr=tok_mem+1;@/
-tok_start[0]=tok_start[1]=tok_mem+1;@/
-text_ptr=max_text_ptr=tok_start+1;
- at z
-
- at x
-int names_match(p,first,l,t)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-eight_bits t; /* desired ilk */
- at y
-boolean names_match(@t\1\1@>
-name_pointer p, /* points to the proposed match */
-const char *first, /* position of first character of string */
-size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* desired |ilk| */
- at z
-
- at x
-void
-init_p(p,t)
-name_pointer p;
-eight_bits t;
- at y
-void
-init_p(
-name_pointer p,
-eight_bits t)
- at z
-
- at x
-  p->ilk=t; p->xref=(char*)xmem;
- at y
   struct perm_meaning *q=p-name_dir+cur_meaning;
   p->ilk=t; init_node(p);
   q->stamp=0;
@@ -624,31 +427,6 @@
 @z
 
 @x
-void
-init_node(p)
-name_pointer p;
- at y
-void
-init_node(
-name_pointer p)
- at z
-
- at x
-  p->xref=(char*)xmem;
-}
- at y
-  p->xref=(void *)xmem;
-}
-
-static void
-update_node(
-name_pointer p)
-{
-  p->xref=(void *)xref_ptr;
-}
- at z
-
- at x
 id_lookup("extern",NULL,int_like);
 @y
 ext_loc=id_lookup("extern",NULL,int_like)-name_dir;
@@ -722,11 +500,11 @@
 @z
 
 @x
-void   skip_limbo();
+static eight_bits skip_TeX(void);@/
 
 @ @c
 @y
-static void skip_limbo(void);@/
+static eight_bits skip_TeX(void);@/
 
 @ We look for a clue about the program's title, because this will become
 part of all meanings.
@@ -735,14 +513,6 @@
 @z
 
 @x
-void
-skip_limbo() {
- at y
-static void
-skip_limbo(void) {
- at z
-
- at x
     if (loc>limit && get_line()==0) return;
 @y
     if (loc>limit && get_line()==0) return;
@@ -753,10 +523,8 @@
 @z
 
 @x
-unsigned
-skip_TeX() /* skip past pure \TEX/ code */
+skip_TeX(void) /* skip past pure \TEX/ code */
 @y
-static eight_bits
 skip_TeX(void)
 @z
 
@@ -768,31 +536,6 @@
 @z
 
 @x
-eight_bits get_next();
- at y
-static eight_bits get_next(void);@/
- at z
-
- at x
-eight_bits
-get_next() /* produces the next input token */
-{@+eight_bits c; /* the current character */
- at y
-static eight_bits
-get_next(void) /* produces the next input token */
-{
-  eight_bits c; /* the current character */
- at z
-
- at x
-    else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"'))@|
- at y
-    else if (c=='\'' || c=='"'@|
-           || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
-           || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
- at z
-
- at x
 @d right_preproc 0217 /* ends a preprocessor command */
 @y
 @d right_preproc 0223 /* ends a preprocessor command */
@@ -799,44 +542,6 @@
 @z
 
 @x
-    else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); break;
- at y
-    else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); } } break;
- at z
-
- at x
-  case '!': if (*loc=='=') compress(not_eq); break;
- at y
-  case '!': if (*loc=='=') compress(non_eq); break;
- at z
-
- at x
-  while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
- at y
-  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
-      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
- at z
-
- at x
-    *id_loc++='$'; *id_loc++=toupper(*loc); loc++;
- at y
-    *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
- at z
-
- at x
-  if (delim=='L') { /* wide character constant */
-    delim=*loc++; *++id_loc=delim;
-  }
- at y
-  if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
-    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
-    delim=*loc++; *++id_loc=delim;
-  }
- at z
-
- at x
         err_print("! String didn't end"); loc=limit; break;
 @y
         err_print(_("! String didn't end")); loc=limit; break;
@@ -849,20 +554,8 @@
 @z
 
 @x
-    if (c=='\\') if (loc>=limit) continue;
-      else if (++id_loc<=section_text_end) {
-        *id_loc = '\\'; c=*loc++;
-      }
+    fputs("\n! String too long: ",stdout);
 @y
-    if (c=='\\') { if (loc>=limit) continue;
-      else { if (++id_loc<=section_text_end) {
-        *id_loc = '\\'; c=*loc++;
-      } } }
- at z
-
- at x
-    printf("\n! String too long: ");
- at y
     fputs(_("\n! String too long: "),stdout);
 @z
 
@@ -881,12 +574,10 @@
 @z
 
 @x
-    case xref_roman: case xref_wildcard: case xref_typewriter:
-    case noop: case TeX_string: c=ccode[c]; skip_restricted(); return(c);
+    case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
 @y
     case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
     case meaning: case suppress:
-    case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return(c);
 @z
 
 @x
@@ -896,7 +587,7 @@
 @z
 
 @x
-  printf("\n! Section name too long: ");
+  fputs("\n! Section name too long: ",stdout);
 @y
   fputs(_("\n! Section name too long: "),stdout);
 @z
@@ -914,17 +605,11 @@
 @z
 
 @x
-void skip_restricted();
- at y
-void skip_restricted(void);@/
- at z
-
- at x
-void
-skip_restricted()
+static void
+skip_restricted(void)
 {
 @y
-void
+static void
 skip_restricted(void)
 { int c=ccode[(eight_bits)*(loc-1)];
 @z
@@ -1007,20 +692,6 @@
 @z
 
 @x
-void phase_one();
- at y
-static void phase_one(void);@/
- at z
-
- at x
-void
-phase_one() {
- at y
-static void
-phase_one(void) {
- at z
-
- at x
   skip_limbo(); change_exists=0;
 @y
   skip_limbo();
@@ -1051,36 +722,6 @@
 @z
 
 @x
-void C_xref();
- at y
-static void C_xref(eight_bits);@/
- at z
-
- at x
-void
-C_xref( spec_ctrl ) /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl;
- at y
-static void
-C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl at t\2\2@>)
- at z
-
- at x
-void outer_xref();
- at y
-static void outer_xref(void);@/
- at z
-
- at x
-void
-outer_xref() /* extension of |C_xref| */
- at y
-static void
-outer_xref(void) /* extension of |C_xref| */
- at z
-
- at x
     case translit_code: err_print("! Use @@l in limbo only"); continue;
 @y
     case translit_code: err_print(_("! Use @@l in limbo only")); continue;
@@ -1094,12 +735,6 @@
 @z
 
 @x
-            else lhs->xref=(char*)q->xlink;
- at y
-            else lhs->xref=(void *)q->xlink;
- at z
-
- at x
     err_print("! Missing left identifier of @@s");
 @y
     err_print(_("! Missing left identifier of @@s"));
@@ -1112,30 +747,16 @@
 @z
 
 @x
-void section_check();
+      fputs("\n! Never defined: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @y
-static void section_check(name_pointer);@/
- at z
-
- at x
-void
-section_check(p)
-name_pointer p; /* print anomalies in subtree |p| */
- at y
-static void
-section_check(
-name_pointer p) /* print anomalies in subtree |p| */
- at z
-
- at x
-      printf("\n! Never defined: <"); print_section_name(p); putchar('>'); mark_harmless;
- at y
       fputs(_("\n! Never defined: <"),stdout);
       print_section_name(p); putchar('>'); mark_harmless;
 @z
 
 @x
-      printf("\n! Never used: <"); print_section_name(p); putchar('>'); mark_harmless;
+      fputs("\n! Never used: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @y
       fputs(_("\n! Never used: <"),stdout);
       print_section_name(p); putchar('>'); mark_harmless;
@@ -1142,51 +763,12 @@
 @z
 
 @x
-If the |per_cent| parameter is 1 a |'%'| is appended to the line
- at y
-If the |per_cent| parameter is 1, a |'%'| is appended to the line
- at z
-
- at x
- at d tex_printf(c) fprintf(active_file,c)
- at y
- at d tex_printf(c) fprintf(active_file,"%s",c)
- at d tex_puts(c) fputs(c,active_file)
- at z
-
- at x
-void
-flush_buffer(b,per_cent,carryover)
-char *b; /* outputs from |out_buf+1| to |b|,where |b<=out_ptr| */
-boolean per_cent,carryover;
- at y
-static void
-flush_buffer(@t\1\1@>
-char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
-boolean per_cent,boolean carryover at t\2\2@>)
- at z
-
- at x
-  if (b<out_ptr) strncpy(out_buf+1,b+1,out_ptr-b);
- at y
-  if (b<out_ptr) strncpy(out_buf+1,b+1,(size_t)(out_ptr-b));
- at z
-
- at x
-void
-finish_line() /* do this at the end of a line */
- at y
-static void
-finish_line(void) /* do this at the end of a line */
- at z
-
- at x
 @ In particular, the |finish_line| procedure is called near the very
 beginning of phase two. We initialize the output variables in a slightly
 tricky way so that the first line of the output file will be
 `\.{\\input cwebmac}'.
 
-@<Set init...@>=
+@<Start \TEX/...@>=
 out_ptr=out_buf+1; out_line=1; active_file=tex_file;
 *out_ptr='c'; tex_printf("\\input cwebma");
 @y
@@ -1228,30 +810,6 @@
 @z
 
 @x
-void
-out_str(s) /* output characters from |s| to end of string */
-char *s;
- at y
-static void
-out_str(@t\1\1@> /* output characters from |s| to end of string */
-const char*s at t\2\2@>)
- at z
-
- at x
-void break_out();
- at y
-static void break_out(void);@/
- at z
-
- at x
-void
-break_out() /* finds a way to break the output line */
- at y
-static void
-break_out(void) /* finds a way to break the output line */
- at z
-
- at x
   printf("\n! Line had to be broken (output l. %d):\n",out_line);
 @y
   printf(_("\n! Line had to be broken (output l. %d):\n"),out_line);
@@ -1265,16 +823,6 @@
 @z
 
 @x
-void
-out_section(n)
-sixteen_bits n;
- at y
-static void
-out_section(
-sixteen_bits n)
- at z
-
- at x
   if(changed_section[n]) out_str ("\\*");
 @.\\*@>
 @y
@@ -1281,26 +829,6 @@
 @z
 
 @x
-void
-out_name(p,quote_xalpha)
-name_pointer p;
-boolean quote_xalpha;
- at y
-static void
-out_name(
-name_pointer p,
-boolean quote_xalpha)
- at z
-
- at x
-void
-copy_limbo()
- at y
-static void
-copy_limbo(void)
- at z
-
- at x
         default: err_print("! Double @@ should be used in limbo");
 @y
         case right_start: right_start_switch=1; break;
@@ -1308,20 +836,6 @@
 @z
 
 @x
-@ @f copy_TeX TeX
- at y
- at f copy_TeX TeX
- at z
-
- at x
-eight_bits
-copy_TeX()
- at y
-static eight_bits
-copy_TeX(void)
- at z
-
- at x
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
 @y
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow(_("token")); *(tok_ptr++)=c;}
@@ -1328,22 +842,6 @@
 @z
 
 @x
-int copy_comment();
- at y
-static int copy_comment(boolean,int);@/
- at z
-
- at x
-int copy_comment(is_long_comment,bal) /* copies \TEX/ code in comments */
-boolean is_long_comment; /* is this a traditional \CEE/ comment? */
-int bal; /* brace balance */
- at y
-static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
-boolean is_long_comment, /* is this a traditional \CEE/ comment? */
-int bal at t\2\2@>) /* brace balance */
- at z
-
- at x
           err_print("! Input ended in mid-comment");
 @y
           err_print(_("! Input ended in mid-comment"));
@@ -1374,14 +872,6 @@
 @z
 
 @x
-else if (c=='\\' && *loc!='@@')
-  if (phase==2) app_tok(*(loc++))@; else loc++;
- at y
-else { if (c=='\\' && *loc!='@@') {
-  if (phase==2) app_tok(*(loc++))@; else loc++; } }
- at z
-
- at x
 @d end_arg 62 /* \.{@@]} */
 @y
 @d end_arg 62 /* \.{@@]} */
@@ -1389,34 +879,6 @@
 @z
 
 @x
-eight_bits cat_index;
-
-@ @<Set in...@>=
-    for (cat_index=0;cat_index<255;cat_index++)
-      strcpy(cat_name[cat_index],"UNKNOWN");
- at y
-
-@ @<Set in...@>=
-{int c; for (c=0;c<256;c++) strcpy(cat_name[c],"UNKNOWN");}
- at z
-
- at x
-void
-print_cat(c) /* symbolic printout of a category */
-eight_bits c;
- at y
-static void
-print_cat(@t\1\1@> /* symbolic printout of a category */
-eight_bits c at t\2\2@>)
- at z
-
- at x
-  printf(cat_name[c]);
- at y
-  fputs(cat_name[c],stdout);
- at z
-
- at x
 @i prod.w
 @y
 @i prod-twill.w
@@ -1437,90 +899,36 @@
 @z
 
 @x
-void
-print_text(p) /* prints a token list for debugging; not used in |main| */
-text_pointer p;
+static void print_text(text_pointer p);@/
 @y
-#ifdef DEAD_CODE /* not used in |main| */
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
-text_pointer p at t\2\2@>)
+#if 0
+static void print_text(text_pointer p);@/
+#endif
 @z
 
 @x
-  fflush(stdout);
-}
- at y
-  printf("|\n"); update_terminal;
-}
-@#
-static void pr_txt(
-  int k)
-{ print_text(&tok_start[k]); }
-#endif /* |DEAD_CODE| */
- at z
-
- at x
- at d app(a) *(tok_ptr++)=a
- at d app1(a) *(tok_ptr++)=tok_flag+(int)((a)->trans-tok_start)
- at y
- at d app(a) *(tok_ptr++)=(token)(a)
- at d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
- at z
-
- at x
-void
-app_str(s)
-char *s;
- at y
 static void
-app_str(
-const char *s)
- at z
-
- at x
-void
-big_app(a)
-token a;
+print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
 @y
+#if 0
 static void
-big_app(
-token a)
+print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
 @z
 
 @x
-void
-big_app1(a)
-scrap_pointer a;
+  update_terminal;
 @y
-static void
-big_app1(
-scrap_pointer a)
+  printf("|\n"); update_terminal;
 @z
 
 @x
-        && pp->cat!=prerangle
+}
 @y
-        && pp->cat!=prerangle @|
+}
+#endif
 @z
 
 @x
-        && pp->cat!=ftemplate
- at y
-        && pp->cat!=ftemplate @|
- at z
-
- at x
-token_pointer
-find_first_ident(p)
-text_pointer p;
- at y
-static token_pointer
-find_first_ident(
-text_pointer p)
- at z
-
- at x
 the |for| loop below.
 
 @c
@@ -1536,16 +944,6 @@
 @z
 
 @x
-void
-make_reserved(p) /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p;
- at y
-static void
-make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p at t\2\2@>)
- at z
-
- at x
   token_pointer tok_loc; /* pointer to |tok_value| */
   if ((tok_loc=find_first_ident(p->trans))<=operator_found)
     return; /* this should not happen */
@@ -1554,45 +952,11 @@
 @z
 
 @x
-void
-make_underlined(p)
-/* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p;
- at y
-static void
-make_underlined(@t\1\1@>
-/* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p at t\2\2@>)
- at z
-
- at x
   token_pointer tok_loc; /* where the first identifier appears */
 @y
 @z
 
 @x
-void  underline_xref();
- at y
-static void underline_xref(name_pointer);@/
- at z
-
- at x
-void
-underline_xref(p)
-name_pointer p;
- at y
-static void
-underline_xref(
-name_pointer p)
- at z
-
- at x
-  p->xref=(char*)xref_ptr;
- at y
-  update_node(p);
- at z
-
- at x
   r->num=m; /* everything from |q| on is left undisturbed */
 @y
   r->num=m; /* everything from |q| on is left undisturbed */
@@ -1722,12 +1086,6 @@
   reduce(pp,1,fn_decl,0,1);
 }
 @y
-\.{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.
-
- at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
-
 @<Cases for |exp|@>=
 if(cat1==lbrace || cat1==int_like || cat1==decl) {
   make_underlined(pp);
@@ -1811,14 +1169,7 @@
   big_app1(pp+1); reduce(pp,2,cat1,-1,41);
 }
 @y
-@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
-not yet present.  Here is a simple implementation.  The purpose is to suppress
-the extra space between local variable declarations and the first statement in
-a function block.
-
- at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
-
-@<Cases for |decl|@>=
+@ @<Cases for |decl|@>=
 if (cat1==decl) {
   big_app1(pp); big_app(force); big_app1(pp+1);
   reduce(pp,2,decl,-1,40);
@@ -1848,9 +1199,7 @@
   big_app1(pp+1); reduce(pp,2,function,-1,52);
 }
 @y
-@ Outdent after parameter declarations with option \.{-i}.
-
-@<Cases for |fn_decl|@>=
+@ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
   big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
 }
@@ -1931,34 +1280,6 @@
 @z
 
 @x
-void
-reduce(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
- at y
-static void
-reduce(
-scrap_pointer j, short k,
-eight_bits c,
-short d, short n)
- at z
-
- at x
-void
-squash(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
- at y
-static void
-squash(
-scrap_pointer j, short k,
-eight_bits c,
-short d, short n)
- at z
-
- at x
     overflow("token");
 @y
     overflow(_("token"));
@@ -1971,38 +1292,6 @@
 @z
 
 @x
-{ scrap_pointer k; /* pointer into |scrap_info| */
-  if (tracing==2) {
-    printf("\n%d:",n);
-    for (k=scrap_base; k<=lo_ptr; k++) {
-      if (k==pp) putxchar('*'); else putxchar(' ');
-      if (k->mathness %4 ==  yes_math) putchar('+');
-      else if (k->mathness %4 ==  no_math) putchar('-');
-      print_cat(k->cat);
-      if (k->mathness /4 ==  yes_math) putchar('+');
-      else if (k->mathness /4 ==  no_math) putchar('-');
- at y
-{ 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('-');
- at z
-
- at x
-text_pointer
-translate() /* converts a sequence of scraps */
- at y
-static text_pointer
-translate(void) /* converts a sequence of scraps */
- at z
-
- at x
     if (tok_ptr+6>tok_mem_end) overflow("token");
 @y
     if (tok_ptr+6>tok_mem_end) overflow(_("token"));
@@ -2021,160 +1310,10 @@
 @z
 
 @x
-void
-C_parse(spec_ctrl) /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl;
- at y
-static void
-C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl at t\2\2@>)
- at z
-
- at x
-switch (next_control) {
-  case section_name:
-    app(section_flag+(int)(cur_section-name_dir));
-    app_scrap(section_scrap,maybe_math);
-    app_scrap(exp,yes_math);@+break;
-  case string: case constant: case verbatim: @<Append a string or constant@>;
-   @+break;
-  case identifier: app_cur_id(1);@+break;
-  case TeX_string: @<Append a \TEX/ string, without forming a scrap@>;@+break;
-  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 .\\\#@>
   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_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;@/
-  @t\4@>  @<Cases involving nonstandard characters@>@;
-  case thin_space: app_str("\\,"); app_scrap(insert,maybe_math);@+break;
- at .\\,@>
-  case math_break: app(opt); app_str("0");
-    app_scrap(insert,maybe_math);@+break;
-  case line_break: app(force); app_scrap(insert,no_math);@+break;
-  case left_preproc: app(force); app(preproc_line);
-    app_str("\\#"); app_scrap(lproc,no_math);@+break;
- at .\\\#@>
-  case right_preproc: app(force); app_scrap(rproc,no_math);@+break;
-  case big_line_break: app(big_force); app_scrap(insert,no_math);@+break;
-  case no_line_break: app(big_cancel); app(noop); app(break_space);
-    app(noop); app(big_cancel);
-    app_scrap(insert,no_math);@+break;
-  case pseudo_semi: app_scrap(semi,maybe_math);@+break;
-  case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
-  case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
-  case join: app_str("\\J"); app_scrap(insert,no_math);@+break;
- at .\\J@>
-  case output_defs_code: app(force); app_str("\\ATH"); app(force);
-    app_scrap(insert,no_math);@+break;
- at .\\ATH@>
-  default: app(inserted); app(next_control);
-    app_scrap(insert,maybe_math);@+break;
-}
 @y
-switch (next_control) {
-  case section_name:
-    app(section_flag+(int)(cur_section-name_dir));
-    app_scrap(section_scrap,maybe_math);
-    app_scrap(exp,yes_math);@+break;
-  case string: case constant: case verbatim:
-    @<Append a string or constant@>;@+break;
-  case identifier: app_cur_id(1);@+break;
-  case TeX_string:
-    @<Append a \TEX/ string, without forming a scrap@>;@+break;
-  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 .\\\#@>
   case ignore: case xref_roman: case xref_wildcard:
   case meaning: case suppress:
-  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_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;@/
-  @t\4@>  @<Cases involving nonstandard characters@>@;
-  case thin_space: app_str("\\,");@+app_scrap(insert,maybe_math);@+break;
- at .\\,@>
-  case math_break: app(opt);@+app_str("0");@+
-    app_scrap(insert,maybe_math);@+break;
-  case line_break: app(force);@+app_scrap(insert,no_math);@+break;
-  case left_preproc: app(force);@+app(preproc_line);@+app_str("\\#");
-    app_scrap(lproc,no_math);@+break;
- at .\\\#@>
-  case right_preproc: app(force);@+app_scrap(rproc,no_math);@+break;
-  case big_line_break: app(big_force);@+app_scrap(insert,no_math);@+break;
-  case no_line_break: app(big_cancel);@+app(noop);@+app(break_space);@+
-    app(noop);@+app(big_cancel); app_scrap(insert,no_math);@+break;
-  case pseudo_semi: app_scrap(semi,maybe_math);@+break;
-  case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
-  case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
-  case join: app_str("\\J");@+app_scrap(insert,no_math);@+break;
- at .\\J@>
-  case output_defs_code: app(force);@+app_str("\\ATH");@+app(force);
-    app_scrap(insert,no_math);@+break;
- at .\\ATH@>
-  default: app(inserted);@+app(next_control);
-    app_scrap(insert,maybe_math);@+break;
-}
 @z
 
 @x
@@ -2184,12 +1323,6 @@
 @z
 
 @x
-case not_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
- at y
-case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
- at z
-
- at x
         else err_print("! Double @@ should be used in strings");
 @y
         else err_print(_("! Double @@ should be used in strings"));
@@ -2196,22 +1329,6 @@
 @z
 
 @x
-void app_cur_id();
- at y
-void app_cur_id(boolean);@/
- at z
-
- at x
-void
-app_cur_id(scrapping)
-boolean scrapping; /* are we making this into a scrap? */
- at y
-void
-app_cur_id(@t\1\1@>
-boolean scrapping at t\2\2@>) /* are we making this into a scrap? */
- at z
-
- at x
       else app_scrap(p->ilk,maybe_math);
     }
   }
@@ -2223,14 +1340,6 @@
 @z
 
 @x
-text_pointer
-C_translate()
- at y
-static text_pointer
-C_translate(void)
- at z
-
- at x
   if (next_control!='|') err_print("! Missing '|' after C text");
 @y
   if (next_control!='|') err_print(_("! Missing '|' after C text"));
@@ -2245,14 +1354,6 @@
 @z
 
 @x
-void
-outer_parse() /* makes scraps from \CEE/ tokens and comments */
- at y
-static void
-outer_parse(void) /* makes scraps from \CEE/ tokens and comments */
- at z
-
- at x
         app(tok_flag+(int)(p-tok_start));
 @y
         app(tok_flag+(int)(p-tok_start));
@@ -2260,16 +1361,6 @@
 @z
 
 @x
-void
-push_level(p) /* suspends the current level */
-text_pointer p;
- at y
-static void
-push_level(@t\1\1@> /* suspends the current level */
-text_pointer p at t\2\2@>)
- at z
-
- at x
   if (stack_ptr==stack_end) overflow("stack");
 @y
   if (stack_ptr==stack_end) overflow(_("stack"));
@@ -2276,88 +1367,18 @@
 @z
 
 @x
-void
-pop_level()
+  fputs("\n! Illegal control code in section name: <",stdout);
 @y
-static void
-pop_level(void)
- at z
-
- at x
-eight_bits
-get_output() /* returns the next token of output */
- at y
-static eight_bits
-get_output(void) /* returns the next token of output */
- at z
-
- at x
-  return(a);
- at y
-  return((eight_bits)a);
- at z
-
- at x
-void
-output_C() /* outputs the current token list */
- at y
-static void
-output_C(void) /* outputs the current token list */
- at z
-
- at x
-void make_output();
- at y
-static void make_output(void);@/
- at z
-
- at x
-void
-make_output() /* outputs the equivalents of tokens */
-{
-  eight_bits a, /* current output byte */
- at y
-static void
-make_output(void) /* outputs the equivalents of tokens */
-{
-  eight_bits a=0, /* current output byte */
- at z
-
- at x
-  else if (b!='|') out(b)@;
- at y
-  else { if (b!='|') out(b)@;
- at z
-
- at x
-  }
- at y
-  } }
- at z
-
- at x
-  printf("\n! Illegal control code in section name: <");
- at y
   fputs(_("\n! Illegal control code in section name: <"),stdout);
 @z
 
 @x
-    printf("\n! C text in section name didn't end: <");
+    fputs("\n! C text in section name didn't end: <",stdout);
 @y
     fputs(_("\n! C text in section name didn't end: <"),stdout);
 @z
 
 @x
-    if (b=='\'' || b=='"')
-      if (delim==0) delim=b;
-      else if (delim==b) delim=0;
- at y
-    if (b=='\'' || b=='"') {
-      if (delim==0) delim=b;
-      else if (delim==b) delim=0; }
- at z
-
- at x
       if (j>buffer+long_buf_size-3) overflow("buffer");
 @y
       if (j>buffer+long_buf_size-3) overflow(_("buffer"));
@@ -2370,22 +1391,8 @@
 @z
 
 @x
-void phase_two();
+reset_input(); if (show_progress) fputs("\nWriting the output file...",stdout);
 @y
-static void phase_two(void);@/
- at z
-
- at x
-void
-phase_two() {
- at y
-static void
-phase_two(void) {
- at z
-
- at x
-reset_input(); if (show_progress) printf("\nWriting the output file...");
- at y
 reset_input(); if (show_progress) fputs(_("\nWriting the output file..."),stdout);
 @z
 
@@ -2398,11 +1405,11 @@
 @z
 
 @x
-while (!input_has_ended) @<Translate the current section@>;
+while (!input_has_ended) @<Translate the current section@>@;
 }
 
 @y
-while (!input_has_ended) @<Translate the current section@>;
+while (!input_has_ended) @<Translate the current section@>@;
 }
 
 @ @<Glob...@>=
@@ -2410,7 +1417,7 @@
 char aux_file_name[max_file_name_length]; /* name of \.{.aux} file */
 
 @ @<Read the \.{.aux} file, if present; then open it for output@>=
-strncpy(aux_file_name,tex_file_name,strlen(tex_file_name)-4);
+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 */
@@ -2433,16 +1440,14 @@
 
 @x
 boolean group_found=0; /* has a starred section occurred? */
+
+@ @<Translate the current section@>= {
+  section_count++;
 @y
 boolean group_found=0; /* has a starred section occurred? */
 boolean right_start_switch; /* has `\.{@@r}' occurred recently? */
 boolean temp_switch; /* has `\.{@@\%}' occurred recently? */
- at z
 
- at x
-@ @<Translate the current section@>= {
-  section_count++;
- at y
 @ @d usage_sentinel (struct perm_meaning *)1
 @<Translate the current section@>= {
   section_count++;
@@ -2524,42 +1529,6 @@
 @z
 
 @x
-void finish_C();
- at y
-static void finish_C(boolean);@/
- at z
-
- at x
-void
-finish_C(visible) /* finishes a definition or a \CEE/ part */
-  boolean visible; /* nonzero if we should produce \TEX/ output */
- at y
-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 */
- at z
-
- at x
-    if (out_ptr>out_buf+1)
-      if (*(out_ptr-1)=='\\')
- at .\\6@>
- at .\\7@>
- at .\\Y@>
-        if (*out_ptr=='6') out_ptr-=2;
-        else if (*out_ptr=='7') *out_ptr='Y';
- at y
-    if (out_ptr>out_buf+1) {
-      if (*(out_ptr-1)=='\\') {
- at .\\6@>
- at .\\7@>
- at .\\Y@>
-        if (*out_ptr=='6') out_ptr-=2;
-        else if (*out_ptr=='7') *out_ptr='Y';
-      }
-    }
- at z
-
- at x
 @<Start a macro...@>= {
 @y
 @<Start a macro...@>= {
@@ -2635,22 +1604,6 @@
 @z
 
 @x
-void footnote();
- at y
-static void footnote(sixteen_bits);@/
- at z
-
- at x
-void
-footnote(flag) /* outputs section cross-references */
-sixteen_bits flag;
- at y
-static void
-footnote(@t\1\1@> /* outputs section cross-references */
-sixteen_bits flag at t\2\2@>)
- at z
-
- at x
 out_str("\\fi"); finish_line();
 @.\\fi@>
 flush_buffer(out_buf,0,0); /* insert a blank line, it looks nice */
@@ -2670,7 +1623,7 @@
 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@>=
+@<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) {
@@ -2749,20 +1702,6 @@
 @z
 
 @x
-void phase_three();
- at y
-static void phase_three(void);@/
- at z
-
- at x
-void
-phase_three() {
- at y
-static void
-phase_three(void) {
- at z
-
- at x
 if (no_xref) {
   finish_line();
   out_str("\\end");
@@ -2779,18 +1718,12 @@
 @z
 
 @x
-  phase=3; if (show_progress) printf("\nWriting the index...");
+  phase=3; if (show_progress) fputs("\nWriting the index...",stdout);
 @y
   phase=3; if (show_progress) fputs(_("\nWriting the index..."),stdout);
 @z
 
 @x
-  if ((idx_file=fopen(idx_file_name,"w"))==NULL)
- at y
-  if ((idx_file=fopen(idx_file_name,"wb"))==NULL)
- at z
-
- at x
     fatal("! Cannot open index file ",idx_file_name);
 @y
     fatal(_("! Cannot open index file "),idx_file_name);
@@ -2798,26 +1731,12 @@
 
 @x
   if (change_exists) {
-    @<Tell about changed sections@>; finish_line(); finish_line();
+    @<Tell about changed sections@>@; finish_line(); finish_line();
   }
 @y
 @z
 
 @x
-  @<Do the first pass of sorting@>;
-  @<Sort and output the index@>;
- at y
-  @<Do the first pass of sorting@>@;
-  @<Sort and output the index@>@;
- at z
-
- at x
-  if ((scn_file=fopen(scn_file_name,"w"))==NULL)
- at y
-  if ((scn_file=fopen(scn_file_name,"wb"))==NULL)
- at z
-
- at x
     fatal("! Cannot open section file ",scn_file_name);
 @y
     fatal(_("! Cannot open section file "),scn_file_name);
@@ -2824,12 +1743,6 @@
 @z
 
 @x
-  @<Output all the section names@>;
- at y
-  @<Output all the section names@>@;
- at z
-
- at x
 @.\\end@>
   finish_line();
   fclose(active_file);
@@ -2842,12 +1755,9 @@
 @z
 
 @x
-if (show_happiness) printf("\nDone.");
+  fputs("Done.",stdout);
 @y
-if (show_happiness) {
-  if (show_progress) new_line;
   fputs(_("Done."),stdout);
-}
 @z
 
 @x
@@ -2875,106 +1785,6 @@
 @z
 
 @x
-for (c=0; c<=255; c++) bucket[c]=NULL;
- at y
-for (c=0; c<256; c++) bucket[c]=NULL;
- at z
-
- at x
-    if (cur_name->xref!=(char*)xmem) {
- at y
-    if (cur_name->xref!=(void *)xmem) {
- at z
-
- at x
-@ @<Rest of |trans_plus| union@>=
- at y
-@<Rest of |trans_plus| union@>=
- at z
-
- at x
-collate[0]=0;
-strcpy(collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
-/* 16 characters + 1 = 17 */
-strcpy(collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
-/* 16 characters + 17 = 33 */
-strcpy(collate+33,"!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
-/* 32 characters + 33 = 65 */
-strcpy(collate+65,"abcdefghijklmnopqrstuvwxyz0123456789");
-/* (26 + 10) characters + 65 = 101 */
-strcpy(collate+101,"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
-/* 16 characters + 101 = 117 */
-strcpy(collate+117,"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
-/* 16 characters + 117 = 133 */
-strcpy(collate+133,"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
-/* 16 characters + 133 = 149 */
-strcpy(collate+149,"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
-/* 16 characters + 149 = 165 */
-strcpy(collate+165,"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
-/* 16 characters + 165 = 181 */
-strcpy(collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
-/* 16 characters + 181 = 197 */
-strcpy(collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
-/* 16 characters + 197 = 213 */
-strcpy(collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
-/* 16 characters + 213 = 229 */
- at y
-collate[0]=0;
-strcpy((char *)collate+1,
-  " \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
-/* 16 characters + 1 = 17 */
-strcpy((char *)collate+17,
-  "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
-/* 16 characters + 17 = 33 */
-strcpy((char *)collate+33,
-  "!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
-/* 32 characters + 33 = 65 */
-strcpy((char *)collate+65,
-  "abcdefghijklmnopqrstuvwxyz0123456789");
-/* (26 + 10) characters + 65 = 101 */
-strcpy((char *)collate+101,
-  "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
-/* 16 characters + 101 = 117 */
-strcpy((char *)collate+117,
-  "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
-/* 16 characters + 117 = 133 */
-strcpy((char *)collate+133,
-  "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
-/* 16 characters + 133 = 149 */
-strcpy((char *)collate+149,
-  "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
-/* 16 characters + 149 = 165 */
-strcpy((char *)collate+165,
-  "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
-/* 16 characters + 165 = 181 */
-strcpy((char *)collate+181,
-  "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
-/* 16 characters + 181 = 197 */
-strcpy((char *)collate+197,
-  "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
-/* 16 characters + 197 = 213 */
-strcpy((char *)collate+213,
-  "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
-/* 16 characters + 213 = 229 */
- at z
-
- at x
-void  unbucket();
- at y
-static void unbucket(eight_bits);@/
- at z
-
- at x
-void
-unbucket(d) /* empties buckets having depth |d| */
-eight_bits d;
- at y
-static void
-unbucket(@t\1\1@> /* empties buckets having depth |d| */
-eight_bits d at t\2\2@>)
- at z
-
- at x
     if (sort_ptr>=scrap_info_end) overflow("sorting");
 @y
     if (sort_ptr>=scrap_info_end) overflow(_("sorting"));
@@ -3030,93 +1840,60 @@
 @z
 
 @x
-void section_print();
- at y
-static void section_print(name_pointer);@/
- at z
-
- at x
-void
-section_print(p) /* print all section names in subtree |p| */
-name_pointer p;
- at y
-static void
-section_print(@t\1\1@> /* print all section names in subtree |p| */
-name_pointer p at t\2\2@>)
- at z
-
- at x
-@ @<Output all the section names@>=section_print(root)
- at y
-@ @<Output all the section names@>=section_print(root);
- at z
-
- at x
-void
-print_stats() {
- at y
-void
-print_stats(void) {
- at z
-
- at x
-  printf("\nMemory usage statistics:\n");
+  puts("\nMemory usage statistics:");
 @.Memory usage statistics:@>
   printf("%ld names (out of %ld)\n",
-            (long)(name_ptr-name_dir),(long)max_names);
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf("%ld cross-references (out of %ld)\n",
-            (long)(xref_ptr-xmem),(long)max_refs);
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
   printf("%ld bytes (out of %ld)\n",
-            (long)(byte_ptr-byte_mem),(long)max_bytes);
-  printf("Parsing:\n");
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
+  puts("Parsing:");
   printf("%ld scraps (out of %ld)\n",
-            (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
   printf("%ld texts (out of %ld)\n",
-            (long)(max_text_ptr-tok_start),(long)max_texts);
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
   printf("%ld tokens (out of %ld)\n",
-            (long)(max_tok_ptr-tok_mem),(long)max_toks);
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
   printf("%ld levels (out of %ld)\n",
-            (long)(max_stack_ptr-stack),(long)stack_size);
-  printf("Sorting:\n");
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
+  puts("Sorting:");
   printf("%ld levels (out of %ld)\n",
-            (long)(max_sort_ptr-scrap_info),(long)max_scraps);
-}
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
 @y
   puts(_("\nMemory usage statistics:"));
 @.Memory usage statistics:@>
   printf(_("%ld names (out of %ld)\n"),
-            (long)(name_ptr-name_dir),(long)max_names);
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf(_("%ld cross-references (out of %ld)\n"),
-            (long)(xref_ptr-xmem),(long)max_refs);
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
   printf(_("%ld bytes (out of %ld)\n"),
-            (long)(byte_ptr-byte_mem),(long)max_bytes);
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
   printf(_("%ld temp meanings (out of %ld)\n"),
-            (long)(max_temp_meaning_ptr-temp_meaning_stack),
+            (ptrdiff_t)(max_temp_meaning_ptr-temp_meaning_stack),
             (long)max_meanings);
   printf(_("%ld titles (out of %ld)\n"),
-            (long)(title_code_ptr-title_code),(long)max_titles);
+            (ptrdiff_t)(title_code_ptr-title_code),(long)max_titles);
   puts(_("Parsing:"));
   printf(_("%ld scraps (out of %ld)\n"),
-            (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
   printf(_("%ld texts (out of %ld)\n"),
-            (long)(max_text_ptr-tok_start),(long)max_texts);
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
   printf(_("%ld tokens (out of %ld)\n"),
-            (long)(max_tok_ptr-tok_mem),(long)max_toks);
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
   printf(_("%ld levels (out of %ld)\n"),
-            (long)(max_stack_ptr-stack),(long)stack_size);
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
   puts(_("Sorting:"));
   printf(_("%ld levels (out of %ld)\n"),
-            (long)(max_sort_ptr-scrap_info),(long)max_scraps);
-}
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
 @z
 
 @x
 @** Index.
 @y
-@** Extensions for modern {\tt CWEB}.  The following sections introduce changes
-and extensions to the code that have been created by numerous contributors over
-the course of a quarter century. They make \.{CWEB} adhere to modern coding
-standards and introduce new or improved features.
+@** Extensions to \.{CWEB}.  The following sections introduce new or improved
+features that have been created by numerous contributors over the course of a
+quarter century.
 
 \bigskip
 \font\itt=cmitt10
@@ -3124,58 +1901,26 @@
 modified material is incorporated all over the place, without taking special
 care for keeping the original section numbering intact.}
 
-@* Set {\tt CWEAVE} flags.
-At least one of these is already used in \.{COMMON}.
+@* 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.
 
+ at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+
 @<Set init...@>=
-  make_xrefs=force_lines=make_pb=indent_param_decl=order_decl_stmt=1;
-    /* controlled by command-line options */
+indent_param_decl=true;
 
-@* Function declarations.  Here are declarations---conforming to
-{\mc ANSI~C}---of all functions in this code, as far as they are
-not already in |"common.h"|.  These are private to \.{CWEAVE} and \.{CTWILL}.
+@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
+not yet present.  Here is a simple implementation.  The purpose is to suppress
+the extra space between local variable declarations and the first statement in
+a function block.
 
-@<Predecl...@>=
-static eight_bits copy_TeX(void);@/
-static eight_bits get_output(void);@/
-static eight_bits skip_TeX(void);@/
-static text_pointer C_translate(void);@/
-static text_pointer translate(void);@/
-static token_pointer find_first_ident(text_pointer);@/
-static void app_str(const char *);@/
-static void big_app(token);@/
-static void big_app1(scrap_pointer);@/
-static void copy_limbo(void);@/
-static void C_parse(eight_bits);@/
-static void finish_line(void);@/
-static void flush_buffer(char *,boolean,boolean);@/
-static void make_reserved(scrap_pointer);@/
-static void make_underlined(scrap_pointer);@/
-static void new_section_xref(name_pointer);@/
-static void new_xref(name_pointer);@/
-static void outer_parse(void);@/
-static void output_C(void);@/
-static void out_name(name_pointer,boolean);@/
-static void out_section(sixteen_bits);@/
-static void out_str(const char *);@/
-static void pop_level(void);@/
-static void print_cat(eight_bits);@/
-#ifdef DEAD_CODE
-static void print_text(text_pointer p);@/
-#endif
-static void push_level(text_pointer);@/
-static void reduce(scrap_pointer,short,eight_bits,short,short);@/
-static void set_file_flag(name_pointer);@/
-static void skip_limbo(void);@/
-static void squash(scrap_pointer,short,eight_bits,short,short);@/
-static void update_node(name_pointer p);@/
+ at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
 
-@* Language setting.  This global variable is defined and set in \.{COMMON} by
-the `\.{+l}' (or `\.{-l}') command-line option.
+@<Set init...@>=
+order_decl_stmt=true;
 
-@<Global var...@>=
-extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
-
 @* Output file update.  Most \CEE/ projects are controlled by a
 \.{Makefile} that automatically takes care of the temporal dependecies
 between the different source modules.  It is suitable that \.{CWEB} doesn't

Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill.bux	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill.bux	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,90 +1,88 @@
-@$program {COMMON.W}2 \&{int}@>
-@$ctangle {COMMON.W}2 \&{int}@>
-@$ctwill {COMMON.W}2 \&{int}@>
-@$cweave {COMMON.W}2 \&{int}@>
-@$phase {COMMON.W}3 \&{int}@>
-@$common_init {COMMON.W}4 \&{void} (\,)@>
-@$id_first {COMMON.W}6 \&{char} ${*}$@>
-@$id_loc {COMMON.W}6 \&{char} ${*}$@>
-@$section_text {COMMON.W}6 \&{char} [\,][\,]@>
-@$section_text_end {COMMON.W}6 \&{char} ${*}$@>
-@$buffer {COMMON.W}7 \&{char} [\,]@>
-@$buffer_end {COMMON.W}7 \&{char} ${*}$@>
-@$limit {COMMON.W}7 \&{char} ${*}$@>
-@$loc {COMMON.W}7 \&{char} ${*}$@>
+@$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} (\,)@>
+@$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} ${*}$@>
+@$limit {COMMON.W}22 \&{char} ${*}$@>
+@$loc {COMMON.W}22 \&{char} ${*}$@>
 
-@$include_depth {COMMON.W}10 \&{int}@>
-@$file {COMMON.W}10 \&{FILE} ${*}$ [\,]@>
-@$change_file {COMMON.W}10 \&{FILE} ${*}$@>
-@$file_name {COMMON.W}10 \&{char} [\,][\,]@>
-@$change_file_name {COMMON.W}10 \&{char} [\,]@>
-@$alt_file_name {COMMON.W}10 \&{char} [\,]@>
-@$line {COMMON.W}10 \&{int} [\,]@>
-@$change_line {COMMON.W}10 \&{int}@>
-@$change_depth {COMMON.W}10 \&{int}@>
-@$input_has_ended {COMMON.W}10 \&{boolean}@>
-@$changing {COMMON.W}10 \&{boolean}@>
-@$web_file_open {COMMON.W}10 \&{boolean}@>
+@$include_depth {COMMON.W}25 \&{int}@>
+@$file {COMMON.W}25 \&{FILE} ${*}$ [\,]@>
+@$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}@>
+@$input_has_ended {COMMON.W}25 \&{boolean}@>
+@$changing {COMMON.W}25 \&{boolean}@>
+@$web_file_open {COMMON.W}25 \&{boolean}@>
 
-@$reset_input {COMMON.W}18 \&{void} (\,)@>
+@$reset_input {COMMON.W}35 \&{void} (\,)@>
 
-@$section_count {COMMON.W}20 \&{sixteen\_bits}@>
-@$changed_section {COMMON.W}20 \&{boolean} [\,]@>
-@$change_pending {COMMON.W}20 \&{boolean}@>
-@$print_where {COMMON.W}20 \&{boolean}@>
-@$get_line {COMMON.W}21 \&{boolean} (\,)@>
+@$section_count {COMMON.W}37 \&{sixteen\_bits}@>
+@$changed_section {COMMON.W}37 \&{boolean} [\,]@>
+@$change_pending {COMMON.W}37 \&{boolean}@>
+@$print_where {COMMON.W}37 \&{boolean}@>
+@$get_line {COMMON.W}38 \&{boolean} (\,)@>
 
-@$check_complete {COMMON.W}26 \&{void} (\,)@>
-@$byte_mem {COMMON.W}27 \&{char} [\,]@>
-@$byte_mem_end {COMMON.W}27 \&{char} ${*}$@>
-@$name_dir {COMMON.W}27 \&{name\_info} [\,]@>
-@$name_dir_end {COMMON.W}27 \&{name\_pointer}@>
+@$check_complete {COMMON.W}42 \&{void} (\,)@>
+@$byte_mem {COMMON.W}43 \&{char} [\,]@>
+@$byte_mem_end {COMMON.W}43 \&{char} ${*}$@>
+@$name_dir {COMMON.W}43 \&{name\_info} [\,]@>
+@$name_dir_end {COMMON.W}43 \&{name\_pointer}@>
 
-@$byte_ptr {COMMON.W}29 \&{char} ${*}$@>
-@$name_ptr {COMMON.W}29 \&{name\_pointer}@>
+@$byte_ptr {COMMON.W}44 \&{char} ${*}$@>
+@$name_ptr {COMMON.W}44 \&{name\_pointer}@>
 
-@$h {COMMON.W}32 \&{hash\_pointer}@>
-@$hash {COMMON.W}32 \&{name\_pointer} [\,]@>
-@$hash_end {COMMON.W}32 \&{hash\_pointer}@>
+@$h {COMMON.W}46 \&{hash\_pointer}@>
+@$hash {COMMON.W}46 \&{name\_pointer} [\,]@>
+@$hash_end {COMMON.W}46 \&{hash\_pointer}@>
 
-@$id_lookup {COMMON.W}35 \&{name\_pointer} (\,)@>
+@$id_lookup {COMMON.W}48 \&{name\_pointer} (\,)@>
 
-@$print_section_name {COMMON.W}42 \&{void} (\,)@>
-@$sprint_section_name {COMMON.W}43 \&{void} (\,)@>
-@$print_prefix_name {COMMON.W}44 \&{void} (\,)@>
+@$print_section_name {COMMON.W}52 \&{void} (\,)@>
+@$sprint_section_name {COMMON.W}53 \&{void} (\,)@>
+@$print_prefix_name {COMMON.W}54 \&{void} (\,)@>
 
-@$section_lookup {COMMON.W}49 \&{name\_pointer} (\,)@>
+@$section_lookup {COMMON.W}59 \&{name\_pointer} (\,)@>
 
-@$history {COMMON.W}56 \&{int}@>
+@$history {COMMON.W}65 \&{int}@>
 
-@$err_print {COMMON.W}58 \&{void} (\,)@>
+@$err_print {COMMON.W}66 \&{void} (\,)@>
 
-@$wrap_up {COMMON.W}60 \&{int} (\,)@>
+@$wrap_up {COMMON.W}68 \&{int} (\,)@>
 
-@$fatal {COMMON.W}64 \&{void} (\,)@>
-@$overflow {COMMON.W}65 \&{void} (\,)@>
+@$fatal {COMMON.W}70 \&{void} (\,)@>
+@$overflow {COMMON.W}71 \&{void} (\,)@>
 
-@$argc {COMMON.W}67 \&{int}@>
-@$argv {COMMON.W}67 \&{char} ${**}$@>
-@$C_file_name {COMMON.W}67 \&{char} [\,]@>
-@$tex_file_name {COMMON.W}67 \&{char} [\,]@>
-@$idx_file_name {COMMON.W}67 \&{char} [\,]@>
-@$scn_file_name {COMMON.W}67 \&{char} [\,]@>
-@$check_file_name {COMMON.W}67 \&{char} [\,]@>
-@$flags {COMMON.W}67 \&{boolean} [\,]@>
-@$use_language {COMMON.W}67 \&{const char} ${*}$@>
+@$argc {COMMON.W}73 \&{int}@>
+@$argv {COMMON.W}73 \&{char} ${**}$@>
+@$C_file_name {COMMON.W}73 \&{char} [\,]@>
+@$tex_file_name {COMMON.W}73 \&{char} [\,]@>
+@$idx_file_name {COMMON.W}73 \&{char} [\,]@>
+@$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}77 \&{FILE} ${*}$@>
-@$tex_file {COMMON.W}77 \&{FILE} ${*}$@>
-@$idx_file {COMMON.W}77 \&{FILE} ${*}$@>
-@$scn_file {COMMON.W}77 \&{FILE} ${*}$@>
-@$check_file {COMMON.W}77 \&{FILE} ${*}$@>
-@$active_file {COMMON.W}77 \&{FILE} ${*}$@>
+@$C_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$tex_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$idx_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$scn_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$check_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$active_file {COMMON.W}83 \&{FILE} ${*}$@>
 
-@$cb_banner {COMMON.W}86 \&{char} [\,]@>
+@$cb_banner {COMMON.W}87 \&{char} [\,]@>
 
-@$cb_show_banner {COMMON.W}95 \&{void} (\,)@>
+@$cb_show_banner {COMMON.W}99 \&{void} (\,)@>
 
 @$versionstring "<lib/lib.h>" \zip@>
-
-@$skip_comment {}108 =\\{copy\_comment}@>

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -20,16 +20,16 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 3.64pc/big)\n"
+ at d banner "This is CWEAVE (Version 4.0pc/big)"
 @z
 
 
- at x Section 9.
+ at x Section 7.
 @d chunk_marker 0
 
 @<Common code...@>=
@@ -41,7 +41,7 @@
       names */
     char Ilk; /* used by identifiers in \.{CWEAVE} only */
   } dummy;
-  char *equiv_or_xref; /* info corresponding to names */
+  void *equiv_or_xref; /* 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;
@@ -54,9 +54,6 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
 @y
 @d chunk_marker 0
 
@@ -87,13 +84,10 @@
 extern name_pointer hash[]; /* heads of hash lists */
 extern hash_pointer hash_end; /* end of |hash| */
 extern hash_pointer h; /* index into hash-head array */
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
 @z
 
 
- at x Section 18.
+ at x Section 22.
 typedef struct xref_info {
   sixteen_bits num; /* section number plus zero or |def_flag| */
   struct xref_info *xlink; /* pointer to the previous cross-reference */
@@ -108,7 +102,7 @@
 @z
 
 
- at x Section 19.
+ at x Section 23.
 xref_info xmem[max_refs]; /* contains cross-reference information */
 xref_pointer xmem_end = xmem+max_refs-1;
 @y
@@ -117,7 +111,7 @@
 @z
 
 
- at x Section 20.
+ at x Section 24.
 @d xref equiv_or_xref
 @y
 @d xref ptr_union.xref_member
@@ -124,45 +118,17 @@
 @z
 
 
- at x Section 20.
-xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
+ at x Section 24.
+xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 @y
 xmem_end = xmem + max_refs - 1;
-xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 @z
 
 
- at x Section 21.
-  append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
- at y
-  append_xref(m); xref_ptr->xlink=q; p->xref=(char huge*)xref_ptr;
- at z
-
-
- at x Section 22.
-  if (r==xmem) p->xref=(char*)xref_ptr;
- at y
-  if (r==xmem) p->xref=(char huge*)xref_ptr;
- at z
-
-
- at x Section 23.
-  q=(xref_pointer)p->xref;
-  if (q->num==file_flag) return;
-  append_xref(file_flag);
-  xref_ptr->xlink = q;
-  p->xref = (char *)xref_ptr;
- at y
-  q=(xref_pointer)p->xref;
-  if (q->num==file_flag) return;
-  append_xref(file_flag);
-  xref_ptr->xlink = q;
-  p->xref = (char huge*)xref_ptr;
- at z
-
- at x Section 25. (to please Borland's C++, version 4.02)
+ at x Section 30. (to please Borland's C++, version 4.02)
 token tok_mem[max_toks]; /* tokens */
 token_pointer tok_mem_end = tok_mem+max_toks-1; /* end of |tok_mem| */
 token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
@@ -180,9 +146,10 @@
 token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
 @z
 
- at x Section 26. (goes with the previous change)
-tok_start[1]=tok_mem+1;
-max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
+ at x Section 31. (goes with the previous change)
+tok_ptr=max_tok_ptr=tok_mem+1;@/
+tok_start[0]=tok_start[1]=tok_mem+1;@/
+text_ptr=max_text_ptr=tok_start+1;
 @y
 tok_start[1]=tok_mem+1;
 tok_mem_end=tok_mem+max_toks-1;
@@ -191,27 +158,20 @@
 @z
 
 
- at x Section 27.
-  p->ilk=t; p->xref=(char*)xmem;
+ at x Section 32.
+  p->xref=(void *)xmem;
 @y
-  p->ilk=t; p->xref=(char huge*)xmem;
+  p->xref=(void huge*)xmem;
 @z
 
 
- at x Section 27.
-  p->xref=(char*)xmem;
- at y
-  p->xref=(char huge*)xmem;
- at z
-
-
- at x Section 70.
+ at x Section 74.
       if (unindexed(lhs)) { /* retain only underlined entries */
         xref_pointer q,r=NULL;
         for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
           if (q->num<def_flag)
             if (r) r->xlink=q->xlink;
-            else lhs->xref=(char*)q->xlink;
+            else lhs->xref=(void *)q->xlink;
           else r=q;
       }
 @y
@@ -220,13 +180,13 @@
         for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
           if (q->num<def_flag)
             if (r) r->xlink=q->xlink;
-            else lhs->xref=(char huge*)q->xlink;
+            else lhs->xref=(void huge*)q->xlink;
           else r=q;
       }
 @z
 
 
- at x Section 87.
+ at x Section 93.
   char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
   out('{');
   for (k=p->byte_start; k<k_end; k++) {
@@ -237,33 +197,7 @@
 @z
 
 
- at x Section 116.
-  append_xref(0); /* this number doesn't matter */
-  xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
-  p->xref=(char*)xref_ptr;
-  while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
-  r->num=m; /* everything from |q| on is left undisturbed */
- at y
-  append_xref(0); /* this number doesn't matter */
-  xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
-  p->xref=(char huge*)xref_ptr;
-  while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
-  r->num=m; /* everything from |q| on is left undisturbed */
- at z
-
-
- at x Section 163.
-@ @<Change |pp| to $\max...@>=
- at y
-@ @<Change |pp| to $\max...@>=
-#ifdef __MSDOS__
-if (d<0 && pp+d>pp) pp=scrap_base; /* segmented architecture caused wrap */
-else
-#endif
- at z
-
-
- at x Section 194.
+ at x Section 209.
   char *p; /* index into |byte_mem| */
 @y
   char huge *p; /* index into |byte_mem| */
@@ -270,14 +204,14 @@
 @z
 
 
- at x Section 229.
-    if (cur_name->xref!=(char*)xmem) {
+ at x Section 244.
+    if (cur_name->xref!=(void *)xmem) {
 @y
-    if (cur_name->xref!=(char huge*)xmem) {
+    if (cur_name->xref!=(void huge*)xmem) {
 @z
 
 
- at x Section 232.
+ at x Section 246.
 char *cur_byte; /* index into |byte_mem| */
 @y
 char huge* cur_byte; /* index into |byte_mem| */
@@ -284,19 +218,19 @@
 @z
 
 
- at x Section 241.
+ at x Section 255.
 switch (cur_name->ilk) {
-  case normal: if (is_tiny(cur_name)) out_str("\\|");
+  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
     else {char *j;
 @y
 switch (cur_name->ilk) {
-  case normal: if (is_tiny(cur_name)) out_str("\\|");
+  case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
     else {char huge* j;
 @z
 
 
- at x Section 241.
-  case custom: case quoted: {char *j; out_str("$\\");
+ at x Section 255.
+  case custom: {char *j; out_str("$\\");
 @y
-  case custom: case quoted: {char huge* j; out_str("$\\");
+  case custom: {char huge* j; out_str("$\\");
 @z

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -16,7 +16,7 @@
 }
 @y
 \def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{109}
+\def\contentspagenumber{111}
 \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-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -11,29 +11,18 @@
 change files that have -bs in their name instead of -pc.)
 
 @x section 1
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
- at d banner "This is CWEAVE (Version 3.64pc)\n"
+ at d banner "This is CWEAVE (Version 4.0pc)"
 @z
 
 @x section 4
- at d max_bytes 90000 /* the number of bytes in identifiers,
+ at d max_bytes 1000000 /* the number of bytes in identifiers,
 @y
 @d max_bytes (unsigned)60000 /* the number of bytes in identifiers,
 @z
 @x
- at d max_refs 20000 /* number of cross-references; must be less than 65536 */
+ at d max_refs 65535 /* number of cross-references; must be less than 65536 */
 @y
 @d max_refs 10000 /* number of cross-references; must be less than 65536 */
 @z
-
- at x section 163
-@ @<Change |pp| to $\max...@>=
- at y
-@ @<Change |pp| to $\max...@>=
-#ifdef __MSDOS__
-if (d<0 && pp+d>pp) pp=scrap_base; /* segmented architecture caused wrap */
-else
-#endif
- at z
-

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -7,15 +7,15 @@
 
 
 @x
-\def\title{CWEAVE (Version 3.64)}
+\def\title{CWEAVE (Version 4.0)}
 @y
-\def\title{CWEAVE (QL Version 3.64)}
+\def\title{CWEAVE (QL Version 4.0)}
 @z
 
 @x section 1
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
- at d banner "This is CWEAVE (QL Version 3.64)\n"
+ at d banner "This is CWEAVE (QL Version 4.0)"
 @z
 
 @x

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -13,25 +13,26 @@
 (also modified by Don Knuth to keep version numbers uptodate)
 
 @x section 1 (01-FEB-1992 ST)
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
- at d banner "This is CWEAVE (VAX/VMS Version 3.64)\n"
+ at d banner "This is CWEAVE (VAX/VMS Version 4.0)"
 @z
 
- at x section 6 (from common.h) (01-FEB-1992 ST)
-#include <stdio.h>
+ at x section 3 (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| */
+#include <stdint.h> /* definition of |@!uint8_t| and |@!uint16_t| */
+#include <stdlib.h> /* definition of |@!getenv| and |@!exit| */
+#include <stdio.h> /* definition of |@!printf| and friends */
+#include <string.h> /* definition of |@!strlen|, |@!strcmp| and so on */
 @y
-#include stdio /* VMS searches Textlibraries faster */
+#include ctype /* definition of |@!isalpha|, |@!isdigit| and so on */
+               /* VMS searches text libraries faster */
+#include stdbool /* definition of |@!bool|, |@!true| and |@!false| */
+#include stddef /* definition of |@!ptrdiff_t| */
+#include stdint /* definition of |@!uint8_t| and |@!uint16_t| */
+#include stdlib /* definition of |@!getenv| and |@!exit| */
+#include stdio /* definition of |@!printf| and friends */
+#include string /* definition of |@!strlen|, |@!strcmp| and so on */
 @z
-
- at x section 38 (1991 JM) (01-FEB-1992 ST)
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
- at y
-#include ctype /* VMS searches Textlibraries faster */
- at z
-
- at x section 39 (01-FEB-1992 ST)
- at d isxalpha(c) ((c)=='_') /* non-alpha character allowed in identifier */
- at y
- at d isxalpha(c) ((c)=='_' || (c)=='$') /* non-alpha characters allowed in id */
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,30 +1,31 @@
- at q Changes for CWEB in TeX Live from numerous contributors. @>
- at q This file is in the Public Domain. @>
+ at q Changes for CWEB in TeX Live from numerous contributors.              @>
+ at q This file is in the Public Domain.                                    @>
 
- at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
- at q were merged with the set of change files of the CWEBbin project; @>
- at q see https://github.com/ascherer/cwebbin for the original parts. @>
+ at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber   @>
+ at q were merged with the set of change files of the CWEBbin project;      @>
+ at q see https://github.com/ascherer/cwebbin for the original parts.       @>
 
- at q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
- at q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
- at q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
- at q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
- at q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
- at q with the 'tie' processor and is used as a monolithic changefile for @>
- at q {common,ctangle,cweave}.w in TeX Live. @>
+ at q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch    @>
+ at q has been created from the elaborate set of change files               @>
+ at q {comm,ctang,cweav,cwebman}-patch.ch,                                  @>
+ at q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch,     @>
+ at q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and        @>
+ at q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+ at q and is used as a monolithic changefile for {common,ctangle,cweave}.w  @>
+ at q and cwebman.tex in TeX Live.                                          @>
 
- at q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+ at q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
-\def\title{CWEAVE (Version 3.64)}
+\def\title{CWEAVE (Version 4.0)}
 @y
-\def\title{CWEAVE (Version 3.64 [\TeX~Live])}
+\def\title{CWEAVE (Version 4.0 [\TeX~Live])}
 @z
 
 @x
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
 @y
-  \centerline{(Version 3.64 [\TeX~Live])}
+  \centerline{(Version 4.0 [\TeX~Live])}
 @z
 
 @x
@@ -36,115 +37,23 @@
 @x
 }
 @y
-}}
-\datecontentspage
+}}\datecontentspage
 @z
 
 @x
- at s not_eq normal @q unreserve a C++ keyword @>
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
- at z
-
- at x
- at d banner "This is CWEAVE (Version 3.64)\n"
- at y
- at d banner "This is CWEAVE, Version 3.64"
+ at d banner "This is CWEAVE, Version 4.0"
   /* will be extended by the \TeX~Live |versionstring| */
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
+  if (show_banner) puts(banner); /* print a ``banner line'' */
 @y
-@ For string handling we include the {\mc ANSI C} system header file instead
-of predeclaring the standard system functions |@!strlen|, |@!strcmp|,
-|@!strcpy|, |@!strncmp|, and |@!strncpy|.
-@^system dependencies@>
-
-@<Include files@>=
-#include <string.h>
- at z
-
- at x
-int main (ac, av)
-int ac; /* argument count */
-char **av; /* argument values */
- at y
-int main (@t\1\1@>
-int ac, /* argument count */
-char **av at t\2\2@>) /* argument values */
- at z
-
- at x
-  make_xrefs=force_lines=make_pb=1; /* controlled by command-line options */
-  common_init();
-  @<Set initial values@>;
- at y
-  @<Set initial values@>;
-  common_init();
-  @<Start \TEX/ output@>;
- at z
-
- at x
-  if (show_banner) printf(banner); /* print a ``banner line'' */
- at y
   if (show_banner) cb_show_banner(); /* print a ``banner line'' */
 @z
 
 @x
- at d max_bytes 90000 /* the number of bytes in identifiers,
- at y
- at d max_bytes 1000000 /* the number of bytes in identifiers,
- at z
-
- at x
- at d max_names 4000 /* number of identifiers, strings, section names;
- at y
- at d max_names 10239 /* number of identifiers, strings, section names;
- at z
-
- at x
- at d max_sections 2000 /* greater than the total number of sections */
- at d hash_size 353 /* should be prime */
- at d buf_size 100 /* maximum length of input line, plus one */
- at y
- at d max_sections 10239 /* greater than the total number of sections */
- at d hash_size 8501 /* should be prime */
- at d buf_size 1000 /* maximum length of input line, plus one */
- at z
-
- at x
- at d max_refs 20000 /* number of cross-references; must be less than 65536 */
- at d max_toks 20000 /* number of symbols in \CEE/ texts being parsed;
- at y
- at d max_refs 65535 /* number of cross-references; must be less than 65536 */
- at d max_toks 65535 /* number of symbols in \CEE/ texts being parsed;
- at z
-
- at x
- at d max_texts 4000 /* number of phrases in \CEE/ texts being parsed;
- at y
- at d max_texts 10239 /* number of phrases in \CEE/ texts being parsed;
- at z
-
- at x
- at d max_scraps 2000 /* number of tokens in \CEE/ texts being parsed */
- at d stack_size 400 /* number of simultaneous output levels */
- at y
- at d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
- at d stack_size 2000 /* number of simultaneous output levels */
- at z
-
- at x
 @i common.h
 @y
 @i comm-w2c.h
@@ -151,12 +60,6 @@
 @z
 
 @x
-xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
- at y
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
- at z
-
- at x
 @d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
 @y
 @d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
@@ -163,221 +66,6 @@
 @z
 
 @x
- at d no_xref (flags['x']==0)
- at d make_xrefs flags['x'] /* should cross references be output? */
- at y
- at d no_xref (!make_xrefs) /* should cross references be suppressed? */
- at z
-
- at x
-void
-new_xref(p)
-name_pointer p;
- at y
-static void
-new_xref(
-name_pointer p)
- at z
-
- at x
-  append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
- at y
-  append_xref(m); xref_ptr->xlink=q; update_node(p);
- at z
-
- at x
-void
-new_section_xref(p)
-name_pointer p;
- at y
-static void
-new_section_xref(
-name_pointer p)
- at z
-
- at x
-  if (r==xmem) p->xref=(char*)xref_ptr;
- at y
-  if (r==xmem) update_node(p);
- at z
-
- at x
-void
-set_file_flag(p)
-name_pointer p;
- at y
-static void
-set_file_flag(
-name_pointer p)
- at z
-
- at x
-  p->xref = (char *)xref_ptr;
- at y
-  update_node(p);
- at z
-
- at x
-further details about them will be explained later. A |text_pointer| variable
-is an index into |tok_start|.
- at y
-further details about them will be explained later. A \&{text\_pointer}
-variable is an index into |tok_start|.
- at z
-
- at x
-tok_ptr=tok_mem+1; text_ptr=tok_start+1; tok_start[0]=tok_mem+1;
-tok_start[1]=tok_mem+1;
-max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
- at y
-tok_ptr=max_tok_ptr=tok_mem+1;@/
-tok_start[0]=tok_start[1]=tok_mem+1;@/
-text_ptr=max_text_ptr=tok_start+1;
- at z
-
- at x
-int names_match(p,first,l,t)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-eight_bits t; /* desired ilk */
- at y
-boolean names_match(@t\1\1@>
-name_pointer p, /* points to the proposed match */
-const char *first, /* position of first character of string */
-size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* desired |ilk| */
- at z
-
- at x
-void
-init_p(p,t)
-name_pointer p;
-eight_bits t;
- at y
-void
-init_p(
-name_pointer p,
-eight_bits t)
- at z
-
- at x
-  p->ilk=t; p->xref=(char*)xmem;
- at y
-  p->ilk=t; init_node(p);
- at z
-
- at x
-void
-init_node(p)
-name_pointer p;
- at y
-void
-init_node(
-name_pointer p)
- at z
-
- at x
-  p->xref=(char*)xmem;
-}
- at y
-  p->xref=(void *)xmem;
-}
-
-static void
-update_node(
-name_pointer p)
-{
-  p->xref=(void *)xref_ptr;
-}
- at z
-
- at x
-void   skip_limbo();
- at y
-static void skip_limbo(void);@/
- at z
-
- at x
-void
-skip_limbo() {
- at y
-static void
-skip_limbo(void) {
- at z
-
- at x
-unsigned
-skip_TeX() /* skip past pure \TEX/ code */
- at y
-static eight_bits
-skip_TeX(void) /* skip past pure \TEX/ code */
- at z
-
- at x
-eight_bits get_next();
- at y
-static eight_bits get_next(void);@/
- at z
-
- at x
-eight_bits
-get_next() /* produces the next input token */
-{@+eight_bits c; /* the current character */
- at y
-static eight_bits
-get_next(void) /* produces the next input token */
-{
-  eight_bits c; /* the current character */
- at z
-
- at x
-    else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"'))@|
- at y
-    else if (c=='\'' || c=='"'@|
-           || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
-           || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
- at z
-
- at x
-    else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); break;
- at y
-    else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
-                        else compress(minus_gt); } } break;
- at z
-
- at x
-  case '!': if (*loc=='=') compress(not_eq); break;
- at y
-  case '!': if (*loc=='=') compress(non_eq); break;
- at z
-
- at x
-  while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
- at y
-  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
-      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
- at z
-
- at x
-    *id_loc++='$'; *id_loc++=toupper(*loc); loc++;
- at y
-    *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
- at z
-
- at x
-  if (delim=='L') { /* wide character constant */
-    delim=*loc++; *++id_loc=delim;
-  }
- at y
-  if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
-    if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
-    delim=*loc++; *++id_loc=delim;
-  }
- at z
-
- at x
         err_print("! String didn't end"); loc=limit; break;
 @y
         err_print(_("! String didn't end")); loc=limit; break;
@@ -390,20 +78,8 @@
 @z
 
 @x
-    if (c=='\\') if (loc>=limit) continue;
-      else if (++id_loc<=section_text_end) {
-        *id_loc = '\\'; c=*loc++;
-      }
+    fputs("\n! String too long: ",stdout);
 @y
-    if (c=='\\') { if (loc>=limit) continue;
-      else { if (++id_loc<=section_text_end) {
-        *id_loc = '\\'; c=*loc++;
-      } } }
- at z
-
- at x
-    printf("\n! String too long: ");
- at y
     fputs(_("\n! String too long: "),stdout);
 @z
 
@@ -414,14 +90,6 @@
 @z
 
 @x
-    case xref_roman: case xref_wildcard: case xref_typewriter:
-    case noop: case TeX_string: c=ccode[c]; skip_restricted(); return(c);
- at y
-    case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
-    case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return(c);
- at z
-
- at x
     err_print("! Input ended in section name");
 @y
     err_print(_("! Input ended in section name"));
@@ -428,7 +96,7 @@
 @z
 
 @x
-  printf("\n! Section name too long: ");
+  fputs("\n! Section name too long: ",stdout);
 @y
   fputs(_("\n! Section name too long: "),stdout);
 @z
@@ -446,20 +114,6 @@
 @z
 
 @x
-void skip_restricted();
- at y
-void skip_restricted(void);@/
- at z
-
- at x
-void
-skip_restricted()
- at y
-void
-skip_restricted(void)
- at z
-
- at x
     err_print("! Control text didn't end"); loc=limit;
 @y
     err_print(_("! Control text didn't end")); loc=limit;
@@ -478,20 +132,6 @@
 @z
 
 @x
-void phase_one();
- at y
-static void phase_one(void);@/
- at z
-
- at x
-void
-phase_one() {
- at y
-static void
-phase_one(void) {
- at z
-
- at x
   if (++section_count==max_sections) overflow("section number");
 @y
   if (++section_count==max_sections) overflow(_("section number"));
@@ -498,36 +138,6 @@
 @z
 
 @x
-void C_xref();
- at y
-static void C_xref(eight_bits);@/
- at z
-
- at x
-void
-C_xref( spec_ctrl ) /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl;
- at y
-static void
-C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl at t\2\2@>)
- at z
-
- at x
-void outer_xref();
- at y
-static void outer_xref(void);@/
- at z
-
- at x
-void
-outer_xref() /* extension of |C_xref| */
- at y
-static void
-outer_xref(void) /* extension of |C_xref| */
- at z
-
- at x
     case translit_code: err_print("! Use @@l in limbo only"); continue;
 @y
     case translit_code: err_print(_("! Use @@l in limbo only")); continue;
@@ -534,12 +144,6 @@
 @z
 
 @x
-            else lhs->xref=(char*)q->xlink;
- at y
-            else lhs->xref=(void *)q->xlink;
- at z
-
- at x
     err_print("! Missing left identifier of @@s");
 @y
     err_print(_("! Missing left identifier of @@s"));
@@ -552,30 +156,16 @@
 @z
 
 @x
-void section_check();
+      fputs("\n! Never defined: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @y
-static void section_check(name_pointer);@/
- at z
-
- at x
-void
-section_check(p)
-name_pointer p; /* print anomalies in subtree |p| */
- at y
-static void
-section_check(
-name_pointer p) /* print anomalies in subtree |p| */
- at z
-
- at x
-      printf("\n! Never defined: <"); print_section_name(p); putchar('>'); mark_harmless;
- at y
       fputs(_("\n! Never defined: <"),stdout);
       print_section_name(p); putchar('>'); mark_harmless;
 @z
 
 @x
-      printf("\n! Never used: <"); print_section_name(p); putchar('>'); mark_harmless;
+      fputs("\n! Never used: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @y
       fputs(_("\n! Never used: <"),stdout);
       print_section_name(p); putchar('>'); mark_harmless;
@@ -582,51 +172,12 @@
 @z
 
 @x
-If the |per_cent| parameter is 1 a |'%'| is appended to the line
- at y
-If the |per_cent| parameter is 1, a |'%'| is appended to the line
- at z
-
- at x
- at d tex_printf(c) fprintf(active_file,c)
- at y
- at d tex_printf(c) fprintf(active_file,"%s",c)
- at d tex_puts(c) fputs(c,active_file)
- at z
-
- at x
-void
-flush_buffer(b,per_cent,carryover)
-char *b; /* outputs from |out_buf+1| to |b|,where |b<=out_ptr| */
-boolean per_cent,carryover;
- at y
-static void
-flush_buffer(@t\1\1@>
-char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
-boolean per_cent,boolean carryover at t\2\2@>)
- at z
-
- at x
-  if (b<out_ptr) strncpy(out_buf+1,b+1,out_ptr-b);
- at y
-  if (b<out_ptr) strncpy(out_buf+1,b+1,(size_t)(out_ptr-b));
- at z
-
- at x
-void
-finish_line() /* do this at the end of a line */
- at y
-static void
-finish_line(void) /* do this at the end of a line */
- at z
-
- at x
 @ In particular, the |finish_line| procedure is called near the very
 beginning of phase two. We initialize the output variables in a slightly
 tricky way so that the first line of the output file will be
 `\.{\\input cwebmac}'.
 
-@<Set init...@>=
+@<Start \TEX/...@>=
 out_ptr=out_buf+1; out_line=1; active_file=tex_file;
 *out_ptr='c'; tex_printf("\\input cwebma");
 @y
@@ -649,30 +200,6 @@
 @z
 
 @x
-void
-out_str(s) /* output characters from |s| to end of string */
-char *s;
- at y
-static void
-out_str(@t\1\1@> /* output characters from |s| to end of string */
-const char*s at t\2\2@>)
- at z
-
- at x
-void break_out();
- at y
-static void break_out(void);@/
- at z
-
- at x
-void
-break_out() /* finds a way to break the output line */
- at y
-static void
-break_out(void) /* finds a way to break the output line */
- at z
-
- at x
   printf("\n! Line had to be broken (output l. %d):\n",out_line);
 @y
   printf(_("\n! Line had to be broken (output l. %d):\n"),out_line);
@@ -679,36 +206,6 @@
 @z
 
 @x
-void
-out_section(n)
-sixteen_bits n;
- at y
-static void
-out_section(
-sixteen_bits n)
- at z
-
- at x
-void
-out_name(p,quote_xalpha)
-name_pointer p;
-boolean quote_xalpha;
- at y
-static void
-out_name(
-name_pointer p,
-boolean quote_xalpha)
- at z
-
- at x
-void
-copy_limbo()
- at y
-static void
-copy_limbo(void)
- at z
-
- at x
         default: err_print("! Double @@ should be used in limbo");
 @y
         default: err_print(_("! Double @@ should be used in limbo"));
@@ -715,14 +212,6 @@
 @z
 
 @x
-eight_bits
-copy_TeX()
- at y
-static eight_bits
-copy_TeX(void)
- at z
-
- at x
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
 @y
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow(_("token")); *(tok_ptr++)=c;}
@@ -729,22 +218,6 @@
 @z
 
 @x
-int copy_comment();
- at y
-static int copy_comment(boolean,int);@/
- at z
-
- at x
-int copy_comment(is_long_comment,bal) /* copies \TEX/ code in comments */
-boolean is_long_comment; /* is this a traditional \CEE/ comment? */
-int bal; /* brace balance */
- at y
-static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
-boolean is_long_comment, /* is this a traditional \CEE/ comment? */
-int bal at t\2\2@>) /* brace balance */
- at z
-
- at x
           err_print("! Input ended in mid-comment");
 @y
           err_print(_("! Input ended in mid-comment"));
@@ -775,166 +248,30 @@
 @z
 
 @x
-else if (c=='\\' && *loc!='@@')
-  if (phase==2) app_tok(*(loc++))@; else loc++;
+static void print_text(text_pointer p);@/
 @y
-else { if (c=='\\' && *loc!='@@') {
-  if (phase==2) app_tok(*(loc++))@; else loc++; } }
+#if 0
+static void print_text(text_pointer p);@/
+#endif
 @z
 
 @x
-eight_bits cat_index;
-
-@ @<Set in...@>=
-    for (cat_index=0;cat_index<255;cat_index++)
-      strcpy(cat_name[cat_index],"UNKNOWN");
- at y
-
-@ @<Set in...@>=
-{int c; for (c=0;c<256;c++) strcpy(cat_name[c],"UNKNOWN");}
- at z
-
- at x
-void
-print_cat(c) /* symbolic printout of a category */
-eight_bits c;
- at y
 static void
-print_cat(@t\1\1@> /* symbolic printout of a category */
-eight_bits c at t\2\2@>)
- at z
-
- at x
-  printf(cat_name[c]);
+print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
 @y
-  fputs(cat_name[c],stdout);
- at z
-
- at x
-void
-print_text(p) /* prints a token list for debugging; not used in |main| */
-text_pointer p;
- at y
-#ifdef DEAD_CODE /* not used in |main| */
+#if 0
 static void
 print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
-text_pointer p at t\2\2@>)
 @z
 
 @x
-  fflush(stdout);
 }
 @y
-  update_terminal;
 }
-#endif /* |DEAD_CODE| */
+#endif
 @z
 
 @x
- at d app(a) *(tok_ptr++)=a
- at d app1(a) *(tok_ptr++)=tok_flag+(int)((a)->trans-tok_start)
- at y
- at d app(a) *(tok_ptr++)=(token)(a)
- at d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
- at z
-
- at x
-void
-app_str(s)
-char *s;
- at y
-static void
-app_str(
-const char *s)
- at z
-
- at x
-void
-big_app(a)
-token a;
- at y
-static void
-big_app(
-token a)
- at z
-
- at x
-void
-big_app1(a)
-scrap_pointer a;
- at y
-static void
-big_app1(
-scrap_pointer a)
- at z
-
- at x
-        && pp->cat!=prerangle
- at y
-        && pp->cat!=prerangle @|
- at z
-
- at x
-        && pp->cat!=ftemplate
- at y
-        && pp->cat!=ftemplate @|
- at z
-
- at x
-token_pointer
-find_first_ident(p)
-text_pointer p;
- at y
-static token_pointer
-find_first_ident(
-text_pointer p)
- at z
-
- at x
-void
-make_reserved(p) /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p;
- at y
-static void
-make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p at t\2\2@>)
- at z
-
- at x
-void
-make_underlined(p)
-/* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p;
- at y
-static void
-make_underlined(@t\1\1@>
-/* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p at t\2\2@>)
- at z
-
- at x
-void  underline_xref();
- at y
-static void underline_xref(name_pointer);@/
- at z
-
- at x
-void
-underline_xref(p)
-name_pointer p;
- at y
-static void
-underline_xref(
-name_pointer p)
- at z
-
- at x
-  p->xref=(char*)xref_ptr;
- at y
-  update_node(p);
- 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);
@@ -941,12 +278,6 @@
   reduce(pp,1,fn_decl,0,1);
 }
 @y
-\.{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.
-
- at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
-
 @<Cases for |exp|@>=
 if(cat1==lbrace || cat1==int_like || cat1==decl) {
   make_underlined(pp); big_app1(pp);
@@ -1014,14 +345,7 @@
   big_app1(pp+1); reduce(pp,2,cat1,-1,41);
 }
 @y
-@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
-not yet present.  Here is a simple implementation.  The purpose is to suppress
-the extra space between local variable declarations and the first statement in
-a function block.
-
- at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
-
-@<Cases for |decl|@>=
+@ @<Cases for |decl|@>=
 if (cat1==decl) {
   big_app1(pp); big_app(force); big_app1(pp+1);
   reduce(pp,2,decl,-1,40);
@@ -1044,9 +368,7 @@
   big_app1(pp+1); reduce(pp,2,function,-1,52);
 }
 @y
-@ Outdent after parameter declarations with option \.{-i}.
-
-@<Cases for |fn_decl|@>=
+@ @<Cases for |fn_decl|@>=
 if (cat1==decl) {
   big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
 }
@@ -1061,34 +383,6 @@
 @z
 
 @x
-void
-reduce(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
- at y
-static void
-reduce(
-scrap_pointer j, short k,
-eight_bits c,
-short d, short n)
- at z
-
- at x
-void
-squash(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
- at y
-static void
-squash(
-scrap_pointer j, short k,
-eight_bits c,
-short d, short n)
- at z
-
- at x
     overflow("token");
 @y
     overflow(_("token"));
@@ -1101,38 +395,6 @@
 @z
 
 @x
-{ scrap_pointer k; /* pointer into |scrap_info| */
-  if (tracing==2) {
-    printf("\n%d:",n);
-    for (k=scrap_base; k<=lo_ptr; k++) {
-      if (k==pp) putxchar('*'); else putxchar(' ');
-      if (k->mathness %4 ==  yes_math) putchar('+');
-      else if (k->mathness %4 ==  no_math) putchar('-');
-      print_cat(k->cat);
-      if (k->mathness /4 ==  yes_math) putchar('+');
-      else if (k->mathness /4 ==  no_math) putchar('-');
- at y
-{ 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('-');
- at z
-
- at x
-text_pointer
-translate() /* converts a sequence of scraps */
- at y
-static text_pointer
-translate(void) /* converts a sequence of scraps */
- at z
-
- at x
     if (tok_ptr+6>tok_mem_end) overflow("token");
 @y
     if (tok_ptr+6>tok_mem_end) overflow(_("token"));
@@ -1151,162 +413,6 @@
 @z
 
 @x
-void
-C_parse(spec_ctrl) /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl;
- at y
-static void
-C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl at t\2\2@>)
- at z
-
- at x
-switch (next_control) {
-  case section_name:
-    app(section_flag+(int)(cur_section-name_dir));
-    app_scrap(section_scrap,maybe_math);
-    app_scrap(exp,yes_math);@+break;
-  case string: case constant: case verbatim: @<Append a string or constant@>;
-   @+break;
-  case identifier: app_cur_id(1);@+break;
-  case TeX_string: @<Append a \TEX/ string, without forming a scrap@>;@+break;
-  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 .\\\#@>
-  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_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;@/
-  @t\4@>  @<Cases involving nonstandard characters@>@;
-  case thin_space: app_str("\\,"); app_scrap(insert,maybe_math);@+break;
- at .\\,@>
-  case math_break: app(opt); app_str("0");
-    app_scrap(insert,maybe_math);@+break;
-  case line_break: app(force); app_scrap(insert,no_math);@+break;
-  case left_preproc: app(force); app(preproc_line);
-    app_str("\\#"); app_scrap(lproc,no_math);@+break;
- at .\\\#@>
-  case right_preproc: app(force); app_scrap(rproc,no_math);@+break;
-  case big_line_break: app(big_force); app_scrap(insert,no_math);@+break;
-  case no_line_break: app(big_cancel); app(noop); app(break_space);
-    app(noop); app(big_cancel);
-    app_scrap(insert,no_math);@+break;
-  case pseudo_semi: app_scrap(semi,maybe_math);@+break;
-  case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
-  case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
-  case join: app_str("\\J"); app_scrap(insert,no_math);@+break;
- at .\\J@>
-  case output_defs_code: app(force); app_str("\\ATH"); app(force);
-    app_scrap(insert,no_math);@+break;
- at .\\ATH@>
-  default: app(inserted); app(next_control);
-    app_scrap(insert,maybe_math);@+break;
-}
- at y
-switch (next_control) {
-  case section_name:
-    app(section_flag+(int)(cur_section-name_dir));
-    app_scrap(section_scrap,maybe_math);
-    app_scrap(exp,yes_math);@+break;
-  case string: case constant: case verbatim:
-    @<Append a string or constant@>;@+break;
-  case identifier: app_cur_id(1);@+break;
-  case TeX_string:
-    @<Append a \TEX/ string, without forming a scrap@>;@+break;
-  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 .\\\#@>
-  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_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;@/
-  @t\4@>  @<Cases involving nonstandard characters@>@;
-  case thin_space: app_str("\\,");@+app_scrap(insert,maybe_math);@+break;
- at .\\,@>
-  case math_break: app(opt);@+app_str("0");@+
-    app_scrap(insert,maybe_math);@+break;
-  case line_break: app(force);@+app_scrap(insert,no_math);@+break;
-  case left_preproc: app(force);@+app(preproc_line);@+app_str("\\#");
-    app_scrap(lproc,no_math);@+break;
- at .\\\#@>
-  case right_preproc: app(force);@+app_scrap(rproc,no_math);@+break;
-  case big_line_break: app(big_force);@+app_scrap(insert,no_math);@+break;
-  case no_line_break: app(big_cancel);@+app(noop);@+app(break_space);@+
-    app(noop);@+app(big_cancel); app_scrap(insert,no_math);@+break;
-  case pseudo_semi: app_scrap(semi,maybe_math);@+break;
-  case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
-  case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
-  case join: app_str("\\J");@+app_scrap(insert,no_math);@+break;
- at .\\J@>
-  case output_defs_code: app(force);@+app_str("\\ATH");@+app(force);
-    app_scrap(insert,no_math);@+break;
- at .\\ATH@>
-  default: app(inserted);@+app(next_control);
-    app_scrap(insert,maybe_math);@+break;
-}
- at z
-
- at x
   overflow("scrap/token/text");
 @y
   overflow(_("scrap/token/text"));
@@ -1313,12 +419,6 @@
 @z
 
 @x
-case not_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
- at y
-case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
- at z
-
- at x
         else err_print("! Double @@ should be used in strings");
 @y
         else err_print(_("! Double @@ should be used in strings"));
@@ -1325,30 +425,6 @@
 @z
 
 @x
-void app_cur_id();
- at y
-void app_cur_id(boolean);@/
- at z
-
- at x
-void
-app_cur_id(scrapping)
-boolean scrapping; /* are we making this into a scrap? */
- at y
-void
-app_cur_id(@t\1\1@>
-boolean scrapping at t\2\2@>) /* are we making this into a scrap? */
- at z
-
- at x
-text_pointer
-C_translate()
- at y
-static text_pointer
-C_translate(void)
- at z
-
- at x
   if (next_control!='|') err_print("! Missing '|' after C text");
 @y
   if (next_control!='|') err_print(_("! Missing '|' after C text"));
@@ -1355,24 +431,6 @@
 @z
 
 @x
-void
-outer_parse() /* makes scraps from \CEE/ tokens and comments */
- at y
-static void
-outer_parse(void) /* makes scraps from \CEE/ tokens and comments */
- at z
-
- at x
-void
-push_level(p) /* suspends the current level */
-text_pointer p;
- at y
-static void
-push_level(@t\1\1@> /* suspends the current level */
-text_pointer p at t\2\2@>)
- at z
-
- at x
   if (stack_ptr==stack_end) overflow("stack");
 @y
   if (stack_ptr==stack_end) overflow(_("stack"));
@@ -1379,88 +437,18 @@
 @z
 
 @x
-void
-pop_level()
+  fputs("\n! Illegal control code in section name: <",stdout);
 @y
-static void
-pop_level(void)
- at z
-
- at x
-eight_bits
-get_output() /* returns the next token of output */
- at y
-static eight_bits
-get_output(void) /* returns the next token of output */
- at z
-
- at x
-  return(a);
- at y
-  return((eight_bits)a);
- at z
-
- at x
-void
-output_C() /* outputs the current token list */
- at y
-static void
-output_C(void) /* outputs the current token list */
- at z
-
- at x
-void make_output();
- at y
-static void make_output(void);@/
- at z
-
- at x
-void
-make_output() /* outputs the equivalents of tokens */
-{
-  eight_bits a, /* current output byte */
- at y
-static void
-make_output(void) /* outputs the equivalents of tokens */
-{
-  eight_bits a=0, /* current output byte */
- at z
-
- at x
-  else if (b!='|') out(b)@;
- at y
-  else { if (b!='|') out(b)@;
- at z
-
- at x
-  }
- at y
-  } }
- at z
-
- at x
-  printf("\n! Illegal control code in section name: <");
- at y
   fputs(_("\n! Illegal control code in section name: <"),stdout);
 @z
 
 @x
-    printf("\n! C text in section name didn't end: <");
+    fputs("\n! C text in section name didn't end: <",stdout);
 @y
     fputs(_("\n! C text in section name didn't end: <"),stdout);
 @z
 
 @x
-    if (b=='\'' || b=='"')
-      if (delim==0) delim=b;
-      else if (delim==b) delim=0;
- at y
-    if (b=='\'' || b=='"') {
-      if (delim==0) delim=b;
-      else if (delim==b) delim=0; }
- at z
-
- at x
       if (j>buffer+long_buf_size-3) overflow("buffer");
 @y
       if (j>buffer+long_buf_size-3) overflow(_("buffer"));
@@ -1473,22 +461,8 @@
 @z
 
 @x
-void phase_two();
+reset_input(); if (show_progress) fputs("\nWriting the output file...",stdout);
 @y
-static void phase_two(void);@/
- at z
-
- at x
-void
-phase_two() {
- at y
-static void
-phase_two(void) {
- at z
-
- at x
-reset_input(); if (show_progress) printf("\nWriting the output file...");
- at y
 reset_input(); if (show_progress) fputs(_("\nWriting the output file..."),stdout);
 @z
 
@@ -1505,42 +479,6 @@
 @z
 
 @x
-void finish_C();
- at y
-static void finish_C(boolean);@/
- at z
-
- at x
-void
-finish_C(visible) /* finishes a definition or a \CEE/ part */
-  boolean visible; /* nonzero if we should produce \TEX/ output */
- at y
-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 */
- at z
-
- at x
-    if (out_ptr>out_buf+1)
-      if (*(out_ptr-1)=='\\')
- at .\\6@>
- at .\\7@>
- at .\\Y@>
-        if (*out_ptr=='6') out_ptr-=2;
-        else if (*out_ptr=='7') *out_ptr='Y';
- at y
-    if (out_ptr>out_buf+1) {
-      if (*(out_ptr-1)=='\\') {
- at .\\6@>
- at .\\7@>
- at .\\Y@>
-        if (*out_ptr=='6') out_ptr-=2;
-        else if (*out_ptr=='7') *out_ptr='Y';
-      }
-    }
- at z
-
- at x
     err_print("! Improper macro definition");
 @y
     err_print(_("! Improper macro definition"));
@@ -1571,36 +509,6 @@
 @z
 
 @x
-void footnote();
- at y
-static void footnote(sixteen_bits);@/
- at z
-
- at x
-void
-footnote(flag) /* outputs section cross-references */
-sixteen_bits flag;
- at y
-static void
-footnote(@t\1\1@> /* outputs section cross-references */
-sixteen_bits flag at t\2\2@>)
- at z
-
- at x
-void phase_three();
- at y
-static void phase_three(void);@/
- at z
-
- at x
-void
-phase_three() {
- at y
-static void
-phase_three(void) {
- at z
-
- at x
 if (no_xref) {
   finish_line();
   out_str("\\end");
@@ -1617,18 +525,12 @@
 @z
 
 @x
-  phase=3; if (show_progress) printf("\nWriting the index...");
+  phase=3; if (show_progress) fputs("\nWriting the index...",stdout);
 @y
   phase=3; if (show_progress) fputs(_("\nWriting the index..."),stdout);
 @z
 
 @x
-  if ((idx_file=fopen(idx_file_name,"w"))==NULL)
- at y
-  if ((idx_file=fopen(idx_file_name,"wb"))==NULL)
- at z
-
- at x
     fatal("! Cannot open index file ",idx_file_name);
 @y
     fatal(_("! Cannot open index file "),idx_file_name);
@@ -1635,26 +537,6 @@
 @z
 
 @x
-    @<Tell about changed sections@>; finish_line(); finish_line();
- at y
-    @<Tell about changed sections@>@; finish_line(); finish_line();
- at z
-
- at x
-  @<Do the first pass of sorting@>;
-  @<Sort and output the index@>;
- at y
-  @<Do the first pass of sorting@>@;
-  @<Sort and output the index@>@;
- at z
-
- at x
-  if ((scn_file=fopen(scn_file_name,"w"))==NULL)
- at y
-  if ((scn_file=fopen(scn_file_name,"wb"))==NULL)
- at z
-
- at x
     fatal("! Cannot open section file ",scn_file_name);
 @y
     fatal(_("! Cannot open section file "),scn_file_name);
@@ -1661,12 +543,6 @@
 @z
 
 @x
-  @<Output all the section names@>;
- at y
-  @<Output all the section names@>@;
- at z
-
- at x
 @.\\end@>
   finish_line();
   fclose(active_file);
@@ -1679,109 +555,12 @@
 @z
 
 @x
-if (show_happiness) printf("\nDone.");
+  fputs("Done.",stdout);
 @y
-if (show_happiness) {
-  if (show_progress) new_line;
   fputs(_("Done."),stdout);
-}
 @z
 
 @x
-for (c=0; c<=255; c++) bucket[c]=NULL;
- at y
-for (c=0; c<256; c++) bucket[c]=NULL;
- at z
-
- at x
-    if (cur_name->xref!=(char*)xmem) {
- at y
-    if (cur_name->xref!=(void *)xmem) {
- at z
-
- at x
-collate[0]=0;
-strcpy(collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
-/* 16 characters + 1 = 17 */
-strcpy(collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
-/* 16 characters + 17 = 33 */
-strcpy(collate+33,"!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
-/* 32 characters + 33 = 65 */
-strcpy(collate+65,"abcdefghijklmnopqrstuvwxyz0123456789");
-/* (26 + 10) characters + 65 = 101 */
-strcpy(collate+101,"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
-/* 16 characters + 101 = 117 */
-strcpy(collate+117,"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
-/* 16 characters + 117 = 133 */
-strcpy(collate+133,"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
-/* 16 characters + 133 = 149 */
-strcpy(collate+149,"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
-/* 16 characters + 149 = 165 */
-strcpy(collate+165,"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
-/* 16 characters + 165 = 181 */
-strcpy(collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
-/* 16 characters + 181 = 197 */
-strcpy(collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
-/* 16 characters + 197 = 213 */
-strcpy(collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
-/* 16 characters + 213 = 229 */
- at y
-collate[0]=0;
-strcpy((char *)collate+1,
-  " \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
-/* 16 characters + 1 = 17 */
-strcpy((char *)collate+17,
-  "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
-/* 16 characters + 17 = 33 */
-strcpy((char *)collate+33,
-  "!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
-/* 32 characters + 33 = 65 */
-strcpy((char *)collate+65,
-  "abcdefghijklmnopqrstuvwxyz0123456789");
-/* (26 + 10) characters + 65 = 101 */
-strcpy((char *)collate+101,
-  "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
-/* 16 characters + 101 = 117 */
-strcpy((char *)collate+117,
-  "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
-/* 16 characters + 117 = 133 */
-strcpy((char *)collate+133,
-  "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
-/* 16 characters + 133 = 149 */
-strcpy((char *)collate+149,
-  "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
-/* 16 characters + 149 = 165 */
-strcpy((char *)collate+165,
-  "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
-/* 16 characters + 165 = 181 */
-strcpy((char *)collate+181,
-  "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
-/* 16 characters + 181 = 197 */
-strcpy((char *)collate+197,
-  "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
-/* 16 characters + 197 = 213 */
-strcpy((char *)collate+213,
-  "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
-/* 16 characters + 213 = 229 */
- at z
-
- at x
-void  unbucket();
- at y
-static void unbucket(eight_bits);@/
- at z
-
- at x
-void
-unbucket(d) /* empties buckets having depth |d| */
-eight_bits d;
- at y
-static void
-unbucket(@t\1\1@> /* empties buckets having depth |d| */
-eight_bits d at t\2\2@>)
- at z
-
- at x
     if (sort_ptr>=scrap_info_end) overflow("sorting");
 @y
     if (sort_ptr>=scrap_info_end) overflow(_("sorting"));
@@ -1788,145 +567,79 @@
 @z
 
 @x
-void section_print();
- at y
-static void section_print(name_pointer);@/
- at z
-
- at x
-void
-section_print(p) /* print all section names in subtree |p| */
-name_pointer p;
- at y
-static void
-section_print(@t\1\1@> /* print all section names in subtree |p| */
-name_pointer p at t\2\2@>)
- at z
-
- at x
-@ @<Output all the section names@>=section_print(root)
- at y
-@ @<Output all the section names@>=section_print(root);
- at z
-
- at x
-void
-print_stats() {
- at y
-void
-print_stats(void) {
- at z
-
- at x
-  printf("\nMemory usage statistics:\n");
+  puts("\nMemory usage statistics:");
 @.Memory usage statistics:@>
   printf("%ld names (out of %ld)\n",
-            (long)(name_ptr-name_dir),(long)max_names);
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf("%ld cross-references (out of %ld)\n",
-            (long)(xref_ptr-xmem),(long)max_refs);
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
   printf("%ld bytes (out of %ld)\n",
-            (long)(byte_ptr-byte_mem),(long)max_bytes);
-  printf("Parsing:\n");
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
+  puts("Parsing:");
   printf("%ld scraps (out of %ld)\n",
-            (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
   printf("%ld texts (out of %ld)\n",
-            (long)(max_text_ptr-tok_start),(long)max_texts);
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
   printf("%ld tokens (out of %ld)\n",
-            (long)(max_tok_ptr-tok_mem),(long)max_toks);
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
   printf("%ld levels (out of %ld)\n",
-            (long)(max_stack_ptr-stack),(long)stack_size);
-  printf("Sorting:\n");
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
+  puts("Sorting:");
   printf("%ld levels (out of %ld)\n",
-            (long)(max_sort_ptr-scrap_info),(long)max_scraps);
-}
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
 @y
   puts(_("\nMemory usage statistics:"));
 @.Memory usage statistics:@>
   printf(_("%ld names (out of %ld)\n"),
-            (long)(name_ptr-name_dir),(long)max_names);
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf(_("%ld cross-references (out of %ld)\n"),
-            (long)(xref_ptr-xmem),(long)max_refs);
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
   printf(_("%ld bytes (out of %ld)\n"),
-            (long)(byte_ptr-byte_mem),(long)max_bytes);
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
   puts(_("Parsing:"));
   printf(_("%ld scraps (out of %ld)\n"),
-            (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
   printf(_("%ld texts (out of %ld)\n"),
-            (long)(max_text_ptr-tok_start),(long)max_texts);
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
   printf(_("%ld tokens (out of %ld)\n"),
-            (long)(max_tok_ptr-tok_mem),(long)max_toks);
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
   printf(_("%ld levels (out of %ld)\n"),
-            (long)(max_stack_ptr-stack),(long)stack_size);
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
   puts(_("Sorting:"));
   printf(_("%ld levels (out of %ld)\n"),
-            (long)(max_sort_ptr-scrap_info),(long)max_scraps);
-}
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
 @z
 
 @x
 @** Index.
 @y
-@** Extensions for modern {\tt CWEB}.  The following sections introduce changes
-and extensions to the code that have been created by numerous contributors over
-the course of a quarter century. They make \.{CWEB} adhere to modern coding
-standards and introduce new or improved features.
+@** Extensions to \.{CWEB}.  The following sections introduce new or improved
+features that have been created by numerous contributors over the course of a
+quarter century.
 
 Care has been taken to keep the original section numbering intact, so this new
-section should have the same number as the original ``\&{250.~Index},'' and
-additional material follows below.
+material should nicely integrate with the original ``\&{263.~Index}.''
 
-@* Set {\tt CWEAVE} flags.
-At least one of these is already used in \.{COMMON}.
+@* 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.
 
+ at d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+
 @<Set init...@>=
-  make_xrefs=force_lines=make_pb=indent_param_decl=order_decl_stmt=1;
-    /* controlled by command-line options */
+indent_param_decl=true;
 
-@* Function declarations.  Here are declarations---conforming to
-{\mc ANSI~C}---of all functions in this code, as far as they are
-not already in |"common.h"|.  These are private to \.{CWEAVE}.
+@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
+not yet present.  Here is a simple implementation.  The purpose is to suppress
+the extra space between local variable declarations and the first statement in
+a function block.
 
-@<Predecl...@>=
-static eight_bits copy_TeX(void);@/
-static eight_bits get_output(void);@/
-static eight_bits skip_TeX(void);@/
-static text_pointer C_translate(void);@/
-static text_pointer translate(void);@/
-static token_pointer find_first_ident(text_pointer);@/
-static void app_str(const char *);@/
-static void big_app(token);@/
-static void big_app1(scrap_pointer);@/
-static void copy_limbo(void);@/
-static void C_parse(eight_bits);@/
-static void finish_line(void);@/
-static void flush_buffer(char *,boolean,boolean);@/
-static void make_reserved(scrap_pointer);@/
-static void make_underlined(scrap_pointer);@/
-static void new_section_xref(name_pointer);@/
-static void new_xref(name_pointer);@/
-static void outer_parse(void);@/
-static void output_C(void);@/
-static void out_name(name_pointer,boolean);@/
-static void out_section(sixteen_bits);@/
-static void out_str(const char *);@/
-static void pop_level(void);@/
-static void print_cat(eight_bits);@/
-#ifdef DEAD_CODE
-static void print_text(text_pointer p);@/
-#endif
-static void push_level(text_pointer);@/
-static void reduce(scrap_pointer,short,eight_bits,short,short);@/
-static void set_file_flag(name_pointer);@/
-static void skip_limbo(void);@/
-static void squash(scrap_pointer,short,eight_bits,short,short);@/
-static void update_node(name_pointer p);@/
+ at d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
 
-@* Language setting.  This global variable is defined and set in \.{COMMON} by
-the `\.{+l}' (or `\.{-l}') command-line option.
+@<Set init...@>=
+order_decl_stmt=true;
 
-@<Global var...@>=
-extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
-
 @* Output file update.  Most \CEE/ projects are controlled by a
 \.{Makefile} that automatically takes care of the temporal dependecies
 between the different source modules.  It is suitable that \.{CWEB} doesn't

Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -2,51 +2,33 @@
 (Contributed by Fabrice Popineau, February 2002)
 
 @x section 1
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 @y
- at d banner "This is CWEAVE (Version 3.64win32)\n"
+ at d banner "This is CWEAVE (Version 4.0win32)"
 @z
 
 @x
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* desired |ilk| */
 @y
+boolean __cdecl names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* desired |ilk| */
 @z
 
 @x
-int names_match(p,first,l,t)
-name_pointer p; /* points to the proposed match */
- at y
-int __cdecl names_match(p,first,l,t)
-name_pointer p; /* points to the proposed match */
- at z
-
- at x
 void
-init_p(p,t)
-name_pointer p;
+init_p(
+name_pointer p,
+eight_bits t)
 @y
 void __cdecl
-init_p(p,t)
-name_pointer p;
+init_p(
+name_pointer p,
+eight_bits t)
 @z
-
- at x
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
- at y
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
-#include <string.h> /* definition of |strncmp| and |strncpy| */
- at z

Modified: trunk/Build/source/texk/web2c/cwebdir/cweave.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweave.w	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweave.w	2021-02-07 11:02:17 UTC (rev 57658)
@@ -2,10 +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 3.64 --- February 2002
-% (essentially the same as version 3.6, which added
-%  recently introduced features of standard C++ to version 3.4)
-% (In November 2016 I made minor adjustments but changed no code -- DEK)
+% Version 4.0--- February 2021
 
 % Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
 
@@ -18,6 +15,11 @@
 % entire resulting derived work is given a different name and distributed
 % under the terms of a permission notice identical to this one.
 
+% Amendments to 'cweave.w' resulting in this updated version were created
+% by numerous collaborators over the course of many years.
+
+% Please send comments, suggestions, etc. to tex-k@@tug.org.
+
 % Here is TeX material that gets inserted after \input cwebmac
 \def\hang{\hangindent 3em\indent\ignorespaces}
 \def\pb{$\.|\ldots\.|$} % C brackets (|...|)
@@ -30,11 +32,11 @@
 \def\skipxTeX{\\{skip\_\TEX/}}
 \def\copyxTeX{\\{copy\_\TEX/}}
 
-\def\title{CWEAVE (Version 3.64)}
+\def\title{CWEAVE (Version 4.0)}
 \def\topofcontents{\null\vfill
   \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
   \vskip 15pt
-  \centerline{(Version 3.64)}
+  \centerline{(Version 4.0)}
   \vfill}
 \def\botofcontents{\vfill
 \noindent
@@ -52,7 +54,6 @@
 }
 \pageno=\contentspagenumber \advance\pageno by 1
 \let\maybe=\iftrue
- at s not_eq normal @q unreserve a C++ keyword @>
 
 @** Introduction.
 This is the \.{CWEAVE} program by Silvio Levy and Donald E. Knuth,
@@ -66,7 +67,7 @@
 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
 is modified.
 
- at d banner "This is CWEAVE (Version 3.64)\n"
+ at d banner "This is CWEAVE (Version 4.0)"
 
 @c @<Include files@>@/
 @h
@@ -75,18 +76,6 @@
 @<Global variables@>@/
 @<Predeclaration of procedures@>
 
-@ We predeclare several standard system functions here instead of including
-their system header files, because the names of the header files are not as
-standard as the names of the functions. (For example, some \CEE/ environments
-have \.{<string.h>} where others have \.{<strings.h>}.)
-
-@<Predecl...@>=
-extern int strlen(); /* length of string */
-extern int strcmp(); /* compare strings lexicographically */
-extern char* strcpy(); /* copy one string to another */
-extern int strncmp(); /* compare up to $n$ string characters */
-extern char* strncpy(); /* copy up to $n$ string characters */
-
 @ \.{CWEAVE} has a fairly straightforward outline.  It operates in
 three phases: First it inputs the source file and stores cross-reference
 data, then it inputs the source once again and produces the \TEX/ output
@@ -96,17 +85,17 @@
 to \.{CTANGLE} and \.{CWEAVE}, before proceeding further.
 
 @c
-int main (ac, av)
-int ac; /* argument count */
-char **av; /* argument values */
+int main (@t\1\1@>
+int ac, /* argument count */
+char **av at t\2\2@>) /* argument values */
 {
   argc=ac; argv=av;
   program=cweave;
-  make_xrefs=force_lines=make_pb=1; /* controlled by command-line options */
+  @<Set initial values@>@;
   common_init();
-  @<Set initial values@>;
-  if (show_banner) printf(banner); /* print a ``banner line'' */
-  @<Store all the reserved words@>;
+  @<Start \TEX/ output@>@;
+  if (show_banner) puts(banner); /* print a ``banner line'' */
+  @<Store all the reserved words@>@;
   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 */
@@ -113,36 +102,25 @@
   return wrap_up(); /* and exit gracefully */
 }
 
+@ The next few sections contain stuff from the file |"common.w"| that must
+be included in both |"ctangle.w"| and |"cweave.w"|. It appears in
+file |"common.h"|, which is also included in |"common.w"| to propagate
+possible changes from this \.{COMMON} interface consistently.
+
+First comes general stuff:
+
+ at i common.h
+
 @ The following parameters were sufficient in the original \.{WEAVE} to
 handle \TEX/, so they should be sufficient for most applications of \.{CWEAVE}.
-If you change |max_bytes|, |max_names|, |hash_size|, or |buf_size|
-you have to change them also in the file |"common.w"|.
 
- at d max_bytes 90000 /* the number of bytes in identifiers,
-  index entries, and section names */
- at d max_names 4000 /* number of identifiers, strings, section names;
-  must be less than 10240; used in |"common.w"| */
- at d max_sections 2000 /* greater than the total number of sections */
- at d hash_size 353 /* should be prime */
- at d buf_size 100 /* maximum length of input line, plus one */
- at d longest_name 10000 /* section names and strings shouldn't be longer than this */
- at d long_buf_size (buf_size+longest_name)
 @d line_length 80 /* lines of \TEX/ output have at most this many characters;
   should be less than 256 */
- at d max_refs 20000 /* number of cross-references; must be less than 65536 */
- at d max_toks 20000 /* number of symbols in \CEE/ texts being parsed;
-  must be less than 65536 */
- at d max_texts 4000 /* number of phrases in \CEE/ texts being parsed;
+ at 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 */
- at d max_scraps 2000 /* number of tokens in \CEE/ texts being parsed */
- at d stack_size 400 /* number of simultaneous output levels */
+ at d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
 
-@ The next few sections contain stuff from the file |"common.w"| that must
-be included in both |"ctangle.w"| and |"cweave.w"|. It appears in
-file |"common.h"|, which needs to be updated when |"common.w"| changes.
-
- at i common.h
-
 @* Data structures exclusive to {\tt CWEAVE}.
 As explained in \.{common.w}, the field of a |name_info| structure
 that contains the |rlink| of a section name is used for a completely
@@ -252,7 +230,7 @@
 @d xref equiv_or_xref
 
 @<Set init...@>=
-xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
 xmem->num=0; /* sentinel value */
 
 @ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -266,16 +244,20 @@
 
 @d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
   else (++xref_ptr)->num=c;
- at d no_xref (flags['x']==0)
- at d make_xrefs flags['x'] /* should cross references be output? */
+ at d no_xref (!make_xrefs)
 @d is_tiny(p) ((p+1)->byte_start==(p)->byte_start+1)
 @d unindexed(a) (a<res_wd_end && a->ilk>=custom)
       /* tells if uses of a name are to be indexed */
 
- at c
-void
-new_xref(p)
-name_pointer p;
+@<Predecl...@>=
+static void new_xref(name_pointer);@/
+static void new_section_xref(name_pointer);@/
+static void set_file_flag(name_pointer);@/
+
+@ @c
+static void
+new_xref(
+name_pointer p)
 {
   xref_pointer q; /* pointer to previous cross-reference */
   sixteen_bits m, n; /* new and previous cross-reference value */
@@ -289,7 +271,7 @@
         q->num=m; return;
     }
   }
-  append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
+  append_xref(m); xref_ptr->xlink=q; update_node(p);
 }
 
 @ The cross-reference lists for section names are slightly different.
@@ -304,9 +286,9 @@
 is insignificant.
 
 @c
-void
-new_section_xref(p)
-name_pointer p;
+static void
+new_section_xref(
+name_pointer p)
 {
   xref_pointer q,r; /* pointers to previous cross-references */
   q=(xref_pointer)p->xref; r=xmem;
@@ -316,7 +298,7 @@
         return; /* don't duplicate entries */
   append_xref(section_count+section_xref_switch);
   xref_ptr->xlink=q; section_xref_switch=0;
-  if (r==xmem) p->xref=(char*)xref_ptr;
+  if (r==xmem) update_node(p);
   else r->xlink=xref_ptr;
 }
 
@@ -324,9 +306,9 @@
 |file_flag|. Here's how that flag gets put~in.
 
 @c
-void
-set_file_flag(p)
-name_pointer p;
+static void
+set_file_flag(
+name_pointer p)
 {
   xref_pointer q;
   q=(xref_pointer)p->xref;
@@ -333,14 +315,14 @@
   if (q->num==file_flag) return;
   append_xref(file_flag);
   xref_ptr->xlink = q;
-  p->xref = (char *)xref_ptr;
+  update_node(p);
 }
 
 @ A third large area of memory is used for sixteen-bit `tokens', which appear
 in short lists similar to the strings of characters in |byte_mem|. Token lists
 are used to contain the result of \CEE/ code translated into \TEX/ form;
-further details about them will be explained later. A |text_pointer| variable
-is an index into |tok_start|.
+further details about them will be explained later. A \&{text\_pointer}
+variable is an index into |tok_start|.
 
 @<Typed...@>=
 typedef sixteen_bits token;
@@ -363,17 +345,17 @@
 text_pointer max_text_ptr; /* largest value of |text_ptr| */
 
 @ @<Set init...@>=
-tok_ptr=tok_mem+1; text_ptr=tok_start+1; tok_start[0]=tok_mem+1;
-tok_start[1]=tok_mem+1;
-max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
+tok_ptr=max_tok_ptr=tok_mem+1;@/
+tok_start[0]=tok_start[1]=tok_mem+1;@/
+text_ptr=max_text_ptr=tok_start+1;
 
 @ Here are the three procedures needed to complete |id_lookup|:
 @c
-int names_match(p,first,l,t)
-name_pointer p; /* points to the proposed match */
-char *first; /* position of first character of string */
-int l; /* length of identifier */
-eight_bits t; /* desired ilk */
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t at t\2\2@>) /* desired |ilk| */
 {
   if (length(p)!=l) return 0;
   if (p->ilk!=t && !(t==normal && abnormal(p))) return 0;
@@ -381,20 +363,30 @@
 }
 
 void
-init_p(p,t)
-name_pointer p;
-eight_bits t;
+init_p(
+name_pointer p,
+eight_bits t)
 {
-  p->ilk=t; p->xref=(char*)xmem;
+  p->ilk=t; init_node(p);
 }
 
 void
-init_node(p)
-name_pointer p;
+init_node(
+name_pointer p)
 {
-  p->xref=(char*)xmem;
+  p->xref=(void *)xmem;
 }
 
+static void
+update_node(
+name_pointer p)
+{
+  p->xref=(void *)xref_ptr;
+}
+
+@ @<Predecl...@>=
+static void update_node(name_pointer p);@/
+
 @ We have to get \CEE/'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
@@ -598,11 +590,12 @@
 interpretation of identifiers.
 
 @<Predec...@>=
-void   skip_limbo();
+static void skip_limbo(void);@/
+static eight_bits skip_TeX(void);@/
 
 @ @c
-void
-skip_limbo() {
+static void
+skip_limbo(void) {
   while(1) {
     if (loc>limit && get_line()==0) return;
     *(limit+1)='@@';
@@ -610,7 +603,7 @@
     if (loc++ <=limit) { int c=ccode[(eight_bits)*loc++];
       if (c==new_section) return;
       if (c==noop) skip_restricted();
-      else if (c==format_code) @<Process simple format in limbo@>;
+      else if (c==format_code) @<Process simple format in limbo@>@;
     }
   }
 }
@@ -623,8 +616,8 @@
 @f skip_TeX TeX
 
 @c
-unsigned
-skip_TeX() /* skip past pure \TEX/ code */
+static eight_bits
+skip_TeX(void) /* skip past pure \TEX/ code */
 {
   while (1) {
     if (loc>limit && get_line()==0) return(new_section);
@@ -679,10 +672,6 @@
 name_pointer cur_section; /* name of section just scanned */
 char cur_section_char; /* the character just before that name */
 
-@ @<Include...@>=
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-#include <stdlib.h> /* definition of |exit| */
-
 @ 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/
@@ -694,18 +683,21 @@
 @^high-bit character handling@>
 
 @<Predecl...@>=
-eight_bits get_next();
+static eight_bits get_next(void);@/
 
 @ @c
-eight_bits
-get_next() /* produces the next input token */
-{@+eight_bits c; /* the current character */
+static eight_bits
+get_next(void) /* produces the next input token */
+{
+  eight_bits c; /* the current character */
   while (1) {
-    @<Check if we're at the end of a preprocessor command@>;
+    @<Check if we're at the end of a preprocessor command@>@;
     if (loc>limit && get_line()==0) return(new_section);
     c=*(loc++);
     if (xisdigit(c) || c=='.') @<Get a constant@>@;
-    else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"'))@|
+    else if (c=='\'' || c=='"'@|
+           || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
+           || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
            || (c=='<' && sharp_include_line==1))
         @<Get a string@>@;
     else if (xisalpha(c) || isxalpha(c) || ishigh(c))
@@ -712,7 +704,7 @@
       @<Get an identifier@>@;
     else if (c=='@@') @<Get control code and possible section name@>@;
     else if (xisspace(c)) continue; /* ignore spaces and tabs */
-    if (c=='#' && loc==buffer+1) @<Raise preprocessor flag@>;
+    if (c=='#' && loc==buffer+1) @<Raise preprocessor flag@>@;
     mistake: @<Compress two-symbol operator@>@;
     return(c);
   }
@@ -736,7 +728,7 @@
 
 @ @<Raise prep...@>= {
   preprocessing=1;
-  @<Check if next token is |include|@>;
+  @<Check if next token is |include|@>@;
   return (left_preproc);
 }
 
@@ -778,8 +770,8 @@
     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;
+    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);
@@ -793,12 +785,13 @@
     else if (*loc=='<') compress(lt_lt); break;
   case '&': if (*loc=='&') compress(and_and); break;
   case '|': if (*loc=='|') compress(or_or); break;
-  case '!': if (*loc=='=') compress(not_eq); break;
+  case '!': if (*loc=='=') compress(non_eq); break;
 }
 
 @ @<Get an identifier@>= {
   id_first=--loc;
-  while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
+  while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+      || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
   id_loc=loc; return(identifier);
 }
 
@@ -833,7 +826,7 @@
   }
   while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
          || *loc=='f' || *loc=='F') {
-    *id_loc++='$'; *id_loc++=toupper(*loc); loc++;
+    *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
   }
   return(constant);
 }
@@ -849,7 +842,8 @@
   id_loc = section_text;
   if (delim=='\'' && *(loc-2)=='@@') {*++id_loc='@@'; *++id_loc='@@';}
   *++id_loc=delim;
-  if (delim=='L') { /* wide character constant */
+  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 */
@@ -868,14 +862,14 @@
       if (++id_loc<=section_text_end) *id_loc=c;
       break;
     }
-    if (c=='\\') if (loc>=limit) continue;
-      else if (++id_loc<=section_text_end) {
+    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) {
-    printf("\n! String too long: ");
+    fputs("\n! String too long: ",stdout);
 @.String too long@>
     term_write(section_text+1,25);
     printf("..."); mark_error;
@@ -894,12 +888,12 @@
 @.Use @@l in limbo...@>
     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[c]; skip_restricted(); return(c);
+    case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
+    case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return(c);
     case section_name:
-      @<Scan the section name and make |cur_section| point to it@>;
-    case verbatim: @<Scan a verbatim string@>;
-    case ord: @<Get a string@>;
+      @<Scan the section name and make |cur_section| point to it@>@;
+    case verbatim: @<Scan a verbatim string@>@;
+    case ord: @<Get a string@>@;
     default: return(ccode[(eight_bits)c]);
   }
 }
@@ -910,7 +904,7 @@
 @<Scan the section name...@>= {
   char *k; /* pointer into |section_text| */
   cur_section_char=*(loc-1);
-  @<Put section name into |section_text|@>;
+  @<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);
@@ -934,7 +928,7 @@
     loc=buffer+1; break;
   }
   c=*loc;
-  @<If end of name or erroneous control code, |break|@>;
+  @<If end of name or erroneous control code, |break|@>@;
   loc++; if (k<section_text_end) k++;
   if (xisspace(c)) {
     c=' '; if (*(k-1)==' ') k--;
@@ -942,7 +936,7 @@
 *k=c;
 }
 if (k>=section_text_end) {
-  printf("\n! Section name too long: ");
+  fputs("\n! Section name too long: ",stdout);
 @.Section name too long@>
   term_write(section_text+1,25);
   printf("..."); mark_harmless;
@@ -969,11 +963,11 @@
 @ This function skips over a restricted context at relatively high speed.
 
 @<Predecl...@>=
-void skip_restricted();
+static void skip_restricted(void);@/
 
 @ @c
-void
-skip_restricted()
+static void
+skip_restricted(void)
 {
   id_first=loc; *(limit+1)='@@';
 false_alarm:
@@ -1022,19 +1016,19 @@
 straightforward outline.
 
 @<Predecl...@>=
-void phase_one();
+static void phase_one(void);@/
 
 @ @c
-void
-phase_one() {
+static void
+phase_one(void) {
   phase=1; reset_input(); section_count=0;
   skip_limbo(); change_exists=0;
   while (!input_has_ended)
-    @<Store cross-reference data for the current section@>;
+    @<Store cross-reference data for the current section@>@;
   changed_section[section_count]=change_exists;
     /* the index changes if anything does */
   phase=2; /* prepare for second phase */
-  @<Print error messages about unused or undefined section names@>;
+  @<Print error messages about unused or undefined section names@>@;
 }
 
 @ @<Store cross-reference data...@>=
@@ -1046,9 +1040,9 @@
     printf("*%d",section_count);
     update_terminal; /* print a progress report */
   }
-  @<Store cross-references in the \TEX/ part of a section@>;
-  @<Store cross-references in the definition part of a section@>;
-  @<Store cross-references in the \CEE/ part of a section@>;
+  @<Store cross-references in the \TEX/ part of a section@>@;
+  @<Store cross-references in the definition part of a section@>@;
+  @<Store cross-references in the \CEE/ part of a section@>@;
   if (changed_section[section_count]) change_exists=1;
 }
 
@@ -1074,12 +1068,13 @@
 as well as |normal==0|.
 
 @<Predecl...@>=
-void C_xref();
+static void C_xref(eight_bits);@/
+static void outer_xref(void);@/
 
 @ @c
-void
-C_xref( spec_ctrl ) /* makes cross-references for \CEE/ identifiers */
-  eight_bits spec_ctrl;
+static void
+C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
+  eight_bits spec_ctrl at t\2\2@>)
 {
   name_pointer p; /* a referenced name */
   while (next_control<format_code || next_control==spec_ctrl) {
@@ -1101,12 +1096,9 @@
 with |next_control!='|'| and ends with |next_control>=format_code|. Thus, it
 handles \CEE/ text with embedded comments.
 
-@<Predecl...@>=
-void outer_xref();
-
-@ @c
-void
-outer_xref() /* extension of |C_xref| */
+ at c
+static void
+outer_xref(void) /* extension of |C_xref| */
 {
   int bal; /* brace level in comment */
   while (next_control<format_code)
@@ -1182,7 +1174,7 @@
   if (next_control==definition) {
     xref_switch=def_flag; /* implied \.{@@!} */
     next_control=get_next();
-  } else @<Process a format definition@>;
+  } else @<Process a format definition@>@;
   outer_xref();
 }
 
@@ -1205,7 +1197,7 @@
         for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
           if (q->num<def_flag)
             if (r) r->xlink=q->xlink;
-            else lhs->xref=(char*)q->xlink;
+            else lhs->xref=(void *)q->xlink;
           else r=q;
       }
       next_control=get_next();
@@ -1264,12 +1256,12 @@
 @^recursion@>
 
 @<Predecl...@>=
-void section_check();
+static void section_check(name_pointer);@/
 
 @ @c
-void
-section_check(p)
-name_pointer p; /* print anomalies in subtree |p| */
+static void
+section_check(
+name_pointer p) /* print anomalies in subtree |p| */
 {
   if (p) {
     section_check(p->llink);
@@ -1277,12 +1269,14 @@
     if (cur_xref->num==file_flag) {an_output=1; cur_xref=cur_xref->xlink;}
     else an_output=0;
     if (cur_xref->num <def_flag) {
-      printf("\n! Never defined: <"); print_section_name(p); putchar('>'); mark_harmless;
+      fputs("\n! Never defined: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @.Never defined: <section name>@>
     }
     while (cur_xref->num >=cite_flag) cur_xref=cur_xref->xlink;
     if (cur_xref==xmem && !an_output) {
-      printf("\n! Never used: <"); print_section_name(p); putchar('>'); mark_harmless;
+      fputs("\n! Never used: <",stdout);
+      print_section_name(p); putchar('>'); mark_harmless;
 @.Never used: <section name>@>
     }
     section_check(p->rlink);
@@ -1289,7 +1283,7 @@
   }
 }
 
-@ @<Print error messages about un...@>=section_check(root)
+@ @<Print error messages about un...@>=section_check(root);
 
 @* Low-level output routines.
 The \TEX/ output is supposed to appear in lines at most |line_length|
@@ -1305,7 +1299,7 @@
 
 @ The |flush_buffer| routine empties the buffer up to a given breakpoint,
 and moves any remaining characters to the beginning of the next line.
-If the |per_cent| parameter is 1 a |'%'| is appended to the line
+If the |per_cent| parameter is 1, a |'%'| is appended to the line
 that is being output; in this case the breakpoint |b| should be strictly
 less than |out_buf_end|. If the |per_cent| parameter is |0|,
 trailing blanks are suppressed.
@@ -1317,13 +1311,18 @@
 @d c_line_write(c) fflush(active_file),fwrite(out_buf+1,sizeof(char),c,active_file)
 @d tex_putc(c) putc(c,active_file)
 @d tex_new_line putc('\n',active_file)
- at d tex_printf(c) fprintf(active_file,c)
+ at d tex_printf(c) fprintf(active_file,"%s",c)
+ at d tex_puts(c) fputs(c,active_file)
 
- at c
-void
-flush_buffer(b,per_cent,carryover)
-char *b; /* outputs from |out_buf+1| to |b|,where |b<=out_ptr| */
-boolean per_cent,carryover;
+@<Predecl...@>=
+static void flush_buffer(char *,boolean,boolean);@/
+static void finish_line(void);@/
+
+@ @c
+static void
+flush_buffer(@t\1\1@>
+char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
+boolean per_cent,boolean carryover at t\2\2@>)
 {
   char *j; j=b; /* pointer into |out_buf| */
   if (! per_cent) /* remove trailing blanks */
@@ -1336,7 +1335,7 @@
       if (*j--=='%' && (j==out_buf || *j!='\\')) {
         *b--='%'; break;
       }
-  if (b<out_ptr) strncpy(out_buf+1,b+1,out_ptr-b);
+  if (b<out_ptr) strncpy(out_buf+1,b+1,(size_t)(out_ptr-b));
   out_ptr-=b-out_buf;
 }
 
@@ -1349,8 +1348,8 @@
 been emitted during the output of translated \CEE/ text.
 
 @c
-void
-finish_line() /* do this at the end of a line */
+static void
+finish_line(void) /* do this at the end of a line */
 {
   char *k; /* pointer into |buffer| */
   if (out_ptr>out_buf) flush_buffer(out_ptr,0,0);
@@ -1366,7 +1365,7 @@
 tricky way so that the first line of the output file will be
 `\.{\\input cwebmac}'.
 
-@<Set init...@>=
+@<Start \TEX/...@>=
 out_ptr=out_buf+1; out_line=1; active_file=tex_file;
 *out_ptr='c'; tex_printf("\\input cwebma");
 
@@ -1380,10 +1379,14 @@
 
 @d out(c) {if (out_ptr>=out_buf_end) break_out(); *(++out_ptr)=c;}
 
- at c
-void
-out_str(s) /* output characters from |s| to end of string */
-char *s;
+@<Predecl...@>=
+static void out_str(const char *);@/
+static void break_out(void);@/
+
+@ @c
+static void
+out_str(@t\1\1@> /* output characters from |s| to end of string */
+const char*s at t\2\2@>)
 {
   while (*s) out(*s++);
 }
@@ -1399,16 +1402,13 @@
 preceded by another backslash. In the latter case, a |'%'| is output at
 the break.
 
-@<Predecl...@>=
-void break_out();
-
-@ @c
-void
-break_out() /* finds a way to break the output line */
+ at c
+static void
+break_out(void) /* finds a way to break the output line */
 {
   char *k=out_ptr; /* pointer into |out_buf| */
   while (1) {
-    if (k==out_buf) @<Print warning message, break the line, |return|@>;
+    if (k==out_buf) @<Print warning message, break the line, |return|@>@;
     if (*k==' ') {
       flush_buffer(k,0,1); return;
     }
@@ -1437,10 +1437,14 @@
 |def_flag|, so it cannot have more than five decimal digits.  If
 the section is changed, we output `\.{\\*}' just after the number.
 
- at c
-void
-out_section(n)
-sixteen_bits n;
+@<Predecl...@>=
+static void out_section(sixteen_bits);@/
+static void out_name(name_pointer,boolean);@/
+
+@ @c
+static void
+out_section(
+sixteen_bits n)
 {
   char s[6];
   sprintf(s,"%d",n); out_str(s);
@@ -1452,10 +1456,10 @@
 entry, enclosing it in braces.
 
 @c
-void
-out_name(p,quote_xalpha)
-name_pointer p;
-boolean quote_xalpha;
+static void
+out_name(
+name_pointer p,
+boolean quote_xalpha)
 {
   char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
   out('{');
@@ -1469,11 +1473,9 @@
 }
 
 @* Routines that copy \TEX/ material.
-During phase two, we use subroutines |copy_limbo|, |copy_TeX|, and
-|copy_comment| in place of the analogous |skip_limbo|, |skip_TeX|, and
-|skip_comment| that were used in phase one. (Well, |copy_comment|
-was actually written in such a way that it functions as |skip_comment|
-in phase one.)
+During phase two, we use the subroutines |copy_limbo| and |copy_TeX| (and
+|copy_comment|) in place of the analogous |skip_limbo| and |skip_TeX|
+that were used in phase one.
 
 The |copy_limbo| routine, for example, takes \TEX/ material that is not
 part of any section and transcribes it almost verbatim to the output file.
@@ -1481,9 +1483,14 @@
 `\.{@@@@}' pairs are replaced by singletons; `\.{@@l}' and `\.{@@q}' and
 `\.{@@s}' are interpreted.
 
- at c
-void
-copy_limbo()
+@<Predecl...@>=
+static void copy_limbo(void);@/
+static eight_bits copy_TeX(void);@/
+static int copy_comment(boolean,int);@/
+
+@ @c
+static void
+copy_limbo(void)
 {
   char c;
   while (1) {
@@ -1515,10 +1522,10 @@
 We don't copy spaces or tab marks into the beginning of a line. This
 makes the test for empty lines in |finish_line| work.
 
-@ @f copy_TeX TeX
+ at f copy_TeX TeX
 @c
-eight_bits
-copy_TeX()
+static eight_bits
+copy_TeX(void)
 {
   char c; /* current character being copied */
   while (1) {
@@ -1545,13 +1552,10 @@
 
 @d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
 
-@<Predec...@>=
-int copy_comment();
-
-@ @c
-int copy_comment(is_long_comment,bal) /* copies \TEX/ code in comments */
-boolean is_long_comment; /* is this a traditional \CEE/ comment? */
-int bal; /* brace balance */
+ at c
+static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal at t\2\2@>) /* brace balance */
 {
   char c; /* current character being copied */
   while (1) {
@@ -1571,12 +1575,12 @@
     }
     c=*(loc++);
     if (c=='|') return(bal);
-    if (is_long_comment) @<Check for end of comment@>;
+    if (is_long_comment) @<Check for end of comment@>@;
     if (phase==2) {
       if (ishigh(c)) app_tok(quoted_char);
       app_tok(c);
     }
-    @<Copy special things when |c=='@@', '\\'|@>;
+    @<Copy special things when |c=='@@', '\\'|@>@;
     if (c=='{') bal++;
     else if (c=='}') {
       if(bal>1) bal--;
@@ -1586,7 +1590,7 @@
       }
     }
   }
-done:@<Clear |bal| and |return|@>;
+done:@<Clear |bal| and |return|@>@;
 }
 
 @ @<Check for end of comment@>=
@@ -1605,8 +1609,8 @@
     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.
@@ -1660,9 +1664,12 @@
 comma, with penalty 90.
 
 At each opportunity the longest possible production is applied.  For
-example, if the current sequence of scraps is |int_like| |cast|
-|lbrace|, rule 31 is applied; but if the sequence is |int_like| |cast|
-followed by anything other than |lbrace|, rule 32 takes effect.
+example, if the current sequence of scraps is |if_clause| |stmt|
+|else_like| |if_like|, rule 63 is applied; but if the sequence is
+|if_clause| |stmt| |else_like| followed by anything other than
+|if_like|, rule 64 takes effect; and if the sequence is |if_clause|
+|stmt| followed by anything other than |else_like|, rule 65 takes
+effect.
 
 Translation rules such as `$E_1C\,\\{opt}9\,E_2$' above use subscripts
 to distinguish between translations of scraps whose categories have the
@@ -1713,11 +1720,9 @@
 
 @<Glo...@>=
 char cat_name[256][12];
-eight_bits cat_index;
 
 @ @<Set in...@>=
-    for (cat_index=0;cat_index<255;cat_index++)
-      strcpy(cat_name[cat_index],"UNKNOWN");
+{int c; for (c=0;c<256;c++) strcpy(cat_name[c],"UNKNOWN");}
 @.UNKNOWN@>
     strcpy(cat_name[exp],"exp");
     strcpy(cat_name[unop],"unop");
@@ -1780,12 +1785,15 @@
 
 @ This code allows \.{CWEAVE} to display its parsing steps.
 
- at c
-void
-print_cat(c) /* symbolic printout of a category */
-eight_bits c;
+@<Predecl...@>=
+static void print_cat(eight_bits);@/
+
+@ @c
+static void
+print_cat(@t\1\1@> /* symbolic printout of a category */
+eight_bits c at t\2\2@>)
 {
-  printf(cat_name[c]);
+  fputs(cat_name[c],stdout);
 }
 
 @ The token lists for translated \TEX/ output contain some special control
@@ -2135,10 +2143,13 @@
 @d tok_flag 4*id_flag /* signifies a token list */
 @d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
 
- at c
-void
-print_text(p) /* prints a token list for debugging; not used in |main| */
-text_pointer p;
+@<Predecl...@>=
+static void print_text(text_pointer p);@/
+
+@ @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@>)
 {
   token_pointer j; /* index into |tok_mem| */
   sixteen_bits r; /* remainder of token after the flag has been stripped off */
@@ -2154,10 +2165,10 @@
         break; /* |section_flag| */
       case 4: printf("[[%d]]",r); break; /* |tok_flag| */
       case 5: printf("|[[%d]]|",r); break; /* |inner_tok_flag| */
-      default: @<Print token |r| in symbolic form@>;
+      default: @<Print token |r| in symbolic form@>@;
     }
   }
-  fflush(stdout);
+  update_terminal;
 }
 
 @ @<Print token |r|...@>=
@@ -2173,7 +2184,7 @@
   case force: printf("[force]"); break;
   case big_force: printf("[fforce]"); break;
   case preproc_line: printf("[preproc]"); break;
-  case quoted_char: j++; printf("[%o]",(unsigned)*j); break;
+  case quoted_char: j++; printf("[%o]",(unsigned int)*j); break;
   case end_translation: printf("[quit]"); break;
   case inserted: printf("[inserted]"); break;
   default: putxchar(r);
@@ -2254,23 +2265,28 @@
 @d big_app2(a) big_app1(a);big_app1(a+1)
 @d big_app3(a) big_app2(a);big_app1(a+2)
 @d big_app4(a) big_app3(a);big_app1(a+3)
- at d app(a) *(tok_ptr++)=a
- at d app1(a) *(tok_ptr++)=tok_flag+(int)((a)->trans-tok_start)
+ at d app(a) *(tok_ptr++)=(token)(a)
+ at d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
 
 @<Global...@>=
 int cur_mathness, init_mathness;
 
+@ @<Predecl...@>=
+static void app_str(const char *);@/
+static void big_app(token);@/
+static void big_app1(scrap_pointer);@/
+
 @ @c
-void
-app_str(s)
-char *s;
+static void
+app_str(
+const char *s)
 {
   while (*s) app_tok(*(s++));
 }
 
-void
-big_app(a)
-token a;
+static void
+big_app(
+token a)
 {
         if (a==' ' || (a>=big_cancel && a<=big_force)) /* non-math token */ {
                 if (cur_mathness==maybe_math) init_mathness=no_math;
@@ -2285,9 +2301,9 @@
         app(a);
 }
 
-void
-big_app1(a)
-scrap_pointer a;
+static void
+big_app1(
+scrap_pointer a)
 {
   switch (a->mathness % 4) { /* left boundary */
   case (no_math):
@@ -2316,11 +2332,11 @@
 @d lhs_not_simple (pp->cat!=public_like
         && pp->cat!=semi 
         && pp->cat!=prelangle
-        && pp->cat!=prerangle
+        && pp->cat!=prerangle @|
         && pp->cat!=template_like
         && pp->cat!=new_like
         && pp->cat!=new_exp
-        && pp->cat!=ftemplate
+        && pp->cat!=ftemplate @|
         && pp->cat!=raw_ubin
         && pp->cat!=const_like
         && pp->cat!=raw_int
@@ -2336,53 +2352,53 @@
   else if (cat3==insert) squash(pp+2,2,(pp+2)->cat,0,0);
   else
   switch (pp->cat) {
-    case exp: @<Cases for |exp|@>; @+break;
-    case lpar: @<Cases for |lpar|@>; @+break;
-    case unop: @<Cases for |unop|@>; @+break;
-    case ubinop: @<Cases for |ubinop|@>; @+break;
-    case binop: @<Cases for |binop|@>; @+break;
-    case cast: @<Cases for |cast|@>; @+break;
-    case sizeof_like: @<Cases for |sizeof_like|@>; @+break;
-    case int_like: @<Cases for |int_like|@>; @+break;
-    case public_like: @<Cases for |public_like|@>; @+break;
-    case colcol: @<Cases for |colcol|@>; @+break;
-    case decl_head: @<Cases for |decl_head|@>; @+break;
-    case decl: @<Cases for |decl|@>; @+break;
-    case base: @<Cases for |base|@>; @+break;
-    case struct_like: @<Cases for |struct_like|@>; @+break;
-    case struct_head: @<Cases for |struct_head|@>; @+break;
-    case fn_decl: @<Cases for |fn_decl|@>; @+break;
-    case function: @<Cases for |function|@>; @+break;
-    case lbrace: @<Cases for |lbrace|@>; @+break;
-    case if_like: @<Cases for |if_like|@>; @+break;
-    case else_like: @<Cases for |else_like|@>; @+break;
-    case else_head: @<Cases for |else_head|@>; @+break;
-    case if_clause: @<Cases for |if_clause|@>; @+break;
-    case if_head: @<Cases for |if_head|@>; @+break;
-    case do_like: @<Cases for |do_like|@>; @+break;
-    case case_like: @<Cases for |case_like|@>; @+break;
-    case catch_like: @<Cases for |catch_like|@>; @+break;
-    case tag: @<Cases for |tag|@>; @+break;
-    case stmt: @<Cases for |stmt|@>; @+break;
-    case semi: @<Cases for |semi|@>; @+break;
-    case lproc: @<Cases for |lproc|@>; @+break;
-    case section_scrap: @<Cases for |section_scrap|@>; @+break;
-    case insert: @<Cases for |insert|@>; @+break;
-    case prelangle: @<Cases for |prelangle|@>; @+break;
-    case prerangle: @<Cases for |prerangle|@>; @+break;
-    case langle: @<Cases for |langle|@>; @+break;
-    case template_like: @<Cases for |template_like|@>; @+break;
-    case new_like: @<Cases for |new_like|@>; @+break;
-    case new_exp: @<Cases for |new_exp|@>; @+break;
-    case ftemplate: @<Cases for |ftemplate|@>; @+break;
-    case for_like: @<Cases for |for_like|@>; @+break;
-    case raw_ubin: @<Cases for |raw_ubin|@>; @+break;
-    case const_like: @<Cases for |const_like|@>; @+break;
-    case raw_int: @<Cases for |raw_int|@>; @+break;
-    case operator_like: @<Cases for |operator_like|@>; @+break;
-    case typedef_like: @<Cases for |typedef_like|@>; @+break;
-    case delete_like: @<Cases for |delete_like|@>; @+break;
-    case question: @<Cases for |question|@>; @+break;
+    case exp: @<Cases for |exp|@>@; @+break;
+    case lpar: @<Cases for |lpar|@>@; @+break;
+    case unop: @<Cases for |unop|@>@; @+break;
+    case ubinop: @<Cases for |ubinop|@>@; @+break;
+    case binop: @<Cases for |binop|@>@; @+break;
+    case cast: @<Cases for |cast|@>@; @+break;
+    case sizeof_like: @<Cases for |sizeof_like|@>@; @+break;
+    case int_like: @<Cases for |int_like|@>@; @+break;
+    case public_like: @<Cases for |public_like|@>@; @+break;
+    case colcol: @<Cases for |colcol|@>@; @+break;
+    case decl_head: @<Cases for |decl_head|@>@; @+break;
+    case decl: @<Cases for |decl|@>@; @+break;
+    case base: @<Cases for |base|@>@; @+break;
+    case struct_like: @<Cases for |struct_like|@>@; @+break;
+    case struct_head: @<Cases for |struct_head|@>@; @+break;
+    case fn_decl: @<Cases for |fn_decl|@>@; @+break;
+    case function: @<Cases for |function|@>@; @+break;
+    case lbrace: @<Cases for |lbrace|@>@; @+break;
+    case if_like: @<Cases for |if_like|@>@; @+break;
+    case else_like: @<Cases for |else_like|@>@; @+break;
+    case else_head: @<Cases for |else_head|@>@; @+break;
+    case if_clause: @<Cases for |if_clause|@>@; @+break;
+    case if_head: @<Cases for |if_head|@>@; @+break;
+    case do_like: @<Cases for |do_like|@>@; @+break;
+    case case_like: @<Cases for |case_like|@>@; @+break;
+    case catch_like: @<Cases for |catch_like|@>@; @+break;
+    case tag: @<Cases for |tag|@>@; @+break;
+    case stmt: @<Cases for |stmt|@>@; @+break;
+    case semi: @<Cases for |semi|@>@; @+break;
+    case lproc: @<Cases for |lproc|@>@; @+break;
+    case section_scrap: @<Cases for |section_scrap|@>@; @+break;
+    case insert: @<Cases for |insert|@>@; @+break;
+    case prelangle: @<Cases for |prelangle|@>@; @+break;
+    case prerangle: @<Cases for |prerangle|@>@; @+break;
+    case langle: @<Cases for |langle|@>@; @+break;
+    case template_like: @<Cases for |template_like|@>@; @+break;
+    case new_like: @<Cases for |new_like|@>@; @+break;
+    case new_exp: @<Cases for |new_exp|@>@; @+break;
+    case ftemplate: @<Cases for |ftemplate|@>@; @+break;
+    case for_like: @<Cases for |for_like|@>@; @+break;
+    case raw_ubin: @<Cases for |raw_ubin|@>@; @+break;
+    case const_like: @<Cases for |const_like|@>@; @+break;
+    case raw_int: @<Cases for |raw_int|@>@; @+break;
+    case operator_like: @<Cases for |operator_like|@>@; @+break;
+    case typedef_like: @<Cases for |typedef_like|@>@; @+break;
+    case delete_like: @<Cases for |delete_like|@>@; @+break;
+    case question: @<Cases for |question|@>@; @+break;
   }
   pp++; /* if no match was found, we move to the right */
 }
@@ -2411,10 +2427,16 @@
 @d case_found (token_pointer)1 /* likewise */
 @d operator_found (token_pointer)2 /* likewise */
 
- at c
-token_pointer
-find_first_ident(p)
-text_pointer p;
+@<Predecl...@>=
+static token_pointer find_first_ident(text_pointer);@/
+static void make_reserved(scrap_pointer);@/
+static void make_underlined(scrap_pointer);@/
+static void underline_xref(name_pointer);@/
+
+@ @c
+static token_pointer
+find_first_ident(
+text_pointer p)
 {
   token_pointer q; /* token to be returned */
   token_pointer j; /* token being looked at */
@@ -2444,11 +2466,11 @@
 the |for| loop below.
 
 @c
-void
-make_reserved(p) /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p;
+static void
+make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p at t\2\2@>)
 {
-  sixteen_bits tok_value; /* the name of this identifier, plus its flag*/
+  sixteen_bits tok_value; /* the name of this identifier, plus its flag */
   token_pointer tok_loc; /* pointer to |tok_value| */
   if ((tok_loc=find_first_ident(p->trans))<=operator_found)
     return; /* this should not happen */
@@ -2475,10 +2497,10 @@
 it has been swallowed up by an |exp|.
 
 @c
-void
-make_underlined(p)
+static void
+make_underlined(@t\1\1@>
 /* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p;
+scrap_pointer p at t\2\2@>)
 {
   token_pointer tok_loc; /* where the first identifier appears */
   if ((tok_loc=find_first_ident(p->trans))<=operator_found)
@@ -2492,13 +2514,10 @@
 We actually have to search through the list for the existing
 cross-reference.
 
-@<Predecl...@>=
-void  underline_xref();
-
-@ @c
-void
-underline_xref(p)
-name_pointer p;
+ at c
+static void
+underline_xref(
+name_pointer p)
 {
   xref_pointer q=(xref_pointer)p->xref; /* pointer to cross-reference being examined */
   xref_pointer r; /* temporary pointer for permuting cross-references */
@@ -2515,7 +2534,7 @@
     else if (n>=def_flag && n<m) break;
     q=q->xlink;
   }
-  @<Insert new cross-reference at |q|, not at beginning of list@>;
+  @<Insert new cross-reference at |q|, not at beginning of list@>@;
 }
 
 @ We get to this section only when the identifier is one letter long,
@@ -2528,7 +2547,7 @@
 @<Insert new cross-reference at |q|...@>=
   append_xref(0); /* this number doesn't matter */
   xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
-  p->xref=(char*)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 */
 
@@ -2818,7 +2837,11 @@
 grouped together on the same line.
 
 @d force_lines flags['f'] /* should each statement be on its own line? */
-@<Cases for |stmt|@>=
+
+@<Set init...@>=
+force_lines=true;
+
+@ @<Cases for |stmt|@>=
 if (cat1==stmt||cat1==decl||cat1==function) {
   big_app1(pp);
   if (cat1==function) big_app(big_force);
@@ -3000,12 +3023,16 @@
 
 @d freeze_text *(++text_ptr)=tok_ptr
 
- at c
-void
-reduce(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
+@<Predecl...@>=
+static void reduce(scrap_pointer,short,eight_bits,short,short);@/
+static void squash(scrap_pointer,short,eight_bits,short,short);@/
+
+@ @c
+static void
+reduce(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
 {
   scrap_pointer i, i1; /* pointers into scrap memory */
   j->cat=c; j->trans=text_ptr;
@@ -3019,7 +3046,7 @@
     lo_ptr=lo_ptr-k+1;
   }
   pp=(pp+d<scrap_base? scrap_base: pp+d);
-  @<Print a snapshot of the scrap list if debugging @>;
+  @<Print a snapshot of the scrap list if debugging @>@;
   pp--; /* we next say |pp++| */
 }
 
@@ -3027,16 +3054,16 @@
 takes advantage of the simplification that occurs when |k==1|.
 
 @c
-void
-squash(j,k,c,d,n)
-scrap_pointer j;
-eight_bits c;
-short k, d, n;
+static void
+squash(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
 {
   scrap_pointer i; /* pointers into scrap memory */
   if (k==1) {
     j->cat=c; pp=(pp+d<scrap_base? scrap_base: pp+d);
-    @<Print a snapshot...@>;
+    @<Print a snapshot...@>@;
     pp--; /* we next say |pp++| */
     return;
   }
@@ -3059,7 +3086,7 @@
 
 @<Reduce the scraps using the productions until no more rules apply@>=
 while (1) {
-  @<Make sure the entries |pp| through |pp+3| of |cat| are defined@>;
+  @<Make sure the entries |pp| through |pp+3| of |cat| are defined@>@;
   if (tok_ptr+safe_tok_incr>tok_mem_end) {
     if (tok_ptr>max_tok_ptr) max_tok_ptr=tok_ptr;
     overflow("token");
@@ -3070,7 +3097,7 @@
   }
   if (pp>lo_ptr) break;
   init_mathness=cur_mathness=maybe_math;
-  @<Match a production...@>;
+  @<Match a production...@>@;
 }
 
 @ If we get to the end of the scrap list, category codes equal to zero are
@@ -3094,18 +3121,18 @@
 int tracing; /* can be used to show parsing details */
 
 @ @<Print a snapsh...@>=
-{ scrap_pointer k; /* pointer into |scrap_info| */
+{ scrap_pointer k_l; /* pointer into |scrap_info| */
   if (tracing==2) {
     printf("\n%d:",n);
-    for (k=scrap_base; k<=lo_ptr; k++) {
-      if (k==pp) putxchar('*'); else putxchar(' ');
-      if (k->mathness %4 ==  yes_math) putchar('+');
-      else if (k->mathness %4 ==  no_math) putchar('-');
-      print_cat(k->cat);
-      if (k->mathness /4 ==  yes_math) putchar('+');
-      else if (k->mathness /4 ==  no_math) putchar('-');
+    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) printf("..."); /* indicate that more is coming */
+    if (hi_ptr<=scrap_ptr) fputs("...",stdout); /* indicate that more is coming */
   }
 }
 
@@ -3122,16 +3149,19 @@
 since |translate| might add a new text and a new scrap before it checks
 for overflow.
 
- at c
-text_pointer
-translate() /* converts a sequence of scraps */
+@<Predecl...@>=
+static text_pointer translate(void);@/
+
+@ @c
+static text_pointer
+translate(void) /* converts a sequence of scraps */
 {
   scrap_pointer i, /* index into |cat| */
   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...@>;
-  @<Combine the irreducible scraps that remain@>;
+  @<If tracing, print an indication of where we are@>@;
+  @<Reduce the scraps...@>@;
+  @<Combine the irreducible scraps that remain@>@;
 }
 
 @ If the initial sequence of scraps does not reduce to a single scrap,
@@ -3140,7 +3170,7 @@
 where appropriate.
 
 @<Combine the irreducible...@>= {
-  @<If semi-tracing, show the irreducible scraps@>;
+  @<If semi-tracing, show the irreducible scraps@>@;
   for (j=scrap_base; j<=lo_ptr; j++) {
     if (j!=scrap_base) app(' ');
     if (j->mathness % 4 == yes_math) app('$');
@@ -3187,14 +3217,17 @@
 what it reads are appended into the |cat| and |trans| arrays, and |scrap_ptr|
 is advanced.
 
- at c
-void
-C_parse(spec_ctrl) /* creates scraps from \CEE/ tokens */
-  eight_bits spec_ctrl;
+@<Predecl...@>=
+static void C_parse(eight_bits);@/
+
+@ @c
+static void
+C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
+  eight_bits spec_ctrl at t\2\2@>)
 {
   int count; /* characters remaining before string break */
   while (next_control<format_code || next_control==spec_ctrl) {
-    @<Append the scrap appropriate to |next_control|@>;
+    @<Append the scrap appropriate to |next_control|@>@;
     next_control=get_next();
     if (next_control=='|' || next_control==begin_comment ||
         next_control==begin_short_comment) return;
@@ -3211,76 +3244,77 @@
 }
 
 @ @<Append the scr...@>=
-@<Make sure that there is room for the new scraps, tokens, and texts@>;
+@<Make sure that there is room for the new scraps, tokens, and texts@>@;
 switch (next_control) {
   case section_name:
     app(section_flag+(int)(cur_section-name_dir));
     app_scrap(section_scrap,maybe_math);
     app_scrap(exp,yes_math);@+break;
-  case string: case constant: case verbatim: @<Append a string or constant@>;
-   @+break;
+  case string: case constant: case verbatim:
+    @<Append a string or constant@>@;@+break;
   case identifier: app_cur_id(1);@+break;
-  case TeX_string: @<Append a \TEX/ string, without forming a scrap@>;@+break;
+  case TeX_string:
+    @<Append a \TEX/ string, without forming a scrap@>@;@+break;
   case '/': case '.':
-    app(next_control); app_scrap(binop,yes_math);@+break;
+    app(next_control);@+app_scrap(binop,yes_math);@+break;
   case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
 @.\\langle@>
   case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
 @.\\rangle@>
-  case '=': app_str("\\K"); app_scrap(binop,yes_math);@+break;
+  case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
 @.\\K@>
-  case '|': app_str("\\OR"); app_scrap(binop,yes_math);@+break;
+  case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
 @.\\OR@>
-  case '^': app_str("\\XOR"); app_scrap(binop,yes_math);@+break;
+  case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
 @.\\XOR@>
-  case '%': app_str("\\MOD"); app_scrap(binop,yes_math);@+break;
+  case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
 @.\\MOD@>
-  case '!': app_str("\\R"); app_scrap(unop,yes_math);@+break;
+  case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
 @.\\R@>
-  case '~': app_str("\\CM"); app_scrap(unop,yes_math);@+break;
+  case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
 @.\\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;
+  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;
 @.\\AND@>
-  case '?': app_str("\\?"); app_scrap(question,yes_math);@+break;
+  case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
 @.\\?@>
-  case '#': app_str("\\#"); app_scrap(ubinop,yes_math);@+break;
+  case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
 @.\\\#@>
   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_str("\\{"@q}@>); app_scrap(lbrace,yes_math);@+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_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
 @.\\\{@>@q}@>
-  case '}': app_str(@q{@>"\\}"); app_scrap(rbrace,yes_math);@+break;
+  case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
 @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;@/
+  case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+  case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+  case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
   @t\4@>  @<Cases involving nonstandard characters@>@;
-  case thin_space: app_str("\\,"); app_scrap(insert,maybe_math);@+break;
+  case thin_space: app_str("\\,");@+app_scrap(insert,maybe_math);@+break;
 @.\\,@>
-  case math_break: app(opt); app_str("0");
+  case math_break: app(opt);@+app_str("0");@+
     app_scrap(insert,maybe_math);@+break;
-  case line_break: app(force); app_scrap(insert,no_math);@+break;
-  case left_preproc: app(force); app(preproc_line);
-    app_str("\\#"); app_scrap(lproc,no_math);@+break;
+  case line_break: app(force);@+app_scrap(insert,no_math);@+break;
+  case left_preproc: app(force);@+app(preproc_line);@+app_str("\\#");
+    app_scrap(lproc,no_math);@+break;
 @.\\\#@>
-  case right_preproc: app(force); app_scrap(rproc,no_math);@+break;
-  case big_line_break: app(big_force); app_scrap(insert,no_math);@+break;
-  case no_line_break: app(big_cancel); app(noop); app(break_space);
-    app(noop); app(big_cancel);
+  case right_preproc: app(force);@+app_scrap(rproc,no_math);@+break;
+  case big_line_break: app(big_force);@+app_scrap(insert,no_math);@+break;
+  case no_line_break: app(big_cancel);@+app(noop);@+app(break_space);@+
+    app(noop);@+app(big_cancel);
     app_scrap(insert,no_math);@+break;
   case pseudo_semi: app_scrap(semi,maybe_math);@+break;
   case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
   case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
-  case join: app_str("\\J"); app_scrap(insert,no_math);@+break;
+  case join: app_str("\\J");@+app_scrap(insert,no_math);@+break;
 @.\\J@>
-  case output_defs_code: app(force); app_str("\\ATH"); app(force);
+  case output_defs_code: app(force);@+app_str("\\ATH");@+app(force);
     app_scrap(insert,no_math);@+break;
 @.\\ATH@>
-  default: app(inserted); app(next_control);
+  default: app(inserted);@+app(next_control);
     app_scrap(insert,maybe_math);@+break;
 }
 
@@ -3299,7 +3333,7 @@
 possible to keep \.{CWEAVE} from outputting unusual |char| codes.
 
 @<Cases involving nonstandard...@>=
-case not_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
+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;
 @.\\Z@>
@@ -3419,12 +3453,14 @@
 token list; it also builds a new scrap if |scrapping==1|.
 
 @<Predec...@>=
-void app_cur_id();
+static void app_cur_id(boolean);@/
+static text_pointer C_translate(void);@/
+static void outer_parse(void);@/
 
 @ @c
-void
-app_cur_id(scrapping)
-boolean scrapping; /* are we making this into a scrap? */
+static void
+app_cur_id(@t\1\1@>
+boolean scrapping at t\2\2@>) /* 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 */
@@ -3447,8 +3483,8 @@
 unaffected by this translation process.
 
 @c
-text_pointer
-C_translate()
+static text_pointer
+C_translate(void)
 {
   text_pointer p; /* points to the translation */
   scrap_pointer save_base; /* holds original value of |scrap_base| */
@@ -3476,9 +3512,12 @@
 
 @d make_pb flags['e']
 
- at c
-void
-outer_parse() /* makes scraps from \CEE/ tokens and comments */
+@<Set init...@>=
+make_pb=true;
+
+@ @c
+static void
+outer_parse(void) /* makes scraps from \CEE/ tokens and comments */
 {
   int bal; /* brace level in comment */
   text_pointer p, q; /* partial comments */
@@ -3487,7 +3526,7 @@
       C_parse(ignore);
     else {
       boolean is_long_comment=(next_control==begin_comment);
-      @<Make sure that there is room for the new...@>;
+      @<Make sure that there is room for the new...@>@;
       app(cancel); app(inserted);
       if (is_long_comment) app_str("\\C{"@q}@>);
 @.\\C@>
@@ -3582,10 +3621,14 @@
 is called; it saves the old level of output and gets a new one going.
 The value of |cur_mode| is not changed.
 
- at c
-void
-push_level(p) /* suspends the current level */
-text_pointer p;
+@<Predecl...@>=
+static void push_level(text_pointer);@/
+static void pop_level(void);@/
+
+@ @c
+static void
+push_level(@t\1\1@> /* suspends the current level */
+text_pointer p at t\2\2@>)
 {
   if (stack_ptr==stack_end) overflow("stack");
   if (stack_ptr>stack) { /* save current state */
@@ -3603,8 +3646,8 @@
 called when |stack_ptr==1|.
 
 @c
-void
-pop_level()
+static void
+pop_level(void)
 {
   cur_end=(--stack_ptr)->end_field;
   cur_tok=stack_ptr->tok_field; cur_mode=stack_ptr->mode_field;
@@ -3624,9 +3667,14 @@
 @ @d res_word 0201 /* returned by |get_output| for reserved words */
 @d section_code 0200 /* returned by |get_output| for section names */
 
- at c
-eight_bits
-get_output() /* returns the next token of output */
+@<Predecl...@>=
+static eight_bits get_output(void);@/
+static void output_C(void);@/
+static void make_output(void);@/
+
+@ @c
+static eight_bits
+get_output(void) /* returns the next token of output */
 {
   sixteen_bits a; /* current item read from |tok_mem| */
   restart: while (cur_tok==cur_end) pop_level();
@@ -3643,7 +3691,7 @@
       default: return(identifier); /* |a==id_flag+cur_name| */
     }
   }
-  return(a);
+  return((eight_bits)a);
 }
 
 @ The real work associated with token output is done by |make_output|.
@@ -3662,8 +3710,8 @@
 @^recursion@>
 
 @c
-void
-output_C() /* outputs the current token list */
+static void
+output_C(void) /* outputs the current token list */
 {
   token_pointer save_tok_ptr;
   text_pointer save_text_ptr;
@@ -3684,17 +3732,14 @@
 
 @ Here is \.{CWEAVE}'s major output handler.
 
-@<Predecl...@>=
-void make_output();
-
-@ @c
-void
-make_output() /* outputs the equivalents of tokens */
+ at c
+static void
+make_output(void) /* outputs the equivalents of tokens */
 {
-  eight_bits a, /* current output byte */
+  eight_bits a=0, /* current output byte */
   b; /* next output byte */
   int c; /* count of |indent| and |outdent| tokens */
-  char scratch[longest_name]; /* scratch area for section names */
+  char scratch[longest_name+1]; /* scratch area for section names */
   char *k, *k_limit; /* indices into |scratch| */
   char *j; /* index into |buffer| */
   char *p; /* index into |byte_mem| */
@@ -3708,8 +3753,8 @@
     a=get_output();
     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 identifier: case res_word: @<Output an identifier@>@; break;
+      case section_code: @<Output a section name@>@; break;
       case math_rel: out_str("\\MRL{"@q}@>);
 @.\\MRL@>
       case noop: case inserted: break;
@@ -3721,11 +3766,11 @@
           if (a==indent) c++; else if (a==outdent) c--;
           else if (a==opt) a=get_output();
         }
-        @<Output saved |indent| or |outdent| tokens@>;
+        @<Output saved |indent| or |outdent| tokens@>@;
         goto reswitch;
       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;
+        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 */
@@ -3802,7 +3847,7 @@
     a=get_output();
     if (a==inserted) continue;
     if (a==cancel || a==big_cancel) {
-      @<Output saved |indent| or |outdent| tokens@>;
+      @<Output saved |indent| or |outdent| tokens@>@;
       goto reswitch; /* |cancel| overrides everything */
     }
     if ((a!=' ' && a<indent) || a==backup || a>big_force) {
@@ -3809,7 +3854,7 @@
       if (save_mode==outer) {
         if (out_ptr>out_buf+3 && strncmp(out_ptr-3,"\\Y\\B",4)==0)
           goto reswitch;
-        @<Output saved |indent| or |outdent| tokens@>;
+        @<Output saved |indent| or |outdent| tokens@>@;
         out('\\'); out(b-cancel+'0');
 @.\\5@>
 @.\\6@>
@@ -3860,7 +3905,7 @@
   out(':');
   if (an_output) out_str("\\.{"@q}@>);
 @.\\.@>
-  @<Output the text of the section name@>;
+  @<Output the text of the section name@>@;
   if (an_output) out_str(@q{@>" }");
   out_str("\\X");
 }
@@ -3872,7 +3917,7 @@
 cur_section_name=cur_name;
 while (k<k_limit) {
   b=*(k++);
-  if (b=='@@') @<Skip next character, give error if not `\.{@@}'@>;
+  if (b=='@@') @<Skip next character, give error if not `\.{@@}'@>@;
   if (an_output)
     switch (b) {
  case  ' ':case '\\':case '#':case '%':case '$':case '^':
@@ -3891,18 +3936,18 @@
 @.\\\_@>
  default: out(b);
     }
-  else if (b!='|') out(b)@;
+  else { if (b!='|') out(b)@;
   else {
-    @<Copy the \CEE/ text into the |buffer| array@>;
+    @<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...@>=
 if (*k++!='@@') {
-  printf("\n! Illegal control code in section name: <");
+  fputs("\n! Illegal control code in section name: <",stdout);
 @.Illegal control code...@>
   print_section_name(cur_section_name); printf("> "); mark_error;
 }
@@ -3917,7 +3962,7 @@
 j=limit+1; *j='|'; delim=0;
 while (1) {
   if (k>=k_limit) {
-    printf("\n! C text in section name didn't end: <");
+    fputs("\n! C text in section name didn't end: <",stdout);
 @.C text...didn't end@>
     print_section_name(cur_section_name); printf("> "); mark_error; break;
   }
@@ -3925,9 +3970,9 @@
   if (b=='@@' || (b=='\\' && delim!=0))
      @<Copy a quoted character into the buffer@>@;
   else {
-    if (b=='\'' || b=='"')
+    if (b=='\'' || b=='"') {
       if (delim==0) delim=b;
-      else if (delim==b) delim=0;
+      else if (delim==b) delim=0; }
     if (b!='|' || delim!=0) {
       if (j>buffer+long_buf_size-3) overflow("buffer");
       *(++j)=b;
@@ -3949,16 +3994,16 @@
 \.{CWEB} specifications.
 
 @<Predecl...@>=
-void phase_two();
+static void phase_two(void);@/
 
 @ @c
-void
-phase_two() {
-reset_input(); if (show_progress) printf("\nWriting the output file...");
+static void
+phase_two(void) {
+reset_input(); if (show_progress) fputs("\nWriting the output file...",stdout);
 @.Writing the output file...@>
 section_count=0; format_visible=1; copy_limbo();
 finish_line(); flush_buffer(out_buf,0,0); /* insert a blank line, it looks nice */
-while (!input_has_ended) @<Translate the current section@>;
+while (!input_has_ended) @<Translate the current section@>@;
 }
 
 @ The output file will contain the control sequence \.{\\Y} between non-null
@@ -3986,13 +4031,13 @@
 
 @ @<Translate the current section@>= {
   section_count++;
-  @<Output the code for the beginning of a new section@>;
+  @<Output the code for the beginning of a new section@>@;
   save_position;
-  @<Translate the \TEX/ part of the current section@>;
-  @<Translate the definition part of the current section@>;
-  @<Translate the \CEE/ part of the current section@>;
-  @<Show cross-references to this section@>;
-  @<Output the code for the end of a section@>;
+  @<Translate the \TEX/ part of the current section@>@;
+  @<Translate the definition part of the current section@>@;
+  @<Translate the \CEE/ part of the current section@>@;
+  @<Show cross-references to this section@>@;
+  @<Output the code for the end of a section@>@;
 }
 
 @ Sections beginning with the \.{CWEB} control sequence `\.{@@\ }' start in the
@@ -4056,7 +4101,7 @@
 while (next_control<=definition) { /* |format_code| or |definition| */
   init_stack;
   if (next_control==definition) @<Start a macro definition@>@;
-  else @<Start a format definition@>;
+  else @<Start a format definition@>@;
   outer_parse(); finish_C(format_visible); format_visible=1;
   doing_format=0;
 }
@@ -4072,12 +4117,12 @@
 \.{\\7} is replaced by the concluding \.{\\par} or by \.{\\Y\\par}.
 
 @<Predecl...@>=
-void finish_C();
+static void finish_C(boolean);@/
 
 @ @c
-void
-finish_C(visible) /* finishes a definition or a \CEE/ part */
-  boolean visible; /* nonzero if we should produce \TEX/ output */
+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 */
 {
   text_pointer p; /* translation of the scraps */
   if (visible) {
@@ -4085,13 +4130,15 @@
     p=translate();
 @.\\B@>
     app(tok_flag+(int)(p-tok_start)); make_output(); /* output the list */
-    if (out_ptr>out_buf+1)
-      if (*(out_ptr-1)=='\\')
+    if (out_ptr>out_buf+1) {
+      if (*(out_ptr-1)=='\\') {
 @.\\6@>
 @.\\7@>
 @.\\Y@>
         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;
@@ -4169,11 +4216,11 @@
   else {
     this_section=cur_section;
     @<Check that '=' or '==' follows this section name, and
-      emit the scraps to start the section definition@>;
+      emit the scraps to start the section definition@>@;
   }
   while  (next_control<=section_name) {
     outer_parse();
-    @<Emit the scrap for a section name if present@>;
+    @<Emit the scrap for a section name if present@>@;
   }
   finish_C(1);
 }
@@ -4196,8 +4243,8 @@
 if(cur_xref->num==file_flag) cur_xref=cur_xref->xlink;
 app_str("${}");
 if (cur_xref->num!=section_count+def_flag) {
-  app_str("\\mathrel+"); /*section name is multiply defined*/
-  this_section=name_dir; /*so we won't give cross-reference info here*/
+  app_str("\\mathrel+"); /* section name is multiply defined */
+  this_section=name_dir; /* so we won't give cross-reference info here */
 }
 app_str("\\E"); /* output an equivalence sign */
 @.\\E@>
@@ -4243,12 +4290,12 @@
 supply new definitions for the macros \.{\\A}, \.{\\As}, etc.
 
 @<Predecl...@>=
-void footnote();
+static void footnote(sixteen_bits);@/
 
 @ @c
-void
-footnote(flag) /* outputs section cross-references */
-sixteen_bits flag;
+static void
+footnote(@t\1\1@> /* outputs section cross-references */
+sixteen_bits flag at t\2\2@>)
 {
   xref_pointer q; /* cross-reference pointer variable */
   if (cur_xref->num<=flag) return;
@@ -4257,7 +4304,7 @@
 @.\\Q@>
 @.\\U@>
   out(flag==0? 'U': flag==cite_flag? 'Q': 'A');
-  @<Output all the section numbers on the reference list |cur_xref|@>;
+  @<Output all the section numbers on the reference list |cur_xref|@>@;
   out('.');
 }
 
@@ -4292,11 +4339,11 @@
 contents.
 
 @<Predecl...@>=
-void phase_three();
+static void phase_three(void);@/
 
 @ @c
-void
-phase_three() {
+static void
+phase_three(void) {
 if (no_xref) {
   finish_line();
   out_str("\\end");
@@ -4304,29 +4351,29 @@
   finish_line();
 }
 else {
-  phase=3; if (show_progress) printf("\nWriting the index...");
+  phase=3; if (show_progress) fputs("\nWriting the index...",stdout);
 @.Writing the index...@>
   finish_line();
-  if ((idx_file=fopen(idx_file_name,"w"))==NULL)
+  if ((idx_file=fopen(idx_file_name,"wb"))==NULL)
     fatal("! Cannot open index file ",idx_file_name);
 @.Cannot open index file@>
   if (change_exists) {
-    @<Tell about changed sections@>; finish_line(); finish_line();
+    @<Tell about changed sections@>@; finish_line(); finish_line();
   }
   out_str("\\inx"); finish_line();
 @.\\inx@>
   active_file=idx_file; /* change active file to the index file */
-  @<Do the first pass of sorting@>;
-  @<Sort and output the index@>;
+  @<Do the first pass of sorting@>@;
+  @<Sort and output the index@>@;
   finish_line(); fclose(active_file); /* finished with |idx_file| */
   active_file=tex_file; /* switch back to |tex_file| for a tic */
   out_str("\\fin"); finish_line();
 @.\\fin@>
-  if ((scn_file=fopen(scn_file_name,"w"))==NULL)
+  if ((scn_file=fopen(scn_file_name,"wb"))==NULL)
     fatal("! Cannot open section file ",scn_file_name);
 @.Cannot open section file@>
   active_file=scn_file; /* change active file to section listing file */
-  @<Output all the section names@>;
+  @<Output all the section names@>@;
   finish_line(); fclose(active_file); /* finished with |scn_file| */
   active_file=tex_file;
   if (group_found) out_str("\\con");@+else out_str("\\end");
@@ -4335,7 +4382,10 @@
   finish_line();
   fclose(active_file);
 }
-if (show_happiness) printf("\nDone.");
+if (show_happiness) {
+  if (show_progress) new_line;
+  fputs("Done.",stdout);
+}
 check_complete(); /* was all of the change file used? */
 }
 
@@ -4362,7 +4412,7 @@
 @ A left-to-right radix sorting method is used, since this makes it easy to
 adjust the collating sequence and since the running time will be at worst
 proportional to the total length of all entries in the index. We put the
-identifiers into 102 different lists based on their first characters.
+identifiers into different lists based on their first characters.
 (Uppercase letters are put into the same list as the corresponding lowercase
 letters, since we want to have `$t<\\{TeX}<\&{to}$'.) The
 list for character |c| begins at location |bucket[c]| and continues through
@@ -4378,12 +4428,12 @@
 
 @<Do the first pass...@>= {
 int c;
-for (c=0; c<=255; c++) bucket[c]=NULL;
+for (c=0; c<256; c++) bucket[c]=NULL;
 for (h=hash; h<=hash_end; h++) {
   next_name=*h;
   while (next_name) {
     cur_name=next_name; next_name=cur_name->link;
-    if (cur_name->xref!=(char*)xmem) {
+    if (cur_name->xref!=(void *)xmem) {
       c=(eight_bits)((cur_name->byte_start)[0]);
       if (xisupper(c)) c=tolower(c);
       blink[cur_name-name_dir]=bucket[c]; bucket[c]=cur_name;
@@ -4401,7 +4451,7 @@
 |k| characters of all entries on this list are known to be equal we have
 |depth[j]==k|.
 
-@ @<Rest of |trans_plus| union@>=
+@<Rest of |trans_plus| union@>=
 name_pointer Head;
 
 @ @d depth cat /* reclaims memory that is no longer needed for parsing */
@@ -4424,7 +4474,7 @@
 $|collate|[0]<|collate|[1]<\cdots<|collate|[100]$.
 
 @<Global...@>=
-eight_bits collate[102+128]; /* collation order */
+eight_bits collate[101+128]; /* collation order */
 @^high-bit character handling@>
 
 @ We use the order $\hbox{null}<\.\ <\hbox{other characters}<{}$\.\_${}<
@@ -4438,29 +4488,41 @@
 
 @<Set init...@>=
 collate[0]=0;
-strcpy(collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
+memcpy((char *)collate+1,
+  " \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17",16);
 /* 16 characters + 1 = 17 */
-strcpy(collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
+memcpy((char *)collate+17,
+  "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37",16);
 /* 16 characters + 17 = 33 */
-strcpy(collate+33,"!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
+memcpy((char *)collate+33,
+  "!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_",32);
 /* 32 characters + 33 = 65 */
-strcpy(collate+65,"abcdefghijklmnopqrstuvwxyz0123456789");
+memcpy((char *)collate+65,
+  "abcdefghijklmnopqrstuvwxyz0123456789",36);
 /* (26 + 10) characters + 65 = 101 */
-strcpy(collate+101,"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
+memcpy((char *)collate+101,
+  "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217",16);
 /* 16 characters + 101 = 117 */
-strcpy(collate+117,"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
+memcpy((char *)collate+117,
+  "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237",16);
 /* 16 characters + 117 = 133 */
-strcpy(collate+133,"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
+memcpy((char *)collate+133,
+  "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257",16);
 /* 16 characters + 133 = 149 */
-strcpy(collate+149,"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
+memcpy((char *)collate+149,
+  "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277",16);
 /* 16 characters + 149 = 165 */
-strcpy(collate+165,"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
+memcpy((char *)collate+165,
+  "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317",16);
 /* 16 characters + 165 = 181 */
-strcpy(collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
+memcpy((char *)collate+181,
+  "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337",16);
 /* 16 characters + 181 = 197 */
-strcpy(collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
+memcpy((char *)collate+197,
+  "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357",16);
 /* 16 characters + 197 = 213 */
-strcpy(collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+memcpy((char *)collate+213,
+  "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377",16);
 /* 16 characters + 213 = 229 */
 
 @ Procedure |unbucket| goes through the buckets and adds nonempty lists
@@ -4472,15 +4534,15 @@
 @d infinity 255 /* $\infty$ (approximately) */
 
 @<Predecl...@>=
-void  unbucket();
+static void unbucket(eight_bits);@/
 
 @ @c
-void
-unbucket(d) /* empties buckets having depth |d| */
-eight_bits d;
+static void
+unbucket(@t\1\1@> /* empties buckets having depth |d| */
+eight_bits d at t\2\2@>)
 {
   int c; /* index into |bucket|; cannot be a simple |char| because of sign
-    comparison below*/
+    comparison below */
   for (c=100+128; c>= 0; c--) if (bucket[collate[c]]) {
 @^high-bit character handling@>
     if (sort_ptr>=scrap_info_end) overflow("sorting");
@@ -4498,7 +4560,7 @@
   cur_depth=sort_ptr->depth;
   if (blink[sort_ptr->head-name_dir]==0 || cur_depth==infinity)
     @<Output index entries for the list at |sort_ptr|@>@;
-  else @<Split the list at |sort_ptr| into further lists@>;
+  else @<Split the list at |sort_ptr| into further lists@>@;
 }
 
 @ @<Split the list...@>= {
@@ -4522,8 +4584,8 @@
   do {
     out_str("\\I");
 @.\\I@>
-    @<Output the name at |cur_name|@>;
-    @<Output the cross-references at |cur_name|@>;
+    @<Output the name at |cur_name|@>@;
+    @<Output the cross-references at |cur_name|@>@;
     cur_name=blink[cur_name-name_dir];
   } while (cur_name);
   --sort_ptr;
@@ -4563,7 +4625,7 @@
 `\.{\\[}$\,\ldots\,$\.]'.
 
 @<Output the cross-references...@>=
-@<Invert the cross-reference list at |cur_name|, making |cur_xref| the head@>;
+@<Invert the cross-reference list at |cur_name|, making |cur_xref| the head@>@;
 do {
   out_str(", "); cur_val=cur_xref->num;
   if (cur_val<def_flag) out_section(cur_val);
@@ -4592,12 +4654,12 @@
 @^recursion@>
 
 @<Predecl...@>=
-void section_print();
+static void section_print(name_pointer);@/
 
 @ @c
-void
-section_print(p) /* print all section names in subtree |p| */
-name_pointer p;
+static void
+section_print(@t\1\1@> /* print all section names in subtree |p| */
+name_pointer p at t\2\2@>)
 {
   if (p) {
     section_print(p->llink); out_str("\\I");
@@ -4611,34 +4673,34 @@
   }
 }
 
-@ @<Output all the section names@>=section_print(root)
+@ @<Output all the section names@>=section_print(root);
 
-@ Because on some systems the difference between two pointers is a |long|
+@ Because on some systems the difference between two pointers is a |ptrdiff_t|
 rather than an |int|, we use \.{\%ld} to print these quantities.
 
 @c
 void
-print_stats() {
-  printf("\nMemory usage statistics:\n");
+print_stats(void) {
+  puts("\nMemory usage statistics:");
 @.Memory usage statistics:@>
   printf("%ld names (out of %ld)\n",
-            (long)(name_ptr-name_dir),(long)max_names);
+            (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
   printf("%ld cross-references (out of %ld)\n",
-            (long)(xref_ptr-xmem),(long)max_refs);
+            (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
   printf("%ld bytes (out of %ld)\n",
-            (long)(byte_ptr-byte_mem),(long)max_bytes);
-  printf("Parsing:\n");
+            (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
+  puts("Parsing:");
   printf("%ld scraps (out of %ld)\n",
-            (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
   printf("%ld texts (out of %ld)\n",
-            (long)(max_text_ptr-tok_start),(long)max_texts);
+            (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
   printf("%ld tokens (out of %ld)\n",
-            (long)(max_tok_ptr-tok_mem),(long)max_toks);
+            (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
   printf("%ld levels (out of %ld)\n",
-            (long)(max_stack_ptr-stack),(long)stack_size);
-  printf("Sorting:\n");
+            (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
+  puts("Sorting:");
   printf("%ld levels (out of %ld)\n",
-            (long)(max_sort_ptr-scrap_info),(long)max_scraps);
+            (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
 }
 
 @** Index.

Modified: trunk/Build/source/texk/web2c/cwebdir/cweb.1
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweb.1	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cweb.1	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,4 +1,4 @@
-.TH CWEB 1L 2002-Apr-13
+.TH CWEB 1 2018-Dec-16
 .
 .SH NAME
 ctangle, cweave \- translate CWEB to C and/or TeX
@@ -10,7 +10,7 @@
 .B \-bhp
 ] [
 .B +s
-] webfile[.w] [changefile[.ch]] [outputfile[.c]]
+] webfile[.w] [{changefile[.ch]|-} [outputfile[.c]]]
 .br
 .B cweave
 [
@@ -17,7 +17,7 @@
 .B \-befhpx
 ] [
 .B +s
-] webfile[.w] [changefile[.ch]] [outputfile[.tex]]
+] webfile[.w] [{changefile[.ch]|-} [outputfile[.tex]]]
 .ad
 .
 .SH DESCRIPTION
@@ -78,8 +78,7 @@
 .PP
 The
 .B +s
-option prints statistics about memory usage at the end of a run
-(assuming that the programs have been compiled with the -DSTAT switch).
+option prints statistics about memory usage at the end of a run.
 .PP
 There are three other options applicable to
 .I cweave
@@ -99,20 +98,15 @@
 means omit the index and table of contents.
 .
 .SH FILES
+The location of the files mentioned below varies from system to system.
 .TP
-/usr/local/lib/tex/inputs/cwebmac.tex
+cwebmac.tex
 TeX macros used by cweave output.
 .TP
-/usr/local/src/cweb/cwebman.tex
+cwebman.tex
 The user manual.
 .TP
-/usr/local/src/cweb/examples/wc.w
-An introductory example.
-.TP
-/usr/local/src/cweb/examples/wmerge.w
-Patch program based on CWEB-style change files.
-.TP
-/usr/local/lib/cweb
+/usr/lib/cweb
 Directory for cweb "include" files.
 .
 .SH "SEE ALSO"

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,13 +1,14 @@
 % standard macros for CWEB listings (in addition to plain.tex)
-% Version 3.70 --- July 2017
+% Version 4.0 --- February 2021
 \ifx\renewenvironment\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CWEB3.70}
-\chardef\cwebversion=3 \chardef\cwebrevision=70
+\xdef\fmtversion{\fmtversion+CWEB4.0}
+\chardef\cwebversion=4 \chardef\cwebrevision=0
 \newif\ifpdf
 \ifx\pdf+\pdftrue\fi
 % Uncomment the following line if you want PDF goodies to be the default
 %\ifx\pdf-\else\pdftrue\fi
 \def\pdflinkcolor{0 0 1} % the RGB values for hyperlink color
+\ifx\undefined\XeTeXrevision\else\pdftrue\fi % XeTeX produces PDF output
 \newif\ifpdftex
 \ifx\pdfoutput\undefined \pdftexfalse \else\ifnum\pdfoutput=0 \pdftexfalse
 %\else \pdftextrue \pdfoutput=1 \input pdfcolor \let\setcolor\pdfsetcolor \fi\fi

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,25 +1,25 @@
- at q Changes for CWEB in TeX Live from numerous contributors. @>
- at q This file is in the Public Domain. @>
+ at q Changes for CWEB in TeX Live from numerous contributors.              @>
+ at q This file is in the Public Domain.                                    @>
 
- at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
- at q were merged with the set of change files of the CWEBbin project; @>
- at q see https://github.com/ascherer/cwebbin for the original parts. @>
+ at q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber   @>
+ at q were merged with the set of change files of the CWEBbin project;      @>
+ at q see https://github.com/ascherer/cwebbin for the original parts.       @>
 
- at q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
- at q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
- at q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
- at q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
- at q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
- at q with the 'tie' processor and is used as a monolithic changefile for @>
- at q {common,ctangle,cweave}.w in TeX Live. @>
+ at q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch    @>
+ at q has been created from the elaborate set of change files               @>
+ at q {comm,ctang,cweav,cwebman}-patch.ch,                                  @>
+ at q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch,     @>
+ at q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and        @>
+ at q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+ at q and is used as a monolithic changefile for {common,ctangle,cweave}.w  @>
+ at q and cwebman.tex in TeX Live.                                          @>
 
- at q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+ at q Please send comments, suggestions, etc. to tex-k@@tug.org.            @>
 
 @x
 \input cwebmac
 \acrofalse\pdffalse\pdftexfalse
 @y
-\ifx\undefined\XeTeXrevision\else\let\pdf+\fi % XeTeX produces PDF output
 \input cwebmac
 @z
 
@@ -93,41 +93,58 @@
 @z
 
 @x
-\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 3.64)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.0)}
 @y
 \def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}}
-\def\runninghead{{\tentt CWEB} USER MANUAL (3.64 [\TeX~Live])}
+\def\runninghead{{\tentt CWEB} USER MANUAL (4.0 [\TeX~Live])}
 @z
 
 @x
-\vskip 18pt\centerline{(Version 3.64 --- February 2002)}
+\vskip 18pt\centerline{(Version 4.0 --- February 2021)}
 @y
-\vskip 18pt\centerline{(Version 3.64 --- February 2002)%
-\footnote*{This document describes the extended \.{CWEB} (3.64 [\TeX~Live]).}}
+\vskip 18pt\centerline{(Version 4.0 --- February 2021)%
+\footnote*{This document describes the extended \.{CWEB} (4.0 [\TeX~Live]).}}
 @z
 
 @x
-should be sent to Levy (\.{levy at math.berkeley.edu}).
+Internet page \.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}
 @y
-should be sent to Levy (\.{levy at math.berkeley.edu}).%
-\cwebfootnote{Or rather to the ``\TeX~Live''-related mailing list
-\.{tex-k at tug.org}.}
+Internet page
+\pdfURL{\.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}}%
+          {http://www-cs-faculty.stanford.edu/\TILDE/knuth/cweb.html}
 @z
 
 @x
-email address in a \.{CWEB} file (e.g., \.{levy@@math.berkeley.edu}).
+\.{https://github.com/ascherer/cweb} with the really current news.
 @y
-email address in a \.{CWEB} file (e.g., \.{levy@@math.berkeley.edu}%
-\cwebfootnote{Or rather \.{tex-k@@tug.org}.}).
+\pdfURL{\.{https://github.com/ascherer/cweb}}%
+          {https://github.com/ascherer/cweb}
+with the really current news.
 @z
 
 @x
+should be sent to the \TeX-related mailing list \.{tex-k at tug.org}.
+ at y
+should be sent to the \TeX-related mailing list
+\pdfURL{\.{tex-k at tug.org}}%
+   {mailto:tex-k at tug.org}.
+ at z
+
+ at x
+email address in a \.{CWEB} file (e.g., \.{tex-k@@tug.org}).
+ at y
+email address in a \.{CWEB} file (e.g.,
+\pdfURL{\.{tex-k@@tug.org}}%
+   {mailto:tex-k at tug.org}).
+ at z
+
+ at x
 it cannot find them in the current directory.
 @y
 it cannot find them in the current directory.%
 \cwebfootnote{\acrofalse In this extended implementation, if an \.{@i}nclude
 file can not be found in the current directory, \.{CWEB} will use the
-conventions of the \Kpathsea/ library as outlined in section~\X90:File lookup
+conventions of the \Kpathsea/ library as outlined in section~\X91:File lookup
 with \Kpathsea/\X~of \pdfURL{appendix~D}{common-changes.pdf} to look for it.
 % FIXME
 (This is true for any other input or change file lookup.)}
@@ -141,7 +158,7 @@
 to the list:
 \hfil\smallskip
 \option d Set the debugging variable \\{kpathsea\_debug} to the numeric
-value $N\in[0,127]$ of this option.  See section~92 % FIXME
+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
@@ -173,9 +190,9 @@
 @z
 
 @x
-`\.{main(argc,argv)}'.
+`$\\{main}(\\{argc},\39\\{argv}{}$)'.
 @y
-`\.{main(argc,argv)}'.
+`$\\{main}(\\{argc},\39\\{argv}{}$)'.
 \ifx\pdf+\pdftrue\fi
 \ifx\pdfoutput\undefined \pdftexfalse \else\ifnum\pdfoutput=0 \pdftexfalse
 \else \pdftextrue \pdfoutput=1\fi\fi
@@ -183,20 +200,23 @@
 @z
 
 @x
-saying `\.{pdftex}~\.{cob}'.
+\section Hypertext and hyperdocumentation.
 @y
-saying `\.{pdftex}~\.{cob}'.%
-\cwebfootnote{A third way to create PDF output from \.{CWEB} input is the
-use of \.{XeTeX}, which uses `\.{[x]dvipdfm[x]}' in the background, but the
-``plain \TeX'' macros from \.{cwebmac.tex} otherwise.  The process works with
-a small trick in the first step:
-$$\vbox{\halign{\.{#}\hfil\cr
-cweave -lp+ cob\cr
-xetex cob\cr
-acroread cob.pdf\cr}}$$}
+\vfill\eject
+\section Hypertext and hyperdocumentation.
 @z
 
 @x
+the program sources at \.{ftp://ftp.cs.stanford.edu/pub/ctwill}.
+ at y
+the program sources at
+\pdfURL{\.{ftp://ftp.cs.stanford.edu/pub/ctwill}}%
+          {ftp://ftp.cs.stanford.edu/pub/ctwill}.%
+\cwebfootnote{\TeX~Live comes with an up-to-date \.{ctwill} executable -- and
+its associated helpers -- out of the box.}
+ at z
+
+ at x
 As an example of a real program written in \.{CWEB}, Appendix~A
 @y
 As an example of a real program written in \.{CWEB}, \Appendix A
@@ -219,8 +239,8 @@
 appendices \pdfURL{D}{common.pdf}, \pdfURL{E}{ctangle.pdf},
 and~\pdfURL{F}{cweave.pdf}, which exhibit the complete source code for
 \.{CTANGLE} and \.{CWEAVE}.%
-\cwebfootnote{Actually, \pdfURL{appendix~D}{common.pdf} contains the source
-code for \.{COMMON}, and the additional \pdfURL{appendix~G}{ctwill.pdf}
+\cwebfootnote{Actually, \pdfURL{Appendix~D}{common.pdf} contains the source
+code for \.{COMMON}, and the additional \pdfURL{Appendix~G}{ctwill.pdf}
 exhibits the source code for \.{CTWILL}, which is based on \.{CWEAVE}.}
 
 \eject\titletrue
@@ -235,6 +255,13 @@
 @z
 
 @x
+generated sections 27--31 of the file \.{common.w}, which contains
+ at y
+generated sections 27--31 of the file
+\pdfURL{\.{common.w}}{common.pdf}, which contains
+ at z
+
+ at x
 \def\runninghead{APPENDIX A  --- TRANSLATION BY {\tentt CTANGLE}}
 @y
 \def\runninghead{APPENDIX A  --- TRANSLATION BY {\tentt CTANGLE}}
@@ -252,6 +279,8 @@
 \def\runninghead{APPENDIX A --- FINAL DOCUMENT}
 
 And here's what the same excerpt looks like when typeset.
+(Can you spot the typographical nicety used in the \.{CWEB} code?)
+\let\K=\leftarrow
 @y
 \def\runninghead{APPENDIX A --- FINAL DOCUMENT}
 \subsection Final document.
@@ -258,6 +287,9 @@
 
 \acrofalse\pdftexfalse\pdffalse
 And here's what the same excerpt looks like when typeset.
+(Can you spot the typographical niceties used in the \.{CWEB} code?)
+\let\K=\leftarrow
+\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
 @z
 
 @x
@@ -271,9 +303,9 @@
 @z
 
 @x
-  \.{ { }\\vskip 15pt \\centerline\{(Version 3.64)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.0)\}{ }\\vfill\}}\cr}$$
 @y
-  \.{ { }\\vskip 15pt \\centerline\{(Version 3.64)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.0)\}{ }\\vfill\}}\cr}$$
 @z
 
 @x
@@ -285,14 +317,9 @@
 @z
 
 @x
-or the \CEE/ comments of a \.{CWEB} file:
+\point 20. Furthermore, group titles can be converted to an arbitrary
 @y
-or the \CEE/ comments of a \.{CWEB} file:%
-\cwebfootnote{Be careful to make that $$\vbox{\halign{\.{#}\hfil\cr
-You can send email to
- \\pdfURL\{the author\}\{mailto:andreas\\UNDER/github@@freenet.de\}\cr
-or visit
- \\pdfURL\{his home page\}\{https://github.com/ascherer\}\cr}}$$ in
-the $21^{\rm st}$ century.}
+\vfill\eject
+\point 20. Furthermore, group titles can be converted to an arbitrary
 @z
 

Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman.tex	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman.tex	2021-02-07 11:02:17 UTC (rev 57658)
@@ -36,7 +36,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 3.64)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.0)}
 
 % This verbatim mode assumes that ! marks are !! in the text being copied.
 \def\verbatim{\begingroup
@@ -50,7 +50,7 @@
 \null\vfill
 \centerline{\titlefont The {\ttitlefont CWEB} System of
     Structured Documentation}
-\vskip 18pt\centerline{(Version 3.64 --- February 2002)}
+\vskip 18pt\centerline{(Version 4.0 --- February 2021)}
 \vskip 24pt
 \centerline{\authorfont Donald E. Knuth and Silvio Levy}
 \vfill
@@ -87,6 +87,10 @@
 Internet page \.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}
 contains current info about \.{CWEB} and related topics.
 
+\smallskip\noindent
+From there you can also reach the \.{CWEB} development page
+\.{https://github.com/ascherer/cweb} with the really current news.
+
 \pageno=0 \titletrue\eject
 
 \titletrue
@@ -103,7 +107,7 @@
 has been revised and enhanced in various ways, by both Knuth and Levy.
 We now believe that its evolution is near an end; however, bug
 reports, suggestions and comments are still welcome, and
-should be sent to Levy (\.{levy at math.berkeley.edu}).
+should be sent to the \TeX-related mailing list \.{tex-k at tug.org}.
 
 Readers who are familiar with Knuth's memo ``The \.{WEB} System of Structured
 Documentation'' will be able
@@ -521,7 +525,7 @@
 \@@ [LTMCrc] A double \.@ denotes the single character `\.@'. This is
 the only control code that is legal everywhere.
 Note that you must use this convention if you are giving an internet
-email address in a \.{CWEB} file (e.g., \.{levy@@math.berkeley.edu}).
+email address in a \.{CWEB} file (e.g., \.{tex-k@@tug.org}).
 
 \subsec
 Here are the codes that introduce the \TEX/ part of a section.
@@ -1151,6 +1155,8 @@
 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
+`\.{xetex}~\.{cob}'.
 
 A more elaborate system called \.{CTWILL}, which extends the usual cross
 references of \.{CWEAVE} by preparing links from the uses of identifiers
@@ -1184,17 +1190,16 @@
 
 This appendix consists
 of four listings.  The first shows the \.{CWEB} input that
-generated sections 12--15 of the file \.{common.w}, which contains
+generated sections 27--31 of the file \.{common.w}, which contains
 routines common to \.{CWEAVE} and \.{CTANGLE}.
 Note that some of the lines are indented to show the program structure;
 the indentation is ignored by \.{CWEAVE} and \.{CTANGLE}, but users find
 that \.{CWEB} files are quite readable if they have some such indentation.
 
-The second and third listings
-show corresponding parts
-of the \CEE/ code output by \.{CTANGLE} and of
-the corresponding \TEX/ code output by \.{CWEAVE}, when run on \.{common.w}.
-The fourth listing shows how that output looks when printed out.
+The second and third listings show corresponding parts of
+the \CEE/ code output by \.{CTANGLE} and of
+the \TEX/ code output by \.{CWEAVE}, when run on \.{common.w}.
+The fourth listing shows how that output looks in print.
 
 \vskip 6pt
 \begingroup \def\tt{\eighttt} \baselineskip9pt
@@ -1206,14 +1211,17 @@
 the change file is exhausted. This procedure is called only when
 |changing| is 1; hence error messages will be reported correctly.
 
- at c
-void
-prime_the_change_buffer()
+@<Predecl...@>=
+static void prime_the_change_buffer(void);@/
+
+@ @c
+static void
+prime_the_change_buffer(void)
 {
   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@>;
-  @<Skip to the next nonblank line; |return| if end of file@>;
-  @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>;
+  @<Skip over comment lines in the change file; |return| if end of file@>@;
+  @<Skip to the next nonblank line; |return| if end of file@>@;
+  @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>@;
 }
 
 @ While looking for a line that begins with \.{@@x} in the change file, we
@@ -1226,7 +1234,7 @@
   if (!!input_ln(change_file)) return;
   if (limit<buffer+2) continue;
   if (buffer[0]!!='@@') continue;
-  if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
+  if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
   if (buffer[1]=='x') break;
   if (buffer[1]=='y' || buffer[1]=='z' || buffer[1]=='i') {
     loc=buffer+2;
@@ -1249,8 +1257,8 @@
 
 @ @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>=
 {
-  change_limit=change_buffer-buffer+limit;
-  strncpy(change_buffer,buffer,limit-buffer+1);
+  change_limit=change_buffer+(ptrdiff_t)(limit-buffer);
+  strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
 }
 
 !endgroup
@@ -1260,21 +1268,21 @@
 \def\runninghead{APPENDIX A  --- TRANSLATION BY {\tentt CTANGLE}}
 
 Here's the portion of the \CEE/ code generated by \.{CTANGLE} that corresponds
-to the source on the preceding page.  Notice that sections~13, 14 and~15
-have been tangled into section~12.
+to the source on the preceding page.  Notice that sections~29, 30 and~31
+have been tangled into section~28.
 
 \vskip6pt
 \begingroup \def\tt{\eighttt} \baselineskip9pt
 \verbatim
-/*:9*//*12:*/
-#line 247 "common.w"
+/*:24*//*28:*/
+#line 236 "common.w"
 
-void
-prime_the_change_buffer()
+static void
+prime_the_change_buffer(void)
 {
 change_limit= change_buffer;
-/*13:*/
-#line 261 "common.w"
+/*29:*/
+#line 250 "common.w"
 
 while(1){
 change_line++;
@@ -1281,7 +1289,7 @@
 if(!!input_ln(change_file))return;
 if(limit<buffer+2)continue;
 if(buffer[0]!!='@')continue;
-if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
+if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
 if(buffer[1]=='x')break;
 if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
 loc= buffer+2;
@@ -1290,12 +1298,12 @@
 }
 }
 
-/*:13*/
-#line 252 "common.w"
-;
-/*14:*/
-#line 278 "common.w"
+/*:29*/
+#line 241 "common.w"
 
+/*30:*/
+#line 267 "common.w"
+
 do{
 change_line++;
 if(!!input_ln(change_file)){
@@ -1305,23 +1313,23 @@
 }
 }while(limit==buffer);
 
-/*:14*/
-#line 253 "common.w"
-;
-/*15:*/
-#line 288 "common.w"
+/*:30*/
+#line 242 "common.w"
 
+/*31:*/
+#line 277 "common.w"
+
 {
-change_limit= change_buffer-buffer+limit;
-strncpy(change_buffer,buffer,limit-buffer+1);
+change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
+strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
 }
 
-/*:15*/
-#line 254 "common.w"
-;
+/*:31*/
+#line 243 "common.w"
+
 }
 
-/*:12*//*16:*/
+/*:28*//*33:*/
 !endgroup
 \endgroup
 \vfill\eject
@@ -1333,31 +1341,35 @@
 \vskip6pt
 \begingroup \def\tt{\eighttt} \baselineskip9pt
 \verbatim
-\M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
+\M{27}Procedure \PB{\\{prime\_the\_change\_buffer}}
 sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
 Since blank lines in the change file are not used for matching, we have
 \PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
 the change file is exhausted. This procedure is called only when
 \PB{\\{changing}} is 1; hence error messages will be reported correctly.
-!vskip-.5!baselineskip
-\Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
+
+\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
 ${}\{{}$\1\6
 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
 change file ends }\6
-\X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
-\X;\6
-\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
-\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
-\PB{\\{change\_limit}}\X;\6
+\X29:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
+\X\6
+\X30:Skip to the next nonblank line; \PB{\&{return}} if end of file\X\6
+\X31:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
+\PB{\\{change\_limit}}\X\6
 \4${}\}{}$\2\par
 \fi
-!vskip-.5!baselineskip
-\M{13}While looking for a line that begins with \.{@x} in the change file, we
+
+\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
 up).
-!vskip-.5!baselineskip
-\Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
+
+\Y\B\4\X29:Skip over comment lines in the change file; \PB{\&{return}} if end
 of file\X${}\E{}$\6
 \&{while} (\T{1})\5
 ${}\{{}$\1\6
@@ -1369,7 +1381,7 @@
 \&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
 \&{continue};\2\6
 \&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
-${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
+${}\\{buffer}[\T{1}]\K\\{tolower}{}$((\&{eight\_bits}) \\{buffer}[\T{1}]);\2\6
 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
 \&{break};\2\6
 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
@@ -1379,11 +1391,11 @@
 \\{err\_print}(\.{"!!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
 \4${}\}{}$\2\6
 \4${}\}{}$\2\par
-\U12.\fi
-!vskip-.5!baselineskip
-\M{14}Here we are looking at lines following the \.{@x}.
-!vskip-.5!baselineskip
-\Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
+\U28.\fi
+
+\M{30}Here we are looking at lines following the \.{@x}.
+
+\Y\B\4\X30:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
 \E{}$\6
 \&{do}\5
 ${}\{{}$\1\6
@@ -1395,25 +1407,20 @@
 \4${}\}{}$\2\6
 \4${}\}{}$\2\5
 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U12.\fi
-!vskip-.5!baselineskip
-\M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
-and \PB{\\{change\_limit}}\X${}\E{}$\6
-${}\{{}$\1\6
-${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
-${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
-\T{1});{}$\6
-\4${}\}{}$\2\par
-\Us12\ET16.\fi
+\U28.\fi
 !endgroup
 \endgroup
+\medskip
+(Code for section 31 omitted for space reasons.)
 \vfil\eject
 
 \def\runninghead{APPENDIX A --- FINAL DOCUMENT}
 
 And here's what the same excerpt looks like when typeset.
+(Can you spot the typographical nicety used in the \.{CWEB} code?)
+\let\K=\leftarrow
 
-\M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
+\M{27}Procedure \PB{\\{prime\_the\_change\_buffer}}
 sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
 Since blank lines in the change file are not used for matching, we have
 \PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
@@ -1420,23 +1427,28 @@
 the change file is exhausted. This procedure is called only when
 \PB{\\{changing}} is 1; hence error messages will be reported correctly.
 
-\Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
+\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
 ${}\{{}$\1\6
 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
 change file ends }\6
-\X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
-\X;\6
-\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
-\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
-\PB{\\{change\_limit}}\X;\6
+\X29:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
+\X\6
+\X30:Skip to the next nonblank line; \PB{\&{return}} if end of file\X\6
+\X31:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
+\PB{\\{change\_limit}}\X\6
 \4${}\}{}$\2\par
 \fi
 
-\M{13}While looking for a line that begins with \.{@x} in the change file, we
+\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 up).
+\.{@z}, or \.{@i} (which would probably mean that the change file is fouled
+up).
 
-\Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
+\Y\B\4\X29:Skip over comment lines in the change file; \PB{\&{return}} if end
 of file\X${}\E{}$\6
 \&{while} (\T{1})\5
 ${}\{{}$\1\6
@@ -1448,7 +1460,7 @@
 \&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
 \&{continue};\2\6
 \&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
-${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
+${}\\{buffer}[\T{1}]\K\\{tolower}{}$((\&{eight\_bits}) \\{buffer}[\T{1}]);\2\6
 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
 \&{break};\2\6
 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
@@ -1458,11 +1470,11 @@
 \\{err\_print}(\.{"!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
 \4${}\}{}$\2\6
 \4${}\}{}$\2\par
-\U12.\fi
+\U28.\fi
 
-\M{14}Here we are looking at lines following the \.{@x}.
+\M{30}Here we are looking at lines following the \.{@x}.
 
-\Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
+\Y\B\4\X30:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
 \E{}$\6
 \&{do}\5
 ${}\{{}$\1\6
@@ -1474,16 +1486,17 @@
 \4${}\}{}$\2\6
 \4${}\}{}$\2\5
 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U12.\fi
+\U28.\fi
 
-\M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
+\M{31}\B\X31:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
 and \PB{\\{change\_limit}}\X${}\E{}$\6
 ${}\{{}$\1\6
-${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
-${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
-\T{1});{}$\6
+${}\\{change\_limit}\K\\{change\_buffer}+(\&{ptrdiff\_t})(\\{limit}-%
+\\{buffer});{}$\6
+${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39(\&{size\_t})(\\{limit}-%
+\\{buffer}+\T{1}));{}$\6
 \4${}\}{}$\2\par
-\Us12\ET16.\fi
+\Us28\ET33.\fi
 
 \vfil\eject\titletrue
 \rightskip=0pt % get out of C mode (cf. \B)
@@ -1579,7 +1592,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 3.64)\}{ }\\vfill\}}\cr}$$
+  \.{ { }\\vskip 15pt \\centerline\{(Version 4.0)\}{ }\\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.
@@ -1704,9 +1717,8 @@
 or the \CEE/ comments of a \.{CWEB} file:
 $$\vbox{\halign{\.{#}\hfil\cr
 You can send email to
- \\pdfURL\{the author\}\{mailto:andreas.scherer@@pobox.com\}\cr
-or visit \\pdfURL\{his home page\}\{http://www.pobox.com/%
-       \\TILDE/scherer\}.\cr}}$$
+ \\pdfURL\{the author\}\{mailto:andreas\\UNDER/github@@freenet.de\}\cr
+or visit \\pdfURL\{his home page\}\{https://github.com/ascherer\}\cr}}$$
 In a {\mc PDF} document, the first argument will appear in blue as
 clickable text; the Acrobat reader, if correctly configured, will then
 redirect those links to the user's browser and open either the

Modified: trunk/Build/source/texk/web2c/cwebdir/examples/wmerge.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/examples/wmerge.w	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/examples/wmerge.w	2021-02-07 11:02:17 UTC (rev 57658)
@@ -85,7 +85,7 @@
 |FILE| is almost as common as |int|); indeed, \.{CWEAVE} knows all
 the types of the ISO standard \CEE/ library. But
 if you're using other types like {\bf caddr\_t},
-@:caddr_t}{\bf caddr_t@>
+@:caddr_t}{\bf caddr\_t@>
 which is defined in \.{/usr/include/sys/types.h}, you should let
 \.{WEAVE} know that this is a type, either by including the \.{.h} file
 at \.{WEB} time (saying \.{@@i /usr/include/sys/types.h}), or by

Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2019 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2019.
+# Andreas Scherer <https://ascherer.github.io>, 2021.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2019\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-15 09:55+0100\n"
+"POT-Creation-Date: 2021-02-06 15:43+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"
@@ -17,31 +17,31 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: comm-texlive.ch:494
+#: comm-texlive.ch:531
 #, c-format
-msgid "%s: Need one to three file arguments.\n"
+msgid ""
+"\n"
+"Email bug reports to %s.\n"
 msgstr ""
 
-#: comm-texlive.ch:495
+#: comm-texlive.ch:511
 #, c-format
-msgid "Try `%s --help' for more information.\n"
+msgid "%s: Need one to three file arguments.\n"
 msgstr ""
 
-#: comm-texlive.ch:514
-#, c-format
-msgid ""
-"\n"
-"Email bug reports to %s.\n"
+#: ctang-texlive.ch:39
+msgid "This is CTANGLE, Version 4.0"
 msgstr ""
 
-#: ctang-texlive.ch:29
-msgid "This is CTANGLE, Version 3.64"
+#: ctwill-texlive.ch:39
+msgid "This is CTWILL, Version 4.0"
 msgstr ""
 
-#: cweav-texlive.ch:29
-msgid "This is CWEAVE, Version 3.64"
+#: cweav-texlive.ch:39
+msgid "This is CWEAVE, Version 4.0"
 msgstr ""
 
-#: ctwill-texlive.ch:29
-msgid "This is CTWILL, Version 3.64"
+#: comm-texlive.ch:512
+#, c-format
+msgid "Try `%s --help' for more information.\n"
 msgstr ""

Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin).
-# Copyright (C) 2019 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2019.
+# Andreas Scherer <https://ascherer/github.io>, 2021.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2019\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-18 16:57+0100\n"
+"POT-Creation-Date: 2021-02-06 15:25+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"
@@ -17,7 +17,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: comm-i18n.ch:182
+#: comm-i18n.ch:176
 msgid ""
 "\n"
 "! Ambiguous prefix: matches <"
@@ -35,7 +35,7 @@
 "! Illegal control code in section name: <"
 msgstr ""
 
-#: cweav-i18n.ch:157
+#: cweav-i18n.ch:159
 #, c-format
 msgid ""
 "\n"
@@ -42,25 +42,25 @@
 "! Line had to be broken (output l. %d):\n"
 msgstr ""
 
-#: cweav-i18n.ch:141
+#: cweav-i18n.ch:142
 msgid ""
 "\n"
 "! Never defined: <"
 msgstr ""
 
-#: cweav-i18n.ch:148
+#: cweav-i18n.ch:150
 msgid ""
 "\n"
 "! Never used: <"
 msgstr ""
 
-#: comm-i18n.ch:202
+#: comm-i18n.ch:196
 msgid ""
 "\n"
 "! New name extends <"
 msgstr ""
 
-#: comm-i18n.ch:196
+#: comm-i18n.ch:190
 msgid ""
 "\n"
 "! New name is a prefix of <"
@@ -78,19 +78,19 @@
 "! Not present: <"
 msgstr ""
 
-#: comm-i18n.ch:208
+#: comm-i18n.ch:202
 msgid ""
 "\n"
 "! Section name incompatible with <"
 msgstr ""
 
-#: ctang-i18n.ch:167 cweav-i18n.ch:67
+#: ctang-i18n.ch:173 cweav-i18n.ch:67
 msgid ""
 "\n"
 "! Section name too long: "
 msgstr ""
 
-#: comm-i18n.ch:254
+#: comm-i18n.ch:248
 #, c-format
 msgid ""
 "\n"
@@ -97,7 +97,7 @@
 "! Sorry, %s capacity exceeded"
 msgstr ""
 
-#: ctang-i18n.ch:125 cweav-i18n.ch:45
+#: ctang-i18n.ch:131 cweav-i18n.ch:45
 msgid ""
 "\n"
 "! String too long: "
@@ -110,7 +110,7 @@
 "Irreducible scrap sequence in section %d:"
 msgstr ""
 
-#: ctang-i18n.ch:292 cweav-i18n.ch:431
+#: ctang-i18n.ch:300 cweav-i18n.ch:430
 msgid ""
 "\n"
 "Memory usage statistics:"
@@ -148,23 +148,23 @@
 "Writing the output files:"
 msgstr ""
 
-#: ctang-i18n.ch:217
+#: ctang-i18n.ch:225
 msgid "! @d, @f and @c are ignored in C text"
 msgstr ""
 
-#: comm-i18n.ch:60
+#: comm-i18n.ch:56
 msgid "! CWEB file ended during a change"
 msgstr ""
 
-#: cweav-twill.ch:1033
+#: cweav-twill.ch:1029
 msgid "! Cannot open aux output file "
 msgstr ""
 
-#: comm-i18n.ch:88
+#: comm-i18n.ch:84
 msgid "! Cannot open change file "
 msgstr ""
 
-#: comm-i18n.ch:118
+#: comm-i18n.ch:112
 msgid "! Cannot open include file"
 msgstr ""
 
@@ -172,12 +172,13 @@
 msgid "! Cannot open index file "
 msgstr ""
 
-#: comm-i18n.ch:82
+#: comm-i18n.ch:78
 msgid "! Cannot open input file "
 msgstr ""
 
-#: comm-i18n.ch:300 comm-i18n.ch:308 ctang-i18n.ch:83 ctang-i18n.ch:307
-#: cweav-i18n.ch:457
+#: comm-i18n.ch:300 comm-i18n.ch:306 comm-i18n.ch:312 comm-i18n.ch:318
+#: ctang-i18n.ch:83 ctang-i18n.ch:89 ctang-i18n.ch:315 ctang-i18n.ch:321
+#: cweav-i18n.ch:455
 msgid "! Cannot open output file "
 msgstr ""
 
@@ -185,19 +186,19 @@
 msgid "! Cannot open section file "
 msgstr ""
 
-#: comm-i18n.ch:46
+#: comm-i18n.ch:42
 msgid "! Change file ended after @x"
 msgstr ""
 
-#: comm-i18n.ch:54
+#: comm-i18n.ch:50
 msgid "! Change file ended before @y"
 msgstr ""
 
-#: comm-i18n.ch:126
+#: comm-i18n.ch:120
 msgid "! Change file ended without @z"
 msgstr ""
 
-#: comm-i18n.ch:140
+#: comm-i18n.ch:134
 msgid "! Change file entry did not match"
 msgstr ""
 
@@ -213,23 +214,23 @@
 msgid "! Control text didn't end"
 msgstr ""
 
-#: ctang-i18n.ch:249
+#: ctang-i18n.ch:257
 msgid "! Definition flushed, must start with identifier"
 msgstr ""
 
-#: ctang-i18n.ch:147
+#: ctang-i18n.ch:153
 msgid "! Double @ should be used in ASCII constant"
 msgstr ""
 
-#: ctang-i18n.ch:139 ctang-i18n.ch:257
+#: ctang-i18n.ch:145 ctang-i18n.ch:265
 msgid "! Double @ should be used in control text"
 msgstr ""
 
-#: ctang-i18n.ch:263 cweav-i18n.ch:165
+#: ctang-i18n.ch:271 cweav-i18n.ch:167 cweav-twill.ch:661 cweav-twill.ch:664
 msgid "! Double @ should be used in limbo"
 msgstr ""
 
-#: ctang-i18n.ch:233
+#: ctang-i18n.ch:241
 msgid "! Double @ should be used in string"
 msgstr ""
 
@@ -241,11 +242,11 @@
 msgid "! Extra } in comment"
 msgstr ""
 
-#: comm-i18n.ch:300
+#: comm-i18n.ch:292
 msgid "! Filename too long\n"
 msgstr ""
 
-#: cweav-twill.ch:550
+#: cweav-twill.ch:541
 msgid "! Identifier in meaning should be followed by space"
 msgstr ""
 
@@ -257,7 +258,7 @@
 msgid "! Improper format definition"
 msgstr ""
 
-#: ctang-i18n.ch:271
+#: ctang-i18n.ch:279
 msgid "! Improper hex number following @l"
 msgstr ""
 
@@ -265,39 +266,39 @@
 msgid "! Improper macro definition"
 msgstr ""
 
-#: comm-i18n.ch:96
+#: comm-i18n.ch:92
 msgid "! Include file name not given"
 msgstr ""
 
-#: comm-i18n.ch:110
+#: comm-i18n.ch:106
 msgid "! Include file name too long"
 msgstr ""
 
-#: comm-i18n.ch:320
+#: comm-i18n.ch:324
 msgid "! Include path too long"
 msgstr ""
 
-#: ctang-i18n.ch:99 cweav-i18n.ch:181
+#: ctang-i18n.ch:105 cweav-i18n.ch:181
 msgid "! Input ended in mid-comment"
 msgstr ""
 
-#: ctang-i18n.ch:119 cweav-i18n.ch:39
+#: ctang-i18n.ch:125 cweav-i18n.ch:39
 msgid "! Input ended in middle of string"
 msgstr ""
 
-#: ctang-i18n.ch:161 cweav-i18n.ch:61
+#: ctang-i18n.ch:167 cweav-i18n.ch:61
 msgid "! Input ended in section name"
 msgstr ""
 
-#: comm-i18n.ch:30
+#: comm-i18n.ch:26
 msgid "! Input line too long"
 msgstr ""
 
-#: cweav-twill.ch:550
+#: cweav-twill.ch:548
 msgid "! Location in meaning should be followed by space"
 msgstr ""
 
-#: ctang-i18n.ch:211
+#: ctang-i18n.ch:219
 msgid "! Misplaced @h"
 msgstr ""
 
@@ -305,11 +306,11 @@
 msgid "! Missing '|' after C text"
 msgstr ""
 
-#: comm-i18n.ch:38
+#: comm-i18n.ch:34
 msgid "! Missing @x in change file"
 msgstr ""
 
-#: ctang-i18n.ch:225
+#: ctang-i18n.ch:233
 msgid "! Missing `@ ' before a named section"
 msgstr ""
 
@@ -325,27 +326,27 @@
 msgid "! Missing } in comment"
 msgstr ""
 
-#: ctang-i18n.ch:181
+#: ctang-i18n.ch:187
 msgid "! Nesting of section names not allowed"
 msgstr ""
 
-#: cweav-twill.ch:1029
+#: cweav-twill.ch:1025
 msgid "! Only @$ is allowed in aux and bux files"
 msgstr ""
 
-#: ctang-i18n.ch:277
+#: ctang-i18n.ch:285
 msgid "! Replacement string in @l too long"
 msgstr ""
 
-#: ctang-i18n.ch:175 cweav-i18n.ch:75
+#: ctang-i18n.ch:181 cweav-i18n.ch:75
 msgid "! Section name didn't end"
 msgstr ""
 
-#: ctang-i18n.ch:99
+#: ctang-i18n.ch:111
 msgid "! Section name ended in mid-comment"
 msgstr ""
 
-#: ctang-i18n.ch:113 ctang-i18n.ch:153 cweav-i18n.ch:33
+#: ctang-i18n.ch:119 ctang-i18n.ch:159 cweav-i18n.ch:33
 msgid "! String didn't end"
 msgstr ""
 
@@ -353,54 +354,54 @@
 msgid "! TeX string should be in C text only"
 msgstr ""
 
-#: comm-i18n.ch:262 comm-i18n.hch:33
+#: comm-i18n.hch:42
 msgid "! This can't happen: "
 msgstr ""
 
-#: cweav-twill.ch:316
+#: cweav-twill.ch:307
 msgid "! Title name didn't end"
 msgstr ""
 
-#: cweav-twill.ch:314
+#: cweav-twill.ch:305
 msgid "! Title should be enclosed in braces or doublequotes"
 msgstr ""
 
-#: comm-i18n.ch:102
+#: comm-i18n.ch:98
 msgid "! Too many nested includes"
 msgstr ""
 
-#: ctang-i18n.ch:241
+#: ctang-i18n.ch:249
 msgid "! Unrecognized escape sequence"
 msgstr ""
 
-#: comm-i18n.ch:283
+#: comm-i18n.ch:272
 msgid ""
 "! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
 msgstr ""
 
-#: comm-i18n.ch:287
+#: comm-i18n.ch:281
 msgid ""
-"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 msgstr ""
 
-#: comm-i18n.ch:290
+#: comm-i18n.ch:277
 msgid ""
-"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 msgstr ""
 
-#: ctang-i18n.ch:131 cweav-i18n.ch:53 cweav-i18n.ch:119
+#: ctang-i18n.ch:139 cweav-i18n.ch:53 cweav-i18n.ch:119
 msgid "! Use @l in limbo only"
 msgstr ""
 
-#: ctang-i18n.ch:189 cweav-i18n.ch:103
+#: ctang-i18n.ch:195 cweav-i18n.ch:103
 msgid "! Verbatim string didn't end"
 msgstr ""
 
-#: comm-i18n.ch:68
+#: comm-i18n.ch:64
 msgid "! Where is the matching @y?"
 msgstr ""
 
-#: comm-i18n.ch:132
+#: comm-i18n.ch:126
 msgid "! Where is the matching @z?"
 msgstr ""
 
@@ -416,89 +417,94 @@
 msgid "! You need an = sign after the section name"
 msgstr ""
 
-#: ctang-i18n.ch:297 cweav-i18n.ch:437
+#: ctang-i18n.ch:305 cweav-i18n.ch:436 cweav-twill.ch:1335 cweav-twill.ch:1338
 #, c-format
 msgid "%ld bytes (out of %ld)\n"
 msgstr ""
 
-#: cweav-i18n.ch:435
+#: cweav-i18n.ch:434
 #, c-format
 msgid "%ld cross-references (out of %ld)\n"
 msgstr ""
 
-#: cweav-i18n.ch:446 cweav-i18n.ch:449
+#: cweav-i18n.ch:445 cweav-i18n.ch:448
 #, c-format
 msgid "%ld levels (out of %ld)\n"
 msgstr ""
 
-#: ctang-i18n.ch:293 cweav-i18n.ch:433
+#: ctang-i18n.ch:301 cweav-i18n.ch:432
 #, c-format
 msgid "%ld names (out of %ld)\n"
 msgstr ""
 
-#: ctang-i18n.ch:295
+#: ctang-i18n.ch:303
 #, c-format
 msgid "%ld replacement texts (out of %ld)\n"
 msgstr ""
 
-#: cweav-i18n.ch:440
+#: cweav-i18n.ch:439
 #, c-format
 msgid "%ld scraps (out of %ld)\n"
 msgstr ""
 
-#: cweav-twill.ch:1346
+#: cweav-twill.ch:1340
 #, c-format
 msgid "%ld temp meanings (out of %ld)\n"
 msgstr ""
 
-#: cweav-i18n.ch:442
+#: cweav-i18n.ch:441
 #, c-format
 msgid "%ld texts (out of %ld)\n"
 msgstr ""
 
-#: ctang-i18n.ch:299 cweav-i18n.ch:444
+#: cweav-twill.ch:1343
 #, c-format
+msgid "%ld titles (out of %ld)\n"
+msgstr ""
+
+#: ctang-i18n.ch:307 cweav-i18n.ch:443
+#, c-format
 msgid "%ld tokens (out of %ld)\n"
 msgstr ""
 
-#: comm-i18n.ch:242
+#: comm-i18n.ch:236
 msgid "(Did you see the warning message above?)"
 msgstr ""
 
-#: comm-i18n.ch:240
+#: comm-i18n.ch:234
 msgid "(No errors were found.)"
 msgstr ""
 
-#: comm-i18n.ch:244
+#: comm-i18n.ch:238
 msgid "(Pardon me, but I think I spotted something wrong.)"
 msgstr ""
 
-#: comm-i18n.ch:246
+#: comm-i18n.ch:240
 msgid "(That was a fatal error, my friend.)"
 msgstr ""
 
-#: comm-i18n.ch:224
+#: comm-i18n.ch:218
 #, c-format
 msgid ". (l. %d of change file)\n"
 msgstr ""
 
-#: comm-i18n.ch:226
+#: comm-i18n.ch:220
 #, c-format
 msgid ". (l. %d of include file %s)\n"
 msgstr ""
 
-#: comm-i18n.ch:225
+#: comm-i18n.ch:219
 #, c-format
 msgid ". (l. %d)\n"
 msgstr ""
 
-#: comm-i18n.ch:188
+#: comm-i18n.ch:182
 msgid ""
 ">\n"
 " and <"
 msgstr ""
 
-#: comm-i18n.ch:214
+#: comm-i18n.ch:208
 msgid ""
 ">,\n"
 " which abbreviates <"
@@ -508,24 +514,24 @@
 msgid "Done."
 msgstr ""
 
-#: cweav-i18n.ch:439
+#: cweav-i18n.ch:438
 msgid "Parsing:"
 msgstr ""
 
-#: cweav-i18n.ch:448
+#: cweav-i18n.ch:447
 msgid "Sorting:"
 msgstr ""
 
 #: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 3.64 [CWEBbin 2020])"
+msgid "This is CTANGLE (Version 4.0 [CWEBbin 2021])"
 msgstr ""
 
-#: cweav-i18n.ch:17
-msgid "This is CWEAVE (Version 3.64 [CWEBbin 2020])"
+#: cweav-twill.ch:61
+msgid "This is CTWILL (Version 4.0 [CWEBbin 2021])"
 msgstr ""
 
-#: cweav-twill.ch:68
-msgid "This is CTWILL (Version 3.64 [CWEBbin 2020])"
+#: cweav-i18n.ch:17 cweav-twill.ch:42
+msgid "This is CWEAVE (Version 4.0 [CWEBbin 2021])"
 msgstr ""
 
 #: cweav-i18n.ch:301 cweav-i18n.ch:309
@@ -532,7 +538,7 @@
 msgid "buffer"
 msgstr ""
 
-#: comm-i18n.ch:149 comm-i18n.ch:159 comm-i18n.ch:174
+#: comm-i18n.ch:143 comm-i18n.ch:153 comm-i18n.ch:168
 msgid "byte memory"
 msgstr ""
 
@@ -540,23 +546,23 @@
 msgid "cross-reference"
 msgstr ""
 
-#: cweav-twill.ch:822
+#: cweav-twill.ch:818
 msgid "find type"
 msgstr ""
 
-#: cweav-twill.ch:761
+#: cweav-twill.ch:757
 msgid "inner"
 msgstr ""
 
-#: ctang-i18n.ch:91
+#: ctang-i18n.ch:97
 msgid "macro defs have strange char"
 msgstr ""
 
-#: comm-i18n.ch:150 comm-i18n.ch:160 comm-i18n.ch:168
+#: comm-i18n.ch:144 comm-i18n.ch:154 comm-i18n.ch:162
 msgid "name"
 msgstr ""
 
-#: comm-i18n.ch:74
+#: comm-i18n.ch:70
 msgid "of the preceding lines failed to match"
 msgstr ""
 
@@ -580,19 +586,19 @@
 msgid "stack"
 msgstr ""
 
-#: cweav-twill.ch:570
+#: cweav-twill.ch:561
 msgid "temp meanings"
 msgstr ""
 
-#: ctang-i18n.ch:203 cweav-i18n.ch:223
+#: ctang-i18n.ch:211 cweav-i18n.ch:223
 msgid "text"
 msgstr ""
 
-#: cweav-twill.ch:317
+#: cweav-twill.ch:308
 msgid "titles"
 msgstr ""
 
-#: ctang-i18n.ch:25 ctang-i18n.ch:197
-#: cweav-i18n.ch:173 cweav-i18n.ch:217 cweav-i18n.ch:231
+#: ctang-i18n.ch:25 ctang-i18n.ch:203 cweav-i18n.ch:175 cweav-i18n.ch:217
+#: cweav-i18n.ch:231
 msgid "token"
 msgstr ""

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2018 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2018.
+# Andreas Scherer <https://ascherer.github.io>, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2018\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-15 09:55+0100\n"
-"PO-Revision-Date: 2019-01-15 09:55+0100\n"
+"POT-Creation-Date: 2021-02-06 15:43+0100\n"
+"PO-Revision-Date: 2021-02-06 15:58+0100\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: German\n"
 "Language: de\n"
@@ -17,18 +17,8 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: comm-texlive.ch:494
+#: comm-texlive.ch:531
 #, c-format
-msgid "%s: Need one to three file arguments.\n"
-msgstr "%s: Benötige ein bis drei Dateiargumente.\n"
-
-#: comm-texlive.ch:495
-#, c-format
-msgid "Try `%s --help' for more information.\n"
-msgstr "Versuche `%s --help' für weitere Informationen.\n"
-
-#: comm-texlive.ch:514
-#, c-format
 msgid ""
 "\n"
 "Email bug reports to %s.\n"
@@ -36,14 +26,24 @@
 "\n"
 "Sende Fehler per Email an %s.\n"
 
-#: ctang-texlive.ch:29
-msgid "This is CTANGLE, Version 3.64"
-msgstr "Dies ist CTANGLE, Version 3.64"
+#: comm-texlive.ch:511
+#, c-format
+msgid "%s: Need one to three file arguments.\n"
+msgstr "%s: Benötige ein bis drei Dateiargumente.\n"
 
-#: cweav-texlive.ch:29
-msgid "This is CWEAVE, Version 3.64"
-msgstr "Dies ist CWEAVE, Version 3.64"
+#: ctang-texlive.ch:39
+msgid "This is CTANGLE, Version 4.0"
+msgstr "Dies ist CTANGLE, Version 4.0"
 
-#: ctwill-texlive.ch:29
-msgid "This is CTWILL, Version 3.64"
-msgstr "Dies ist CTWILL, Version 3.64"
+#: ctwill-texlive.ch:39
+msgid "This is CTWILL, Version 4.0"
+msgstr "Dies ist CTWILL, Version 4.0"
+
+#: cweav-texlive.ch:39
+msgid "This is CWEAVE, Version 4.0"
+msgstr "Dies ist CWEAVE, Version 4.0"
+
+#: comm-texlive.ch:512
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Versuche `%s --help' für weitere Informationen.\n"

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2019 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2019.
+# Andreas Scherer <https://ascherer/github.io>, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2019\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-18 16:57+0100\n"
-"PO-Revision-Date: 2019-01-18 16:57+0100\n"
+"POT-Creation-Date: 2021-02-06 15:25+0100\n"
+"PO-Revision-Date: 2021-02-06 15:57+0100\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: German\n"
 "Language: de\n"
@@ -17,7 +17,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: comm-i18n.ch:182
+#: comm-i18n.ch:176
 msgid ""
 "\n"
 "! Ambiguous prefix: matches <"
@@ -31,7 +31,7 @@
 "! C text in section name didn't end: <"
 msgstr ""
 "\n"
-"! C-Text in Abschnittname nicht beendet: <"
+"! C-Text in Abschnittnamen nicht beendet: <"
 
 #: cweav-i18n.ch:287
 msgid ""
@@ -39,9 +39,9 @@
 "! Illegal control code in section name: <"
 msgstr ""
 "\n"
-"! Unerlaubtes Kontrollzeichen in Abschnittname: <"
+"! Unerlaubtes Kontrollzeichen in Abschnittnamen: <"
 
-#: cweav-i18n.ch:157
+#: cweav-i18n.ch:159
 #, c-format
 msgid ""
 "\n"
@@ -50,7 +50,7 @@
 "\n"
 "! Zeile musste umbrochen werden (Ausgabezeile %d):\n"
 
-#: cweav-i18n.ch:141
+#: cweav-i18n.ch:142
 msgid ""
 "\n"
 "! Never defined: <"
@@ -58,7 +58,7 @@
 "\n"
 "! Nicht definiert: <"
 
-#: cweav-i18n.ch:148
+#: cweav-i18n.ch:150
 msgid ""
 "\n"
 "! Never used: <"
@@ -66,7 +66,7 @@
 "\n"
 "! Nicht benutzt: <"
 
-#: comm-i18n.ch:202
+#: comm-i18n.ch:196
 msgid ""
 "\n"
 "! New name extends <"
@@ -74,7 +74,7 @@
 "\n"
 "! Neuer Name erweitert <"
 
-#: comm-i18n.ch:196
+#: comm-i18n.ch:190
 msgid ""
 "\n"
 "! New name is a prefix of <"
@@ -98,7 +98,7 @@
 "\n"
 "! Nicht vorhanden: <"
 
-#: comm-i18n.ch:208
+#: comm-i18n.ch:202
 msgid ""
 "\n"
 "! Section name incompatible with <"
@@ -106,15 +106,15 @@
 "\n"
 "! Abschnittname passt nicht zu <"
 
-#: ctang-i18n.ch:167 cweav-i18n.ch:67
+#: ctang-i18n.ch:173 cweav-i18n.ch:67
 msgid ""
 "\n"
 "! Section name too long: "
 msgstr ""
 "\n"
-"! Abschnittname zu lang: "
+"! Abschnittname ist zu lang: "
 
-#: comm-i18n.ch:254
+#: comm-i18n.ch:248
 #, c-format
 msgid ""
 "\n"
@@ -123,13 +123,13 @@
 "\n"
 "! Tut mir leid, Kapazität für %s überschritten"
 
-#: ctang-i18n.ch:125 cweav-i18n.ch:45
+#: ctang-i18n.ch:131 cweav-i18n.ch:45
 msgid ""
 "\n"
 "! String too long: "
 msgstr ""
 "\n"
-"! Zeichenkette zu lang: "
+"! Zeichenkette ist zu lang: "
 
 #: cweav-i18n.ch:239
 #, c-format
@@ -138,9 +138,9 @@
 "Irreducible scrap sequence in section %d:"
 msgstr ""
 "\n"
-"Nichtreduzierbare Scrap-Folge in Abschnitt %d:"
+"Nicht reduzierbare Scrap-Folge in Abschnitt %d:"
 
-#: ctang-i18n.ch:292 cweav-i18n.ch:431
+#: ctang-i18n.ch:300 cweav-i18n.ch:430
 msgid ""
 "\n"
 "Memory usage statistics:"
@@ -190,36 +190,37 @@
 "\n"
 "Schreibe die Ausgabedateien:"
 
-#: ctang-i18n.ch:217
+#: ctang-i18n.ch:225
 msgid "! @d, @f and @c are ignored in C text"
 msgstr "! @d, @f und @c werden im C-Text ignoriert"
 
-#: comm-i18n.ch:60
+#: comm-i18n.ch:56
 msgid "! CWEB file ended during a change"
 msgstr "! CWEB-Datei endete während einer Änderung"
 
-#: cweav-twill.ch:1033
+#: cweav-twill.ch:1029
 msgid "! Cannot open aux output file "
 msgstr "! Kann aux-Ausgabedatei nicht öffnen: "
 
-#: comm-i18n.ch:88
+#: comm-i18n.ch:84
 msgid "! Cannot open change file "
 msgstr "! Kann Änderungsdatei nicht öffnen: "
 
-#: comm-i18n.ch:118
+#: comm-i18n.ch:112
 msgid "! Cannot open include file"
 msgstr "! Kann Einfügedatei nicht öffnen"
 
 #: cweav-i18n.ch:383
 msgid "! Cannot open index file "
-msgstr "! Kann die Indexdatei nicht öffnen: "
+msgstr "! Kann Indexdatei nicht öffnen: "
 
-#: comm-i18n.ch:82
+#: comm-i18n.ch:78
 msgid "! Cannot open input file "
 msgstr "! Kann Eingabedatei nicht öffnen: "
 
-#: comm-i18n.ch:300 comm-i18n.ch:308 ctang-i18n.ch:83 ctang-i18n.ch:307
-#: cweav-i18n.ch:457
+#: comm-i18n.ch:300 comm-i18n.ch:306 comm-i18n.ch:312 comm-i18n.ch:318
+#: ctang-i18n.ch:83 ctang-i18n.ch:89 ctang-i18n.ch:315 ctang-i18n.ch:321
+#: cweav-i18n.ch:455
 msgid "! Cannot open output file "
 msgstr "! Kann Ausgabedatei nicht öffnen: "
 
@@ -227,19 +228,19 @@
 msgid "! Cannot open section file "
 msgstr "! Kann die Abschnittdatei nicht öffnen: "
 
-#: comm-i18n.ch:46
+#: comm-i18n.ch:42
 msgid "! Change file ended after @x"
 msgstr "! Änderungsdatei endete nach @x"
 
-#: comm-i18n.ch:54
+#: comm-i18n.ch:50
 msgid "! Change file ended before @y"
 msgstr "! Änderungsdatei endete vor @y"
 
-#: comm-i18n.ch:126
+#: comm-i18n.ch:120
 msgid "! Change file ended without @z"
 msgstr "! Änderungsdatei endete ohne @z"
 
-#: comm-i18n.ch:140
+#: comm-i18n.ch:134
 msgid "! Change file entry did not match"
 msgstr "! Eintrag in der Änderungsdatei stimmt nicht überein"
 
@@ -255,23 +256,23 @@
 msgid "! Control text didn't end"
 msgstr "! Kontrolltext nicht beendet"
 
-#: ctang-i18n.ch:249
+#: ctang-i18n.ch:257
 msgid "! Definition flushed, must start with identifier"
 msgstr "! Definition übergangen, muss mit einem Bezeichner anfangen"
 
-#: ctang-i18n.ch:147
+#: ctang-i18n.ch:153
 msgid "! Double @ should be used in ASCII constant"
 msgstr "! In ASCII Konstanten sollten doppelte @ verwendet werden"
 
-#: ctang-i18n.ch:139 ctang-i18n.ch:257
+#: ctang-i18n.ch:145 ctang-i18n.ch:265
 msgid "! Double @ should be used in control text"
 msgstr "! In Kontrolltexten sollten doppelte @ verwendet werden"
 
-#: ctang-i18n.ch:263 cweav-i18n.ch:165
+#: ctang-i18n.ch:271 cweav-i18n.ch:167 cweav-twill.ch:661 cweav-twill.ch:664
 msgid "! Double @ should be used in limbo"
 msgstr "! Im Einführungsteil sollten doppelte @ verwendet werden"
 
-#: ctang-i18n.ch:233
+#: ctang-i18n.ch:241
 msgid "! Double @ should be used in string"
 msgstr "! In einer Zeichenkette sollten doppelte @ verwendet werden"
 
@@ -283,11 +284,11 @@
 msgid "! Extra } in comment"
 msgstr "! Zusätzliche } in Kommentar"
 
-#: comm-i18n.ch:300
+#: comm-i18n.ch:292
 msgid "! Filename too long\n"
 msgstr "! Dateiname zu lang\n"
 
-#: cweav-twill.ch:550
+#: cweav-twill.ch:541
 msgid "! Identifier in meaning should be followed by space"
 msgstr "! Bezeichner in Bedeutung sollte Leerzeichen folgen"
 
@@ -299,7 +300,7 @@
 msgid "! Improper format definition"
 msgstr "! Ungültige Formatdefinition"
 
-#: ctang-i18n.ch:271
+#: ctang-i18n.ch:279
 msgid "! Improper hex number following @l"
 msgstr "! Ungültige Hexadezimalzahl nach @l"
 
@@ -307,39 +308,39 @@
 msgid "! Improper macro definition"
 msgstr "! Ungültige Makrodefinition"
 
-#: comm-i18n.ch:96
+#: comm-i18n.ch:92
 msgid "! Include file name not given"
 msgstr "! Name der Einfügedatei nicht angegeben"
 
-#: comm-i18n.ch:110
+#: comm-i18n.ch:106
 msgid "! Include file name too long"
 msgstr "! Name der Einfügedatei zu lang"
 
-#: comm-i18n.ch:320
+#: comm-i18n.ch:324
 msgid "! Include path too long"
 msgstr "! Einfügepfad zu lang"
 
-#: ctang-i18n.ch:99 cweav-i18n.ch:181
+#: ctang-i18n.ch:105 cweav-i18n.ch:181
 msgid "! Input ended in mid-comment"
 msgstr "! Eingabe endete mitten in einem Kommentar"
 
-#: ctang-i18n.ch:119 cweav-i18n.ch:39
+#: ctang-i18n.ch:125 cweav-i18n.ch:39
 msgid "! Input ended in middle of string"
 msgstr "! Eingabe endete mitten in einer Zeichenkette"
 
-#: ctang-i18n.ch:161 cweav-i18n.ch:61
+#: ctang-i18n.ch:167 cweav-i18n.ch:61
 msgid "! Input ended in section name"
 msgstr "! Eingabe endete in einem Abschnittnamen"
 
-#: comm-i18n.ch:30
+#: comm-i18n.ch:26
 msgid "! Input line too long"
 msgstr "! Eingabezeile zu lang"
 
-#: cweav-twill.ch:550
+#: cweav-twill.ch:548
 msgid "! Location in meaning should be followed by space"
 msgstr "! Herkunftsort in Bedeutung sollte Leerzeichen folgen"
 
-#: ctang-i18n.ch:211
+#: ctang-i18n.ch:219
 msgid "! Misplaced @h"
 msgstr "! Falsch platziertes @h"
 
@@ -347,11 +348,11 @@
 msgid "! Missing '|' after C text"
 msgstr "! Fehlendes `|' nach C-Text"
 
-#: comm-i18n.ch:38
+#: comm-i18n.ch:34
 msgid "! Missing @x in change file"
 msgstr "! Fehlendes @x in der Änderungsdatei"
 
-#: ctang-i18n.ch:225
+#: ctang-i18n.ch:233
 msgid "! Missing `@ ' before a named section"
 msgstr "! Fehlendes `@ ' vor einem Abschnittnamen"
 
@@ -367,27 +368,27 @@
 msgid "! Missing } in comment"
 msgstr "! Fehlende } in Kommentar"
 
-#: ctang-i18n.ch:181
+#: ctang-i18n.ch:187
 msgid "! Nesting of section names not allowed"
 msgstr "! Verschachtelung von Abschnittnamen nicht erlaubt"
 
-#: cweav-twill.ch:1029
+#: cweav-twill.ch:1025
 msgid "! Only @$ is allowed in aux and bux files"
 msgstr "! Nur @$ ist in aux- und bux-Dateien erlaubt"
 
-#: ctang-i18n.ch:277
+#: ctang-i18n.ch:285
 msgid "! Replacement string in @l too long"
 msgstr "! Ersetzungstext in @l zu lang"
 
-#: ctang-i18n.ch:175 cweav-i18n.ch:75
+#: ctang-i18n.ch:181 cweav-i18n.ch:75
 msgid "! Section name didn't end"
 msgstr "! Abschnittname nicht beendet"
 
-#: ctang-i18n.ch:99
+#: ctang-i18n.ch:111
 msgid "! Section name ended in mid-comment"
 msgstr "! Abschnittname endete mitten in einem Kommentar"
 
-#: ctang-i18n.ch:113 ctang-i18n.ch:153 cweav-i18n.ch:33
+#: ctang-i18n.ch:119 ctang-i18n.ch:159 cweav-i18n.ch:33
 msgid "! String didn't end"
 msgstr "! Zeichenkette nicht beendet"
 
@@ -395,27 +396,27 @@
 msgid "! TeX string should be in C text only"
 msgstr "! TeX-Zeichenkette sollte nur in C-Text stehen"
 
-#: comm-i18n.ch:262 comm-i18n.hch:33
+#: comm-i18n.hch:42
 msgid "! This can't happen: "
 msgstr "! Das kann nicht sein: "
 
-#: cweav-twill.ch:316
+#: cweav-twill.ch:307
 msgid "! Title name didn't end"
 msgstr "! Titel nicht beendet"
 
-#: cweav-twill.ch:314
+#: cweav-twill.ch:305
 msgid "! Title should be enclosed in braces or doublequotes"
 msgstr "! Titel sollte in geschweiften Klammern oder Anführungszeichen stehen"
 
-#: comm-i18n.ch:102
+#: comm-i18n.ch:98
 msgid "! Too many nested includes"
 msgstr "! Zu viele verschachtelte Einfügungen"
 
-#: ctang-i18n.ch:241
+#: ctang-i18n.ch:249
 msgid "! Unrecognized escape sequence"
 msgstr "! Unbekannte Escape-Sequenz"
 
-#: comm-i18n.ch:283
+#: comm-i18n.ch:272
 msgid ""
 "! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
 msgstr ""
@@ -427,11 +428,11 @@
 "s [-] Melde die Verbrauchsstatistik\n"
 "t [+] Vergleiche temporäre Ausgabe nach Änderungen\n"
 
-#: comm-i18n.ch:287
+#: comm-i18n.ch:281
 msgid ""
-"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 msgstr ""
-"! Aufruf: cweave [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Aufruf: ctwill [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 "Optionen sind (+ schaltet ein, - schaltet aus, Vorgabe in Klammern):\n"
 "b [+] Gib eine Startmeldung aus\n"
 "h [+] Bestätige einen fehlerfreien Lauf\n"
@@ -441,15 +442,16 @@
 "i [+] Rücke Parameterdeklarationen ein\n"
 "o [+] Trenne Deklarationen und Anweisungen\n"
 "x [+] Füge Indexe und Inhaltsverzeichnisse ein\n"
-"lX [] Verwende die Makros für Sprache X aus Xcwebmac.tex\n"
+"P [-] Benutze 'proofmac.tex' statt 'ctwimac.tex'\n"
+"lX [] Verwende die Makros für Sprache X aus X{ctwimac|proofmac}.tex\n"
 "s [-] Melde die Verbrauchsstatistik\n"
 "t [+] Vergleiche temporäre Ausgabe nach Änderungen\n"
 
-#: comm-i18n.ch:290
+#: comm-i18n.ch:277
 msgid ""
-"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 msgstr ""
-"! Aufruf: ctwill [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"! Aufruf: cweave [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
 "Optionen sind (+ schaltet ein, - schaltet aus, Vorgabe in Klammern):\n"
 "b [+] Gib eine Startmeldung aus\n"
 "h [+] Bestätige einen fehlerfreien Lauf\n"
@@ -459,24 +461,23 @@
 "i [+] Rücke Parameterdeklarationen ein\n"
 "o [+] Trenne Deklarationen und Anweisungen\n"
 "x [+] Füge Indexe und Inhaltsverzeichnisse ein\n"
-"P [-] Benutze 'proofmac.tex' statt 'ctwimac.tex'\n"
-"lX [] Verwende die Makros für Sprache X aus X{ctwimac|proofmac}.tex\n"
+"lX [] Verwende die Makros für Sprache X aus Xcwebmac.tex\n"
 "s [-] Melde die Verbrauchsstatistik\n"
 "t [+] Vergleiche temporäre Ausgabe nach Änderungen\n"
 
-#: ctang-i18n.ch:131 cweav-i18n.ch:53 cweav-i18n.ch:119
+#: ctang-i18n.ch:139 cweav-i18n.ch:53 cweav-i18n.ch:119
 msgid "! Use @l in limbo only"
 msgstr "! Verwende @l ausschließlich im Einführungsteil"
 
-#: ctang-i18n.ch:189 cweav-i18n.ch:103
+#: ctang-i18n.ch:195 cweav-i18n.ch:103
 msgid "! Verbatim string didn't end"
 msgstr "! Verbatim-Zeichenkette nicht beendet"
 
-#: comm-i18n.ch:68
+#: comm-i18n.ch:64
 msgid "! Where is the matching @y?"
 msgstr "! Wo ist das zugehörige @y?"
 
-#: comm-i18n.ch:132
+#: comm-i18n.ch:126
 msgid "! Where is the matching @z?"
 msgstr "! Wo ist das zugehörige @z?"
 
@@ -492,83 +493,88 @@
 msgid "! You need an = sign after the section name"
 msgstr "! Hinter dem Abschnittnamen muss ein = Zeichen stehen"
 
-#: ctang-i18n.ch:297 cweav-i18n.ch:437
+#: ctang-i18n.ch:305 cweav-i18n.ch:436 cweav-twill.ch:1335 cweav-twill.ch:1338
 #, c-format
 msgid "%ld bytes (out of %ld)\n"
 msgstr "%ld Bytes (von %ld)\n"
 
-#: cweav-i18n.ch:435
+#: cweav-i18n.ch:434
 #, c-format
 msgid "%ld cross-references (out of %ld)\n"
 msgstr "%ld Querverweise (von %ld)\n"
 
-#: cweav-i18n.ch:446 cweav-i18n.ch:449
+#: cweav-i18n.ch:445 cweav-i18n.ch:448
 #, c-format
 msgid "%ld levels (out of %ld)\n"
 msgstr "%ld Ebenen (von %ld)\n"
 
-#: ctang-i18n.ch:293 cweav-i18n.ch:433
+#: ctang-i18n.ch:301 cweav-i18n.ch:432
 #, c-format
 msgid "%ld names (out of %ld)\n"
 msgstr "%ld Namen (von %ld)\n"
 
-#: ctang-i18n.ch:295
+#: ctang-i18n.ch:303
 #, c-format
 msgid "%ld replacement texts (out of %ld)\n"
 msgstr "%ld Ersetzungstexte (von %ld)\n"
 
-#: cweav-i18n.ch:440
+#: cweav-i18n.ch:439
 #, c-format
 msgid "%ld scraps (out of %ld)\n"
 msgstr "%ld Scraps (von %ld)\n"
 
-#: cweav-twill.ch:1346
+#: cweav-twill.ch:1340
 #, c-format
 msgid "%ld temp meanings (out of %ld)\n"
 msgstr "%ld temporäre Bedeutungen (von %ld)\n"
 
-#: cweav-i18n.ch:442
+#: cweav-i18n.ch:441
 #, c-format
 msgid "%ld texts (out of %ld)\n"
 msgstr "%ld Texte (von %ld)\n"
 
-#: ctang-i18n.ch:299 cweav-i18n.ch:444
+#: cweav-twill.ch:1343
 #, c-format
+msgid "%ld titles (out of %ld)\n"
+msgstr "%ld Titel (von %ld)\n"
+
+#: ctang-i18n.ch:307 cweav-i18n.ch:443
+#, c-format
 msgid "%ld tokens (out of %ld)\n"
 msgstr "%ld Token (von %ld)\n"
 
-#: comm-i18n.ch:242
+#: comm-i18n.ch:236
 msgid "(Did you see the warning message above?)"
 msgstr "(Hast du die obige Warnung gesehen?)"
 
-#: comm-i18n.ch:240
+#: comm-i18n.ch:234
 msgid "(No errors were found.)"
 msgstr "(Keine Fehler gefunden.)"
 
-#: comm-i18n.ch:244
+#: comm-i18n.ch:238
 msgid "(Pardon me, but I think I spotted something wrong.)"
 msgstr "(Entschuldige bitte, aber ich glaube, etwas stimmt nicht.)"
 
-#: comm-i18n.ch:246
+#: comm-i18n.ch:240
 msgid "(That was a fatal error, my friend.)"
 msgstr "(Mensch, das war ein böser Fehler.)"
 
-#: comm-i18n.ch:224
+#: comm-i18n.ch:218
 #, c-format
 msgid ". (l. %d of change file)\n"
 msgstr ". (Zeile %d der Änderungsdatei)\n"
 
-#: comm-i18n.ch:226
+#: comm-i18n.ch:220
 #, c-format
 msgid ". (l. %d of include file %s)\n"
 msgstr ". (Zeile %d der Einfügedatei %s)\n"
 
-#: comm-i18n.ch:225
+#: comm-i18n.ch:219
 #, c-format
 msgid ". (l. %d)\n"
 msgstr ". (Zeile %d)\n"
 
-#: comm-i18n.ch:188
+#: comm-i18n.ch:182
 msgid ""
 ">\n"
 " and <"
@@ -576,7 +582,7 @@
 ">\n"
 " und <"
 
-#: comm-i18n.ch:214
+#: comm-i18n.ch:208
 msgid ""
 ">,\n"
 " which abbreviates <"
@@ -588,31 +594,31 @@
 msgid "Done."
 msgstr "Fertig."
 
-#: cweav-i18n.ch:439
+#: cweav-i18n.ch:438
 msgid "Parsing:"
 msgstr "Parsen:"
 
-#: cweav-i18n.ch:448
+#: cweav-i18n.ch:447
 msgid "Sorting:"
 msgstr "Sortieren:"
 
 #: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 3.64 [CWEBbin 2020])"
-msgstr "Dies ist CTANGLE (Version 3.64 [CWEBbin 2020])"
+msgid "This is CTANGLE (Version 4.0 [CWEBbin 2021])"
+msgstr "Dies ist CTANGLE (Version 4.0 [CWEBbin 2021])"
 
-#: cweav-i18n.ch:17
-msgid "This is CWEAVE (Version 3.64 [CWEBbin 2020])"
-msgstr "Dies ist CWEAVE (Version 3.64 [CWEBbin 2020])"
+#: cweav-twill.ch:61
+msgid "This is CTWILL (Version 4.0 [CWEBbin 2021])"
+msgstr "Dies ist CTWILL (Version 4.0 [CWEBbin 2021])"
 
-#: cweav-twill.ch:68
-msgid "This is CTWILL (Version 3.64 [CWEBbin 2020])"
-msgstr "Dies ist CTWILL (Version 3.64 [CWEBbin 2020])"
+#: cweav-i18n.ch:17 cweav-twill.ch:42
+msgid "This is CWEAVE (Version 4.0 [CWEBbin 2021])"
+msgstr "Dies ist CWEAVE (Version 4.0 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:301 cweav-i18n.ch:309
 msgid "buffer"
 msgstr "Puffer"
 
-#: comm-i18n.ch:149 comm-i18n.ch:159 comm-i18n.ch:174
+#: comm-i18n.ch:143 comm-i18n.ch:153 comm-i18n.ch:168
 msgid "byte memory"
 msgstr "Byte-Speicher"
 
@@ -620,23 +626,23 @@
 msgid "cross-reference"
 msgstr "Querverweise"
 
-#: cweav-twill.ch:822
+#: cweav-twill.ch:818
 msgid "find type"
 msgstr "Auffindetyp"
 
-#: cweav-twill.ch:761
+#: cweav-twill.ch:757
 msgid "inner"
 msgstr "inner"
 
-#: ctang-i18n.ch:91
+#: ctang-i18n.ch:97
 msgid "macro defs have strange char"
 msgstr "Unpassendes Zeichen in einer Makrodefinition"
 
-#: comm-i18n.ch:150 comm-i18n.ch:160 comm-i18n.ch:168
+#: comm-i18n.ch:144 comm-i18n.ch:154 comm-i18n.ch:162
 msgid "name"
 msgstr "Bezeichner"
 
-#: comm-i18n.ch:74
+#: comm-i18n.ch:70
 msgid "of the preceding lines failed to match"
 msgstr "der vorangegangenen Zeilen stimmen nicht überein"
 
@@ -660,19 +666,19 @@
 msgid "stack"
 msgstr "Stack"
 
-#: cweav-twill.ch:570
+#: cweav-twill.ch:561
 msgid "temp meanings"
 msgstr "Temporäre Bedeutung"
 
-#: ctang-i18n.ch:203 cweav-i18n.ch:223
+#: ctang-i18n.ch:211 cweav-i18n.ch:223
 msgid "text"
 msgstr "Text"
 
-#: cweav-twill.ch:317
+#: cweav-twill.ch:308
 msgid "titles"
 msgstr "Titel"
 
-#: ctang-i18n.ch:25 ctang-i18n.ch:197 cweav-i18n.ch:173 cweav-i18n.ch:217
+#: ctang-i18n.ch:25 ctang-i18n.ch:203 cweav-i18n.ch:175 cweav-i18n.ch:217
 #: cweav-i18n.ch:231
 msgid "token"
 msgstr "Token"

Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2020 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2020.
+# Andreas Scherer <https://ascherer.github.io>, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2020\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-07-08 15:10+0200\n"
-"PO-Revision-Date: 2020-07-08 15:10+0200\n"
+"POT-Creation-Date: 2021-02-06 15:10+0200\n"
+"PO-Revision-Date: 2021-02-06 15:58+0100\n"
 "Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
 "Language-Team: German\n"
 "Language: de\n"
@@ -18,8 +18,10 @@
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: help.h:52
-msgid "Usage: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
-msgstr "Aufruf: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
+msgid ""
+"Usage: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
+msgstr ""
+"Aufruf: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
 
 #: help.h:53
 msgid "  Tangle WEBFILE with CHANGEFILE into a C/C++ program."
@@ -73,17 +75,19 @@
 msgid "-t          ignore temporary output irrespective of changes"
 msgstr "-t          ignoriere temporäre Ausgabe unabhängig von Änderungen"
 
-#: help.h:65 help.h:91 help.h:118
+#: help.h:66 help.h:92 help.h:119
 msgid "--help      display this help and exit"
 msgstr "--help      zeige diesen Hilfetext und ende"
 
-#: help.h:66 help.h:92 help.h:119
+#: help.h:67 help.h:93 help.h:120
 msgid "--version   output version information and exit"
 msgstr "--version   zeige die Versionsinformation und ende"
 
 #: help.h:72
-msgid "Usage: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
-msgstr "Aufruf: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgid ""
+"Usage: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr ""
+"Aufruf: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
 
 #: help.h:73
 msgid "  Weave WEBFILE with CHANGEFILE into a TeX document."
@@ -118,8 +122,10 @@
 msgstr "+lX         benutze Macros für Sprache X aus Xcwebmac.tex"
 
 #: help.h:98
-msgid "Usage: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
-msgstr "Aufruf: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgid ""
+"Usage: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr ""
+"Aufruf: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
 
 #: help.h:99
 msgid "  Weave WEBFILE with CHANGEFILE into a TeX document with mini-indexes."

Modified: trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2019 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2019.
+# Andreas Scherer <https://ascherer/github.io>, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2020\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-18 16:57+0100\n"
-"PO-Revision-Date: 2019-09-22 17:08+0200\n"
+"POT-Creation-Date: 2021-02-06 15:25+0100\n"
+"PO-Revision-Date: 2021-02-06 15:57+0100\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 3.64 [CWEBbin 2020])"
-msgstr "Questo è CTANGLE (Versione 3.64 [CWEBbin 2020])"
+msgid "This is CTANGLE (Version 4.0 [CWEBbin 2021])"
+msgstr "Questo è CTANGLE (Versione 4.0 [CWEBbin 2021])"
 
 #: cweav-i18n.ch:17
-msgid "This is CWEAVE (Version 3.64 [CWEBbin 2020])"
-msgstr "Questo è CWEAVE (Versione 3.64 [CWEBbin 2020])"
+msgid "This is CWEAVE (Version 4.0 [CWEBbin 2021])"
+msgstr "Questo è CWEAVE (Versione 4.0 [CWEBbin 2021])"
 
 #: cweav-twill.ch:68
-msgid "This is CTWILL (Version 3.64 [CWEBbin 2020])"
-msgstr "Questo è CTWILL (Versione 3.64 [CWEBbin 2020])"
+msgid "This is CTWILL (Version 4.0 [CWEBbin 2021])"
+msgstr "Questo è CTWILL (Versione 4.0 [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-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,14 +1,14 @@
 # International version of CWEB (CWEBbin, TeXLive).
-# Copyright (C) 2020 Andreas Scherer et al.
+# Copyright (C) 2021 Andreas Scherer et al.
 # This file is distributed under the same license as the CWEB package.
-# Andreas Scherer <https://ascherer.github.io>, 2020.
+# Andreas Scherer <https://ascherer.github.io>, 2021.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: CWEBbin 2020\n"
+"Project-Id-Version: CWEBbin 2021\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-07-08 15:10+0200\n"
+"POT-Creation-Date: 2021-02-06 15:10+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"

Modified: trunk/Build/source/texk/web2c/cwebdir/system.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/system.bux	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/system.bux	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,4 +1,5 @@
 @$memcmp "<string.h>" \zip@>
+@$memcpy "<string.h>" \zip@>
 @$strcat "<string.h>" \zip@>
 @$strcmp "<string.h>" \zip@>
 @$strcpy "<string.h>" \zip@>
@@ -24,6 +25,7 @@
 @$sprintf "<stdio.h>" \zip@>
 @$stdout "<stdio.h>" \zip@>
 
+@$getenv "<stdlib.h>" \zip@>
 @$exit "<stdlib.h>" \zip@>
 
 @$isalpha "<ctype.h>" \zip@>

Deleted: trunk/Build/source/texk/web2c/cwebdir/texinputs/p+cwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/texinputs/p+cwebmac.tex	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/p+cwebmac.tex	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,5 +0,0 @@
-% 'Language' to switch on PDF creation with standard 'tex' and 'xetex'
-% created by Andreas Scherer in June 2020.  Used with 'cweave -lp+'.
-% This file is not copyrighted and can be used freely.
-\ifx\undefined\botofcontents \let\pdf+ \input cwebmac % switch on PDF
-\else\endinput\fi % too late, baby!

Modified: trunk/Build/source/texk/web2c/man/ctwill.man
===================================================================
--- trunk/Build/source/texk/web2c/man/ctwill.man	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/man/ctwill.man	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 2.10.1
+.\" Automatically generated by Pandoc 2.11.4
 .\"
-.TH "CTWILL" "1" "September 23, 2020" "Web2c @VERSION@" "General Commands Manual"
+.TH "CTWILL" "1" "February 6, 2021" "Web2c @VERSION@" "General Commands Manual"
 .hy
 .SH NAME
 .PP
@@ -106,7 +106,7 @@
 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 (3.64c).
+This version is based on the most recent version of CWEB (4.0).
 .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.

Modified: trunk/Build/source/texk/web2c/man/cweb.man
===================================================================
--- trunk/Build/source/texk/web2c/man/cweb.man	2021-02-07 03:24:17 UTC (rev 57657)
+++ trunk/Build/source/texk/web2c/man/cweb.man	2021-02-07 11:02:17 UTC (rev 57658)
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pandoc 2.10.1
+.\" Automatically generated by Pandoc 2.11.4
 .\"
 .TH "CWEB" "1" "September 23, 2020" "Web2c @VERSION@" "General Commands Manual"
 .hy



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