texlive[58884] Build/source/texk/web2c: [CWEB] New release 4.3.
commits+ascherer at tug.org
commits+ascherer at tug.org
Fri Apr 16 14:49:28 CEST 2021
Revision: 58884
http://tug.org/svn/texlive?view=revision&revision=58884
Author: ascherer
Date: 2021-04-16 14:49:28 +0200 (Fri, 16 Apr 2021)
Log Message:
-----------
[CWEB] New release 4.3.
This release introduces new features to CWEB 4:
* Former option '-t' is now called '-c'.
- New option '-t' for CWEAVE when dealing with 'typename' in
C++ templates.
- New option '-k' for CTANGLE to keep '-separators in numeric
literals.
* Support for "variadic macros" along "variadic functions".
* @d is printed similar to #define (and vice versa):
- '#' is no longer printed in boldface.
- Spacing is similar in most cases.
* Support for extended C99/C++ numeric literals:
- hexadecimal, octal, and -- new! -- binary numbers.
- NOTE: 'cwebmac.tex 4.3' is NOT compatible with CWEAVE 4.2 and older
and vice versa.
* Long parameter lists in ANSI function definitions are indented similar
to old-style function parameters.
- Option '-i' works similar for old-style and modern function headers.
* Additional C99/C++ keywords -- from 'alignas' to 'thread_local' -- are
supported internally.
* '@i'nclude file 'iso_types.w' for numeric types (in addition to
'c++lib.w').
* Countless code modifications, including some corrections amd
improvements.
Thanks and cudos to Github user "@texdraft" for numerous contributions
to this feature release!
Modified Paths:
--------------
trunk/Build/source/texk/web2c/ChangeLog
trunk/Build/source/texk/web2c/Makefile.in
trunk/Build/source/texk/web2c/am/cweb.am
trunk/Build/source/texk/web2c/ctangleboot.cin
trunk/Build/source/texk/web2c/cwebboot.cin
trunk/Build/source/texk/web2c/cwebdir/ChangeLog
trunk/Build/source/texk/web2c/cwebdir/Makefile
trunk/Build/source/texk/web2c/cwebdir/README
trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch
trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch
trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch
trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch
trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch
trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch
trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch
trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch
trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h
trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch
trunk/Build/source/texk/web2c/cwebdir/common.c
trunk/Build/source/texk/web2c/cwebdir/common.h
trunk/Build/source/texk/web2c/cwebdir/common.w
trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch
trunk/Build/source/texk/web2c/cwebdir/ctangle.c
trunk/Build/source/texk/web2c/cwebdir/ctangle.w
trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex
trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch
trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
trunk/Build/source/texk/web2c/cwebdir/ctwill.bux
trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex
trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch
trunk/Build/source/texk/web2c/cwebdir/cweave.w
trunk/Build/source/texk/web2c/cwebdir/cweb.1
trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch
trunk/Build/source/texk/web2c/cwebdir/cwebman.tex
trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot
trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po
trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po
trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
trunk/Build/source/texk/web2c/cwebdir/prod-twill.w
trunk/Build/source/texk/web2c/cwebdir/prod.w
trunk/Build/source/texk/web2c/cwebdir/refsort.w
trunk/Build/source/texk/web2c/cwebdir/system.bux
trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex
trunk/Build/source/texk/web2c/cwebdir/twinx.w
trunk/Build/source/texk/web2c/help.h
trunk/Build/source/texk/web2c/man/ChangeLog
trunk/Build/source/texk/web2c/man/ctwill.man
trunk/Build/source/texk/web2c/man/cweb.man
Added Paths:
-----------
trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
trunk/Build/source/texk/web2c/cwebdir/common.bux
trunk/Build/source/texk/web2c/cwebdir/iso_types.w
trunk/Build/source/texk/web2c/cwebdir/refsort.ch
trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
trunk/Build/source/texk/web2c/cwebdir/twinx.ch
Modified: trunk/Build/source/texk/web2c/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/ChangeLog 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/ChangeLog 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,13 @@
+2021-04-16 Andreas Scherer <https://ascherer.github.io>
+
+ * ctangleboot.cin,
+ * cwebboot.cin,
+ * help.h: CWEB release 4.3.
+
+2021-03-24 Andreas Scherer <https://ascherer.github.io>
+
+ * help.h: New options for CTANGLE, CWEAVE and CTWILL.
+
2021-03-23 Karl Berry <karl at tug.org>
* TL'21.
@@ -8,6 +18,11 @@
* doc/webman.tex: add these Knuth files here, since nowhere
else seems better. PDF output for them is in the knuth-pdf package.
+2021-03-06 Andreas Scherer <https://ascherer.github.io>
+
+ * Makefile.in,
+ * am/cweb.am: Patch refsort and twinx with changefiles.
+
2021-02-25 Andreas Scherer <https://ascherer.github.io>
* ctangleboot.cin,
Modified: trunk/Build/source/texk/web2c/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/Makefile.in 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/Makefile.in 2021-04-16 12:49:28 UTC (rev 58884)
@@ -21196,10 +21196,10 @@
$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave cweav-w2c
ctwill.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod-twill.w cwebdir/ctwill-w2c.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave ctwill-w2c ctwill.c
-ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
- $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
-ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
- $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w cwebdir/refsort.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort refsort ctwill-refsort.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w cwebdir/twinx.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx twinx ctwill-twinx.c
tie.c: ctangle$(EXEEXT) tiedir/tie.w tiedir/tie-w2c.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/tiedir $(ctangle) tie.w tie-w2c.ch
ctiedir/ctie.log: ctie$(EXEEXT)
Modified: trunk/Build/source/texk/web2c/am/cweb.am
===================================================================
--- trunk/Build/source/texk/web2c/am/cweb.am 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/am/cweb.am 2021-04-16 12:49:28 UTC (rev 58884)
@@ -25,13 +25,13 @@
DISTCLEANFILES += ctwill.c
nodist_ctwill_refsort_SOURCES = ctwill-refsort.c
-ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
- $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w cwebdir/refsort.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort refsort ctwill-refsort.c
DISTCLEANFILES += ctwill-refsort.c
nodist_ctwill_twinx_SOURCES = ctwill-twinx.c
-ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
- $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w cwebdir/twinx.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx twinx ctwill-twinx.c
DISTCLEANFILES += ctwill-twinx.c
nodist_tie_SOURCES = tie.c
Modified: trunk/Build/source/texk/web2c/ctangleboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/ctangleboot.cin 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/ctangleboot.cin 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
#line 66 "cwebdir/ctangle.w"
/*4:*/
-#line 53 "cwebdir/comm-w2c.h"
+#line 51 "cwebdir/comm-w2c.h"
#ifndef HAVE_GETTEXT
#define HAVE_GETTEXT 0
@@ -25,7 +25,7 @@
/*:4*/
#line 67 "cwebdir/ctangle.w"
-#define banner "This is CTANGLE, Version 4.2" \
+#define banner "This is CTANGLE, Version 4.3" \
\
#define _(S) gettext(S) \
@@ -46,13 +46,19 @@
#define period_ast 026
#define minus_gt_ast 027 \
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) )
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) ) \
+#define compress(c) if(loc++<=limit) return c \
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define isxalpha(c) ((c) =='_'||(c) =='$') \
+
+#define ishigh(c) ((eight_bits) (c) > 0177) \
+ \
+
#define max_include_depth 10 \
#define max_file_name_length 1024
@@ -82,15 +88,12 @@
#define show_progress flags['p']
#define show_stats flags['s']
#define show_happiness flags['h']
-#define temporary_output flags['t']
-#define make_xrefs flags['x'] \
+#define make_xrefs flags['x']
+#define check_for_change flags['c'] \
#define update_terminal fflush(stdout)
#define new_line putchar('\n')
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
-#define C_printf(c,a) fprintf(C_file,c,a)
-#define C_putc(c) putc(c,C_file) \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) \
#define max_bytes 1000000 \
@@ -106,9 +109,11 @@
#define equiv equiv_or_xref \
+#define macro 0
#define section_flag max_texts \
#define string 02
+#define constant 03
#define join 0177
#define output_defs_flag (2*024000-1) \
@@ -128,9 +133,12 @@
#define verbatim 4 \
#define max_files 256
+#define C_printf(c,a) fprintf(C_file,c,a)
+#define C_putc(c) putc(c,C_file) \
+
#define translit_length 10 \
-#define ignore 0
+#define ignore 00
#define ord 0302
#define control_text 0303
#define translit_code 0304
@@ -141,18 +149,10 @@
#define section_name 0311
#define new_section 0312 \
-#define constant 03 \
+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow(_("token") ) ;*tok_ptr++= c;} \
-#define isxalpha(c) ((c) =='_'||(c) =='$') \
+#define keep_digit_separators flags['k'] \
-#define ishigh(c) ((eight_bits) (c) > 0177) \
- \
-
-#define compress(c) if(loc++<=limit) return c \
-
-#define macro 0
-#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow(_("token") ) ;*tok_ptr++= c;} \
-
#define max_banner 50 \
@@ -159,7 +159,7 @@
#line 68 "cwebdir/ctangle.w"
/*3:*/
-#line 35 "cwebdir/comm-w2c.h"
+#line 33 "cwebdir/comm-w2c.h"
typedef bool boolean;
typedef uint8_t eight_bits;
@@ -179,7 +179,7 @@
extern char*id_loc;
/*:5*//*6:*/
-#line 105 "cwebdir/comm-w2c.h"
+#line 109 "cwebdir/comm-w2c.h"
extern char buffer[];
extern char*buffer_end;
@@ -187,7 +187,7 @@
extern char*limit;
/*:6*//*7:*/
-#line 122 "cwebdir/comm-w2c.h"
+#line 126 "cwebdir/comm-w2c.h"
extern int include_depth;
extern FILE*file[];
@@ -204,7 +204,7 @@
extern boolean web_file_open;
/*:7*//*9:*/
-#line 143 "cwebdir/comm-w2c.h"
+#line 147 "cwebdir/comm-w2c.h"
extern sixteen_bits section_count;
extern boolean changed_section[];
@@ -212,7 +212,7 @@
extern boolean print_where;
/*:9*//*10:*/
-#line 157 "cwebdir/comm-w2c.h"
+#line 161 "cwebdir/comm-w2c.h"
typedef struct name_info{
char*byte_start;
@@ -237,12 +237,12 @@
extern hash_pointer h;
/*:10*//*12:*/
-#line 201 "cwebdir/comm-w2c.h"
+#line 205 "cwebdir/comm-w2c.h"
extern int history;
/*:12*//*14:*/
-#line 218 "cwebdir/comm-w2c.h"
+#line 222 "cwebdir/comm-w2c.h"
extern int argc;
extern char**argv;
@@ -254,7 +254,7 @@
extern const char*use_language;
/*:14*//*15:*/
-#line 235 "cwebdir/comm-w2c.h"
+#line 237 "cwebdir/comm-w2c.h"
extern FILE*C_file;
extern FILE*tex_file;
@@ -281,7 +281,7 @@
typedef text*text_pointer;
/*:19*//*31:*/
-#line 269 "cwebdir/ctangle.w"
+#line 273 "cwebdir/ctangle.w"
typedef struct{
eight_bits*end_field;
@@ -306,12 +306,12 @@
static eight_bits*tok_ptr;
/*:20*//*26:*/
-#line 198 "cwebdir/ctangle.w"
+#line 199 "cwebdir/ctangle.w"
static text_pointer last_unnamed;
/*:26*//*32:*/
-#line 285 "cwebdir/ctangle.w"
+#line 289 "cwebdir/ctangle.w"
static output_state cur_state;
@@ -320,18 +320,18 @@
static stack_pointer stack_ptr;
/*:32*//*37:*/
-#line 361 "cwebdir/ctangle.w"
+#line 365 "cwebdir/ctangle.w"
static int cur_val;
/*:37*//*42:*/
-#line 452 "cwebdir/ctangle.w"
+#line 456 "cwebdir/ctangle.w"
static eight_bits out_state;
static boolean protect;
/*:42*//*45:*/
-#line 483 "cwebdir/ctangle.w"
+#line 487 "cwebdir/ctangle.w"
static name_pointer output_files[max_files];
static name_pointer*cur_out_file,*end_output_files,*an_output_file;
@@ -339,33 +339,33 @@
static char output_file_name[longest_name+1];
/*:45*//*52:*/
-#line 582 "cwebdir/ctangle.w"
+#line 584 "cwebdir/ctangle.w"
static boolean output_defs_seen= false;
/*:52*//*57:*/
-#line 691 "cwebdir/ctangle.w"
+#line 696 "cwebdir/ctangle.w"
static char translit[128][translit_length];
/*:57*//*62:*/
-#line 770 "cwebdir/ctangle.w"
+#line 775 "cwebdir/ctangle.w"
static eight_bits ccode[256];
/*:62*//*66:*/
-#line 830 "cwebdir/ctangle.w"
+#line 835 "cwebdir/ctangle.w"
static boolean comment_continues= false;
/*:66*//*68:*/
-#line 869 "cwebdir/ctangle.w"
+#line 872 "cwebdir/ctangle.w"
static name_pointer cur_section_name;
static boolean no_where;
/*:68*//*82:*/
-#line 1182 "cwebdir/ctangle.w"
+#line 1189 "cwebdir/ctangle.w"
static text_pointer cur_text;
static eight_bits next_control;
@@ -374,7 +374,7 @@
#line 71 "cwebdir/ctangle.w"
/*8:*/
-#line 137 "cwebdir/comm-w2c.h"
+#line 141 "cwebdir/comm-w2c.h"
extern boolean get_line(void);
extern void check_complete(void);
@@ -381,12 +381,12 @@
extern void reset_input(void);
/*:8*//*11:*/
-#line 180 "cwebdir/comm-w2c.h"
+#line 184 "cwebdir/comm-w2c.h"
extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
extern name_pointer id_lookup(const char*,const char*,char);
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
extern void init_node(name_pointer);
extern void init_p(name_pointer,eight_bits);
extern void print_prefix_name(name_pointer);
@@ -394,7 +394,7 @@
extern void sprint_section_name(char*,name_pointer);
/*:11*//*13:*/
-#line 204 "cwebdir/comm-w2c.h"
+#line 208 "cwebdir/comm-w2c.h"
extern int wrap_up(void);
extern void err_print(const char*);
@@ -402,7 +402,7 @@
extern void overflow(const char*);
/*:13*//*16:*/
-#line 244 "cwebdir/comm-w2c.h"
+#line 246 "cwebdir/comm-w2c.h"
extern void common_init(void);
extern void print_stats(void);
@@ -409,57 +409,57 @@
extern void cb_show_banner(void);
/*:16*//*30:*/
-#line 241 "cwebdir/ctangle.w"
+#line 245 "cwebdir/ctangle.w"
static void store_two_bytes(sixteen_bits);
/*:30*//*35:*/
-#line 324 "cwebdir/ctangle.w"
+#line 328 "cwebdir/ctangle.w"
static void push_level(name_pointer);
static void pop_level(boolean);
/*:35*//*39:*/
-#line 397 "cwebdir/ctangle.w"
+#line 401 "cwebdir/ctangle.w"
static void get_output(void);
/*:39*//*44:*/
-#line 473 "cwebdir/ctangle.w"
+#line 477 "cwebdir/ctangle.w"
static void flush_buffer(void);
/*:44*//*49:*/
-#line 549 "cwebdir/ctangle.w"
+#line 551 "cwebdir/ctangle.w"
static void phase_two(void);
/*:49*//*53:*/
-#line 585 "cwebdir/ctangle.w"
+#line 587 "cwebdir/ctangle.w"
static void output_defs(void);
static void out_char(eight_bits);
/*:53*//*65:*/
-#line 810 "cwebdir/ctangle.w"
+#line 815 "cwebdir/ctangle.w"
static eight_bits skip_ahead(void);
static boolean skip_comment(boolean);
/*:65*//*70:*/
-#line 924 "cwebdir/ctangle.w"
+#line 922 "cwebdir/ctangle.w"
static eight_bits get_next(void);
/*:70*//*84:*/
-#line 1208 "cwebdir/ctangle.w"
+#line 1215 "cwebdir/ctangle.w"
static void scan_repl(eight_bits);
/*:84*//*91:*/
-#line 1379 "cwebdir/ctangle.w"
+#line 1396 "cwebdir/ctangle.w"
static void scan_section(void);
/*:91*//*99:*/
-#line 1460 "cwebdir/ctangle.w"
+#line 1477 "cwebdir/ctangle.w"
static void phase_one(void);
/*:99*//*101:*/
-#line 1494 "cwebdir/ctangle.w"
+#line 1511 "cwebdir/ctangle.w"
static void skip_limbo(void);
/*:101*/
@@ -488,16 +488,16 @@
init_node(name_dir);
/*:23*//*27:*/
-#line 201 "cwebdir/ctangle.w"
-last_unnamed= text_info;text_info->text_link= 0;
+#line 202 "cwebdir/ctangle.w"
+last_unnamed= text_info;text_info->text_link= macro;
/*:27*//*46:*/
-#line 493 "cwebdir/ctangle.w"
+#line 497 "cwebdir/ctangle.w"
cur_out_file= end_output_files= output_files+max_files;
/*:46*//*58:*/
-#line 694 "cwebdir/ctangle.w"
+#line 699 "cwebdir/ctangle.w"
{
int i;
@@ -505,7 +505,7 @@
}
/*:58*//*63:*/
-#line 773 "cwebdir/ctangle.w"
+#line 778 "cwebdir/ctangle.w"
{
int c;
for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -525,7 +525,7 @@
}
/*:63*//*78:*/
-#line 1103 "cwebdir/ctangle.w"
+#line 1111 "cwebdir/ctangle.w"
section_text[0]= ' ';
/*:78*//*116:*/
@@ -571,7 +571,7 @@
init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
/*:25*//*29:*/
-#line 231 "cwebdir/ctangle.w"
+#line 235 "cwebdir/ctangle.w"
static void
store_two_bytes(
@@ -579,13 +579,13 @@
{
#line 65 "cwebdir/ctang-w2c.ch"
if(tok_ptr+2> tok_mem_end)overflow(_("token"));
-#line 237 "cwebdir/ctangle.w"
+#line 241 "cwebdir/ctangle.w"
*tok_ptr++= x>>8;
*tok_ptr++= x&0377;
}
/*:29*//*34:*/
-#line 309 "cwebdir/ctangle.w"
+#line 313 "cwebdir/ctangle.w"
static void
push_level(
@@ -593,7 +593,7 @@
{
#line 71 "cwebdir/ctang-w2c.ch"
if(stack_ptr==stack_end)overflow(_("stack"));
-#line 315 "cwebdir/ctangle.w"
+#line 319 "cwebdir/ctangle.w"
*stack_ptr= cur_state;
stack_ptr++;
if(p!=NULL){
@@ -604,7 +604,7 @@
}
/*:34*//*36:*/
-#line 332 "cwebdir/ctangle.w"
+#line 336 "cwebdir/ctangle.w"
static void
pop_level(
@@ -620,7 +620,7 @@
}
/*:36*//*38:*/
-#line 368 "cwebdir/ctangle.w"
+#line 372 "cwebdir/ctangle.w"
static void
get_output(void)
@@ -643,7 +643,7 @@
case 0:cur_val= a;out_char(identifier);break;
case 1:if(a==output_defs_flag)output_defs();
else/*40:*/
-#line 402 "cwebdir/ctangle.w"
+#line 406 "cwebdir/ctangle.w"
{
a-= 024000;
@@ -651,7 +651,7 @@
else if(a!=0){
#line 77 "cwebdir/ctang-w2c.ch"
fputs(_("\n! Not present: <"),stdout);
-#line 408 "cwebdir/ctangle.w"
+#line 412 "cwebdir/ctangle.w"
print_section_name(a+name_dir);err_print(">");
}
@@ -659,7 +659,7 @@
}
/*:40*/
-#line 389 "cwebdir/ctangle.w"
+#line 393 "cwebdir/ctangle.w"
break;
default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
@@ -669,7 +669,7 @@
}
/*:38*//*43:*/
-#line 460 "cwebdir/ctangle.w"
+#line 464 "cwebdir/ctangle.w"
static void
flush_buffer(void)
@@ -676,7 +676,7 @@
{
C_putc('\n');
if(cur_line%100==0&&show_progress){
-printf(".");
+putchar('.');
if(cur_line%500==0)printf("%d",cur_line);
update_terminal;
}
@@ -684,7 +684,7 @@
}
/*:43*//*48:*/
-#line 514 "cwebdir/ctangle.w"
+#line 516 "cwebdir/ctangle.w"
static void
phase_two(void){
@@ -691,27 +691,27 @@
web_file_open= false;
cur_line= 1;
/*33:*/
-#line 298 "cwebdir/ctangle.w"
+#line 302 "cwebdir/ctangle.w"
stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
/*:33*/
-#line 519 "cwebdir/ctangle.w"
+#line 521 "cwebdir/ctangle.w"
/*51:*/
-#line 578 "cwebdir/ctangle.w"
+#line 580 "cwebdir/ctangle.w"
if(!output_defs_seen)
output_defs();
/*:51*/
-#line 520 "cwebdir/ctangle.w"
+#line 522 "cwebdir/ctangle.w"
-if(text_info->text_link==0&&cur_out_file==end_output_files){
+if(text_info->text_link==macro&&cur_out_file==end_output_files){
#line 89 "cwebdir/ctang-w2c.ch"
fputs(_("\n! No program text was specified."),stdout);mark_harmless;
-#line 523 "cwebdir/ctangle.w"
+#line 525 "cwebdir/ctangle.w"
}
else{
@@ -719,18 +719,18 @@
if(show_progress)
#line 95 "cwebdir/ctang-w2c.ch"
printf(_("\nWriting the output file (%s):"),C_file_name);
-#line 529 "cwebdir/ctangle.w"
+#line 531 "cwebdir/ctangle.w"
}
else{
if(show_progress){
#line 101 "cwebdir/ctang-w2c.ch"
fputs(_("\nWriting the output files:"),stdout);
-#line 533 "cwebdir/ctangle.w"
+#line 535 "cwebdir/ctangle.w"
printf(" (%s)",C_file_name);
update_terminal;
}
-if(text_info->text_link==0)goto writeloop;
+if(text_info->text_link==macro)goto writeloop;
}
while(stack_ptr> stack)get_output();
flush_buffer();
@@ -752,7 +752,7 @@
fatal(_("! Cannot open output file "),check_file_name);
-if(temporary_output)/*107:*/
+if(check_for_change)/*107:*/
#line 378 "cwebdir/ctang-w2c.ch"
do{
@@ -927,7 +927,7 @@
fatal(_("! Cannot open output file "),check_file_name);
-if(temporary_output)/*107:*/
+if(check_for_change)/*107:*/
#line 378 "cwebdir/ctang-w2c.ch"
do{
@@ -969,22 +969,22 @@
}
strcpy(check_file_name,"");
-#line 573 "cwebdir/ctangle.w"
+#line 575 "cwebdir/ctangle.w"
/*:50*/
-#line 541 "cwebdir/ctangle.w"
+#line 543 "cwebdir/ctangle.w"
if(show_happiness){
if(show_progress)new_line;
#line 107 "cwebdir/ctang-w2c.ch"
fputs(_("Done."),stdout);
-#line 545 "cwebdir/ctangle.w"
+#line 547 "cwebdir/ctangle.w"
}
}
}
/*:48*//*54:*/
-#line 589 "cwebdir/ctangle.w"
+#line 594 "cwebdir/ctangle.w"
static void
output_defs(void)
@@ -992,7 +992,7 @@
sixteen_bits a;
push_level(NULL);
for(cur_text= text_info+1;cur_text<text_ptr;cur_text++)
-if(cur_text->text_link==0){
+if(cur_text->text_link==macro){
cur_byte= cur_text->tok_start;
cur_end= (cur_text+1)->tok_start;
C_printf("%s","#define ");
@@ -1011,8 +1011,8 @@
cur_val= a;out_char(identifier);
}
#line 159 "cwebdir/ctang-w2c.ch"
-else if(a<050000){confusion(_("macro defs have strange char"));}
-#line 615 "cwebdir/ctangle.w"
+else if(a<050000)confusion(_("macro defs have strange char"));
+#line 620 "cwebdir/ctangle.w"
else{
cur_val= a-050000;cur_section= cur_val;out_char(section_number);
}
@@ -1026,7 +1026,7 @@
}
/*:54*//*55:*/
-#line 632 "cwebdir/ctangle.w"
+#line 637 "cwebdir/ctangle.w"
static void
out_char(
@@ -1039,7 +1039,7 @@
if(protect||out_state==verbatim)C_putc('\\');
flush_buffer();if(out_state!=verbatim)out_state= normal;break;
/*59:*/
-#line 700 "cwebdir/ctangle.w"
+#line 705 "cwebdir/ctangle.w"
case identifier:
if(out_state==num_or_id)C_putc(' ');
@@ -1054,10 +1054,10 @@
out_state= num_or_id;break;
/*:59*/
-#line 643 "cwebdir/ctangle.w"
+#line 648 "cwebdir/ctangle.w"
/*60:*/
-#line 713 "cwebdir/ctangle.w"
+#line 718 "cwebdir/ctangle.w"
case section_number:
if(cur_val> 0)C_printf("/*%d:*/",cur_val);
@@ -1079,15 +1079,15 @@
if(*j=='\\'||*j=='"')C_putc('\\');
C_putc(*j);
}
-C_printf("%s","\"\n");
+C_putc('"');C_putc('\n');
}
break;
/*:60*/
-#line 644 "cwebdir/ctangle.w"
+#line 649 "cwebdir/ctangle.w"
/*56:*/
-#line 662 "cwebdir/ctangle.w"
+#line 667 "cwebdir/ctangle.w"
case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
@@ -1108,7 +1108,7 @@
break;
/*:56*/
-#line 645 "cwebdir/ctangle.w"
+#line 650 "cwebdir/ctangle.w"
case'=':case'>':C_putc(cur_char);C_putc(' ');
out_state= normal;break;
@@ -1127,7 +1127,7 @@
}
/*:55*//*64:*/
-#line 794 "cwebdir/ctangle.w"
+#line 799 "cwebdir/ctangle.w"
static eight_bits
skip_ahead(void)
@@ -1145,7 +1145,7 @@
}
/*:64*//*67:*/
-#line 833 "cwebdir/ctangle.w"
+#line 838 "cwebdir/ctangle.w"
static boolean skip_comment(
boolean is_long_comment)
@@ -1158,7 +1158,7 @@
else{
#line 165 "cwebdir/ctang-w2c.ch"
err_print(_("! Input ended in mid-comment"));
-#line 844 "cwebdir/ctangle.w"
+#line 849 "cwebdir/ctangle.w"
return comment_continues= false;
}
@@ -1173,7 +1173,7 @@
if(ccode[(eight_bits)*loc]==new_section){
#line 171 "cwebdir/ctang-w2c.ch"
err_print(_("! Section name ended in mid-comment"));loc--;
-#line 857 "cwebdir/ctangle.w"
+#line 862 "cwebdir/ctangle.w"
return comment_continues= false;
}
@@ -1183,22 +1183,23 @@
}
/*:67*//*69:*/
-#line 881 "cwebdir/ctangle.w"
+#line 879 "cwebdir/ctangle.w"
static eight_bits
get_next(void)
{
-static int preprocessing= 0;
+static boolean preprocessing= false;
eight_bits c;
while(true){
if(loc> limit){
-if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
+if(preprocessing&&*(limit-1)!='\\')preprocessing= false;
if(get_line()==false)return new_section;
else if(print_where&&!no_where){
print_where= false;
/*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1210,9 +1211,10 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 893 "cwebdir/ctangle.w"
+#line 891 "cwebdir/ctangle.w"
}
else return'\n';
@@ -1226,24 +1228,33 @@
}
loc++;
if(xisdigit(c)||c=='.')/*73:*/
-#line 964 "cwebdir/ctangle.w"
+#line 963 "cwebdir/ctangle.w"
{
+boolean hex_flag= false;
id_first= loc-1;
if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
if(*id_first=='0'){
if(*loc=='x'||*loc=='X'){
-loc++;while(xisxdigit(*loc))loc++;goto found;
+hex_flag= true;
+loc++;while(xisxdigit(*loc)||*loc=='\'')loc++;
}
+else if(*loc=='b'||*loc=='B'){
+loc++;while(*loc=='0'||*loc=='1'||*loc=='\'')loc++;goto found;
}
-while(xisdigit(*loc))loc++;
+}
+while(xisdigit(*loc)||*loc=='\'')loc++;
if(*loc=='.'){
loc++;
-while(xisdigit(*loc))loc++;
+while((hex_flag&&xisxdigit(*loc))||xisdigit(*loc)||*loc=='\'')loc++;
}
if(*loc=='e'||*loc=='E'){
if(*++loc=='+'||*loc=='-')loc++;
-while(xisdigit(*loc))loc++;
+while(xisdigit(*loc)||*loc=='\'')loc++;
}
+else if(hex_flag&&(*loc=='p'||*loc=='P')){
+if(*++loc=='+'||*loc=='-')loc++;
+while(xisxdigit(*loc)||*loc=='\'')loc++;
+}
found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'
||*loc=='f'||*loc=='F')loc++;
id_loc= loc;
@@ -1251,19 +1262,19 @@
}
/*:73*/
-#line 905 "cwebdir/ctangle.w"
+#line 903 "cwebdir/ctangle.w"
else if(c=='\''||c=='"'
||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
/*74:*/
-#line 992 "cwebdir/ctangle.w"
+#line 1000 "cwebdir/ctangle.w"
{
char delim= c;
id_first= section_text+1;
id_loc= section_text;*++id_loc= delim;
if(delim=='L'||delim=='u'||delim=='U'){
-if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
+if(delim=='u'&&*loc=='8')*++id_loc= *loc++;
delim= *loc++;*++id_loc= delim;
}
while(true){
@@ -1271,13 +1282,13 @@
if(*(limit-1)!='\\'){
#line 177 "cwebdir/ctang-w2c.ch"
err_print(_("! String didn't end"));loc= limit;break;
-#line 1004 "cwebdir/ctangle.w"
+#line 1012 "cwebdir/ctangle.w"
}
if(get_line()==false){
#line 183 "cwebdir/ctang-w2c.ch"
err_print(_("! Input ended in middle of string"));loc= buffer;break;
-#line 1008 "cwebdir/ctangle.w"
+#line 1016 "cwebdir/ctangle.w"
}
else if(++id_loc<=section_text_end)*id_loc= '\n';
@@ -1297,7 +1308,7 @@
if(id_loc>=section_text_end){
#line 189 "cwebdir/ctang-w2c.ch"
fputs(_("\n! String too long: "),stdout);
-#line 1026 "cwebdir/ctangle.w"
+#line 1034 "cwebdir/ctangle.w"
term_write(section_text+1,25);
err_print("...");
@@ -1307,30 +1318,31 @@
}
/*:74*/
-#line 909 "cwebdir/ctangle.w"
+#line 907 "cwebdir/ctangle.w"
else if(isalpha(c)||isxalpha(c)||ishigh(c))
/*72:*/
-#line 957 "cwebdir/ctangle.w"
+#line 954 "cwebdir/ctangle.w"
{
id_first= --loc;
-while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+do{
+++loc;
+}while(isalpha((eight_bits)*loc)||isdigit((eight_bits)*loc)
||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
id_loc= loc;return identifier;
}
/*:72*/
-#line 911 "cwebdir/ctangle.w"
+#line 909 "cwebdir/ctangle.w"
else if(c=='@')/*75:*/
-#line 1037 "cwebdir/ctangle.w"
+#line 1045 "cwebdir/ctangle.w"
{
-c= ccode[(eight_bits)*loc++];
-switch(c){
+switch(c= ccode[(eight_bits)*loc++]){
case ignore:continue;
#line 195 "cwebdir/ctang-w2c.ch"
case translit_code:err_print(_("! Use @l in limbo only"));continue;
-#line 1042 "cwebdir/ctangle.w"
+#line 1049 "cwebdir/ctangle.w"
case control_text:while((c= skip_ahead())=='@');
@@ -1337,17 +1349,17 @@
if(*(loc-1)!='>')
#line 201 "cwebdir/ctang-w2c.ch"
err_print(_("! Double @ should be used in control text"));
-#line 1047 "cwebdir/ctangle.w"
+#line 1054 "cwebdir/ctangle.w"
continue;
case section_name:
cur_section_name_char= *(loc-1);
/*77:*/
-#line 1085 "cwebdir/ctangle.w"
+#line 1091 "cwebdir/ctangle.w"
{
char*k;
/*79:*/
-#line 1105 "cwebdir/ctangle.w"
+#line 1113 "cwebdir/ctangle.w"
k= section_text;
while(true){
@@ -1354,13 +1366,13 @@
if(loc> limit&&get_line()==false){
#line 219 "cwebdir/ctang-w2c.ch"
err_print(_("! Input ended in section name"));
-#line 1110 "cwebdir/ctangle.w"
+#line 1118 "cwebdir/ctangle.w"
loc= buffer+1;break;
}
c= *loc;
/*80:*/
-#line 1129 "cwebdir/ctangle.w"
+#line 1137 "cwebdir/ctangle.w"
if(c=='@'){
c= *(loc+1);
@@ -1370,13 +1382,13 @@
if(ccode[(eight_bits)c]==new_section){
#line 231 "cwebdir/ctang-w2c.ch"
err_print(_("! Section name didn't end"));break;
-#line 1137 "cwebdir/ctangle.w"
+#line 1145 "cwebdir/ctangle.w"
}
if(ccode[(eight_bits)c]==section_name){
#line 237 "cwebdir/ctang-w2c.ch"
err_print(_("! Nesting of section names not allowed"));break;
-#line 1141 "cwebdir/ctangle.w"
+#line 1149 "cwebdir/ctangle.w"
}
*(++k)= '@';loc++;
@@ -1383,7 +1395,7 @@
}
/*:80*/
-#line 1114 "cwebdir/ctangle.w"
+#line 1122 "cwebdir/ctangle.w"
loc++;if(k<section_text_end)k++;
if(xisspace(c)){
@@ -1394,7 +1406,7 @@
if(k>=section_text_end){
#line 225 "cwebdir/ctang-w2c.ch"
fputs(_("\n! Section name too long: "),stdout);
-#line 1123 "cwebdir/ctangle.w"
+#line 1131 "cwebdir/ctangle.w"
term_write(section_text+1,25);
printf("...");mark_harmless;
@@ -1402,14 +1414,16 @@
if(*k==' '&&k> section_text)k--;
/*:79*/
-#line 1087 "cwebdir/ctangle.w"
+#line 1093 "cwebdir/ctangle.w"
if(k-section_text> 3&&strncmp(k-2,"...",3)==0)
-cur_section_name= section_lookup(section_text+1,k-3,1);
-else cur_section_name= section_lookup(section_text+1,k,0);
+cur_section_name= section_lookup(section_text+1,k-3,true);
+
+else cur_section_name= section_lookup(section_text+1,k,false);
+
if(cur_section_name_char=='(')
/*47:*/
-#line 497 "cwebdir/ctangle.w"
+#line 501 "cwebdir/ctangle.w"
{
for(an_output_file= cur_out_file;
@@ -1418,31 +1432,29 @@
if(an_output_file==end_output_files){
if(cur_out_file> output_files)
*--cur_out_file= cur_section_name;
-else{
#line 83 "cwebdir/ctang-w2c.ch"
-overflow(_("output files"));
-#line 507 "cwebdir/ctangle.w"
+else overflow(_("output files"));
+#line 510 "cwebdir/ctangle.w"
}
}
-}
/*:47*/
-#line 1093 "cwebdir/ctangle.w"
+#line 1101 "cwebdir/ctangle.w"
return section_name;
}
/*:77*/
-#line 1051 "cwebdir/ctangle.w"
+#line 1058 "cwebdir/ctangle.w"
case string:/*81:*/
-#line 1151 "cwebdir/ctangle.w"
+#line 1159 "cwebdir/ctangle.w"
{
id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
while(*loc!='@'||*(loc+1)!='>')loc++;
#line 243 "cwebdir/ctang-w2c.ch"
if(loc>=limit)err_print(_("! Verbatim string didn't end"));
-#line 1155 "cwebdir/ctangle.w"
+#line 1163 "cwebdir/ctangle.w"
id_loc= loc;loc+= 2;
return string;
@@ -1449,21 +1461,20 @@
}
/*:81*/
-#line 1052 "cwebdir/ctangle.w"
+#line 1059 "cwebdir/ctangle.w"
case ord:/*76:*/
-#line 1064 "cwebdir/ctangle.w"
+#line 1071 "cwebdir/ctangle.w"
id_first= loc;
-if(*loc=='\\'){
+if(*loc=='\\')
if(*++loc=='\'')loc++;
-}
while(*loc!='\''){
if(*loc=='@'){
if(*(loc+1)!='@')
#line 207 "cwebdir/ctang-w2c.ch"
err_print(_("! Double @ should be used in ASCII constant"));
-#line 1073 "cwebdir/ctangle.w"
+#line 1079 "cwebdir/ctangle.w"
else loc++;
}
@@ -1471,7 +1482,7 @@
if(loc> limit){
#line 213 "cwebdir/ctang-w2c.ch"
err_print(_("! String didn't end"));loc= limit-1;break;
-#line 1079 "cwebdir/ctangle.w"
+#line 1085 "cwebdir/ctangle.w"
}
}
@@ -1479,7 +1490,7 @@
return ord;
/*:76*/
-#line 1053 "cwebdir/ctangle.w"
+#line 1060 "cwebdir/ctangle.w"
default:return c;
}
@@ -1486,7 +1497,7 @@
}
/*:75*/
-#line 912 "cwebdir/ctangle.w"
+#line 910 "cwebdir/ctangle.w"
else if(xisspace(c)){
if(!preprocessing||loc> limit)continue;
@@ -1493,20 +1504,21 @@
else return' ';
}
-else if(c=='#'&&loc==buffer+1)preprocessing= 1;
+else if(c=='#'&&loc==buffer+1)preprocessing= true;
mistake:/*71:*/
-#line 935 "cwebdir/ctangle.w"
+#line 931 "cwebdir/ctangle.w"
switch(c){
case'+':if(*loc=='+')compress(plus_plus);break;
case'-':if(*loc=='-'){compress(minus_minus);}
-else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
-else compress(minus_gt);}}break;
+else if(*loc=='>'){
+if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
+else compress(minus_gt);
+}break;
case'.':if(*loc=='*'){compress(period_ast);}
else if(*loc=='.'&&*(loc+1)=='.'){
loc++;compress(dot_dot_dot);
-}
-break;
+}break;
case':':if(*loc==':')compress(colon_colon);break;
case'=':if(*loc=='=')compress(eq_eq);break;
case'>':if(*loc=='='){compress(gt_eq);}
@@ -1519,7 +1531,7 @@
}
/*:71*/
-#line 919 "cwebdir/ctangle.w"
+#line 917 "cwebdir/ctangle.w"
return c;
}
@@ -1526,7 +1538,7 @@
}
/*:69*//*83:*/
-#line 1186 "cwebdir/ctangle.w"
+#line 1193 "cwebdir/ctangle.w"
static void
scan_repl(
@@ -1533,9 +1545,10 @@
eight_bits t)
{
sixteen_bits a;
-if(t==section_name){/*85:*/
-#line 1214 "cwebdir/ctangle.w"
+if(t==section_name)/*85:*/
+#line 1221 "cwebdir/ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1547,13 +1560,14 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1192 "cwebdir/ctangle.w"
-}
+#line 1199 "cwebdir/ctangle.w"
+
while(true)switch(a= get_next()){
/*86:*/
-#line 1227 "cwebdir/ctangle.w"
+#line 1236 "cwebdir/ctangle.w"
case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
app_repl((a/0400)+0200);
@@ -1561,7 +1575,7 @@
case section_name:if(t!=section_name)goto done;
else{
/*87:*/
-#line 1260 "cwebdir/ctangle.w"
+#line 1269 "cwebdir/ctangle.w"
{
char*try_loc= loc;
while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1569,7 +1583,7 @@
while(*try_loc==' '&&try_loc<limit)try_loc++;
#line 273 "cwebdir/ctang-w2c.ch"
if(*try_loc=='=')err_print(_("! Missing `@ ' before a named section"));
-#line 1266 "cwebdir/ctangle.w"
+#line 1275 "cwebdir/ctangle.w"
@@ -1576,14 +1590,15 @@
}
/*:87*/
-#line 1233 "cwebdir/ctangle.w"
+#line 1242 "cwebdir/ctangle.w"
a= cur_section_name-name_dir;
app_repl((a/0400)+0250);
app_repl(a%0400);
/*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1595,14 +1610,15 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1237 "cwebdir/ctangle.w"
+#line 1246 "cwebdir/ctangle.w"
break;
}
#line 261 "cwebdir/ctang-w2c.ch"
case output_defs_code:if(t!=section_name)err_print(_("! Misplaced @h"));
-#line 1240 "cwebdir/ctangle.w"
+#line 1249 "cwebdir/ctangle.w"
else{
output_defs_seen= true;
@@ -1610,8 +1626,9 @@
app_repl((a/0400)+0200);
app_repl(a%0400);
/*85:*/
-#line 1214 "cwebdir/ctangle.w"
+#line 1221 "cwebdir/ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1623,15 +1640,16 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1246 "cwebdir/ctangle.w"
+#line 1255 "cwebdir/ctangle.w"
}
break;
case constant:case string:
/*88:*/
-#line 1271 "cwebdir/ctangle.w"
+#line 1286 "cwebdir/ctangle.w"
app_repl(a);
while(id_first<id_loc){
@@ -1639,19 +1657,21 @@
if(*(id_first+1)=='@')id_first++;
#line 279 "cwebdir/ctang-w2c.ch"
else err_print(_("! Double @ should be used in string"));
-#line 1277 "cwebdir/ctangle.w"
+#line 1292 "cwebdir/ctangle.w"
}
+else if(a==constant&&*id_first=='\''&&!keep_digit_separators)
+id_first++;
app_repl(*id_first++);
}
app_repl(a);break;
/*:88*/
-#line 1250 "cwebdir/ctangle.w"
+#line 1259 "cwebdir/ctangle.w"
case ord:
/*89:*/
-#line 1287 "cwebdir/ctangle.w"
+#line 1304 "cwebdir/ctangle.w"
{
int c= (eight_bits)*id_first;
if(c=='\\'){
@@ -1690,7 +1710,7 @@
case'\"':c= '\"';break;
#line 285 "cwebdir/ctang-w2c.ch"
default:err_print(_("! Unrecognized escape sequence"));
-#line 1324 "cwebdir/ctangle.w"
+#line 1341 "cwebdir/ctangle.w"
}
}
@@ -1704,19 +1724,19 @@
break;
/*:89*/
-#line 1252 "cwebdir/ctangle.w"
+#line 1261 "cwebdir/ctangle.w"
case definition:case format_code:case begin_C:if(t!=section_name)goto done;
else{
#line 267 "cwebdir/ctang-w2c.ch"
err_print(_("! @d, @f and @c are ignored in C text"));continue;
-#line 1256 "cwebdir/ctangle.w"
+#line 1265 "cwebdir/ctangle.w"
}
case new_section:goto done;
/*:86*/
-#line 1197 "cwebdir/ctangle.w"
+#line 1204 "cwebdir/ctangle.w"
case')':app_repl(a);
if(t==macro)app_repl(' ');
@@ -1726,12 +1746,12 @@
done:next_control= (eight_bits)a;
#line 255 "cwebdir/ctang-w2c.ch"
if(text_ptr> text_info_end)overflow(_("text"));
-#line 1205 "cwebdir/ctangle.w"
+#line 1212 "cwebdir/ctangle.w"
cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
}
/*:83*//*90:*/
-#line 1346 "cwebdir/ctangle.w"
+#line 1363 "cwebdir/ctangle.w"
static void
scan_section(void)
@@ -1743,10 +1763,10 @@
if(*(loc-1)=='*'&&show_progress){
printf("*%d",section_count);update_terminal;
}
-next_control= 0;
+next_control= ignore;
while(true){
/*92:*/
-#line 1387 "cwebdir/ctangle.w"
+#line 1404 "cwebdir/ctangle.w"
while(next_control<definition)
@@ -1755,17 +1775,17 @@
}
/*:92*/
-#line 1360 "cwebdir/ctangle.w"
+#line 1377 "cwebdir/ctangle.w"
if(next_control==definition){
/*93:*/
-#line 1394 "cwebdir/ctangle.w"
+#line 1411 "cwebdir/ctangle.w"
{
while((next_control= get_next())=='\n');
if(next_control!=identifier){
#line 291 "cwebdir/ctang-w2c.ch"
err_print(_("! Definition flushed, must start with identifier"));
-#line 1398 "cwebdir/ctangle.w"
+#line 1415 "cwebdir/ctangle.w"
continue;
}
@@ -1780,7 +1800,7 @@
}
/*:93*/
-#line 1362 "cwebdir/ctangle.w"
+#line 1379 "cwebdir/ctangle.w"
continue;
}
@@ -1790,7 +1810,7 @@
if(next_control==section_name){
p= cur_section_name;
/*94:*/
-#line 1419 "cwebdir/ctangle.w"
+#line 1436 "cwebdir/ctangle.w"
while((next_control= get_next())=='+');
if(next_control!='='&&next_control!=eq_eq)
@@ -1797,7 +1817,7 @@
continue;
/*:94*/
-#line 1370 "cwebdir/ctangle.w"
+#line 1387 "cwebdir/ctangle.w"
break;
}
@@ -1805,22 +1825,22 @@
}
no_where= print_where= false;
/*95:*/
-#line 1424 "cwebdir/ctangle.w"
+#line 1441 "cwebdir/ctangle.w"
/*96:*/
-#line 1429 "cwebdir/ctangle.w"
+#line 1446 "cwebdir/ctangle.w"
store_two_bytes((sixteen_bits)(0150000+section_count));
/*:96*/
-#line 1425 "cwebdir/ctangle.w"
+#line 1442 "cwebdir/ctangle.w"
scan_repl(section_name);
/*97:*/
-#line 1433 "cwebdir/ctangle.w"
+#line 1450 "cwebdir/ctangle.w"
-if(p==name_dir||p==0){
+if(p==name_dir||p==NULL){
(last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
}
else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
@@ -1835,16 +1855,16 @@
/*:97*/
-#line 1427 "cwebdir/ctangle.w"
+#line 1444 "cwebdir/ctangle.w"
/*:95*/
-#line 1376 "cwebdir/ctangle.w"
+#line 1393 "cwebdir/ctangle.w"
}
/*:90*//*98:*/
-#line 1448 "cwebdir/ctangle.w"
+#line 1465 "cwebdir/ctangle.w"
static void
phase_one(void){
@@ -1858,7 +1878,7 @@
}
/*:98*//*100:*/
-#line 1465 "cwebdir/ctangle.w"
+#line 1482 "cwebdir/ctangle.w"
static void
skip_limbo(void)
@@ -1873,7 +1893,7 @@
if(ccode[(eight_bits)c]==new_section)break;
switch(ccode[(eight_bits)c]){
case translit_code:/*102:*/
-#line 1496 "cwebdir/ctangle.w"
+#line 1513 "cwebdir/ctangle.w"
while(xisspace(*loc)&&loc<limit)loc++;
loc+= 3;
@@ -1881,7 +1901,7 @@
||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))
#line 309 "cwebdir/ctang-w2c.ch"
err_print(_("! Improper hex number following @l"));
-#line 1502 "cwebdir/ctangle.w"
+#line 1519 "cwebdir/ctangle.w"
else{
unsigned int i;
@@ -1893,7 +1913,7 @@
if(loc-beg>=translit_length)
#line 315 "cwebdir/ctang-w2c.ch"
err_print(_("! Replacement string in @l too long"));
-#line 1512 "cwebdir/ctangle.w"
+#line 1529 "cwebdir/ctangle.w"
else{
strncpy(translit[i-0200],beg,(size_t)(loc-beg));
@@ -1902,7 +1922,7 @@
}
/*:102*/
-#line 1478 "cwebdir/ctangle.w"
+#line 1495 "cwebdir/ctangle.w"
break;
case format_code:case'@':break;
case control_text:if(c=='q'||c=='Q'){
@@ -1910,13 +1930,13 @@
if(*(loc-1)!='>')
#line 297 "cwebdir/ctang-w2c.ch"
err_print(_("! Double @ should be used in control text"));
-#line 1484 "cwebdir/ctangle.w"
+#line 1501 "cwebdir/ctangle.w"
break;
}
#line 303 "cwebdir/ctang-w2c.ch"
default:err_print(_("! Double @ should be used in limbo"));
-#line 1488 "cwebdir/ctangle.w"
+#line 1505 "cwebdir/ctangle.w"
}
}
@@ -1924,7 +1944,7 @@
}
/*:100*//*103:*/
-#line 1522 "cwebdir/ctangle.w"
+#line 1539 "cwebdir/ctangle.w"
void
print_stats(void){
@@ -1937,7 +1957,7 @@
printf(_("%ld bytes (out of %ld)\n"),
(ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
printf(_("%ld tokens (out of %ld)\n"),
-#line 1533 "cwebdir/ctangle.w"
+#line 1550 "cwebdir/ctangle.w"
(ptrdiff_t)(tok_ptr-tok_mem),(long)max_toks);
}
Modified: trunk/Build/source/texk/web2c/cwebboot.cin
===================================================================
--- trunk/Build/source/texk/web2c/cwebboot.cin 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebboot.cin 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
/*1:*/
-#line 66 "cwebdir/common.w"
+#line 62 "cwebdir/common.w"
/*3:*/
-#line 53 "cwebdir/comm-w2c.h"
+#line 51 "cwebdir/comm-w2c.h"
#ifndef HAVE_GETTEXT
#define HAVE_GETTEXT 0
@@ -23,7 +23,7 @@
#include <string.h>
/*:3*//*89:*/
-#line 709 "cwebdir/comm-w2c.ch"
+#line 712 "cwebdir/comm-w2c.ch"
#if HAVE_GETTEXT
#include <locale.h>
@@ -34,7 +34,7 @@
#endif
/*:89*//*91:*/
-#line 756 "cwebdir/comm-w2c.ch"
+#line 759 "cwebdir/comm-w2c.ch"
typedef bool boolean;
#define HAVE_BOOLEAN
@@ -44,13 +44,13 @@
#include <lib/lib.h>
/*:91*//*94:*/
-#line 795 "cwebdir/comm-w2c.ch"
+#line 798 "cwebdir/comm-w2c.ch"
#define CWEB
#include "help.h"
/*:94*/
-#line 67 "cwebdir/common.w"
+#line 63 "cwebdir/common.w"
#define _(S) gettext(S) \
@@ -70,13 +70,19 @@
#define period_ast 026
#define minus_gt_ast 027 \
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) )
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) ) \
+#define compress(c) if(loc++<=limit) return c \
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define isxalpha(c) ((c) =='_'||(c) =='$') \
+
+#define ishigh(c) ((eight_bits) (c) > 0177) \
+ \
+
#define max_include_depth 10 \
#define max_file_name_length 1024
@@ -106,15 +112,12 @@
#define show_progress flags['p']
#define show_stats flags['s']
#define show_happiness flags['h']
-#define temporary_output flags['t']
-#define make_xrefs flags['x'] \
+#define make_xrefs flags['x']
+#define check_for_change flags['c'] \
#define update_terminal fflush(stdout)
#define new_line putchar('\n')
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
-#define C_printf(c,a) fprintf(C_file,c,a)
-#define C_putc(c) putc(c,C_file) \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) \
#define max_bytes 1000000 \
@@ -131,7 +134,8 @@
#define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) ) \
-#define if_section_start_make_pending(b) {*limit= '!'; \
+#define if_section_start_make_pending(b) { \
+*limit= '!'; \
for(loc= buffer;xisspace(*loc) ;loc++) ; \
*limit= ' '; \
if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
@@ -171,10 +175,10 @@
#define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true) \
-#line 68 "cwebdir/common.w"
+#line 64 "cwebdir/common.w"
/*2:*/
-#line 35 "cwebdir/comm-w2c.h"
+#line 33 "cwebdir/comm-w2c.h"
typedef bool boolean;
typedef uint8_t eight_bits;
@@ -194,7 +198,7 @@
extern char*id_loc;
/*:4*//*5:*/
-#line 105 "cwebdir/comm-w2c.h"
+#line 109 "cwebdir/comm-w2c.h"
extern char buffer[];
extern char*buffer_end;
@@ -202,7 +206,7 @@
extern char*limit;
/*:5*//*6:*/
-#line 122 "cwebdir/comm-w2c.h"
+#line 126 "cwebdir/comm-w2c.h"
extern int include_depth;
extern FILE*file[];
@@ -219,7 +223,7 @@
extern boolean web_file_open;
/*:6*//*8:*/
-#line 143 "cwebdir/comm-w2c.h"
+#line 147 "cwebdir/comm-w2c.h"
extern sixteen_bits section_count;
extern boolean changed_section[];
@@ -227,7 +231,7 @@
extern boolean print_where;
/*:8*//*9:*/
-#line 157 "cwebdir/comm-w2c.h"
+#line 161 "cwebdir/comm-w2c.h"
typedef struct name_info{
char*byte_start;
@@ -252,12 +256,12 @@
extern hash_pointer h;
/*:9*//*11:*/
-#line 201 "cwebdir/comm-w2c.h"
+#line 205 "cwebdir/comm-w2c.h"
extern int history;
/*:11*//*13:*/
-#line 218 "cwebdir/comm-w2c.h"
+#line 222 "cwebdir/comm-w2c.h"
extern int argc;
extern char**argv;
@@ -269,7 +273,7 @@
extern const char*use_language;
/*:13*//*14:*/
-#line 235 "cwebdir/comm-w2c.h"
+#line 237 "cwebdir/comm-w2c.h"
extern FILE*C_file;
extern FILE*tex_file;
@@ -279,22 +283,22 @@
extern FILE*check_file;
/*:14*/
-#line 69 "cwebdir/common.w"
+#line 65 "cwebdir/common.w"
/*18:*/
-#line 83 "cwebdir/common.w"
+#line 79 "cwebdir/common.w"
#line 72 "cwebdir/comm-w2c.ch"
cweb program;
-#line 85 "cwebdir/common.w"
+#line 81 "cwebdir/common.w"
/*:18*//*19:*/
-#line 92 "cwebdir/common.w"
+#line 88 "cwebdir/common.w"
int phase;
/*:19*//*21:*/
-#line 130 "cwebdir/common.w"
+#line 126 "cwebdir/common.w"
char section_text[longest_name+1];
char*section_text_end= section_text+longest_name;
@@ -302,7 +306,7 @@
char*id_loc;
/*:21*//*22:*/
-#line 150 "cwebdir/common.w"
+#line 146 "cwebdir/common.w"
char buffer[long_buf_size];
char*buffer_end= buffer+buf_size-2;
@@ -310,7 +314,7 @@
char*limit= buffer;
/*:22*//*25:*/
-#line 194 "cwebdir/common.w"
+#line 190 "cwebdir/common.w"
int include_depth;
FILE*file[max_include_depth];
@@ -318,7 +322,7 @@
char file_name[max_include_depth][max_file_name_length];
char change_file_name[max_file_name_length];
-#line 202 "cwebdir/common.w"
+#line 198 "cwebdir/common.w"
int line[max_include_depth];
int change_line;
int change_depth;
@@ -327,13 +331,13 @@
boolean web_file_open= false;
/*:25*//*26:*/
-#line 220 "cwebdir/common.w"
+#line 216 "cwebdir/common.w"
static char change_buffer[buf_size];
static char*change_limit;
/*:26*//*37:*/
-#line 399 "cwebdir/common.w"
+#line 396 "cwebdir/common.w"
sixteen_bits section_count;
boolean changed_section[max_sections];
@@ -342,7 +346,7 @@
boolean print_where= false;
/*:37*//*43:*/
-#line 596 "cwebdir/common.w"
+#line 593 "cwebdir/common.w"
char byte_mem[max_bytes];
char*byte_mem_end= byte_mem+max_bytes-1;
@@ -350,13 +354,13 @@
name_pointer name_dir_end= name_dir+max_names-1;
/*:43*//*44:*/
-#line 607 "cwebdir/common.w"
+#line 604 "cwebdir/common.w"
char*byte_ptr;
name_pointer name_ptr;
/*:44*//*46:*/
-#line 627 "cwebdir/common.w"
+#line 624 "cwebdir/common.w"
name_pointer hash[hash_size];
hash_pointer hash_end= hash+hash_size-1;
@@ -363,12 +367,12 @@
hash_pointer h;
/*:46*//*65:*/
-#line 1014 "cwebdir/common.w"
+#line 1006 "cwebdir/common.w"
int history= spotless;
/*:65*//*73:*/
-#line 1135 "cwebdir/common.w"
+#line 1129 "cwebdir/common.w"
int argc;
char**argv;
@@ -375,35 +379,35 @@
char C_file_name[max_file_name_length];
char tex_file_name[max_file_name_length];
char idx_file_name[max_file_name_length];
-#line 431 "cwebdir/comm-w2c.ch"
+#line 441 "cwebdir/comm-w2c.ch"
char scn_file_name[max_file_name_length];
char check_file_name[max_file_name_length];
-#line 1142 "cwebdir/common.w"
+#line 1136 "cwebdir/common.w"
boolean flags[128];
/*:73*//*83:*/
-#line 1282 "cwebdir/common.w"
+#line 1273 "cwebdir/common.w"
FILE*C_file;
FILE*tex_file;
FILE*idx_file;
-#line 569 "cwebdir/comm-w2c.ch"
+#line 572 "cwebdir/comm-w2c.ch"
FILE*scn_file;
FILE*check_file;
-#line 576 "cwebdir/comm-w2c.ch"
+#line 579 "cwebdir/comm-w2c.ch"
FILE*active_file;
char*found_filename;
-#line 1288 "cwebdir/common.w"
+#line 1279 "cwebdir/common.w"
-#line 593 "cwebdir/comm-w2c.ch"
+#line 596 "cwebdir/comm-w2c.ch"
/*:83*//*86:*/
-#line 638 "cwebdir/comm-w2c.ch"
+#line 641 "cwebdir/comm-w2c.ch"
const char*use_language= "";
/*:86*//*87:*/
-#line 651 "cwebdir/comm-w2c.ch"
+#line 654 "cwebdir/comm-w2c.ch"
char cb_banner[max_banner];
string texmf_locale;
@@ -413,10 +417,10 @@
char separators[]= SEPARATORS;
/*:87*/
-#line 70 "cwebdir/common.w"
+#line 66 "cwebdir/common.w"
/*7:*/
-#line 137 "cwebdir/comm-w2c.h"
+#line 141 "cwebdir/comm-w2c.h"
extern boolean get_line(void);
extern void check_complete(void);
@@ -423,12 +427,12 @@
extern void reset_input(void);
/*:7*//*10:*/
-#line 180 "cwebdir/comm-w2c.h"
+#line 184 "cwebdir/comm-w2c.h"
extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
extern name_pointer id_lookup(const char*,const char*,char);
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
extern void init_node(name_pointer);
extern void init_p(name_pointer,eight_bits);
extern void print_prefix_name(name_pointer);
@@ -436,7 +440,7 @@
extern void sprint_section_name(char*,name_pointer);
/*:10*//*12:*/
-#line 204 "cwebdir/comm-w2c.h"
+#line 208 "cwebdir/comm-w2c.h"
extern int wrap_up(void);
extern void err_print(const char*);
@@ -444,7 +448,7 @@
extern void overflow(const char*);
/*:12*//*15:*/
-#line 244 "cwebdir/comm-w2c.h"
+#line 246 "cwebdir/comm-w2c.h"
extern void common_init(void);
extern void print_stats(void);
@@ -451,45 +455,45 @@
extern void cb_show_banner(void);
/*:15*//*24:*/
-#line 180 "cwebdir/common.w"
+#line 176 "cwebdir/common.w"
static boolean input_ln(FILE*);
/*:24*//*28:*/
-#line 241 "cwebdir/common.w"
+#line 237 "cwebdir/common.w"
static void prime_the_change_buffer(void);
/*:28*//*33:*/
-#line 340 "cwebdir/common.w"
+#line 337 "cwebdir/common.w"
static void check_change(void);
/*:33*//*55:*/
-#line 774 "cwebdir/common.w"
+#line 767 "cwebdir/common.w"
static int web_strcmp(char*,int,char*,int);
-static name_pointer add_section_name(name_pointer,int,char*,char*,int);
-static void extend_section_name(name_pointer,char*,char*,int);
+static name_pointer add_section_name(name_pointer,int,char*,char*,boolean);
+static void extend_section_name(name_pointer,char*,char*,boolean);
/*:55*//*64:*/
-#line 1002 "cwebdir/common.w"
+#line 994 "cwebdir/common.w"
static int section_name_cmp(char**,int,name_pointer);
/*:64*//*76:*/
-#line 1197 "cwebdir/common.w"
+#line 1190 "cwebdir/common.w"
static void scan_args(void);
-#line 496 "cwebdir/comm-w2c.ch"
+#line 502 "cwebdir/comm-w2c.ch"
/*:76*//*96:*/
-#line 808 "cwebdir/comm-w2c.ch"
+#line 811 "cwebdir/comm-w2c.ch"
static void cb_usage(const_string str);
static void cb_usagehelp(const_string*message,const_string bug_email);
/*:96*/
-#line 71 "cwebdir/common.w"
+#line 67 "cwebdir/common.w"
/*:1*//*20:*/
-#line 99 "cwebdir/common.w"
+#line 95 "cwebdir/common.w"
void
common_init(void)
@@ -496,7 +500,7 @@
{
#line 78 "cwebdir/comm-w2c.ch"
/*45:*/
-#line 611 "cwebdir/common.w"
+#line 608 "cwebdir/common.w"
name_dir->byte_start= byte_ptr= byte_mem;
name_ptr= name_dir+1;
@@ -504,7 +508,7 @@
root= NULL;
/*:45*//*47:*/
-#line 634 "cwebdir/common.w"
+#line 631 "cwebdir/common.w"
for(h= hash;h<=hash_end;*h++= NULL);
@@ -512,7 +516,7 @@
#line 78 "cwebdir/comm-w2c.ch"
/*92:*/
-#line 770 "cwebdir/comm-w2c.ch"
+#line 773 "cwebdir/comm-w2c.ch"
kpse_set_program_name(argv[0],"cweb");
@@ -521,7 +525,7 @@
#line 85 "cwebdir/comm-w2c.ch"
/*90:*/
-#line 718 "cwebdir/comm-w2c.ch"
+#line 721 "cwebdir/comm-w2c.ch"
setlocale(LC_MESSAGES,setlocale(LC_CTYPE,""));
texmf_locale= kpse_var_expand("${TEXMFLOCALEDIR}");
@@ -540,20 +544,20 @@
#line 85 "cwebdir/comm-w2c.ch"
/*74:*/
-#line 1148 "cwebdir/common.w"
+#line 1142 "cwebdir/common.w"
-#line 438 "cwebdir/comm-w2c.ch"
+#line 448 "cwebdir/comm-w2c.ch"
make_xrefs= true;
-temporary_output= true;
-#line 1150 "cwebdir/common.w"
+check_for_change= true;
+#line 1144 "cwebdir/common.w"
show_stats= false;
/*:74*/
#line 86 "cwebdir/comm-w2c.ch"
-#line 105 "cwebdir/common.w"
+#line 101 "cwebdir/common.w"
/*84:*/
-#line 593 "cwebdir/comm-w2c.ch"
+#line 596 "cwebdir/comm-w2c.ch"
scan_args();
if(program==ctangle){
@@ -584,16 +588,16 @@
if((tex_file= fopen(check_file_name,"wb"))==NULL)
fatal(_("! Cannot open output file "),check_file_name);
}
-#line 1300 "cwebdir/common.w"
+#line 1291 "cwebdir/common.w"
-#line 628 "cwebdir/comm-w2c.ch"
+#line 631 "cwebdir/comm-w2c.ch"
/*:84*/
-#line 105 "cwebdir/common.w"
+#line 101 "cwebdir/common.w"
}
/*:20*//*23:*/
-#line 160 "cwebdir/common.w"
+#line 156 "cwebdir/common.w"
static boolean input_ln(
FILE*fp)
@@ -605,12 +609,12 @@
while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
#line 92 "cwebdir/comm-w2c.ch"
if((*(k++)= c)!=' '&&c!='\r')limit= k;
-#line 170 "cwebdir/common.w"
+#line 166 "cwebdir/common.w"
if(k> buffer_end)
if((c= getc(fp))!=EOF&&c!='\n'){
#line 98 "cwebdir/comm-w2c.ch"
ungetc(c,fp);loc= buffer;err_print(_("! Input line too long"));
-#line 173 "cwebdir/common.w"
+#line 169 "cwebdir/common.w"
}
if(c==EOF&&limit==buffer)return false;
@@ -619,7 +623,7 @@
}
/*:23*//*27:*/
-#line 231 "cwebdir/common.w"
+#line 227 "cwebdir/common.w"
static void
prime_the_change_buffer(void)
@@ -626,7 +630,7 @@
{
change_limit= change_buffer;
/*29:*/
-#line 247 "cwebdir/common.w"
+#line 243 "cwebdir/common.w"
while(true){
change_line++;
@@ -639,16 +643,16 @@
loc= buffer+2;
#line 109 "cwebdir/comm-w2c.ch"
err_print(_("! Missing @x in change file"));
-#line 258 "cwebdir/common.w"
+#line 254 "cwebdir/common.w"
}
}
/*:29*/
-#line 236 "cwebdir/common.w"
+#line 232 "cwebdir/common.w"
/*30:*/
-#line 264 "cwebdir/common.w"
+#line 260 "cwebdir/common.w"
do{
change_line++;
@@ -655,7 +659,7 @@
if(!input_ln(change_file)){
#line 115 "cwebdir/comm-w2c.ch"
err_print(_("! Change file ended after @x"));
-#line 269 "cwebdir/common.w"
+#line 265 "cwebdir/common.w"
return;
}
@@ -662,10 +666,10 @@
}while(limit==buffer);
/*:30*/
-#line 237 "cwebdir/common.w"
+#line 233 "cwebdir/common.w"
/*31:*/
-#line 274 "cwebdir/common.w"
+#line 270 "cwebdir/common.w"
{
change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -673,12 +677,12 @@
}
/*:31*/
-#line 238 "cwebdir/common.w"
+#line 234 "cwebdir/common.w"
}
/*:27*//*32:*/
-#line 302 "cwebdir/common.w"
+#line 299 "cwebdir/common.w"
static void
check_change(void)
@@ -691,11 +695,11 @@
if(!change_pending)changed_section[section_count]= true;
}
while(true){
-changing= true;print_where= true;change_line++;
+changing= print_where= true;change_line++;
if(!input_ln(change_file)){
#line 121 "cwebdir/comm-w2c.ch"
err_print(_("! Change file ended before @y"));
-#line 317 "cwebdir/common.w"
+#line 314 "cwebdir/common.w"
change_limit= change_buffer;changing= false;
return;
@@ -703,12 +707,12 @@
if(limit> buffer+1&&buffer[0]=='@'){
char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
/*34:*/
-#line 342 "cwebdir/common.w"
+#line 339 "cwebdir/common.w"
if(xyz_code=='x'||xyz_code=='z'){
#line 133 "cwebdir/comm-w2c.ch"
loc= buffer+2;err_print(_("! Where is the matching @y?"));
-#line 345 "cwebdir/common.w"
+#line 342 "cwebdir/common.w"
}
else if(xyz_code=='y'){
@@ -717,7 +721,7 @@
printf("\n! Hmm... %d ",n);
#line 139 "cwebdir/comm-w2c.ch"
err_print(_("of the preceding lines failed to match"));
-#line 352 "cwebdir/common.w"
+#line 349 "cwebdir/common.w"
}
change_depth= include_depth;
@@ -725,11 +729,11 @@
}
/*:34*/
-#line 324 "cwebdir/common.w"
+#line 321 "cwebdir/common.w"
}
/*31:*/
-#line 274 "cwebdir/common.w"
+#line 270 "cwebdir/common.w"
{
change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -737,7 +741,7 @@
}
/*:31*/
-#line 326 "cwebdir/common.w"
+#line 323 "cwebdir/common.w"
changing= false;cur_line++;
while(!input_ln(cur_file)){
@@ -744,7 +748,7 @@
if(include_depth==0){
#line 127 "cwebdir/comm-w2c.ch"
err_print(_("! CWEB file ended during a change"));
-#line 331 "cwebdir/common.w"
+#line 328 "cwebdir/common.w"
input_has_ended= true;return;
}
@@ -755,7 +759,7 @@
}
/*:32*//*35:*/
-#line 362 "cwebdir/common.w"
+#line 359 "cwebdir/common.w"
void
reset_input(void)
@@ -762,13 +766,13 @@
{
limit= buffer;loc= buffer+1;buffer[0]= ' ';
/*36:*/
-#line 377 "cwebdir/common.w"
+#line 374 "cwebdir/common.w"
#line 149 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(web_file_name))==NULL||
-(web_file= fopen(found_filename,"r"))==NULL){
+if((found_filename= kpse_find_cweb(web_file_name))==NULL
+||(web_file= fopen(found_filename,"r"))==NULL)
fatal(_("! Cannot open input file "),web_file_name);
-}else if(strlen(found_filename)<max_file_name_length){
+else if(strlen(found_filename)<max_file_name_length){
if(strcmp(web_file_name,found_filename))
strcpy(web_file_name,found_filename+
@@ -775,15 +779,15 @@
((strncmp(found_filename,"./",2)==0)?2:0));
free(found_filename);
}else fatal(_("! Filename too long\n"),found_filename);
-#line 383 "cwebdir/common.w"
+#line 380 "cwebdir/common.w"
web_file_open= true;
#line 165 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(change_file_name))==NULL||
-(change_file= fopen(found_filename,"r"))==NULL){
+if((found_filename= kpse_find_cweb(change_file_name))==NULL
+||(change_file= fopen(found_filename,"r"))==NULL)
fatal(_("! Cannot open change file "),change_file_name);
-}else if(strlen(found_filename)<max_file_name_length){
+else if(strlen(found_filename)<max_file_name_length){
if(strcmp(change_file_name,found_filename))
strcpy(change_file_name,found_filename+
@@ -790,19 +794,19 @@
((strncmp(found_filename,"./",2)==0)?2:0));
free(found_filename);
}else fatal(_("! Filename too long\n"),found_filename);
-#line 388 "cwebdir/common.w"
+#line 385 "cwebdir/common.w"
/*:36*/
-#line 367 "cwebdir/common.w"
+#line 364 "cwebdir/common.w"
-include_depth= 0;cur_line= 0;change_line= 0;
+include_depth= cur_line= change_line= 0;
change_depth= include_depth;
-changing= 1;prime_the_change_buffer();changing= !changing;
+changing= true;prime_the_change_buffer();changing= !changing;
limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= false;
}
/*:35*//*38:*/
-#line 406 "cwebdir/common.w"
+#line 403 "cwebdir/common.w"
boolean get_line(void)
{
@@ -809,13 +813,13 @@
restart:
if(changing&&include_depth==change_depth)
/*41:*/
-#line 514 "cwebdir/common.w"
+#line 511 "cwebdir/common.w"
{
change_line++;
if(!input_ln(change_file)){
#line 274 "cwebdir/comm-w2c.ch"
err_print(_("! Change file ended without @z"));
-#line 518 "cwebdir/common.w"
+#line 515 "cwebdir/common.w"
buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
}
@@ -833,7 +837,7 @@
loc= buffer+2;
#line 280 "cwebdir/comm-w2c.ch"
err_print(_("! Where is the matching @z?"));
-#line 534 "cwebdir/common.w"
+#line 531 "cwebdir/common.w"
}
else if(buffer[1]=='z'){
@@ -844,11 +848,11 @@
}
/*:41*/
-#line 411 "cwebdir/common.w"
+#line 408 "cwebdir/common.w"
if(!changing||include_depth> change_depth){
/*40:*/
-#line 497 "cwebdir/common.w"
+#line 494 "cwebdir/common.w"
{
cur_line++;
while(!input_ln(cur_file)){
@@ -867,7 +871,7 @@
}
/*:40*/
-#line 413 "cwebdir/common.w"
+#line 410 "cwebdir/common.w"
if(changing&&include_depth==change_depth)goto restart;
}
@@ -879,7 +883,7 @@
if(loc>=limit){
#line 180 "cwebdir/comm-w2c.ch"
err_print(_("! Include file name not given"));
-#line 423 "cwebdir/common.w"
+#line 420 "cwebdir/common.w"
goto restart;
}
@@ -886,18 +890,18 @@
if(include_depth>=max_include_depth-1){
#line 186 "cwebdir/comm-w2c.ch"
err_print(_("! Too many nested includes"));
-#line 428 "cwebdir/common.w"
+#line 425 "cwebdir/common.w"
goto restart;
}
include_depth++;
/*39:*/
-#line 451 "cwebdir/common.w"
+#line 448 "cwebdir/common.w"
{
#line 223 "cwebdir/comm-w2c.ch"
char*cur_file_name_end= cur_file_name+max_file_name_length-1;
char*k= cur_file_name;
-#line 456 "cwebdir/common.w"
+#line 453 "cwebdir/common.w"
if(*loc=='"'){
loc++;
@@ -909,8 +913,8 @@
*k= '\0';
#line 230 "cwebdir/comm-w2c.ch"
-if((found_filename= kpse_find_cweb(cur_file_name))!=NULL&&
-(cur_file= fopen(found_filename,"r"))!=NULL){
+if((found_filename= kpse_find_cweb(cur_file_name))!=NULL
+&&(cur_file= fopen(found_filename,"r"))!=NULL){
if(strlen(found_filename)<max_file_name_length){
if(strcmp(cur_file_name,found_filename))
@@ -918,17 +922,17 @@
((strncmp(found_filename,"./",2)==0)?2:0));
free(found_filename);
}else fatal(_("! Filename too long\n"),found_filename);
-#line 467 "cwebdir/common.w"
+#line 464 "cwebdir/common.w"
cur_line= 0;print_where= true;
goto restart;
}
#line 268 "cwebdir/comm-w2c.ch"
include_depth--;err_print(_("! Cannot open include file"));goto restart;
-#line 495 "cwebdir/common.w"
+#line 492 "cwebdir/common.w"
}
/*:39*/
-#line 432 "cwebdir/common.w"
+#line 429 "cwebdir/common.w"
}
return true;
@@ -936,7 +940,7 @@
#line 201 "cwebdir/comm-w2c.ch"
/*:38*//*42:*/
-#line 546 "cwebdir/common.w"
+#line 543 "cwebdir/common.w"
void
check_complete(void){
@@ -946,13 +950,13 @@
changing= true;change_depth= include_depth;loc= buffer;
#line 286 "cwebdir/comm-w2c.ch"
err_print(_("! Change file entry did not match"));
-#line 554 "cwebdir/common.w"
+#line 551 "cwebdir/common.w"
}
}
/*:42*//*48:*/
-#line 639 "cwebdir/common.w"
+#line 636 "cwebdir/common.w"
name_pointer
id_lookup(
@@ -967,7 +971,7 @@
if(last==NULL)for(last= first;*last!='\0';last++);
l= (int)(last-first);
/*49:*/
-#line 662 "cwebdir/common.w"
+#line 659 "cwebdir/common.w"
h= (eight_bits)*i;
while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
@@ -974,10 +978,10 @@
/*:49*/
-#line 652 "cwebdir/common.w"
+#line 649 "cwebdir/common.w"
/*50:*/
-#line 670 "cwebdir/common.w"
+#line 667 "cwebdir/common.w"
p= hash[h];
while(p&&!names_match(p,first,l,t))p= p->link;
@@ -987,15 +991,15 @@
}
/*:50*/
-#line 653 "cwebdir/common.w"
+#line 650 "cwebdir/common.w"
if(p==name_ptr)/*51:*/
-#line 681 "cwebdir/common.w"
+#line 679 "cwebdir/common.w"
{
#line 293 "cwebdir/comm-w2c.ch"
if(byte_ptr+l> byte_mem_end)overflow(_("byte memory"));
if(name_ptr>=name_dir_end)overflow(_("name"));
-#line 684 "cwebdir/common.w"
+#line 682 "cwebdir/common.w"
strncpy(byte_ptr,first,l);
(++name_ptr)->byte_start= byte_ptr+= l;
init_p(p,t);
@@ -1002,13 +1006,13 @@
}
/*:51*/
-#line 654 "cwebdir/common.w"
+#line 651 "cwebdir/common.w"
return p;
}
/*:48*//*52:*/
-#line 713 "cwebdir/common.w"
+#line 711 "cwebdir/common.w"
void
print_section_name(
@@ -1018,11 +1022,9 @@
name_pointer q= p+1;
while(p!=name_dir){
ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-term_write(s,(size_t)(ss-s));p= q->link;q= p;
-}else{
-term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir,q= NULL;
+term_write(s,(size_t)(ss-s));
s= p->byte_start;
}
if(q)term_write("...",3);
@@ -1029,7 +1031,7 @@
}
/*:52*//*53:*/
-#line 732 "cwebdir/common.w"
+#line 728 "cwebdir/common.w"
void
sprint_section_name(
@@ -1040,11 +1042,8 @@
name_pointer q= p+1;
while(p!=name_dir){
ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-p= q->link;q= p;
-}else{
-ss++;p= name_dir;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir;
strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
s= p->byte_start;
}
@@ -1052,7 +1051,7 @@
}
/*:53*//*54:*/
-#line 753 "cwebdir/common.w"
+#line 746 "cwebdir/common.w"
void
print_prefix_name(
@@ -1065,7 +1064,7 @@
}
/*:54*//*56:*/
-#line 779 "cwebdir/common.w"
+#line 772 "cwebdir/common.w"
static int web_strcmp(
char*j,
@@ -1083,7 +1082,7 @@
}
/*:56*//*57:*/
-#line 808 "cwebdir/common.w"
+#line 801 "cwebdir/common.w"
static name_pointer
add_section_name(
@@ -1091,7 +1090,7 @@
int c,
char*first,
char*last,
-int ispref)
+boolean ispref)
{
name_pointer p= name_ptr;
char*s= first_chunk(p);
@@ -1099,7 +1098,7 @@
#line 301 "cwebdir/comm-w2c.ch"
if(s+name_len> byte_mem_end)overflow(_("byte memory"));
if(name_ptr+1>=name_dir_end)overflow(_("name"));
-#line 822 "cwebdir/common.w"
+#line 815 "cwebdir/common.w"
(++name_ptr)->byte_start= byte_ptr= s+name_len;
if(ispref){
*(byte_ptr-1)= ' ';
@@ -1109,14 +1108,13 @@
}
set_prefix_length(p,name_len);
strncpy(s,first,name_len);
-p->llink= NULL;
-p->rlink= NULL;
+p->llink= p->rlink= NULL;
init_node(p);
return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
}
/*:57*//*58:*/
-#line 837 "cwebdir/common.w"
+#line 829 "cwebdir/common.w"
static void
extend_section_name(
@@ -1123,7 +1121,7 @@
name_pointer p,
char*first,
char*last,
-int ispref)
+boolean ispref)
{
char*s;
name_pointer q= p+1;
@@ -1130,7 +1128,7 @@
int name_len= (int)(last-first)+ispref;
#line 308 "cwebdir/comm-w2c.ch"
if(name_ptr>=name_dir_end)overflow(_("name"));
-#line 849 "cwebdir/common.w"
+#line 841 "cwebdir/common.w"
while(q->link!=name_dir)q= q->link;
q->link= name_ptr;
s= name_ptr->byte_start;
@@ -1137,7 +1135,7 @@
name_ptr->link= name_dir;
#line 314 "cwebdir/comm-w2c.ch"
if(s+name_len> byte_mem_end)overflow(_("byte memory"));
-#line 854 "cwebdir/common.w"
+#line 846 "cwebdir/common.w"
(++name_ptr)->byte_start= byte_ptr= s+name_len;
strncpy(s,first,name_len);
if(ispref)*(byte_ptr-1)= ' ';
@@ -1144,14 +1142,14 @@
}
/*:58*//*59:*/
-#line 865 "cwebdir/common.w"
+#line 857 "cwebdir/common.w"
name_pointer
section_lookup(
char*first,char*last,
-int ispref)
+boolean ispref)
{
-int c= 0;
+int c= less;
name_pointer p= root;
name_pointer q= NULL;
name_pointer r= NULL;
@@ -1159,7 +1157,7 @@
int name_len= (int)(last-first)+1;
/*60:*/
-#line 889 "cwebdir/common.w"
+#line 881 "cwebdir/common.w"
while(p){
c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -1171,12 +1169,12 @@
if(r!=NULL){
#line 320 "cwebdir/comm-w2c.ch"
fputs(_("\n! Ambiguous prefix: matches <"),stdout);
-#line 899 "cwebdir/common.w"
+#line 891 "cwebdir/common.w"
print_prefix_name(p);
#line 326 "cwebdir/comm-w2c.ch"
fputs(_(">\n and <"),stdout);
-#line 902 "cwebdir/common.w"
+#line 894 "cwebdir/common.w"
print_prefix_name(r);
err_print(">");
return name_dir;
@@ -1190,19 +1188,19 @@
}
/*:60*/
-#line 879 "cwebdir/common.w"
+#line 871 "cwebdir/common.w"
/*61:*/
-#line 914 "cwebdir/common.w"
+#line 906 "cwebdir/common.w"
if(r==NULL)
return add_section_name(par,c,first,last+1,ispref);
/*:61*/
-#line 880 "cwebdir/common.w"
+#line 872 "cwebdir/common.w"
/*62:*/
-#line 922 "cwebdir/common.w"
+#line 914 "cwebdir/common.w"
switch(section_name_cmp(&first,name_len,r)){
@@ -1210,7 +1208,7 @@
if(!ispref){
#line 332 "cwebdir/comm-w2c.ch"
fputs(_("\n! New name is a prefix of <"),stdout);
-#line 928 "cwebdir/common.w"
+#line 920 "cwebdir/common.w"
print_section_name(r);
err_print(">");
@@ -1217,39 +1215,39 @@
}
else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
-case equal:return r;
+case equal:break;
case extension:if(!ispref||first<=last)
extend_section_name(r,first,last+1,ispref);
-return r;
+break;
case bad_extension:
#line 338 "cwebdir/comm-w2c.ch"
fputs(_("\n! New name extends <"),stdout);
-#line 940 "cwebdir/common.w"
+#line 932 "cwebdir/common.w"
print_section_name(r);
err_print(">");
-return r;
+break;
default:
#line 344 "cwebdir/comm-w2c.ch"
fputs(_("\n! Section name incompatible with <"),stdout);
-#line 946 "cwebdir/common.w"
+#line 938 "cwebdir/common.w"
print_prefix_name(r);
#line 350 "cwebdir/comm-w2c.ch"
fputs(_(">,\n which abbreviates <"),stdout);
-#line 949 "cwebdir/common.w"
+#line 941 "cwebdir/common.w"
print_section_name(r);
err_print(">");
+}
return r;
-}
/*:62*/
-#line 881 "cwebdir/common.w"
+#line 873 "cwebdir/common.w"
}
/*:59*//*63:*/
-#line 970 "cwebdir/common.w"
+#line 962 "cwebdir/common.w"
static int section_name_cmp(
char**pfirst,
@@ -1259,12 +1257,12 @@
char*first= *pfirst;
name_pointer q= r+1;
char*ss,*s= first_chunk(r);
-int c;
-int ispref;
+int c= less;
+boolean ispref;
while(true){
ss= (r+1)->byte_start-1;
-if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
-else ispref= 0,ss++,q= name_dir;
+if(*ss==' '&&ss>=r->byte_start)ispref= true,q= q->link;
+else ispref= false,ss++,q= name_dir;
switch(c= web_strcmp(first,len,s,ss-s)){
case equal:if(q==name_dir)
if(ispref){
@@ -1283,7 +1281,7 @@
}
/*:63*//*66:*/
-#line 1024 "cwebdir/common.w"
+#line 1016 "cwebdir/common.w"
void
err_print(
@@ -1292,7 +1290,7 @@
char*k,*l;
printf(*s=='!'?"\n%s":"%s",s);
if(web_file_open)/*67:*/
-#line 1044 "cwebdir/common.w"
+#line 1036 "cwebdir/common.w"
{if(changing&&include_depth==change_depth)
#line 358 "cwebdir/comm-w2c.ch"
@@ -1299,13 +1297,13 @@
printf(_(". (l. %d of change file)\n"),change_line);
else if(include_depth==0)printf(_(". (l. %d)\n"),cur_line);
else printf(_(". (l. %d of include file %s)\n"),cur_line,cur_file_name);
-#line 1049 "cwebdir/common.w"
+#line 1041 "cwebdir/common.w"
l= (loc>=limit?limit:loc);
if(l> buffer){
for(k= buffer;k<l;k++)
if(*k=='\t')putchar(' ');
else putchar(*k);
-putchar('\n');
+new_line;
for(k= buffer;k<l;k++)putchar(' ');
}
for(k= l;k<limit;k++)putchar(*k);
@@ -1314,13 +1312,13 @@
}
/*:67*/
-#line 1031 "cwebdir/common.w"
+#line 1023 "cwebdir/common.w"
update_terminal;mark_error;
}
/*:66*//*68:*/
-#line 1076 "cwebdir/common.w"
+#line 1068 "cwebdir/common.w"
int wrap_up(void){
if(show_progress)new_line;
@@ -1328,10 +1326,10 @@
print_stats();
#line 388 "cwebdir/comm-w2c.ch"
/*69:*/
-#line 1086 "cwebdir/common.w"
+#line 1078 "cwebdir/common.w"
switch(history){
-#line 412 "cwebdir/comm-w2c.ch"
+#line 414 "cwebdir/comm-w2c.ch"
case spotless:
if(show_happiness)puts(_("(No errors were found.)"));break;
case harmless_message:
@@ -1338,9 +1336,9 @@
puts(_("(Did you see the warning message above?)"));break;
case error_message:
puts(_("(Pardon me, but I think I spotted something wrong.)"));break;
-case fatal_message:
+case fatal_message:default:
puts(_("(That was a fatal error, my friend.)"));
-#line 1094 "cwebdir/common.w"
+#line 1088 "cwebdir/common.w"
}
/*:69*/
@@ -1347,7 +1345,7 @@
#line 388 "cwebdir/comm-w2c.ch"
/*88:*/
-#line 662 "cwebdir/comm-w2c.ch"
+#line 665 "cwebdir/comm-w2c.ch"
if(C_file)fclose(C_file);
if(tex_file)fclose(tex_file);
@@ -1360,16 +1358,16 @@
#line 396 "cwebdir/comm-w2c.ch"
switch(history){
+case spotless:return RETURN_OK;
case harmless_message:return RETURN_WARN;
case error_message:return RETURN_ERROR;
-case fatal_message:return RETURN_FAIL;
-default:return RETURN_OK;
+case fatal_message:default:return RETURN_FAIL;
}
-#line 1084 "cwebdir/common.w"
+#line 1076 "cwebdir/common.w"
}
/*:68*//*70:*/
-#line 1102 "cwebdir/common.w"
+#line 1096 "cwebdir/common.w"
void
fatal(
const char*s,const char*t)
@@ -1380,19 +1378,19 @@
}
/*:70*//*71:*/
-#line 1113 "cwebdir/common.w"
+#line 1107 "cwebdir/common.w"
void
overflow(
const char*t)
{
-#line 425 "cwebdir/comm-w2c.ch"
+#line 427 "cwebdir/comm-w2c.ch"
printf(_("\n! Sorry, %s capacity exceeded"),t);fatal("","");
-#line 1118 "cwebdir/common.w"
+#line 1112 "cwebdir/common.w"
}
/*:71*//*75:*/
-#line 1167 "cwebdir/common.w"
+#line 1161 "cwebdir/common.w"
static void
scan_args(void)
@@ -1403,8 +1401,8 @@
boolean found_web= false,found_change= false,found_out= false;
-#line 462 "cwebdir/comm-w2c.ch"
-
+#line 472 "cwebdir/comm-w2c.ch"
+strcpy(change_file_name,"/dev/null");
#if defined DEV_NULL
strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
change_file_name[max_file_name_length-2]= '\0';
@@ -1411,20 +1409,19 @@
#elif defined _DEV_NULL
strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
change_file_name[max_file_name_length-2]= '\0';
-#else
-strcpy(change_file_name,"/dev/null");
#endif
-#line 1178 "cwebdir/common.w"
+#line 1172 "cwebdir/common.w"
while(--argc> 0){
if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 510 "cwebdir/comm-w2c.ch"
+#line 1251 "cwebdir/common.w"
+#line 515 "cwebdir/comm-w2c.ch"
{
if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
/*95:*/
-#line 799 "cwebdir/comm-w2c.ch"
+#line 802 "cwebdir/comm-w2c.ch"
cb_usagehelp(program==ctangle?CTANGLEHELP:
program==cweave?CWEAVEHELP:CTWILLHELP,NULL);
@@ -1431,12 +1428,12 @@
/*:95*/
-#line 514 "cwebdir/comm-w2c.ch"
+#line 518 "cwebdir/comm-w2c.ch"
if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
/*98:*/
-#line 846 "cwebdir/comm-w2c.ch"
+#line 850 "cwebdir/comm-w2c.ch"
printversionandexit(cb_banner,
program==ctwill?"Donald E. Knuth":"Silvio Levy and Donald E. Knuth",
@@ -1444,72 +1441,68 @@
/*:98*/
-#line 517 "cwebdir/comm-w2c.ch"
+#line 521 "cwebdir/comm-w2c.ch"
if(strcmp("-verbose",*argv)==0||strcmp("--verbose",*argv)==0)
-{show_banner= show_progress= show_happiness= 1;continue;}
+strcpy(*argv,"-v");
if(strcmp("-quiet",*argv)==0||strcmp("--quiet",*argv)==0)
-{show_banner= show_progress= show_happiness= 0;continue;}
-for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
-if(*dot_pos=='v'){
-show_banner= show_progress= show_happiness= true;
-}else
-if(*dot_pos=='q'){
-show_banner= show_progress= show_happiness= false;
-}else
-if(*dot_pos=='d'){
+strcpy(*argv,"-q");
+for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++){
+switch(*dot_pos){
+case'v':show_banner= show_progress= show_happiness= true;continue;
+case'q':show_banner= show_progress= show_happiness= false;continue;
+case'd':
if(sscanf(++dot_pos,"%u",&kpathsea_debug)!=1)/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
/*:81*/
-#line 532 "cwebdir/comm-w2c.ch"
+#line 533 "cwebdir/comm-w2c.ch"
while(isdigit(*dot_pos))dot_pos++;
dot_pos--;
-}else
-if(*dot_pos=='l'){
-use_language= ++dot_pos;
+continue;
+case'l':use_language= ++dot_pos;break;
+default:flags[(eight_bits)*dot_pos]= flag_change;continue;
+}
break;
-}else
-#line 1261 "cwebdir/common.w"
- flags[(eight_bits)*dot_pos]= flag_change;
}
+}
+#line 1254 "cwebdir/common.w"
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
/*:80*/
-#line 1179 "cwebdir/common.w"
+#line 1173 "cwebdir/common.w"
else{
s= name_pos= *argv;dot_pos= NULL;
-#line 482 "cwebdir/comm-w2c.ch"
-while(*s){
+#line 489 "cwebdir/comm-w2c.ch"
+while(*s)
if(*s=='.')dot_pos= s++;
else if(*s==DIR_SEPARATOR||*s==DEVICE_SEPARATOR||*s=='/')
dot_pos= NULL,name_pos= ++s;
else s++;
-}
-#line 1187 "cwebdir/common.w"
+#line 1180 "cwebdir/common.w"
if(!found_web)/*77:*/
-#line 1206 "cwebdir/common.w"
+#line 1199 "cwebdir/common.w"
{
if(s-*argv> max_file_name_length-5)
/*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
/*:82*/
-#line 1209 "cwebdir/common.w"
+#line 1202 "cwebdir/common.w"
if(dot_pos==NULL)
sprintf(web_file_name,"%s.w",*argv);
@@ -1517,7 +1510,7 @@
strcpy(web_file_name,*argv);
*dot_pos= 0;
}
-#line 1217 "cwebdir/common.w"
+#line 1210 "cwebdir/common.w"
sprintf(tex_file_name,"%s.tex",name_pos);
sprintf(idx_file_name,"%s.idx",name_pos);
sprintf(scn_file_name,"%s.scn",name_pos);
@@ -1526,22 +1519,22 @@
}
/*:77*/
-#line 1188 "cwebdir/common.w"
+#line 1181 "cwebdir/common.w"
else if(!found_change)/*78:*/
-#line 1224 "cwebdir/common.w"
+#line 1217 "cwebdir/common.w"
{
if(strcmp(*argv,"-")!=0){
if(s-*argv> max_file_name_length-4)
/*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
/*:82*/
-#line 1228 "cwebdir/common.w"
+#line 1221 "cwebdir/common.w"
if(dot_pos==NULL)
sprintf(change_file_name,"%s.ch",*argv);
@@ -1551,21 +1544,21 @@
}
/*:78*/
-#line 1189 "cwebdir/common.w"
+#line 1182 "cwebdir/common.w"
else if(!found_out)/*79:*/
-#line 1236 "cwebdir/common.w"
+#line 1229 "cwebdir/common.w"
{
if(s-*argv> max_file_name_length-5)
/*82:*/
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
fatal(_("! Filename too long\n"),*argv);
-#line 1277 "cwebdir/common.w"
+#line 1268 "cwebdir/common.w"
/*:82*/
-#line 1239 "cwebdir/common.w"
+#line 1232 "cwebdir/common.w"
if(dot_pos==NULL){
sprintf(tex_file_name,"%s.tex",*argv);
@@ -1585,36 +1578,36 @@
}
/*:79*/
-#line 1190 "cwebdir/common.w"
+#line 1183 "cwebdir/common.w"
else/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
/*:81*/
-#line 1191 "cwebdir/common.w"
+#line 1184 "cwebdir/common.w"
}
}
if(!found_web)/*81:*/
-#line 555 "cwebdir/comm-w2c.ch"
+#line 558 "cwebdir/comm-w2c.ch"
cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
-#line 1275 "cwebdir/common.w"
+#line 1266 "cwebdir/common.w"
-#line 563 "cwebdir/comm-w2c.ch"
+#line 566 "cwebdir/comm-w2c.ch"
/*:81*/
-#line 1194 "cwebdir/common.w"
+#line 1187 "cwebdir/common.w"
}
/*:75*//*97:*/
-#line 812 "cwebdir/comm-w2c.ch"
+#line 815 "cwebdir/comm-w2c.ch"
static void cb_usage(const_string str)
{
@@ -1635,6 +1628,7 @@
textdomain("web2c-help");
while(*message){
+
printf("%s\n",strcmp("",*message)?_(*message):*message);
++message;
}
@@ -1647,11 +1641,10 @@
}
/*:97*//*99:*/
-#line 854 "cwebdir/comm-w2c.ch"
+#line 858 "cwebdir/comm-w2c.ch"
void cb_show_banner(void)
{
-assert(cb_banner[0]!='\0');
textdomain("cweb-tl");
printf("%s%s\n",_(cb_banner),versionstring);
Modified: trunk/Build/source/texk/web2c/cwebdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ChangeLog 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ChangeLog 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,44 @@
+2021-04-16 Andreas Scherer <https://ascherer.github.io>
+
+ * Makefile,
+ * README,
+ * comm-{amiga,bs,mac,mini,os2,pc,ql,vms,w2c,w32}.ch,
+ * comm-w2c.h,
+ * common.bux,
+ * common.c,
+ * common.h,
+ * common.w,
+ * ctang-{bs,man,pc,ql,vms,w2c,w32}.ch,
+ * ctangle.c,
+ * ctangle.w,
+ * ctproofmac.tex,
+ * ctrwinxmac.tex,
+ * ctwill-{mini,w2c}.ch,
+ * ctwill.bux,
+ * ctwimac.tex,
+ * cweav-{bs,man,pc,ql,vms,w2c,w32}.ch,
+ * cweave.w,
+ * cweb.1,
+ * cwebmac.tex,
+ * cwebman-w2c.ch,
+ * cwebman.tex,
+ * iso_types.w,
+ * po/cweb[-tl].pot,
+ * po/de/cweb[-tl].po,
+ * po/de/web2c-help.po,
+ * po/it/cweb.po,
+ * po/web2c-help.pot,
+ * prod-twill.w,
+ * prod.w,
+ * refsort.ch,
+ * resort.w,
+ * system.bux,
+ * texinputs/Xcwebmac.tex,
+ * texinputs/pdfctwimac.tex,
+ * twinx-startup.tex,
+ * twinx.ch,
+ * twinx.w: CWEB 4.3 and CWEBbin 2021.
+
2021-02-25 Andreas Scherer <https://ascherer.github.io>
* Makefile,
Modified: trunk/Build/source/texk/web2c/cwebdir/Makefile
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/Makefile 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/Makefile 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
# This file is part of CWEB.
# It is distributed WITHOUT ANY WARRANTY, express or implied.
-# Version 4.2 --- February 2021
+# Version 4.3 --- April 2021
# Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
@@ -74,7 +74,7 @@
CTANGLE = ./ctangle
SOURCES = cweave.w common.w ctangle.w
ALL = common.w ctangle.w cweave.w prod.w \
- Makefile common.c common.h ctangle.c \
+ Makefile README common.c common.h ctangle.c \
cwebman.tex cwebmac.tex comm-vms.ch ctang-vms.ch \
cweav-vms.ch comm-man.ch ctang-man.ch cweav-man.ch \
comm-pc.ch ctang-pc.ch cweav-pc.ch comm-amiga.ch \
@@ -81,7 +81,7 @@
comm-bs.ch ctang-bs.ch cweav-bs.ch makefile.bs \
comm-ql.ch ctang-ql.ch cweav-ql.ch readme.ql \
comm-w32.ch ctang-w32.ch cweav-w32.ch \
- comm-os2.ch comm-mac.ch cweb.1 cweb.el c++lib.w README
+ comm-os2.ch comm-mac.ch cweb.1 cweb.el c++lib.w iso_types.w
.SUFFIXES: .dvi .tex .w .pdf
@@ -183,6 +183,8 @@
- mkdir $(CWEBINPUTS)
$(CP) c++lib.w $(CWEBINPUTS)
chmod 644 $(CWEBINPUTS)/c++lib.w
+ $(CP) iso_types.w $(CWEBINPUTS)
+ chmod 644 $(CWEBINPUTS)/iso_types.w
floppy: $(ALL) examples
bar cvhf /dev/rfd0 $(ALL) examples
Modified: trunk/Build/source/texk/web2c/cwebdir/README
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/README 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/README 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,7 +1,7 @@
% This file is part of CWEB.
% The CWEB programs by Silvio Levy are based on programs by D. E. Knuth.
% They are distributed WITHOUT ANY WARRANTY, express or implied.
-% This README file last updated February 2021 by Andreas Scherer
+% This README file last updated April 2021 by Andreas Scherer
% Copyright (C) 1987,1990,1993,2000,2016 Silvio Levy and Donald E. Knuth
@@ -66,6 +66,7 @@
prod.w
readme.ql
c++lib.w
+iso_types.w
The file cwebman.tex is the user manual.
The examples directory contains additional examples of the use of CWEB.
@@ -72,8 +73,9 @@
The files common.c and ctangle.c are used for bootstrapping.
The file cweb.1 is a manual page.
The file cweb.el is suggested for GNU-Emacs users.
-The file c++lib.w is for C++ users (say `@i c++lib.w' at beginning of program).
-The files *-man.ch are used if you want to make the full 240-page CWEB manual.
+The files c++lib.w and iso_types.w are for C++ users (say `@i c++lib.w'
+and/or `@i iso_types.w' at beginning of program).
+The files *-man.ch are used if you want to make the full 243-page CWEB manual.
The files *-bs.ch are used instead of *-pc.ch if you are doing BIG programs.
You can use makefile.bs to make CWEB with *-bs.ch.
The files *-ql.ch are for QDOS/SMSQ systems; see readme.ql for further info.
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-amiga.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,7 +10,7 @@
An omitted change file argument means that |"nil:"| should be used,
@z
- at x section 76
+ at x section 75
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"nil:");
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-bs.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -15,7 +15,7 @@
(Update attempt by Andreas Scherer, 31 Jan 2021. Good luck!)
- at x Section 6.
+ at x Section 9.
for section names */
@<Common code...@>=
@@ -50,7 +50,7 @@
union {
void huge* equiv_member;
void huge* xref_member;
- } ptr_union; /* info corresponding to names */
+ } ptr_union; /* info corresponding to names */
} name_info; /* contains information about an identifier or section name */
typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
typedef name_pointer *hash_pointer;
@@ -136,23 +136,23 @@
@x Section 57.
static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
name_pointer par, /* parent of new node */
int c, /* right or left? */
char *first, /* first character of section name */
char *last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
name_pointer p=name_ptr; /* new node */
char *s=first_chunk(p);
@y
static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
name_pointer par, /* parent of new node */
int c, /* right or left? */
char huge* first, /* first character of section name */
char huge* last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
name_pointer p=name_ptr; /* new node */
char huge* s=first_chunk(p);
@@ -161,39 +161,39 @@
@x Section 58.
static void
-extend_section_name(@t\1\1@>
+extend_section_name(
name_pointer p, /* name to be extended */
char *first, /* beginning of extension text */
char *last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
char *s;
@y
static void
-extend_section_name(@t\1\1@>
+extend_section_name(
name_pointer p, /* name to be extended */
char huge* first, /* beginning of extension text */
char huge* last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
char huge* s;
@z
- at x Section 64.
-static int section_name_cmp(@t\1\1@>
+ at x Section 63.
+static int section_name_cmp(
char **pfirst, /* pointer to beginning of comparison string */
int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
{
char *first=*pfirst; /* beginning of comparison string */
name_pointer q=r+1; /* access to subsequent chunks */
char *ss, *s=first_chunk(r);
@y
-static int section_name_cmp(@t\1\1@>
+static int section_name_cmp(
char huge** pfirst, /* pointer to beginning of comparison string */
int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
{
char huge* first=*pfirst; /* beginning of comparison string */
name_pointer q=r+1; /* access to subsequent chunks */
@@ -208,7 +208,7 @@
@z
- at x Section 76.
+ at x Section 75.
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"NUL");
@@ -215,7 +215,7 @@
@z
- at x Section 76.
+ at x Section 75.
else if (*s=='/') dot_pos=NULL,name_pos=++s;
@y
else if (*s == ':' || *s == '\\' || *s == '/')
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mac.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -4,27 +4,24 @@
(Contributed 13 Oct 2000 by AndPio at aol.com; slightly edited by Don Knuth)
@x in limbo, change the title page document to specify Mac version
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
@y
- \centerline{(Version 4.2 for MacOS)}
+ \centerline{(Version 4.3 for MacOS)}
@z
- at x sections 23/24: Make input_ln accept \n, \r, \n\r, or \r\n as line endings
+ at x section 23: Make input_ln accept \n, \r, \n\r, or \r\n as line endings
@ In the unlikely event that your standard I/O library does not
support |feof|, |getc|, and |ungetc| you may have to change things here.
@^system dependencies@>
-@<Predecl...@>=
-static boolean input_ln(FILE *);@/
-
-@ @c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+ at c
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
{
- register int c=EOF; /* character read; initialized so some compilers won't complain */
- register char *k; /* where next character goes */
- if (feof(fp)) return false; /* we have hit end-of-file */
- limit = k = buffer; /* beginning of buffer */
+ register int c=EOF; /* character read; initialized so some compilers won't complain */
+ register char *k; /* where next character goes */
+ if (feof(fp)) return false; /* we have hit end-of-file */
+ limit = k = buffer; /* beginning of buffer */
while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n')
if ((*(k++) = c) != ' ') limit = k;
if (k>buffer_end)
@@ -32,7 +29,7 @@
ungetc(c,fp); loc=buffer; err_print("! Input line too long");
@.Input line too long@>
}
- if (c==EOF && limit==buffer) return false; /* there was nothing after
+ if (c==EOF && limit==buffer) return false; /* there was nothing after
the last newline */
return true;
}
@@ -45,17 +42,14 @@
\UNIX/, {\mc DOS} or {\mc MAC} format.
@^system dependencies@>
-@<Predecl...@>=
-static boolean input_ln(FILE *);@/
-
-@ @c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+ at c
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
{
register int c=EOF; /* character read; initialized so some compilers won't complain */
- register char *k; /* where next character goes */
- if (feof(fp)) return false; /* we have hit end-of-file */
- limit = k = buffer; /* beginning of buffer */
+ register char *k; /* where next character goes */
+ if (feof(fp)) return false; /* we have hit end-of-file */
+ limit = k = buffer; /* beginning of buffer */
while (true) {
c = getc(fp);
if (c==EOF) return limit!=buffer; /* |false|, if there was nothing after
@@ -77,7 +71,7 @@
}
@z
- at x section 28, simply return if no change file was specified
+ at x section 27, simply return if no change file was specified
change_limit=change_buffer; /* this value is used if the change file ends */
@<Skip over comment lines in the change file; |return| if end of file@>@;
@y
@@ -121,13 +115,12 @@
@y
An omitted change file argument means that no change file should be used,
@z
-
- at x section 76, make change file name empty when it is unspecified
+ at x section 75, make change file name empty when it is unspecified
strcpy(change_file_name,"/dev/null");
@y
change_file_name[0]='\0'; /* empty string */
@z
- at x section 76, use the Metrowerks |ccommand| to access command lines
+ at x section 75, use the Metrowerks |ccommand| to access command lines
while (--argc > 0) {
@y
argc = ccommand (&argv); /* use Mac interface to command line */
@@ -134,7 +127,7 @@
@^system dependencies@>
while (--argc > 0) {
@z
- at x section 76, use the path separator constant
+ at x section 75, use the path separator constant
else if (*s=='/') dot_pos=NULL,name_pos=++s;
@y
else if (*s==PATH_SEP) dot_pos=NULL,name_pos=++s;
Added: trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,107 @@
+Limbo.
+
+ at x
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3 [CWEBbin 2021])}
+ at y
+\def\title{COMMON (Version 4.3 [CWEBbin 2021])}
+\def\contentspagenumber{0}
+ at z
+
+Section 3.
+
+ at x
+internationalization.
+ at y
+internationalization.
+ at -A@>
+ at -S@>
+ at z
+
+Section 5.
+
+ at x
+@ Code related to input routines:
+ at y
+@ Code related to input routines:
+ at -c@>
+ at z
+
+Section 9.
+
+ at x
+@ Code related to identifier and section name storage:
+ at y
+@ Code related to identifier and section name storage:
+ at -c@>
+ at z
+
+Section 14.
+
+ at x
+@ Code related to output:
+ at y
+@ Code related to output:
+ at -a@>
+ at -b@>
+ at z
+
+Section 32.
+
+ at x
+current line is nonempty.
+ at y
+current line is nonempty.
+ at -b@>
+ at z
+
+Section 52.
+
+ at x
+ at d first_chunk(p) ((p)->byte_start+2)
+ at y
+ at -m@>
+ at d first_chunk(p) ((p)->byte_start+2)
+ at z
+
+Section 87.
+
+ at x
+@^system dependencies@> @.CWEBINPUTS@>
+ at y
+@^system dependencies@> @.CWEBINPUTS@>
+ at -CWEBINPUTS@>
+ at z
+
+Section 88.
+
+ at x
+@ @c
+ at y
+@ @-CWEBINPUTS@>@c
+ at z
+
+Section 89.
+
+ at x
+needs a few extra variables.
+ at y
+needs a few extra variables.
+ at -SEPARATORS@>
+ at z
+
+Section 91.
+
+ at x
+ at .cweb.mo@>
+ at y
+ at .cweb.mo@>
+ at -A@>
+ at -B@>
+ at z
+
+Section 93.
+
+ at x
+@** Index.
+ at y
+ at z
Property changes on: trunk/Build/source/texk/web2c/cwebdir/comm-mini.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-os2.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,13 +10,13 @@
An omitted change file argument means that |"NUL"| should be used,
@z
- at x section 76
+ at x section 75
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"NUL");
@z
- at x section 76 (this change copied from comm-pc.ch)
+ at x section 75 (this change copied from comm-pc.ch)
else if (*s=='/') dot_pos=NULL,name_pos=++s;
@y
else if (*s == ':' || *s == '\\' || *s == '/')
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-pc.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -19,13 +19,13 @@
An omitted change file argument means that |"NUL"| should be used,
@z
- at x section 76
+ at x section 75
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"NUL");
@z
- at x section 76 (this change copied from comm-bs.ch, July 94)
+ at x section 75 (this change copied from comm-bs.ch, July 94)
else if (*s=='/') dot_pos=NULL,name_pos=++s;
@y
else if (*s == ':' || *s == '\\' || *s == '/')
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-ql.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,12 +10,12 @@
@x
\def\v{\char'174} % vertical (|) in typewriter font
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
\def\topofcontents{\null\vfill
\centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
{\ttitlefont CWEAVE}}
\vskip 15pt
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
\vfill}
\def\botofcontents{\vfill
\noindent
@@ -22,12 +22,12 @@
@y
\def\v{\char'174} % vertical (|) in typewriter font
-\def\title{Common code for CTANGLE and CWEAVE (QL Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (QL Version 4.3)}
\def\topofcontents{\null\vfill
\centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
{\ttitlefont CWEAVE}}
\vskip 15pt
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
\vfill}
\def\botofcontents{\vfill
\noindent
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-vms.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -34,7 +34,7 @@
@x section 68 (01-FEB-1992 ST)
programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
@y
programs are started. Here, for instance, we pass VAX/VMS
a status of |SS$_NORMAL| if and only if only harmless
@@ -67,7 +67,7 @@
null device |"NL:"| should be used, when no changes are desired.
@z
- at x section 76 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
+ at x section 75 (1987 BL) (01-FEB-1992 ST) (05-APR-1992 DEK)
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"NL:");
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,16 +17,16 @@
@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
@x
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
@y
\def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}} \ifacro\sanitizecommand\Kpathsea{KPATHSEA}\fi
-\def\title{Common code for CTANGLE and CWEAVE (4.2 [\TeX~Live])}
+\def\title{Common code for CTANGLE and CWEAVE (4.3 [\TeX~Live])}
@z
@x
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
@y
- \centerline{(Version 4.2 [\TeX~Live])}
+ \centerline{(Version 4.3 [\TeX~Live])}
@z
@x
@@ -146,11 +146,11 @@
fatal("! Cannot open input file ", web_file_name);
}
@y
-if ((found_filename=kpse_find_cweb(web_file_name))==NULL || @|
- (web_file=fopen(found_filename,"r"))==NULL) {
+if ((found_filename=kpse_find_cweb(web_file_name))==NULL @|
+ || (web_file=fopen(found_filename,"r"))==NULL)
fatal(_("! Cannot open input file "), web_file_name);
-} else if (strlen(found_filename) < max_file_name_length) {
- /* Copy name for |#line| directives. */
+else if (strlen(found_filename) < max_file_name_length) {
+ /* Copy name for \#\&{line} directives. */
if (strcmp(web_file_name, found_filename))
strcpy(web_file_name, found_filename +
((strncmp(found_filename,"./",2)==0) ? 2 : 0));
@@ -162,11 +162,11 @@
if ((change_file=fopen(change_file_name,"r"))==NULL)
fatal("! Cannot open change file ", change_file_name);
@y
-if ((found_filename=kpse_find_cweb(change_file_name))==NULL || @|
- (change_file=fopen(found_filename,"r"))==NULL) {
+if ((found_filename=kpse_find_cweb(change_file_name))==NULL @|
+ || (change_file=fopen(found_filename,"r"))==NULL)
fatal(_("! Cannot open change file "), change_file_name);
-} else if (strlen(found_filename) < max_file_name_length) {
- /* Copy name for |#line| directives. */
+else if (strlen(found_filename) < max_file_name_length) {
+ /* Copy name for \#\&{line} directives. */
if (strcmp(change_file_name, found_filename))
strcpy(change_file_name, found_filename +
((strncmp(found_filename,"./",2)==0) ? 2 : 0));
@@ -217,7 +217,7 @@
@x
char temp_file_name[max_file_name_length];
char *cur_file_name_end=cur_file_name+max_file_name_length-1;
- char *k=cur_file_name, *kk;
+ char *kk, *k=cur_file_name;
int l; /* length of file name */
@y
char *cur_file_name_end=cur_file_name+max_file_name_length-1;
@@ -227,9 +227,9 @@
@x
if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@y
- if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL && @|
- (cur_file=fopen(found_filename,"r"))!=NULL) {
- /* Copy name for |#line| directives. */
+ if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL @|
+ && (cur_file=fopen(found_filename,"r"))!=NULL) {
+ /* Copy name for \#\&{line} directives. */
if (strlen(found_filename) < max_file_name_length) {
if (strcmp(cur_file_name, found_filename))
strcpy(cur_file_name, found_filename +
@@ -255,7 +255,7 @@
if (l>0) {
if (k+l+2>=cur_file_name_end) too_long();
@.Include file name ...@>
- for (; k>= cur_file_name; k--) *(k+l+1)=*k;
+ for (; k>=cur_file_name; k--) *(k+l+1)=*k;
strcpy(cur_file_name,temp_file_name);
cur_file_name[l]='/'; /* \UNIX/ pathname separator */
if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@@ -364,7 +364,7 @@
Some implementations may wish to pass the |history| value to the
operating system so that it can be used to govern whether or not other
programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
@^system dependencies@>
@y
On multi-tasking systems like the {\mc AMIGA} it is very convenient to
@@ -394,20 +394,22 @@
else return EXIT_SUCCESS;
@y
switch(history) {
+ case spotless: return RETURN_OK;
case harmless_message: return RETURN_WARN;
case error_message: return RETURN_ERROR;
- case fatal_message: return RETURN_FAIL;
- default: return RETURN_OK;
+ case fatal_message: default: return RETURN_FAIL;
}
@z
@x
-case spotless: if (show_happiness) puts("(No errors were found.)"); break;
+case spotless:
+ if (show_happiness) puts("(No errors were found.)"); break;
case harmless_message:
puts("(Did you see the warning message above?)"); break;
case error_message:
puts("(Pardon me, but I think I spotted something wrong.)"); break;
-case fatal_message: puts("(That was a fatal error, my friend.)");
+case fatal_message: default:
+ puts("(That was a fatal error, my friend.)");
@y
case spotless:
if (show_happiness) puts(_("(No errors were found.)")); break;
@@ -415,7 +417,7 @@
puts(_("(Did you see the warning message above?)")); break;
case error_message:
puts(_("(Pardon me, but I think I spotted something wrong.)")); break;
-case fatal_message:
+case fatal_message: default:
puts(_("(That was a fatal error, my friend.)"));
@z
@@ -426,6 +428,14 @@
@z
@x
+or flags to be turned on (beginning with |"+"|).
+ at y
+or flags to be turned on (beginning with |"+"|).
+\TeX~Live's \.{CWEB} executables accept several ``long options'' as well;
+see section |@<Handle flag arg...@>| for details.
+ at z
+
+ at x
char scn_file_name[max_file_name_length]; /* name of |scn_file| */
@y
char scn_file_name[max_file_name_length]; /* name of |scn_file| */
@@ -436,7 +446,7 @@
show_banner=show_happiness=show_progress=make_xrefs=true;@/
@y
make_xrefs=true;@/
-temporary_output=true; /* Check temporary output for changes */
+check_for_change=true; /* Check temporary output for changes */
@z
@x
@@ -459,7 +469,7 @@
@x
strcpy(change_file_name,"/dev/null");
@y
-@#
+ strcpy(change_file_name,"/dev/null");
#if defined DEV_NULL
strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
change_file_name[max_file_name_length-2]='\0';
@@ -466,25 +476,21 @@
#elif defined _DEV_NULL
strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
change_file_name[max_file_name_length-2]='\0';
-#else
- strcpy(change_file_name,"/dev/null");
#endif
@^system dependencies@>
@z
@x
- while (*s) {
+ while (*s)
if (*s=='.') dot_pos=s++;
else if (*s=='/') dot_pos=NULL,name_pos=++s;
else s++;
- }
@y
- while (*s) {
+ while (*s)
if (*s=='.') dot_pos=s++;
else if (*s==DIR_SEPARATOR || *s==DEVICE_SEPARATOR || *s=='/')
dot_pos=NULL,name_pos=++s;
else s++;
- }
@^system dependencies@>
@z
@@ -503,11 +509,9 @@
@z
@x
-@<Handle flag...@>=
-{
- for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+ flags[(eight_bits)*dot_pos]=flag_change;
@y
-@<Handle flag...@>=
{
if (strcmp("-help",*argv)==0 || strcmp("--help",*argv)==0)
@.--help@>
@@ -517,26 +521,25 @@
@<Display version information and |exit|@>@;
if (strcmp("-verbose",*argv)==0 || strcmp("--verbose",*argv)==0)
@.--verbose@>
- { show_banner=show_progress=show_happiness=1; continue; }
+ strcpy(*argv,"-v");
if (strcmp("-quiet",*argv)==0 || strcmp("--quiet",*argv)==0)
@.--quiet@>
- { show_banner=show_progress=show_happiness=0; continue; }
- for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
- if (*dot_pos=='v') {
- show_banner=show_progress=show_happiness=true;
- } else
- if (*dot_pos=='q') {
- show_banner=show_progress=show_happiness=false;
- } else
- if (*dot_pos=='d') {
+ strcpy(*argv,"-q");
+ for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++) {
+ switch (*dot_pos) {
+ case 'v': show_banner=show_progress=show_happiness=true; continue;
+ case 'q': show_banner=show_progress=show_happiness=false; continue;
+ case 'd':
if (sscanf(++dot_pos,"%u",&kpathsea_debug)!=1) @<Print usage error...@>@;
while (isdigit(*dot_pos)) dot_pos++; /* skip numeric part */
dot_pos--; /* reset to final digit */
- } else
- if(*dot_pos=='l') {
- use_language=++dot_pos;
- break;
- } else
+ continue;
+ case 'l': use_language=++dot_pos; break; /* from |switch| */
+ default: flags[(eight_bits)*dot_pos]=flag_change; continue;
+ }
+ break; /* from |for| loop */
+ }
+}
@z
@x
@@ -625,9 +628,9 @@
@x
@** Index.
@y
-@** Extensions to \.{CWEB}. The following sections introduce new or improved
-features that have been created by numerous contributors over the course of a
-quarter century.
+@** Extensions to {\tentex CWEB}. The following sections introduce new or
+improved features that have been created by numerous contributors over the
+course of a quarter century.
Care has been taken to keep the original section numbering intact, so this new
material should nicely integrate with the original ``\&{85.~Index}.''
@@ -829,6 +832,7 @@
textdomain("web2c-help");
@.web2c-help.mo@>
while (*message) {
+ /* empty string \.{""} has special meaning for |gettext| */
printf("%s\n", strcmp("", *message) ? _(*message) : *message);
++message;
}
@@ -854,7 +858,6 @@
@c
void cb_show_banner (void)
{
- assert(cb_banner[0]!='\0');
textdomain("cweb-tl");
@.cweb-tl.mo@>
printf("%s%s\n", _(cb_banner), versionstring);
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w2c.h 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
% This program by Silvio Levy and Donald E. Knuth
% is based on a program by Knuth.
% It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021 (works also with later versions)
+% Version 4.3 --- April 2021 (works also with later versions)
% Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
@@ -27,9 +27,7 @@
First comes general stuff:
- at s boolean int
- at s uint8_t int
- at s uint16_t int
+ at i iso_types.w
@<Common code...@>=
@@ -73,20 +71,22 @@
@^ASCII code dependencies@>
@d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
- at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
- at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
- at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
- at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
- at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
- at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
- at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
- at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
- at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
- at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
- at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
- at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
- at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
- at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+ at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
+ at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
+ at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
+ at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
+ at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
+ at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
+ at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
+ at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
+ at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
+ at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
+ at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
+ at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
+ at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
+ at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+@#
+ at d compress(c) if (loc++<=limit) return c
@<Common code...@>=
extern char section_text[]; /* text being sought for */
@@ -95,12 +95,16 @@
extern char *id_loc; /* just after the current identifier in the buffer */
@ Code related to input routines:
- at d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
- at d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
- at d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
- at d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
- at d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
+ at d xisalpha(c) (isalpha((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisdigit(c) (isdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisspace(c) (isspace((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xislower(c) (islower((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisupper(c) (isupper((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisxdigit(c) (isxdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d isxalpha(c) ((c)=='_' || (c)=='$')
+ /* non-alpha characters allowed in identifier */
+ at d ishigh(c) ((eight_bits)(c)>0177)
+@^high-bit character handling@>
@<Common code...@>=
extern char buffer[]; /* where each line of input goes */
@@ -181,7 +185,7 @@
extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
extern name_pointer id_lookup(const char *,const char *,char);
/* looks up a string in the identifier table */
-extern name_pointer section_lookup(char *,char *,int); /* finds section name */
+extern name_pointer section_lookup(char *,char *,boolean); /* finds section name */
extern void init_node(name_pointer);@/
extern void init_p(name_pointer,eight_bits);@/
extern void print_prefix_name(name_pointer);@/
@@ -212,8 +216,8 @@
@d show_progress flags['p'] /* should progress reports be printed? */
@d show_stats flags['s'] /* should statistics be printed at end of run? */
@d show_happiness flags['h'] /* should lack of errors be announced? */
- at d temporary_output flags['t'] /* should temporary output take precedence? */
@d make_xrefs flags['x'] /* should cross references be output? */
+ at d check_for_change flags['c'] /* check temporary output for changes */
@<Common code...@>=
extern int argc; /* copy of |ac| parameter to |main| */
@@ -227,10 +231,8 @@
@ Code related to output:
@d update_terminal fflush(stdout) /* empty the terminal output buffer */
- at d new_line putchar('\n') @d putxchar putchar
+ at d new_line putchar('\n')
@d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
- at d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
@<Common code...@>=
extern FILE *C_file; /* where output of \.{CTANGLE} goes */
Modified: trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/comm-w32.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -52,13 +52,13 @@
An omitted change file argument means that |"NUL"| should be used,
@z
- at x section 76
+ at x section 75
strcpy(change_file_name,"/dev/null");
@y
strcpy(change_file_name,"NUL");
@z
- at x section 76 (this change copied from comm-bs.ch, July 94)
+ at x section 75 (this change copied from comm-bs.ch, July 94)
else if (*s=='/') dot_pos=NULL,name_pos=++s;
@y
else if (*s == ':' || *s == '\\' || *s == '/')
Added: trunk/Build/source/texk/web2c/cwebdir/common.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.bux (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/common.bux 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,28 @@
+@$ctangle "common.h" \zip@>
+@$ctwill "common.h" \zip@>
+@$cweave "common.h" \zip@>
+
+@$HAVE_GETTEXT "common.h" \zip@>
+
+@$init_p {CWEAVE.W}32 \&{void} (\,)@>
+@$init_node {CWEAVE.W}32 \&{void} (\,)@>
+@$names_match {CWEAVE.W}32 \&{boolean} (\,)@>
+
+@$ac {CWEAVE.W}2 \&{int}@>
+@$av {CWEAVE.W}2 \&{char} ${*}{*}$@>
+@$main {CWEAVE.W}2 \&{int} (\,)@>
+
+@$print_stats {CWEAVE.W}262 \&{void} (\,)@>
+
+@$xmem {CWEAVE.W}23 \&{xref\_info} [\,]@>
+
+@$xref {CWEAVE.W}24 \\{equiv\_or\_xref}@>
+
+@$text_info {CTANGLE.W}20 \&{text} [\,]@>
+
+@$equiv {CTANGLE.W}22 \\{equiv\_or\_xref}@>
+
+@$ilk {CWEAVE.W}20 \\{dummy.Ilk}@>
+
+@$DEV_NULL {COMMON.W}75 macro@>
+@$_DEV_NULL {COMMON.W}75 macro@>
Modified: trunk/Build/source/texk/web2c/cwebdir/common.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.c 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.c 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
/*1:*/
-#line 66 "common.w"
+#line 62 "common.w"
/*3:*/
-#line 46 "common.h"
+#line 44 "common.h"
#include <ctype.h>
#include <stdbool.h>
@@ -13,7 +13,7 @@
#include <string.h>
/*:3*/
-#line 67 "common.w"
+#line 63 "common.w"
#define ctangle false
#define cweave true \
@@ -34,13 +34,19 @@
#define period_ast 026
#define minus_gt_ast 027 \
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) )
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) ) \
+#define compress(c) if(loc++<=limit) return c \
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define isxalpha(c) ((c) =='_'||(c) =='$') \
+
+#define ishigh(c) ((eight_bits) (c) > 0177) \
+ \
+
#define max_include_depth 10 \
#define max_file_name_length 1024
@@ -74,10 +80,7 @@
#define update_terminal fflush(stdout)
#define new_line putchar('\n')
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
-#define C_printf(c,a) fprintf(C_file,c,a)
-#define C_putc(c) putc(c,C_file) \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) \
#define max_bytes 1000000 \
@@ -94,7 +97,8 @@
#define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) ) \
-#define if_section_start_make_pending(b) {*limit= '!'; \
+#define if_section_start_make_pending(b) { \
+*limit= '!'; \
for(loc= buffer;xisspace(*loc) ;loc++) ; \
*limit= ' '; \
if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
@@ -121,10 +125,10 @@
#define flag_change (**argv!='-')
-#line 68 "common.w"
+#line 64 "common.w"
/*2:*/
-#line 37 "common.h"
+#line 35 "common.h"
typedef bool boolean;
typedef uint8_t eight_bits;
@@ -141,7 +145,7 @@
extern char*id_loc;
/*:4*//*5:*/
-#line 88 "common.h"
+#line 92 "common.h"
extern char buffer[];
extern char*buffer_end;
@@ -149,7 +153,7 @@
extern char*limit;
/*:5*//*6:*/
-#line 105 "common.h"
+#line 109 "common.h"
extern int include_depth;
extern FILE*file[];
@@ -165,7 +169,7 @@
extern boolean web_file_open;
/*:6*//*8:*/
-#line 125 "common.h"
+#line 129 "common.h"
extern sixteen_bits section_count;
extern boolean changed_section[];
@@ -173,7 +177,7 @@
extern boolean print_where;
/*:8*//*9:*/
-#line 139 "common.h"
+#line 143 "common.h"
typedef struct name_info{
char*byte_start;
@@ -198,12 +202,12 @@
extern hash_pointer h;
/*:9*//*11:*/
-#line 183 "common.h"
+#line 187 "common.h"
extern int history;
/*:11*//*13:*/
-#line 199 "common.h"
+#line 203 "common.h"
extern int argc;
extern char**argv;
@@ -214,7 +218,7 @@
extern boolean flags[];
/*:13*//*14:*/
-#line 215 "common.h"
+#line 217 "common.h"
extern FILE*C_file;
extern FILE*tex_file;
@@ -223,20 +227,20 @@
extern FILE*active_file;
/*:14*/
-#line 69 "common.w"
+#line 65 "common.w"
/*18:*/
-#line 83 "common.w"
+#line 79 "common.w"
boolean program;
/*:18*//*19:*/
-#line 92 "common.w"
+#line 88 "common.w"
int phase;
/*:19*//*21:*/
-#line 130 "common.w"
+#line 126 "common.w"
char section_text[longest_name+1];
char*section_text_end= section_text+longest_name;
@@ -244,7 +248,7 @@
char*id_loc;
/*:21*//*22:*/
-#line 150 "common.w"
+#line 146 "common.w"
char buffer[long_buf_size];
char*buffer_end= buffer+buf_size-2;
@@ -252,7 +256,7 @@
char*limit= buffer;
/*:22*//*25:*/
-#line 194 "common.w"
+#line 190 "common.w"
int include_depth;
FILE*file[max_include_depth];
@@ -269,13 +273,13 @@
boolean web_file_open= false;
/*:25*//*26:*/
-#line 220 "common.w"
+#line 216 "common.w"
static char change_buffer[buf_size];
static char*change_limit;
/*:26*//*37:*/
-#line 399 "common.w"
+#line 396 "common.w"
sixteen_bits section_count;
boolean changed_section[max_sections];
@@ -284,7 +288,7 @@
boolean print_where= false;
/*:37*//*43:*/
-#line 596 "common.w"
+#line 593 "common.w"
char byte_mem[max_bytes];
char*byte_mem_end= byte_mem+max_bytes-1;
@@ -292,13 +296,13 @@
name_pointer name_dir_end= name_dir+max_names-1;
/*:43*//*44:*/
-#line 607 "common.w"
+#line 604 "common.w"
char*byte_ptr;
name_pointer name_ptr;
/*:44*//*46:*/
-#line 627 "common.w"
+#line 624 "common.w"
name_pointer hash[hash_size];
hash_pointer hash_end= hash+hash_size-1;
@@ -305,12 +309,12 @@
hash_pointer h;
/*:46*//*65:*/
-#line 1014 "common.w"
+#line 1006 "common.w"
int history= spotless;
/*:65*//*73:*/
-#line 1135 "common.w"
+#line 1129 "common.w"
int argc;
char**argv;
@@ -321,7 +325,7 @@
boolean flags[128];
/*:73*//*83:*/
-#line 1282 "common.w"
+#line 1273 "common.w"
FILE*C_file;
FILE*tex_file;
@@ -330,10 +334,10 @@
FILE*active_file;
/*:83*/
-#line 70 "common.w"
+#line 66 "common.w"
/*7:*/
-#line 119 "common.h"
+#line 123 "common.h"
extern boolean get_line(void);
extern void check_complete(void);
@@ -340,12 +344,12 @@
extern void reset_input(void);
/*:7*//*10:*/
-#line 162 "common.h"
+#line 166 "common.h"
extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
extern name_pointer id_lookup(const char*,const char*,char);
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
extern void init_node(name_pointer);
extern void init_p(name_pointer,eight_bits);
extern void print_prefix_name(name_pointer);
@@ -353,7 +357,7 @@
extern void sprint_section_name(char*,name_pointer);
/*:10*//*12:*/
-#line 186 "common.h"
+#line 190 "common.h"
extern int wrap_up(void);
extern void err_print(const char*);
@@ -361,50 +365,50 @@
extern void overflow(const char*);
/*:12*//*15:*/
-#line 223 "common.h"
+#line 225 "common.h"
extern void common_init(void);
extern void print_stats(void);
/*:15*//*24:*/
-#line 180 "common.w"
+#line 176 "common.w"
static boolean input_ln(FILE*);
/*:24*//*28:*/
-#line 241 "common.w"
+#line 237 "common.w"
static void prime_the_change_buffer(void);
/*:28*//*33:*/
-#line 340 "common.w"
+#line 337 "common.w"
static void check_change(void);
/*:33*//*55:*/
-#line 774 "common.w"
+#line 767 "common.w"
static int web_strcmp(char*,int,char*,int);
-static name_pointer add_section_name(name_pointer,int,char*,char*,int);
-static void extend_section_name(name_pointer,char*,char*,int);
+static name_pointer add_section_name(name_pointer,int,char*,char*,boolean);
+static void extend_section_name(name_pointer,char*,char*,boolean);
/*:55*//*64:*/
-#line 1002 "common.w"
+#line 994 "common.w"
static int section_name_cmp(char**,int,name_pointer);
/*:64*//*76:*/
-#line 1197 "common.w"
+#line 1190 "common.w"
static void scan_args(void);
/*:76*/
-#line 71 "common.w"
+#line 67 "common.w"
/*:1*//*20:*/
-#line 99 "common.w"
+#line 95 "common.w"
void
common_init(void)
{
/*45:*/
-#line 611 "common.w"
+#line 608 "common.w"
name_dir->byte_start= byte_ptr= byte_mem;
name_ptr= name_dir+1;
@@ -412,24 +416,24 @@
root= NULL;
/*:45*//*47:*/
-#line 634 "common.w"
+#line 631 "common.w"
for(h= hash;h<=hash_end;*h++= NULL);
/*:47*/
-#line 103 "common.w"
+#line 99 "common.w"
/*74:*/
-#line 1148 "common.w"
+#line 1142 "common.w"
show_banner= show_happiness= show_progress= make_xrefs= true;
show_stats= false;
/*:74*/
-#line 104 "common.w"
+#line 100 "common.w"
/*84:*/
-#line 1289 "common.w"
+#line 1280 "common.w"
scan_args();
if(program==ctangle){
@@ -443,12 +447,12 @@
}
/*:84*/
-#line 105 "common.w"
+#line 101 "common.w"
}
/*:20*//*23:*/
-#line 160 "common.w"
+#line 156 "common.w"
static boolean input_ln(
FILE*fp)
@@ -470,7 +474,7 @@
}
/*:23*//*27:*/
-#line 231 "common.w"
+#line 227 "common.w"
static void
prime_the_change_buffer(void)
@@ -477,7 +481,7 @@
{
change_limit= change_buffer;
/*29:*/
-#line 247 "common.w"
+#line 243 "common.w"
while(true){
change_line++;
@@ -494,10 +498,10 @@
}
/*:29*/
-#line 236 "common.w"
+#line 232 "common.w"
/*30:*/
-#line 264 "common.w"
+#line 260 "common.w"
do{
change_line++;
@@ -509,10 +513,10 @@
}while(limit==buffer);
/*:30*/
-#line 237 "common.w"
+#line 233 "common.w"
/*31:*/
-#line 274 "common.w"
+#line 270 "common.w"
{
change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -520,12 +524,12 @@
}
/*:31*/
-#line 238 "common.w"
+#line 234 "common.w"
}
/*:27*//*32:*/
-#line 302 "common.w"
+#line 299 "common.w"
static void
check_change(void)
@@ -538,7 +542,7 @@
if(!change_pending)changed_section[section_count]= true;
}
while(true){
-changing= true;print_where= true;change_line++;
+changing= print_where= true;change_line++;
if(!input_ln(change_file)){
err_print("! Change file ended before @y");
@@ -548,7 +552,7 @@
if(limit> buffer+1&&buffer[0]=='@'){
char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
/*34:*/
-#line 342 "common.w"
+#line 339 "common.w"
if(xyz_code=='x'||xyz_code=='z'){
loc= buffer+2;err_print("! Where is the matching @y?");
@@ -566,11 +570,11 @@
}
/*:34*/
-#line 324 "common.w"
+#line 321 "common.w"
}
/*31:*/
-#line 274 "common.w"
+#line 270 "common.w"
{
change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -578,7 +582,7 @@
}
/*:31*/
-#line 326 "common.w"
+#line 323 "common.w"
changing= false;cur_line++;
while(!input_ln(cur_file)){
@@ -594,7 +598,7 @@
}
/*:32*//*35:*/
-#line 362 "common.w"
+#line 359 "common.w"
void
reset_input(void)
@@ -601,7 +605,7 @@
{
limit= buffer;loc= buffer+1;buffer[0]= ' ';
/*36:*/
-#line 377 "common.w"
+#line 374 "common.w"
if((web_file= fopen(web_file_name,"r"))==NULL){
strcpy(web_file_name,alt_web_file_name);
@@ -615,16 +619,16 @@
fatal("! Cannot open change file ",change_file_name);
/*:36*/
-#line 367 "common.w"
+#line 364 "common.w"
-include_depth= 0;cur_line= 0;change_line= 0;
+include_depth= cur_line= change_line= 0;
change_depth= include_depth;
-changing= 1;prime_the_change_buffer();changing= !changing;
+changing= true;prime_the_change_buffer();changing= !changing;
limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= false;
}
/*:35*//*38:*/
-#line 406 "common.w"
+#line 403 "common.w"
boolean get_line(void)
{
@@ -631,7 +635,7 @@
restart:
if(changing&&include_depth==change_depth)
/*41:*/
-#line 514 "common.w"
+#line 511 "common.w"
{
change_line++;
if(!input_ln(change_file)){
@@ -662,11 +666,11 @@
}
/*:41*/
-#line 411 "common.w"
+#line 408 "common.w"
if(!changing||include_depth> change_depth){
/*40:*/
-#line 497 "common.w"
+#line 494 "common.w"
{
cur_line++;
while(!input_ln(cur_file)){
@@ -685,7 +689,7 @@
}
/*:40*/
-#line 413 "common.w"
+#line 410 "common.w"
if(changing&&include_depth==change_depth)goto restart;
}
@@ -706,11 +710,11 @@
}
include_depth++;
/*39:*/
-#line 451 "common.w"
+#line 448 "common.w"
{
char temp_file_name[max_file_name_length];
char*cur_file_name_end= cur_file_name+max_file_name_length-1;
-char*k= cur_file_name,*kk;
+char*kk,*k= cur_file_name;
int l;
if(*loc=='"'){
@@ -754,7 +758,7 @@
}
/*:39*/
-#line 432 "common.w"
+#line 429 "common.w"
}
return true;
@@ -761,7 +765,7 @@
}
/*:38*//*42:*/
-#line 546 "common.w"
+#line 543 "common.w"
void
check_complete(void){
@@ -775,7 +779,7 @@
}
/*:42*//*48:*/
-#line 639 "common.w"
+#line 636 "common.w"
name_pointer
id_lookup(
@@ -790,7 +794,7 @@
if(last==NULL)for(last= first;*last!='\0';last++);
l= (int)(last-first);
/*49:*/
-#line 662 "common.w"
+#line 659 "common.w"
h= (eight_bits)*i;
while(++i<last)h= (h+h+(int)((eight_bits)*i))%hash_size;
@@ -797,10 +801,10 @@
/*:49*/
-#line 652 "common.w"
+#line 649 "common.w"
/*50:*/
-#line 670 "common.w"
+#line 667 "common.w"
p= hash[h];
while(p&&!names_match(p,first,l,t))p= p->link;
@@ -810,10 +814,10 @@
}
/*:50*/
-#line 653 "common.w"
+#line 650 "common.w"
if(p==name_ptr)/*51:*/
-#line 681 "common.w"
+#line 679 "common.w"
{
if(byte_ptr+l> byte_mem_end)overflow("byte memory");
if(name_ptr>=name_dir_end)overflow("name");
@@ -823,13 +827,13 @@
}
/*:51*/
-#line 654 "common.w"
+#line 651 "common.w"
return p;
}
/*:48*//*52:*/
-#line 713 "common.w"
+#line 711 "common.w"
void
print_section_name(
@@ -839,11 +843,9 @@
name_pointer q= p+1;
while(p!=name_dir){
ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-term_write(s,(size_t)(ss-s));p= q->link;q= p;
-}else{
-term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir,q= NULL;
+term_write(s,(size_t)(ss-s));
s= p->byte_start;
}
if(q)term_write("...",3);
@@ -850,7 +852,7 @@
}
/*:52*//*53:*/
-#line 732 "common.w"
+#line 728 "common.w"
void
sprint_section_name(
@@ -861,11 +863,8 @@
name_pointer q= p+1;
while(p!=name_dir){
ss= (p+1)->byte_start-1;
-if(*ss==' '&&ss>=s){
-p= q->link;q= p;
-}else{
-ss++;p= name_dir;
-}
+if(*ss==' '&&ss>=s)p= q->link,q= p;
+else ss++,p= name_dir;
strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
s= p->byte_start;
}
@@ -873,7 +872,7 @@
}
/*:53*//*54:*/
-#line 753 "common.w"
+#line 746 "common.w"
void
print_prefix_name(
@@ -886,7 +885,7 @@
}
/*:54*//*56:*/
-#line 779 "common.w"
+#line 772 "common.w"
static int web_strcmp(
char*j,
@@ -904,7 +903,7 @@
}
/*:56*//*57:*/
-#line 808 "common.w"
+#line 801 "common.w"
static name_pointer
add_section_name(
@@ -912,7 +911,7 @@
int c,
char*first,
char*last,
-int ispref)
+boolean ispref)
{
name_pointer p= name_ptr;
char*s= first_chunk(p);
@@ -928,14 +927,13 @@
}
set_prefix_length(p,name_len);
strncpy(s,first,name_len);
-p->llink= NULL;
-p->rlink= NULL;
+p->llink= p->rlink= NULL;
init_node(p);
return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
}
/*:57*//*58:*/
-#line 837 "common.w"
+#line 829 "common.w"
static void
extend_section_name(
@@ -942,7 +940,7 @@
name_pointer p,
char*first,
char*last,
-int ispref)
+boolean ispref)
{
char*s;
name_pointer q= p+1;
@@ -959,14 +957,14 @@
}
/*:58*//*59:*/
-#line 865 "common.w"
+#line 857 "common.w"
name_pointer
section_lookup(
char*first,char*last,
-int ispref)
+boolean ispref)
{
-int c= 0;
+int c= less;
name_pointer p= root;
name_pointer q= NULL;
name_pointer r= NULL;
@@ -974,7 +972,7 @@
int name_len= (int)(last-first)+1;
/*60:*/
-#line 889 "common.w"
+#line 881 "common.w"
while(p){
c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -1001,19 +999,19 @@
}
/*:60*/
-#line 879 "common.w"
+#line 871 "common.w"
/*61:*/
-#line 914 "common.w"
+#line 906 "common.w"
if(r==NULL)
return add_section_name(par,c,first,last+1,ispref);
/*:61*/
-#line 880 "common.w"
+#line 872 "common.w"
/*62:*/
-#line 922 "common.w"
+#line 914 "common.w"
switch(section_name_cmp(&first,name_len,r)){
@@ -1026,16 +1024,16 @@
}
else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
-case equal:return r;
+case equal:break;
case extension:if(!ispref||first<=last)
extend_section_name(r,first,last+1,ispref);
-return r;
+break;
case bad_extension:
fputs("\n! New name extends <",stdout);
print_section_name(r);
err_print(">");
-return r;
+break;
default:
fputs("\n! Section name incompatible with <",stdout);
@@ -1043,16 +1041,16 @@
fputs(">,\n which abbreviates <",stdout);
print_section_name(r);
err_print(">");
+}
return r;
-}
/*:62*/
-#line 881 "common.w"
+#line 873 "common.w"
}
/*:59*//*63:*/
-#line 970 "common.w"
+#line 962 "common.w"
static int section_name_cmp(
char**pfirst,
@@ -1062,12 +1060,12 @@
char*first= *pfirst;
name_pointer q= r+1;
char*ss,*s= first_chunk(r);
-int c;
-int ispref;
+int c= less;
+boolean ispref;
while(true){
ss= (r+1)->byte_start-1;
-if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
-else ispref= 0,ss++,q= name_dir;
+if(*ss==' '&&ss>=r->byte_start)ispref= true,q= q->link;
+else ispref= false,ss++,q= name_dir;
switch(c= web_strcmp(first,len,s,ss-s)){
case equal:if(q==name_dir)
if(ispref){
@@ -1086,7 +1084,7 @@
}
/*:63*//*66:*/
-#line 1024 "common.w"
+#line 1016 "common.w"
void
err_print(
@@ -1095,7 +1093,7 @@
char*k,*l;
printf(*s=='!'?"\n%s":"%s",s);
if(web_file_open)/*67:*/
-#line 1044 "common.w"
+#line 1036 "common.w"
{if(changing&&include_depth==change_depth)
printf(". (l. %d of change file)\n",change_line);
@@ -1106,7 +1104,7 @@
for(k= buffer;k<l;k++)
if(*k=='\t')putchar(' ');
else putchar(*k);
-putchar('\n');
+new_line;
for(k= buffer;k<l;k++)putchar(' ');
}
for(k= l;k<limit;k++)putchar(*k);
@@ -1115,13 +1113,13 @@
}
/*:67*/
-#line 1031 "common.w"
+#line 1023 "common.w"
update_terminal;mark_error;
}
/*:66*//*68:*/
-#line 1076 "common.w"
+#line 1068 "common.w"
int wrap_up(void){
if(show_progress)new_line;
@@ -1128,19 +1126,21 @@
if(show_stats)
print_stats();
/*69:*/
-#line 1086 "common.w"
+#line 1078 "common.w"
switch(history){
-case spotless:if(show_happiness)puts("(No errors were found.)");break;
+case spotless:
+if(show_happiness)puts("(No errors were found.)");break;
case harmless_message:
puts("(Did you see the warning message above?)");break;
case error_message:
puts("(Pardon me, but I think I spotted something wrong.)");break;
-case fatal_message:puts("(That was a fatal error, my friend.)");
+case fatal_message:default:
+puts("(That was a fatal error, my friend.)");
}
/*:69*/
-#line 1081 "common.w"
+#line 1073 "common.w"
if(history> harmless_message)return EXIT_FAILURE;
else return EXIT_SUCCESS;
@@ -1147,7 +1147,7 @@
}
/*:68*//*70:*/
-#line 1102 "common.w"
+#line 1096 "common.w"
void
fatal(
const char*s,const char*t)
@@ -1158,7 +1158,7 @@
}
/*:70*//*71:*/
-#line 1113 "common.w"
+#line 1107 "common.w"
void
overflow(
const char*t)
@@ -1168,7 +1168,7 @@
/*:71*//*75:*/
-#line 1167 "common.w"
+#line 1161 "common.w"
static void
scan_args(void)
@@ -1182,35 +1182,32 @@
strcpy(change_file_name,"/dev/null");
while(--argc> 0){
if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*80:*/
-#line 1258 "common.w"
+#line 1251 "common.w"
-{
for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
flags[(eight_bits)*dot_pos]= flag_change;
-}
/*:80*/
-#line 1179 "common.w"
+#line 1173 "common.w"
else{
s= name_pos= *argv;dot_pos= NULL;
-while(*s){
+while(*s)
if(*s=='.')dot_pos= s++;
else if(*s=='/')dot_pos= NULL,name_pos= ++s;
else s++;
-}
if(!found_web)/*77:*/
-#line 1206 "common.w"
+#line 1199 "common.w"
{
if(s-*argv> max_file_name_length-5)
/*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
fatal("! Filename too long\n",*argv);
/*:82*/
-#line 1209 "common.w"
+#line 1202 "common.w"
if(dot_pos==NULL)
sprintf(web_file_name,"%s.w",*argv);
@@ -1227,21 +1224,21 @@
}
/*:77*/
-#line 1188 "common.w"
+#line 1181 "common.w"
else if(!found_change)/*78:*/
-#line 1224 "common.w"
+#line 1217 "common.w"
{
if(strcmp(*argv,"-")!=0){
if(s-*argv> max_file_name_length-4)
/*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
fatal("! Filename too long\n",*argv);
/*:82*/
-#line 1228 "common.w"
+#line 1221 "common.w"
if(dot_pos==NULL)
sprintf(change_file_name,"%s.ch",*argv);
@@ -1251,20 +1248,20 @@
}
/*:78*/
-#line 1189 "common.w"
+#line 1182 "common.w"
else if(!found_out)/*79:*/
-#line 1236 "common.w"
+#line 1229 "common.w"
{
if(s-*argv> max_file_name_length-5)
/*82:*/
-#line 1276 "common.w"
+#line 1267 "common.w"
fatal("! Filename too long\n",*argv);
/*:82*/
-#line 1239 "common.w"
+#line 1232 "common.w"
if(dot_pos==NULL){
sprintf(tex_file_name,"%s.tex",*argv);
@@ -1284,10 +1281,10 @@
}
/*:79*/
-#line 1190 "common.w"
+#line 1183 "common.w"
else/*81:*/
-#line 1264 "common.w"
+#line 1255 "common.w"
{
if(program==ctangle)
@@ -1301,12 +1298,12 @@
}
/*:81*/
-#line 1191 "common.w"
+#line 1184 "common.w"
}
}
if(!found_web)/*81:*/
-#line 1264 "common.w"
+#line 1255 "common.w"
{
if(program==ctangle)
@@ -1320,7 +1317,7 @@
}
/*:81*/
-#line 1194 "common.w"
+#line 1187 "common.w"
}
Modified: trunk/Build/source/texk/web2c/cwebdir/common.h
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.h 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.h 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
% This program by Silvio Levy and Donald E. Knuth
% is based on a program by Knuth.
% It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021 (works also with later versions)
+% Version 4.3 --- April 2021 (works also with later versions)
% Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
@@ -27,9 +27,7 @@
First comes general stuff:
- at s boolean int
- at s uint8_t int
- at s uint16_t int
+ at i iso_types.w
@d ctangle false
@d cweave true
@@ -56,20 +54,22 @@
@^ASCII code dependencies@>
@d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
- at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
- at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
- at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
- at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
- at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
- at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
- at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
- at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
- at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
- at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
- at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
- at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
- at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
- at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+ at d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
+ at d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
+ at d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
+ at d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
+ at d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
+ at d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
+ at d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
+ at d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
+ at d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
+ at d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
+ at d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
+ at d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
+ at d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
+ at d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+@#
+ at d compress(c) if (loc++<=limit) return c
@<Common code...@>=
extern char section_text[]; /* text being sought for */
@@ -78,12 +78,16 @@
extern char *id_loc; /* just after the current identifier in the buffer */
@ Code related to input routines:
- at d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
- at d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
- at d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
- at d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
- at d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
- at d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
+ at d xisalpha(c) (isalpha((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisdigit(c) (isdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisspace(c) (isspace((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xislower(c) (islower((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisupper(c) (isupper((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d xisxdigit(c) (isxdigit((eight_bits)(c))&&((eight_bits)(c)<0200))
+ at d isxalpha(c) ((c)=='_' || (c)=='$')
+ /* non-alpha characters allowed in identifier */
+ at d ishigh(c) ((eight_bits)(c)>0177)
+@^high-bit character handling@>
@<Common code...@>=
extern char buffer[]; /* where each line of input goes */
@@ -163,7 +167,7 @@
extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
extern name_pointer id_lookup(const char *,const char *,char);
/* looks up a string in the identifier table */
-extern name_pointer section_lookup(char *,char *,int); /* finds section name */
+extern name_pointer section_lookup(char *,char *,boolean); /* finds section name */
extern void init_node(name_pointer);@/
extern void init_p(name_pointer,eight_bits);@/
extern void print_prefix_name(name_pointer);@/
@@ -207,10 +211,8 @@
@ Code related to output:
@d update_terminal fflush(stdout) /* empty the terminal output buffer */
- at d new_line putchar('\n') @d putxchar putchar
+ at d new_line putchar('\n')
@d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
- at d C_printf(c,a) fprintf(C_file,c,a)
- at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
@<Common code...@>=
extern FILE *C_file; /* where output of \.{CTANGLE} goes */
Modified: trunk/Build/source/texk/web2c/cwebdir/common.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/common.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/common.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
% This program by Silvio Levy and Donald E. Knuth
% is based on a program by Knuth.
% It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
% Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
@@ -22,12 +22,12 @@
\def\v{\char'174} % vertical (|) in typewriter font
-\def\title{Common code for CTANGLE and CWEAVE (Version 4.2)}
+\def\title{Common code for CTANGLE and CWEAVE (Version 4.3)}
\def\topofcontents{\null\vfill
\centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
{\ttitlefont CWEAVE}}
\vskip 15pt
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
\vfill}
\def\botofcontents{\vfill
\noindent
@@ -47,10 +47,6 @@
\pageno=\contentspagenumber \advance\pageno by 1
\let\maybe=\iftrue
- at s boolean int
- at s uint8_t int
- at s uint16_t int
-
@** Introduction. This file contains code common
to both \.{CTANGLE} and \.{CWEAVE}, which roughly concerns the following
problems: character uniformity, input routines, error handling and
@@ -158,13 +154,13 @@
@^system dependencies@>
@c
-static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns |false| */
-FILE *fp at t\2\2@>) /* what file to read from */
+static boolean input_ln( /* copies a line into |buffer| or returns |false| */
+FILE *fp) /* what file to read from */
{
- register int c=EOF; /* character read; initialized so some compilers won't complain */
- register char *k; /* where next character goes */
- if (feof(fp)) return false; /* we have hit end-of-file */
- limit = k = buffer; /* beginning of buffer */
+ register int c=EOF; /* character read; initialized so some compilers won't complain */
+ register char *k; /* where next character goes */
+ if (feof(fp)) return false; /* we have hit end-of-file */
+ limit = k = buffer; /* beginning of buffer */
while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n')
if ((*(k++) = c) != ' ') limit = k;
if (k>buffer_end)
@@ -172,7 +168,7 @@
ungetc(c,fp); loc=buffer; err_print("! Input line too long");
@.Input line too long@>
}
- if (c==EOF && limit==buffer) return false; /* there was nothing after
+ if (c==EOF && limit==buffer) return false; /* there was nothing after
the last newline */
return true;
}
@@ -214,7 +210,7 @@
Here's a shorthand expression for inequality between the two lines:
- at d lines_dont_match (change_limit-change_buffer != limit-buffer || @|
+ at d lines_dont_match (change_limit-change_buffer != limit-buffer @| ||
strncmp(buffer, change_buffer, (size_t)(limit-buffer)))
@<Global var...@>=
@@ -293,8 +289,9 @@
This procedure is called only when |buffer<limit|, i.e., when the
current line is nonempty.
- at d if_section_start_make_pending(b) {@+*limit='!';
- for (loc=buffer;xisspace(*loc);loc++) ;
+ at d if_section_start_make_pending(b) {
+ *limit='!';@+
+ for (loc=buffer;xisspace(*loc);loc++) ;@+
*limit=' ';
if (*loc=='@@' && (xisspace(*(loc+1)) || *(loc+1)=='*')) change_pending=b;
}
@@ -311,7 +308,7 @@
if (!change_pending) changed_section[section_count]=true;
}
while (true) {
- changing=true; print_where=true; change_line++;
+ changing=print_where=true; change_line++;
if (!input_ln(change_file)) {
err_print("! Change file ended before @@y");
@.Change file ended...@>
@@ -365,9 +362,9 @@
{
limit=buffer; loc=buffer+1; buffer[0]=' ';
@<Open input files@>@;
- include_depth=0; cur_line=0; change_line=0;
+ include_depth=cur_line=change_line=0;
change_depth=include_depth;
- changing=1; prime_the_change_buffer(); changing=!changing;
+ changing=true; prime_the_change_buffer(); changing=!changing;
limit=buffer; loc=buffer+1; buffer[0]=' '; input_has_ended=false;
}
@@ -408,7 +405,7 @@
{
restart:
if (changing && include_depth==change_depth)
- @<Read from |change_file| and maybe turn off |changing|@>@;
+ @<Read from |change_file| and maybe turn off |changing|@>@;
if (! changing || include_depth>change_depth) {
@<Read from |cur_file| and maybe turn on |changing|@>@;
if (changing && include_depth==change_depth) goto restart;
@@ -451,7 +448,7 @@
@.CWEBINPUTS@>@<Try to open...@>= {
char temp_file_name[max_file_name_length];
char *cur_file_name_end=cur_file_name+max_file_name_length-1;
- char *k=cur_file_name, *kk;
+ char *kk, *k=cur_file_name;
int l; /* length of file name */
if (*loc=='"') {
@@ -483,7 +480,7 @@
if (l>0) {
if (k+l+2>=cur_file_name_end) too_long();
@.Include file name ...@>
- for (; k>= cur_file_name; k--) *(k+l+1)=*k;
+ for (; k>=cur_file_name; k--) *(k+l+1)=*k;
strcpy(cur_file_name,temp_file_name);
cur_file_name[l]='/'; /* \UNIX/ pathname separator */
if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@@ -638,10 +635,10 @@
@c
name_pointer
-id_lookup(@t\1\1@> /* looks up a string in the identifier table */
+id_lookup( /* looks up a string in the identifier table */
const char *first, /* first character of string */
const char *last, /* last character of string plus one */
-char t at t\2\2@>) /* the |ilk|; used by \.{CWEAVE} only */
+char t) /* the |ilk|; used by \.{CWEAVE} only */
{
const char *i=first; /* position in |buffer| */
int h; /* hash code */
@@ -678,6 +675,7 @@
@ The information associated with a new identifier must be initialized
in a slightly different way in \.{CWEAVE} than in \.{CTANGLE}; hence the
|init_p| procedure.
+
@<Enter a new name...@>= {
if (byte_ptr+l>byte_mem_end) overflow("byte memory");
if (name_ptr>=name_dir_end) overflow("name");
@@ -719,11 +717,9 @@
name_pointer q = p+1;
while (p!=name_dir) {
ss = (p+1)->byte_start-1;
- if (*ss==' ' && ss>=s) {
- term_write(s,(size_t)(ss-s)); p=q->link; q=p;
- } else {
- term_write(s,(size_t)(ss+1-s)); p=name_dir; q=NULL;
- }
+ if (*ss==' ' && ss>=s) p=q->link,q=p;
+ else ss++,p=name_dir,q=NULL;
+ term_write(s,(size_t)(ss-s));
s = p->byte_start;
}
if (q) term_write("...",3); /* complete name not yet known */
@@ -739,11 +735,8 @@
name_pointer q = p+1;
while (p!=name_dir) {
ss = (p+1)->byte_start-1;
- if (*ss==' ' && ss>=s) {
- p=q->link; q=p;
- } else {
- ss++; p=name_dir;
- }
+ if (*ss==' ' && ss>=s) p=q->link,q=p;
+ else ss++,p=name_dir;
strncpy(dest,s,(size_t)(ss-s)), dest+=ss-s;
s = p->byte_start;
}
@@ -773,15 +766,15 @@
@<Predecl...@>=
static int web_strcmp(char *,int,char *,int);@/
-static name_pointer add_section_name(name_pointer,int,char *,char *,int);@/
-static void extend_section_name(name_pointer,char *,char *,int);
+static name_pointer add_section_name(name_pointer,int,char *,char *,boolean);@/
+static void extend_section_name(name_pointer,char *,char *,boolean);
@ @c
-static int web_strcmp(@t\1\1@> /* fuller comparison than |strcmp| */
+static int web_strcmp( /* fuller comparison than |strcmp| */
char *j, /* beginning of first string */
int j_len, /* length of first string */
char *k, /* beginning of second string */
- int k_len at t\2\2@>) /* length of second string */
+ int k_len) /* length of second string */
{
char *j1=j+j_len, *k1=k+k_len;
while (k<k1 && j<j1 && *j==*k) k++, j++;
@@ -807,12 +800,12 @@
@c
static name_pointer
-add_section_name(@t\1\1@> /* install a new node in the tree */
+add_section_name( /* install a new node in the tree */
name_pointer par, /* parent of new node */
int c, /* right or left? */
char *first, /* first character of section name */
char *last, /* last character of section name, plus one */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
name_pointer p=name_ptr; /* new node */
char *s=first_chunk(p);
@@ -828,8 +821,7 @@
}
set_prefix_length(p,name_len);
strncpy(s,first,name_len);
- p->llink=NULL;
- p->rlink=NULL;
+ p->llink=p->rlink=NULL;
init_node(p);
return par==NULL ? (root=p) : c==less ? (par->llink=p) : (par->rlink=p);
}
@@ -836,11 +828,11 @@
@ @c
static void
-extend_section_name(@t\1\1@>
+extend_section_name(
name_pointer p, /* name to be extended */
char *first, /* beginning of extension text */
char *last, /* one beyond end of extension text */
-int ispref at t\2\2@>) /* are we adding a prefix or a full name? */
+boolean ispref) /* are we adding a prefix or a full name? */
{
char *s;
name_pointer q=p+1;
@@ -864,11 +856,11 @@
@c
name_pointer
-section_lookup(@t\1\1@> /* find or install section name in tree */
+section_lookup( /* find or install section name in tree */
char *first,char *last, /* first and last characters of new name */
-int ispref at t\2\2@>) /* is the new name a prefix or a full name? */
+boolean ispref) /* is the new name a prefix or a full name? */
{
- int c=0; /* comparison between two names; initialized so some compilers won't complain */
+ int c=less; /* comparison between two names; initialized so some compilers won't complain */
name_pointer p=root; /* current node of the search tree */
name_pointer q=NULL; /* another place to look in the tree */
name_pointer r=NULL; /* where a match has been found */
@@ -931,16 +923,16 @@
}
else if (name_len<prefix_length(r)) set_prefix_length(r,name_len);
/* fall through */
- case equal: return r;
+ case equal: break;
case extension: if (!ispref || first<=last)
extend_section_name(r,first,last+1,ispref);
- return r;
+ break;
case bad_extension:
fputs("\n! New name extends <",stdout);
@.New name extends...@>
print_section_name(r);
err_print(">");
- return r;
+ break;
default: /* no match: illegal */
fputs("\n! Section name incompatible with <",stdout);
@.Section name incompatible...@>
@@ -948,8 +940,8 @@
fputs(">,\n which abbreviates <",stdout);
print_section_name(r);
err_print(">");
- return r;
}
+return r;
@ The return codes of |section_name_cmp|, which compares a string with
the full name of a section, are those of |web_strcmp| plus
@@ -968,20 +960,20 @@
@d bad_extension 5
@c
-static int section_name_cmp(@t\1\1@>
+static int section_name_cmp(
char **pfirst, /* pointer to beginning of comparison string */
int len, /* length of string */
-name_pointer r at t\2\2@>) /* section name being compared */
+name_pointer r) /* section name being compared */
{
char *first=*pfirst; /* beginning of comparison string */
name_pointer q=r+1; /* access to subsequent chunks */
char *ss, *s=first_chunk(r);
- int c; /* comparison */
- int ispref; /* is chunk |r| a prefix? */
+ int c=less; /* comparison */
+ boolean ispref; /* is chunk |r| a prefix? */
while (true) {
ss=(r+1)->byte_start-1;
- if (*ss==' ' && ss>=r->byte_start) ispref=1,q=q->link;
- else ispref=0,ss++,q=name_dir;
+ if (*ss==' ' && ss>=r->byte_start) ispref=true,q=q->link;
+ else ispref=false,ss++,q=name_dir;
switch(c=web_strcmp(first,len,s,ss-s)) {
case equal: if (q==name_dir)
if (ispref) {
@@ -1023,12 +1015,12 @@
@c
void
-err_print(@t\1\1@> /* prints `\..' and location of error message */
-const char *s at t\2\2@>)
+err_print( /* prints `\..' and location of error message */
+const char *s)
{
char *k,*l; /* pointers into |buffer| */
printf(*s=='!'? "\n%s" : "%s",s);
- if(web_file_open) @<Print error location based on input buffer@>@;
+ if (web_file_open) @<Print error location based on input buffer@>@;
update_terminal; mark_error;
}
@@ -1051,7 +1043,7 @@
for (k=buffer; k<l; k++)
if (*k=='\t') putchar(' ');
else putchar(*k); /* print the characters already read */
- putchar('\n');
+ new_line;
for (k=buffer; k<l; k++) putchar(' '); /* space out the next line */
}
for (k=l; k<limit; k++) putchar(*k); /* print the part not yet read */
@@ -1070,7 +1062,7 @@
Some implementations may wish to pass the |history| value to the
operating system so that it can be used to govern whether or not other
programs are started. Here, for instance, we pass the operating system
-a status of 0 if and only if only harmless messages were printed.
+a status of |EXIT_SUCCESS| if and only if only harmless messages were printed.
@^system dependencies@>
@c
@@ -1085,13 +1077,15 @@
@ @<Print the job |history|@>=
switch (history) {
-case spotless: if (show_happiness) puts("(No errors were found.)"); break;
+case spotless:
+ if (show_happiness) puts("(No errors were found.)"); break;
case harmless_message:
puts("(Did you see the warning message above?)"); break;
case error_message:
puts("(Pardon me, but I think I spotted something wrong.)"); break;
-case fatal_message: puts("(That was a fatal error, my friend.)");
-} /* there are no other cases */
+case fatal_message: default:
+ puts("(That was a fatal error, my friend.)");
+}
@ When there is no way to recover from an error, the |fatal| subroutine is
invoked. This happens most often when |overflow| occurs.
@@ -1179,14 +1173,13 @@
if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
else {
s=name_pos=*argv;@+dot_pos=NULL;
- while (*s) {
+ while (*s)
if (*s=='.') dot_pos=s++;
else if (*s=='/') dot_pos=NULL,name_pos=++s;
else s++;
- }
if (!found_web) @<Make
- |web_file_name|, |tex_file_name|, and |C_file_name|@>@;
- else if (!found_change) @<Make |change_file_name| from |fname|@>@;
+ |web_file_name|, |tex_file_name|, and |C_file_name|@>@;
+ else if (!found_change) @<Make |change_file_name|@>@;
else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
else @<Print usage error message and quit@>@;
}
@@ -1256,10 +1249,8 @@
@ @d flag_change (**argv!='-')
@<Handle flag...@>=
-{
- for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
- flags[(eight_bits)*dot_pos]=flag_change;
-}
+for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+ flags[(eight_bits)*dot_pos]=flag_change;
@ @<Print usage error message and quit@>=
{
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-bs.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,16 +17,16 @@
The ``banner line'' defined here should be changed whenever \.{CTANGLE}
is modified.
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
The ``banner line'' defined here should be changed whenever \.{CTANGLE}
is modified.
- at d banner "This is CTANGLE (Version 4.2pc/big)"
+ at d banner "This is CTANGLE (Version 4.3pc/big)"
@z
- at x Section 9.
+ at x Section 10.
for section names */
@<Common code...@>=
@@ -127,7 +127,7 @@
@z
- at x Section 16.
+ at x Section 19.
eight_bits *tok_start; /* pointer into |tok_mem| */
sixteen_bits text_link; /* relates replacement texts */
} text;
@@ -140,7 +140,7 @@
@z
- at x Section 17.
+ at x Section 20.
static eight_bits tok_mem[max_toks];
static eight_bits *tok_mem_end=tok_mem+max_toks-1;
static eight_bits *tok_ptr; /* first unused position in |tok_mem| */
@@ -151,7 +151,7 @@
@z
- at x Section 18.
+ at x Section 21.
text_info->tok_start=tok_ptr=tok_mem;
text_ptr=text_info+1; text_ptr->tok_start=tok_mem;
/* this makes replacement text 0 of length zero */
@@ -163,7 +163,7 @@
@z
- at x Section 19.
+ at x Section 22.
@d equiv equiv_or_xref /* info corresponding to names */
@y
@d equiv ptr_union.equiv_member /* info corresponding to names */
@@ -170,7 +170,7 @@
@z
- at x Section 27.
+ at x Section 31.
eight_bits *end_field; /* ending location of replacement text */
eight_bits *byte_field; /* present location within replacement text */
@y
@@ -179,7 +179,7 @@
@z
- at x Section 49.
+ at x Section 55.
out_char(
eight_bits cur_char)
{
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-man.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -16,7 +16,7 @@
}
@y
\def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{66}
+\def\contentspagenumber{64}
\def\title{APPENDIX E: CTANGLE}
\let\K=\leftarrow
@z
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-pc.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -9,11 +9,11 @@
alternate change files with -bs suffix instead of -pc.
@x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
- at d banner "This is CTANGLE (Version 4.2pc)"
+ at d banner "This is CTANGLE (Version 4.3pc)"
@z
- at x section 4
+ at x section 17
@d max_bytes 1000000 /* the number of bytes in identifiers,
index entries, and section names */
@d max_toks 1000000 /* number of bytes in compressed \CEE/ code */
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-ql.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,15 +7,15 @@
@x
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
@y
-\def\title{CTANGLE (QL Version 4.2)}
+\def\title{CTANGLE (QL Version 4.3)}
@z
@x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
- at d banner "This is CTANGLE (QL Version 4.2)"
+ at d banner "This is CTANGLE (QL Version 4.3)"
@z
@x
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-vms.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -10,12 +10,12 @@
(these changes not necessary for initial bootstrapping)
@x section 1 (01-FEB-1992 ST)
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
- at d banner "This is CTANGLE (VAX/VMS Version 4.2)"
+ at d banner "This is CTANGLE (VAX/VMS Version 4.3)"
@z
- at x section 3 (01-FEB-1992 ST)
+ at x section 4 (01-FEB-1992 ST)
#include <ctype.h> /* definition of |@!isalpha|, |@!isdigit| and so on */
#include <stdbool.h> /* definition of |@!bool|, |@!true| and |@!false| */
#include <stddef.h> /* definition of |@!ptrdiff_t| */
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w2c.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,15 +17,15 @@
@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
@x
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
@y
-\def\title{CTANGLE (Version 4.2 [\TeX~Live])}
+\def\title{CTANGLE (Version 4.3 [\TeX~Live])}
@z
@x
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
@y
- \centerline{(Version 4.2 [\TeX~Live])}
+ \centerline{(Version 4.3 [\TeX~Live])}
@z
@x
@@ -41,9 +41,9 @@
@z
@x
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
- at d banner "This is CTANGLE, Version 4.2"
+ at d banner "This is CTANGLE, Version 4.3"
/* will be extended by the \TeX~Live |versionstring| */
@z
@@ -78,9 +78,9 @@
@z
@x
- overflow("output files");
+ else overflow("output files");
@y
- overflow(_("output files"));
+ else overflow(_("output files"));
@z
@x
@@ -113,14 +113,14 @@
an_output_file--;
sprint_section_name(output_file_name,*an_output_file);
fclose(C_file);
- C_file=fopen(output_file_name,"wb");
- if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
+ if ((C_file=fopen(output_file_name,"wb"))==NULL)
+ fatal("! Cannot open output file ",output_file_name);
@.Cannot open output file@>
if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
cur_line=1;
stack_ptr=stack+1;
- cur_name= (*an_output_file);
- cur_repl= (text_pointer)cur_name->equiv;
+ cur_name=(*an_output_file);
+ cur_repl=(text_pointer)cur_name->equiv;
cur_byte=cur_repl->tok_start;
cur_end=(cur_repl+1)->tok_start;
while (stack_ptr > stack) get_output();
@@ -142,8 +142,8 @@
if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
cur_line=1;
stack_ptr=stack+1;
- cur_name= (*an_output_file);
- cur_repl= (text_pointer)cur_name->equiv;
+ cur_name=(*an_output_file);
+ cur_repl=(text_pointer)cur_name->equiv;
cur_byte=cur_repl->tok_start;
cur_end=(cur_repl+1)->tok_start;
while (stack_ptr > stack) get_output();
@@ -154,9 +154,9 @@
@z
@x
- else if (a<050000) { confusion("macro defs have strange char");}
+ else if (a<050000) confusion("macro defs have strange char");
@y
- else if (a<050000) { confusion(_("macro defs have strange char"));}
+ else if (a<050000) confusion(_("macro defs have strange char"));
@z
@x
@@ -338,9 +338,9 @@
@x
@** Index.
@y
-@** Extensions to \.{CWEB}. The following sections introduce new or improved
-features that have been created by numerous contributors over the course of a
-quarter century.
+@** Extensions to {\tentex CWEB}. The following sections introduce new or
+improved features that have been created by numerous contributors over the
+course of a quarter century.
Care has been taken to keep the original section numbering intact, so this new
material should nicely integrate with the original ``\&{104.~Index}.''
@@ -368,7 +368,7 @@
fatal(_("! Cannot open output file "),check_file_name);
@.Cannot open output file@>
- if (temporary_output) @<Compare the temporary output...@>@;
+ if (check_for_change) @<Compare the temporary output...@>@;
fclose(C_file); C_file=NULL;
fclose(check_file); check_file=NULL;
Modified: trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctang-w32.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -4,23 +4,23 @@
Changes necessary for compiling with Borland C/C++
@x section 1
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@y
- at d banner "This is CTANGLE (Version 4.2win32)"
+ at d banner "This is CTANGLE (Version 4.3win32)"
@z
@x
-boolean names_match(@t\1\1@>
+boolean names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
@y
-boolean __cdecl names_match(@t\1\1@>
+boolean __cdecl names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
@z
@x
Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.c
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.c 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.c 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
#line 66 "ctangle.w"
/*4:*/
-#line 46 "common.h"
+#line 44 "common.h"
#include <ctype.h>
#include <stdbool.h>
@@ -15,7 +15,7 @@
/*:4*/
#line 67 "ctangle.w"
-#define banner "This is CTANGLE (Version 4.2)" \
+#define banner "This is CTANGLE (Version 4.3)" \
#define ctangle false
#define cweave true \
@@ -36,13 +36,19 @@
#define period_ast 026
#define minus_gt_ast 027 \
-#define xisalpha(c) (isalpha((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisdigit(c) (isdigit((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) )
-#define xislower(c) (islower((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) )
-#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) ) \
+#define compress(c) if(loc++<=limit) return c \
+#define xisalpha(c) (isalpha((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisdigit(c) (isdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisspace(c) (isspace((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xislower(c) (islower((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisupper(c) (isupper((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define xisxdigit(c) (isxdigit((eight_bits) (c) ) &&((eight_bits) (c) <0200) )
+#define isxalpha(c) ((c) =='_'||(c) =='$') \
+
+#define ishigh(c) ((eight_bits) (c) > 0177) \
+ \
+
#define max_include_depth 10 \
#define max_file_name_length 1024
@@ -76,10 +82,7 @@
#define update_terminal fflush(stdout)
#define new_line putchar('\n')
-#define putxchar putchar
-#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
-#define C_printf(c,a) fprintf(C_file,c,a)
-#define C_putc(c) putc(c,C_file) \
+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) \
#define max_bytes 1000000 \
@@ -95,9 +98,11 @@
#define equiv equiv_or_xref \
+#define macro 0
#define section_flag max_texts \
#define string 02
+#define constant 03
#define join 0177
#define output_defs_flag (2*024000-1) \
@@ -117,9 +122,12 @@
#define verbatim 4 \
#define max_files 256
+#define C_printf(c,a) fprintf(C_file,c,a)
+#define C_putc(c) putc(c,C_file) \
+
#define translit_length 10 \
-#define ignore 0
+#define ignore 00
#define ord 0302
#define control_text 0303
#define translit_code 0304
@@ -130,23 +138,15 @@
#define section_name 0311
#define new_section 0312 \
-#define constant 03 \
+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
-#define isxalpha(c) ((c) =='_'||(c) =='$') \
+#define keep_digit_separators flags['k'] \
-#define ishigh(c) ((eight_bits) (c) > 0177) \
- \
-#define compress(c) if(loc++<=limit) return c \
-
-#define macro 0
-#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
-
-
#line 68 "ctangle.w"
/*3:*/
-#line 37 "common.h"
+#line 35 "common.h"
typedef bool boolean;
typedef uint8_t eight_bits;
@@ -163,7 +163,7 @@
extern char*id_loc;
/*:5*//*6:*/
-#line 88 "common.h"
+#line 92 "common.h"
extern char buffer[];
extern char*buffer_end;
@@ -171,7 +171,7 @@
extern char*limit;
/*:6*//*7:*/
-#line 105 "common.h"
+#line 109 "common.h"
extern int include_depth;
extern FILE*file[];
@@ -187,7 +187,7 @@
extern boolean web_file_open;
/*:7*//*9:*/
-#line 125 "common.h"
+#line 129 "common.h"
extern sixteen_bits section_count;
extern boolean changed_section[];
@@ -195,7 +195,7 @@
extern boolean print_where;
/*:9*//*10:*/
-#line 139 "common.h"
+#line 143 "common.h"
typedef struct name_info{
char*byte_start;
@@ -220,12 +220,12 @@
extern hash_pointer h;
/*:10*//*12:*/
-#line 183 "common.h"
+#line 187 "common.h"
extern int history;
/*:12*//*14:*/
-#line 199 "common.h"
+#line 203 "common.h"
extern int argc;
extern char**argv;
@@ -236,7 +236,7 @@
extern boolean flags[];
/*:14*//*15:*/
-#line 215 "common.h"
+#line 217 "common.h"
extern FILE*C_file;
extern FILE*tex_file;
@@ -257,7 +257,7 @@
typedef text*text_pointer;
/*:19*//*31:*/
-#line 269 "ctangle.w"
+#line 273 "ctangle.w"
typedef struct{
eight_bits*end_field;
@@ -282,12 +282,12 @@
static eight_bits*tok_ptr;
/*:20*//*26:*/
-#line 198 "ctangle.w"
+#line 199 "ctangle.w"
static text_pointer last_unnamed;
/*:26*//*32:*/
-#line 285 "ctangle.w"
+#line 289 "ctangle.w"
static output_state cur_state;
@@ -296,18 +296,18 @@
static stack_pointer stack_ptr;
/*:32*//*37:*/
-#line 361 "ctangle.w"
+#line 365 "ctangle.w"
static int cur_val;
/*:37*//*42:*/
-#line 452 "ctangle.w"
+#line 456 "ctangle.w"
static eight_bits out_state;
static boolean protect;
/*:42*//*45:*/
-#line 483 "ctangle.w"
+#line 487 "ctangle.w"
static name_pointer output_files[max_files];
static name_pointer*cur_out_file,*end_output_files,*an_output_file;
@@ -315,33 +315,33 @@
static char output_file_name[longest_name+1];
/*:45*//*52:*/
-#line 582 "ctangle.w"
+#line 584 "ctangle.w"
static boolean output_defs_seen= false;
/*:52*//*57:*/
-#line 691 "ctangle.w"
+#line 696 "ctangle.w"
static char translit[128][translit_length];
/*:57*//*62:*/
-#line 770 "ctangle.w"
+#line 775 "ctangle.w"
static eight_bits ccode[256];
/*:62*//*66:*/
-#line 830 "ctangle.w"
+#line 835 "ctangle.w"
static boolean comment_continues= false;
/*:66*//*68:*/
-#line 869 "ctangle.w"
+#line 872 "ctangle.w"
static name_pointer cur_section_name;
static boolean no_where;
/*:68*//*82:*/
-#line 1182 "ctangle.w"
+#line 1189 "ctangle.w"
static text_pointer cur_text;
static eight_bits next_control;
@@ -350,7 +350,7 @@
#line 71 "ctangle.w"
/*8:*/
-#line 119 "common.h"
+#line 123 "common.h"
extern boolean get_line(void);
extern void check_complete(void);
@@ -357,12 +357,12 @@
extern void reset_input(void);
/*:8*//*11:*/
-#line 162 "common.h"
+#line 166 "common.h"
extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
extern name_pointer id_lookup(const char*,const char*,char);
-extern name_pointer section_lookup(char*,char*,int);
+extern name_pointer section_lookup(char*,char*,boolean);
extern void init_node(name_pointer);
extern void init_p(name_pointer,eight_bits);
extern void print_prefix_name(name_pointer);
@@ -370,7 +370,7 @@
extern void sprint_section_name(char*,name_pointer);
/*:11*//*13:*/
-#line 186 "common.h"
+#line 190 "common.h"
extern int wrap_up(void);
extern void err_print(const char*);
@@ -378,63 +378,63 @@
extern void overflow(const char*);
/*:13*//*16:*/
-#line 223 "common.h"
+#line 225 "common.h"
extern void common_init(void);
extern void print_stats(void);
/*:16*//*30:*/
-#line 241 "ctangle.w"
+#line 245 "ctangle.w"
static void store_two_bytes(sixteen_bits);
/*:30*//*35:*/
-#line 324 "ctangle.w"
+#line 328 "ctangle.w"
static void push_level(name_pointer);
static void pop_level(boolean);
/*:35*//*39:*/
-#line 397 "ctangle.w"
+#line 401 "ctangle.w"
static void get_output(void);
/*:39*//*44:*/
-#line 473 "ctangle.w"
+#line 477 "ctangle.w"
static void flush_buffer(void);
/*:44*//*49:*/
-#line 549 "ctangle.w"
+#line 551 "ctangle.w"
static void phase_two(void);
/*:49*//*53:*/
-#line 585 "ctangle.w"
+#line 587 "ctangle.w"
static void output_defs(void);
static void out_char(eight_bits);
/*:53*//*65:*/
-#line 810 "ctangle.w"
+#line 815 "ctangle.w"
static eight_bits skip_ahead(void);
static boolean skip_comment(boolean);
/*:65*//*70:*/
-#line 924 "ctangle.w"
+#line 922 "ctangle.w"
static eight_bits get_next(void);
/*:70*//*84:*/
-#line 1208 "ctangle.w"
+#line 1215 "ctangle.w"
static void scan_repl(eight_bits);
/*:84*//*91:*/
-#line 1379 "ctangle.w"
+#line 1396 "ctangle.w"
static void scan_section(void);
/*:91*//*99:*/
-#line 1460 "ctangle.w"
+#line 1477 "ctangle.w"
static void phase_one(void);
/*:99*//*101:*/
-#line 1494 "ctangle.w"
+#line 1511 "ctangle.w"
static void skip_limbo(void);
/*:101*/
@@ -463,16 +463,16 @@
init_node(name_dir);
/*:23*//*27:*/
-#line 201 "ctangle.w"
-last_unnamed= text_info;text_info->text_link= 0;
+#line 202 "ctangle.w"
+last_unnamed= text_info;text_info->text_link= macro;
/*:27*//*46:*/
-#line 493 "ctangle.w"
+#line 497 "ctangle.w"
cur_out_file= end_output_files= output_files+max_files;
/*:46*//*58:*/
-#line 694 "ctangle.w"
+#line 699 "ctangle.w"
{
int i;
@@ -480,7 +480,7 @@
}
/*:58*//*63:*/
-#line 773 "ctangle.w"
+#line 778 "ctangle.w"
{
int c;
for(c= 0;c<256;c++)ccode[c]= ignore;
@@ -500,7 +500,7 @@
}
/*:63*//*78:*/
-#line 1103 "ctangle.w"
+#line 1111 "ctangle.w"
section_text[0]= ' ';
/*:78*/
@@ -539,7 +539,7 @@
init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
/*:25*//*29:*/
-#line 231 "ctangle.w"
+#line 235 "ctangle.w"
static void
store_two_bytes(
@@ -551,7 +551,7 @@
}
/*:29*//*34:*/
-#line 309 "ctangle.w"
+#line 313 "ctangle.w"
static void
push_level(
@@ -568,7 +568,7 @@
}
/*:34*//*36:*/
-#line 332 "ctangle.w"
+#line 336 "ctangle.w"
static void
pop_level(
@@ -584,7 +584,7 @@
}
/*:36*//*38:*/
-#line 368 "ctangle.w"
+#line 372 "ctangle.w"
static void
get_output(void)
@@ -607,7 +607,7 @@
case 0:cur_val= a;out_char(identifier);break;
case 1:if(a==output_defs_flag)output_defs();
else/*40:*/
-#line 402 "ctangle.w"
+#line 406 "ctangle.w"
{
a-= 024000;
@@ -621,7 +621,7 @@
}
/*:40*/
-#line 389 "ctangle.w"
+#line 393 "ctangle.w"
break;
default:cur_val= a-050000;if(cur_val> 0)cur_section= cur_val;
@@ -631,7 +631,7 @@
}
/*:38*//*43:*/
-#line 460 "ctangle.w"
+#line 464 "ctangle.w"
static void
flush_buffer(void)
@@ -638,7 +638,7 @@
{
C_putc('\n');
if(cur_line%100==0&&show_progress){
-printf(".");
+putchar('.');
if(cur_line%500==0)printf("%d",cur_line);
update_terminal;
}
@@ -646,7 +646,7 @@
}
/*:43*//*48:*/
-#line 514 "ctangle.w"
+#line 516 "ctangle.w"
static void
phase_two(void){
@@ -653,24 +653,24 @@
web_file_open= false;
cur_line= 1;
/*33:*/
-#line 298 "ctangle.w"
+#line 302 "ctangle.w"
stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
/*:33*/
-#line 519 "ctangle.w"
+#line 521 "ctangle.w"
/*51:*/
-#line 578 "ctangle.w"
+#line 580 "ctangle.w"
if(!output_defs_seen)
output_defs();
/*:51*/
-#line 520 "ctangle.w"
+#line 522 "ctangle.w"
-if(text_info->text_link==0&&cur_out_file==end_output_files){
+if(text_info->text_link==macro&&cur_out_file==end_output_files){
fputs("\n! No program text was specified.",stdout);mark_harmless;
}
@@ -686,19 +686,19 @@
printf(" (%s)",C_file_name);
update_terminal;
}
-if(text_info->text_link==0)goto writeloop;
+if(text_info->text_link==macro)goto writeloop;
}
while(stack_ptr> stack)get_output();
flush_buffer();
writeloop:/*50:*/
-#line 555 "ctangle.w"
+#line 557 "ctangle.w"
for(an_output_file= end_output_files;an_output_file> cur_out_file;){
an_output_file--;
sprint_section_name(output_file_name,*an_output_file);
fclose(C_file);
-C_file= fopen(output_file_name,"wb");
-if(C_file==0)fatal("! Cannot open output file ",output_file_name);
+if((C_file= fopen(output_file_name,"wb"))==NULL)
+fatal("! Cannot open output file ",output_file_name);
if(show_progress){printf("\n(%s)",output_file_name);update_terminal;}
cur_line= 1;
@@ -712,7 +712,7 @@
}
/*:50*/
-#line 541 "ctangle.w"
+#line 543 "ctangle.w"
if(show_happiness){
if(show_progress)new_line;
@@ -722,7 +722,7 @@
}
/*:48*//*54:*/
-#line 589 "ctangle.w"
+#line 594 "ctangle.w"
static void
output_defs(void)
@@ -730,7 +730,7 @@
sixteen_bits a;
push_level(NULL);
for(cur_text= text_info+1;cur_text<text_ptr;cur_text++)
-if(cur_text->text_link==0){
+if(cur_text->text_link==macro){
cur_byte= cur_text->tok_start;
cur_end= (cur_text+1)->tok_start;
C_printf("%s","#define ");
@@ -748,7 +748,7 @@
if(a<024000){
cur_val= a;out_char(identifier);
}
-else if(a<050000){confusion("macro defs have strange char");}
+else if(a<050000)confusion("macro defs have strange char");
else{
cur_val= a-050000;cur_section= cur_val;out_char(section_number);
}
@@ -762,7 +762,7 @@
}
/*:54*//*55:*/
-#line 632 "ctangle.w"
+#line 637 "ctangle.w"
static void
out_char(
@@ -775,7 +775,7 @@
if(protect||out_state==verbatim)C_putc('\\');
flush_buffer();if(out_state!=verbatim)out_state= normal;break;
/*59:*/
-#line 700 "ctangle.w"
+#line 705 "ctangle.w"
case identifier:
if(out_state==num_or_id)C_putc(' ');
@@ -790,10 +790,10 @@
out_state= num_or_id;break;
/*:59*/
-#line 643 "ctangle.w"
+#line 648 "ctangle.w"
/*60:*/
-#line 713 "ctangle.w"
+#line 718 "ctangle.w"
case section_number:
if(cur_val> 0)C_printf("/*%d:*/",cur_val);
@@ -815,15 +815,15 @@
if(*j=='\\'||*j=='"')C_putc('\\');
C_putc(*j);
}
-C_printf("%s","\"\n");
+C_putc('"');C_putc('\n');
}
break;
/*:60*/
-#line 644 "ctangle.w"
+#line 649 "ctangle.w"
/*56:*/
-#line 662 "ctangle.w"
+#line 667 "ctangle.w"
case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
@@ -844,7 +844,7 @@
break;
/*:56*/
-#line 645 "ctangle.w"
+#line 650 "ctangle.w"
case'=':case'>':C_putc(cur_char);C_putc(' ');
out_state= normal;break;
@@ -863,7 +863,7 @@
}
/*:55*//*64:*/
-#line 794 "ctangle.w"
+#line 799 "ctangle.w"
static eight_bits
skip_ahead(void)
@@ -881,7 +881,7 @@
}
/*:64*//*67:*/
-#line 833 "ctangle.w"
+#line 838 "ctangle.w"
static boolean skip_comment(
boolean is_long_comment)
@@ -915,22 +915,23 @@
}
/*:67*//*69:*/
-#line 881 "ctangle.w"
+#line 879 "ctangle.w"
static eight_bits
get_next(void)
{
-static int preprocessing= 0;
+static boolean preprocessing= false;
eight_bits c;
while(true){
if(loc> limit){
-if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
+if(preprocessing&&*(limit-1)!='\\')preprocessing= false;
if(get_line()==false)return new_section;
else if(print_where&&!no_where){
print_where= false;
/*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -942,9 +943,10 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 893 "ctangle.w"
+#line 891 "ctangle.w"
}
else return'\n';
@@ -958,24 +960,33 @@
}
loc++;
if(xisdigit(c)||c=='.')/*73:*/
-#line 964 "ctangle.w"
+#line 963 "ctangle.w"
{
+boolean hex_flag= false;
id_first= loc-1;
if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
if(*id_first=='0'){
if(*loc=='x'||*loc=='X'){
-loc++;while(xisxdigit(*loc))loc++;goto found;
+hex_flag= true;
+loc++;while(xisxdigit(*loc)||*loc=='\'')loc++;
}
+else if(*loc=='b'||*loc=='B'){
+loc++;while(*loc=='0'||*loc=='1'||*loc=='\'')loc++;goto found;
}
-while(xisdigit(*loc))loc++;
+}
+while(xisdigit(*loc)||*loc=='\'')loc++;
if(*loc=='.'){
loc++;
-while(xisdigit(*loc))loc++;
+while((hex_flag&&xisxdigit(*loc))||xisdigit(*loc)||*loc=='\'')loc++;
}
if(*loc=='e'||*loc=='E'){
if(*++loc=='+'||*loc=='-')loc++;
-while(xisdigit(*loc))loc++;
+while(xisdigit(*loc)||*loc=='\'')loc++;
}
+else if(hex_flag&&(*loc=='p'||*loc=='P')){
+if(*++loc=='+'||*loc=='-')loc++;
+while(xisxdigit(*loc)||*loc=='\'')loc++;
+}
found:while(*loc=='u'||*loc=='U'||*loc=='l'||*loc=='L'
||*loc=='f'||*loc=='F')loc++;
id_loc= loc;
@@ -983,19 +994,19 @@
}
/*:73*/
-#line 905 "ctangle.w"
+#line 903 "ctangle.w"
else if(c=='\''||c=='"'
||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
/*74:*/
-#line 992 "ctangle.w"
+#line 1000 "ctangle.w"
{
char delim= c;
id_first= section_text+1;
id_loc= section_text;*++id_loc= delim;
if(delim=='L'||delim=='u'||delim=='U'){
-if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
+if(delim=='u'&&*loc=='8')*++id_loc= *loc++;
delim= *loc++;*++id_loc= delim;
}
while(true){
@@ -1033,26 +1044,27 @@
}
/*:74*/
-#line 909 "ctangle.w"
+#line 907 "ctangle.w"
else if(isalpha(c)||isxalpha(c)||ishigh(c))
/*72:*/
-#line 957 "ctangle.w"
+#line 954 "ctangle.w"
{
id_first= --loc;
-while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+do{
+++loc;
+}while(isalpha((eight_bits)*loc)||isdigit((eight_bits)*loc)
||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
id_loc= loc;return identifier;
}
/*:72*/
-#line 911 "ctangle.w"
+#line 909 "ctangle.w"
else if(c=='@')/*75:*/
-#line 1037 "ctangle.w"
+#line 1045 "ctangle.w"
{
-c= ccode[(eight_bits)*loc++];
-switch(c){
+switch(c= ccode[(eight_bits)*loc++]){
case ignore:continue;
case translit_code:err_print("! Use @l in limbo only");continue;
@@ -1065,11 +1077,11 @@
case section_name:
cur_section_name_char= *(loc-1);
/*77:*/
-#line 1085 "ctangle.w"
+#line 1091 "ctangle.w"
{
char*k;
/*79:*/
-#line 1105 "ctangle.w"
+#line 1113 "ctangle.w"
k= section_text;
while(true){
@@ -1080,7 +1092,7 @@
}
c= *loc;
/*80:*/
-#line 1129 "ctangle.w"
+#line 1137 "ctangle.w"
if(c=='@'){
c= *(loc+1);
@@ -1099,7 +1111,7 @@
}
/*:80*/
-#line 1114 "ctangle.w"
+#line 1122 "ctangle.w"
loc++;if(k<section_text_end)k++;
if(xisspace(c)){
@@ -1116,14 +1128,16 @@
if(*k==' '&&k> section_text)k--;
/*:79*/
-#line 1087 "ctangle.w"
+#line 1093 "ctangle.w"
if(k-section_text> 3&&strncmp(k-2,"...",3)==0)
-cur_section_name= section_lookup(section_text+1,k-3,1);
-else cur_section_name= section_lookup(section_text+1,k,0);
+cur_section_name= section_lookup(section_text+1,k-3,true);
+
+else cur_section_name= section_lookup(section_text+1,k,false);
+
if(cur_section_name_char=='(')
/*47:*/
-#line 497 "ctangle.w"
+#line 501 "ctangle.w"
{
for(an_output_file= cur_out_file;
@@ -1132,23 +1146,21 @@
if(an_output_file==end_output_files){
if(cur_out_file> output_files)
*--cur_out_file= cur_section_name;
-else{
-overflow("output files");
+else overflow("output files");
}
}
-}
/*:47*/
-#line 1093 "ctangle.w"
+#line 1101 "ctangle.w"
return section_name;
}
/*:77*/
-#line 1051 "ctangle.w"
+#line 1058 "ctangle.w"
case string:/*81:*/
-#line 1151 "ctangle.w"
+#line 1159 "ctangle.w"
{
id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
while(*loc!='@'||*(loc+1)!='>')loc++;
@@ -1159,15 +1171,14 @@
}
/*:81*/
-#line 1052 "ctangle.w"
+#line 1059 "ctangle.w"
case ord:/*76:*/
-#line 1064 "ctangle.w"
+#line 1071 "ctangle.w"
id_first= loc;
-if(*loc=='\\'){
+if(*loc=='\\')
if(*++loc=='\'')loc++;
-}
while(*loc!='\''){
if(*loc=='@'){
if(*(loc+1)!='@')
@@ -1185,7 +1196,7 @@
return ord;
/*:76*/
-#line 1053 "ctangle.w"
+#line 1060 "ctangle.w"
default:return c;
}
@@ -1192,7 +1203,7 @@
}
/*:75*/
-#line 912 "ctangle.w"
+#line 910 "ctangle.w"
else if(xisspace(c)){
if(!preprocessing||loc> limit)continue;
@@ -1199,20 +1210,21 @@
else return' ';
}
-else if(c=='#'&&loc==buffer+1)preprocessing= 1;
+else if(c=='#'&&loc==buffer+1)preprocessing= true;
mistake:/*71:*/
-#line 935 "ctangle.w"
+#line 931 "ctangle.w"
switch(c){
case'+':if(*loc=='+')compress(plus_plus);break;
case'-':if(*loc=='-'){compress(minus_minus);}
-else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
-else compress(minus_gt);}}break;
+else if(*loc=='>'){
+if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
+else compress(minus_gt);
+}break;
case'.':if(*loc=='*'){compress(period_ast);}
else if(*loc=='.'&&*(loc+1)=='.'){
loc++;compress(dot_dot_dot);
-}
-break;
+}break;
case':':if(*loc==':')compress(colon_colon);break;
case'=':if(*loc=='=')compress(eq_eq);break;
case'>':if(*loc=='='){compress(gt_eq);}
@@ -1225,7 +1237,7 @@
}
/*:71*/
-#line 919 "ctangle.w"
+#line 917 "ctangle.w"
return c;
}
@@ -1232,7 +1244,7 @@
}
/*:69*//*83:*/
-#line 1186 "ctangle.w"
+#line 1193 "ctangle.w"
static void
scan_repl(
@@ -1239,9 +1251,10 @@
eight_bits t)
{
sixteen_bits a;
-if(t==section_name){/*85:*/
-#line 1214 "ctangle.w"
+if(t==section_name)/*85:*/
+#line 1221 "ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1253,13 +1266,14 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1192 "ctangle.w"
-}
+#line 1199 "ctangle.w"
+
while(true)switch(a= get_next()){
/*86:*/
-#line 1227 "ctangle.w"
+#line 1236 "ctangle.w"
case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
app_repl((a/0400)+0200);
@@ -1267,7 +1281,7 @@
case section_name:if(t!=section_name)goto done;
else{
/*87:*/
-#line 1260 "ctangle.w"
+#line 1269 "ctangle.w"
{
char*try_loc= loc;
while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1280,14 +1294,15 @@
}
/*:87*/
-#line 1233 "ctangle.w"
+#line 1242 "ctangle.w"
a= cur_section_name-name_dir;
app_repl((a/0400)+0250);
app_repl(a%0400);
/*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1299,9 +1314,10 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1237 "ctangle.w"
+#line 1246 "ctangle.w"
break;
}
case output_defs_code:if(t!=section_name)err_print("! Misplaced @h");
@@ -1312,8 +1328,9 @@
app_repl((a/0400)+0200);
app_repl(a%0400);
/*85:*/
-#line 1214 "ctangle.w"
+#line 1221 "ctangle.w"
+{
store_two_bytes(0150000);
if(changing&&include_depth==change_depth){
id_first= change_file_name;
@@ -1325,15 +1342,16 @@
id_loc= id_first+strlen(id_first);
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
+}
/*:85*/
-#line 1246 "ctangle.w"
+#line 1255 "ctangle.w"
}
break;
case constant:case string:
/*88:*/
-#line 1271 "ctangle.w"
+#line 1286 "ctangle.w"
app_repl(a);
while(id_first<id_loc){
@@ -1342,16 +1360,18 @@
else err_print("! Double @ should be used in string");
}
+else if(a==constant&&*id_first=='\''&&!keep_digit_separators)
+id_first++;
app_repl(*id_first++);
}
app_repl(a);break;
/*:88*/
-#line 1250 "ctangle.w"
+#line 1259 "ctangle.w"
case ord:
/*89:*/
-#line 1287 "ctangle.w"
+#line 1304 "ctangle.w"
{
int c= (eight_bits)*id_first;
if(c=='\\'){
@@ -1402,7 +1422,7 @@
break;
/*:89*/
-#line 1252 "ctangle.w"
+#line 1261 "ctangle.w"
case definition:case format_code:case begin_C:if(t!=section_name)goto done;
else{
@@ -1412,7 +1432,7 @@
case new_section:goto done;
/*:86*/
-#line 1197 "ctangle.w"
+#line 1204 "ctangle.w"
case')':app_repl(a);
if(t==macro)app_repl(' ');
@@ -1425,7 +1445,7 @@
}
/*:83*//*90:*/
-#line 1346 "ctangle.w"
+#line 1363 "ctangle.w"
static void
scan_section(void)
@@ -1437,10 +1457,10 @@
if(*(loc-1)=='*'&&show_progress){
printf("*%d",section_count);update_terminal;
}
-next_control= 0;
+next_control= ignore;
while(true){
/*92:*/
-#line 1387 "ctangle.w"
+#line 1404 "ctangle.w"
while(next_control<definition)
@@ -1449,11 +1469,11 @@
}
/*:92*/
-#line 1360 "ctangle.w"
+#line 1377 "ctangle.w"
if(next_control==definition){
/*93:*/
-#line 1394 "ctangle.w"
+#line 1411 "ctangle.w"
{
while((next_control= get_next())=='\n');
if(next_control!=identifier){
@@ -1472,7 +1492,7 @@
}
/*:93*/
-#line 1362 "ctangle.w"
+#line 1379 "ctangle.w"
continue;
}
@@ -1482,7 +1502,7 @@
if(next_control==section_name){
p= cur_section_name;
/*94:*/
-#line 1419 "ctangle.w"
+#line 1436 "ctangle.w"
while((next_control= get_next())=='+');
if(next_control!='='&&next_control!=eq_eq)
@@ -1489,7 +1509,7 @@
continue;
/*:94*/
-#line 1370 "ctangle.w"
+#line 1387 "ctangle.w"
break;
}
@@ -1497,22 +1517,22 @@
}
no_where= print_where= false;
/*95:*/
-#line 1424 "ctangle.w"
+#line 1441 "ctangle.w"
/*96:*/
-#line 1429 "ctangle.w"
+#line 1446 "ctangle.w"
store_two_bytes((sixteen_bits)(0150000+section_count));
/*:96*/
-#line 1425 "ctangle.w"
+#line 1442 "ctangle.w"
scan_repl(section_name);
/*97:*/
-#line 1433 "ctangle.w"
+#line 1450 "ctangle.w"
-if(p==name_dir||p==0){
+if(p==name_dir||p==NULL){
(last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
}
else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
@@ -1527,16 +1547,16 @@
/*:97*/
-#line 1427 "ctangle.w"
+#line 1444 "ctangle.w"
/*:95*/
-#line 1376 "ctangle.w"
+#line 1393 "ctangle.w"
}
/*:90*//*98:*/
-#line 1448 "ctangle.w"
+#line 1465 "ctangle.w"
static void
phase_one(void){
@@ -1550,7 +1570,7 @@
}
/*:98*//*100:*/
-#line 1465 "ctangle.w"
+#line 1482 "ctangle.w"
static void
skip_limbo(void)
@@ -1565,7 +1585,7 @@
if(ccode[(eight_bits)c]==new_section)break;
switch(ccode[(eight_bits)c]){
case translit_code:/*102:*/
-#line 1496 "ctangle.w"
+#line 1513 "ctangle.w"
while(xisspace(*loc)&&loc<limit)loc++;
loc+= 3;
@@ -1590,7 +1610,7 @@
}
/*:102*/
-#line 1478 "ctangle.w"
+#line 1495 "ctangle.w"
break;
case format_code:case'@':break;
case control_text:if(c=='q'||c=='Q'){
@@ -1608,7 +1628,7 @@
}
/*:100*//*103:*/
-#line 1522 "ctangle.w"
+#line 1539 "ctangle.w"
void
print_stats(void){
Modified: trunk/Build/source/texk/web2c/cwebdir/ctangle.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctangle.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctangle.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
% This program by Silvio Levy and Donald E. Knuth
% is based on a program by Knuth.
% It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
% Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
@@ -27,11 +27,11 @@
\mathchardef\RA="3221 % right arrow
\mathchardef\BA="3224 % double arrow
-\def\title{CTANGLE (Version 4.2)}
+\def\title{CTANGLE (Version 4.3)}
\def\topofcontents{\null\vfill
\centerline{\titlefont The {\ttitlefont CTANGLE} processor}
\vskip 15pt
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
\vfill}
\def\botofcontents{\vfill
\noindent
@@ -61,7 +61,7 @@
The ``banner line'' defined here should be changed whenever \.{CTANGLE}
is modified.
- at d banner "This is CTANGLE (Version 4.2)"
+ at d banner "This is CTANGLE (Version 4.3)"
@c
@<Include files@>@/
@@ -151,11 +151,11 @@
starting at position |first| equals the identifier pointed to by |p|:
@c
-boolean names_match(@t\1\1@>
+boolean names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* not used by \.{TANGLE} */
+eight_bits t) /* not used by \.{TANGLE} */
{@+(void)t;
if (length(p)!=l) return false;
return !strncmp(first,p->byte_start,l);
@@ -193,12 +193,13 @@
The replacement text pointer for the first unnamed section appears in
|text_info->text_link|, and the most recent such pointer is |last_unnamed|.
+ at d macro 0
@d section_flag max_texts /* final |text_link| in section replacement texts */
@<Private...@>=
static text_pointer last_unnamed; /* most recent replacement text of unnamed section */
-@ @<Set init...@>= last_unnamed=text_info; text_info->text_link=0;
+@ @<Set init...@>= last_unnamed=text_info; text_info->text_link=macro;
@ If the first byte of a token is less than |0200|, the token occupies a
single byte. Otherwise we make a sixteen-bit token by combining two consecutive
@@ -214,15 +215,18 @@
Some of the 7-bit codes will not be present, however, so we can
use them for special purposes. The following symbolic names are used:
-\yskip \hang |join| denotes the concatenation of adjacent items with no
-space or line breaks allowed between them (the \.{@@\&} operation of \.{CWEB}).
+\yskip \hang |string| denotes the beginning or end of a string
+or a verbatim construction.
-\hang |string| denotes the beginning or end of a string, verbatim
-construction or numerical constant.
+\hang |constant| denotes a numerical constant.
+
+\hang |join| denotes the concatenation of adjacent items with no space
+or line breaks allowed between them (the \.{@@\&} operation of \.{CWEB}).
@^ASCII code dependencies@>
- at d string 02 /* takes the place of extended ASCII \.{\char2} */
- at d join 0177 /* takes the place of ASCII delete */
+ at d string 02 /* takes the place of ASCII \.{STX} */
+ at d constant 03 /* takes the place of ASCII \.{ETX} */
+ at d join 0177 /* takes the place of ASCII \.{DEL} */
@d output_defs_flag (2*024000-1)
@ The following procedure is used to enter a two-byte value into
@@ -308,8 +312,8 @@
@c
static void
-push_level(@t\1\1@> /* suspends the current level */
-name_pointer p at t\2\2@>)
+push_level( /* suspends the current level */
+name_pointer p)
{
if (stack_ptr==stack_end) overflow("stack");
*stack_ptr=cur_state;
@@ -331,8 +335,8 @@
@c
static void
-pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
-boolean flag at t\2\2@>) /* |flag==false| means we are in |output_defs| */
+pop_level( /* do this when |cur_byte| reaches |cur_end| */
+boolean flag) /* |flag==false| means we are in |output_defs| */
{
if (flag && cur_repl->text_link<section_flag) { /* link to a continuation */
cur_repl=cur_repl->text_link+text_info; /* stay on the same level */
@@ -350,7 +354,7 @@
if the next output begins or ends the replacement text of some section,
in which case |cur_val| is that section's number (if beginning) or the
negative of that value (if ending). (A section number of 0 indicates
-not the beginning or ending of a section, but a \&{\#line} command.)
+not the beginning or ending of a section, but a \#\&{line} command.)
And it sends the value |identifier|
if the next output is an identifier, in which case
|cur_val| points to that identifier name.
@@ -463,7 +467,7 @@
{
C_putc('\n');
if (cur_line % 100 == 0 && show_progress) {
- printf(".");
+ putchar('.');
if (cur_line % 500 == 0) printf("%d",cur_line);
update_terminal; /* progress report */
}
@@ -502,9 +506,7 @@
if (an_output_file==end_output_files) {
if (cur_out_file>output_files)
*--cur_out_file=cur_section_name;
- else {
- overflow("output files");
- }
+ else overflow("output files");
}
}
@@ -518,7 +520,7 @@
cur_line=1;
@<Initialize the output stacks@>@;
@<Output macro definitions if appropriate@>@;
- if (text_info->text_link==0 && cur_out_file==end_output_files) {
+ if (text_info->text_link==macro && cur_out_file==end_output_files) {
fputs("\n! No program text was specified.",stdout); mark_harmless;
@.No program text...@>
}
@@ -534,7 +536,7 @@
printf(" (%s)",C_file_name);
update_terminal;
}
- if (text_info->text_link==0) goto writeloop;
+ if (text_info->text_link==macro) goto writeloop;
}
while (stack_ptr>stack) get_output();
flush_buffer();
@@ -557,14 +559,14 @@
an_output_file--;
sprint_section_name(output_file_name,*an_output_file);
fclose(C_file);
- C_file=fopen(output_file_name,"wb");
- if (C_file ==0) fatal("! Cannot open output file ",output_file_name);
+ if ((C_file=fopen(output_file_name,"wb"))==NULL)
+ fatal("! Cannot open output file ",output_file_name);
@.Cannot open output file@>
if (show_progress) { printf("\n(%s)",output_file_name); update_terminal; }
cur_line=1;
stack_ptr=stack+1;
- cur_name= (*an_output_file);
- cur_repl= (text_pointer)cur_name->equiv;
+ cur_name=(*an_output_file);
+ cur_repl=(text_pointer)cur_name->equiv;
cur_byte=cur_repl->tok_start;
cur_end=(cur_repl+1)->tok_start;
while (stack_ptr > stack) get_output();
@@ -586,7 +588,10 @@
static void output_defs(void);@/
static void out_char(eight_bits);
-@ @c
+@ @d C_printf(c,a) fprintf(C_file,c,a)
+ at d C_putc(c) putc(c,C_file) /* isn't \CEE/ wonderfully consistent? */
+
+ at c
static void
output_defs(void)
{
@@ -593,7 +598,7 @@
sixteen_bits a;
push_level(NULL);
for (cur_text=text_info+1; cur_text<text_ptr; cur_text++)
- if (cur_text->text_link==0) { /* |cur_text| is the text for a macro */
+ if (cur_text->text_link==macro) { /* |cur_text| is the text for a |macro| */
cur_byte=cur_text->tok_start;
cur_end=(cur_text+1)->tok_start;
C_printf("%s","#define ");
@@ -611,7 +616,7 @@
if (a<024000) { /* |024000==(0250-0200)*0400| */
cur_val=a; out_char(identifier);
}
- else if (a<050000) { confusion("macro defs have strange char");}
+ else if (a<050000) confusion("macro defs have strange char");
else {
cur_val=a-050000; cur_section=cur_val; out_char(section_number);
}
@@ -643,7 +648,7 @@
@/@t\4@>@<Case of an identifier@>@;
@/@t\4@>@<Case of a section number@>@;
@/@t\4@>@<Cases like \.{!=}@>@;
- case '=': case '>': C_putc(cur_char); C_putc(' ');
+ case '=': case '>': C_putc(cur_char);@+C_putc(' ');
out_state=normal; break;
case join: out_state=unbreakable; break;
case constant: if (out_state==verbatim) {
@@ -659,7 +664,7 @@
}
}
-@ @<Cases like \.{!=}@>=
+@ @<Cases like \.{!=}@>=@t\1\quad@>
case plus_plus: C_putc('+');@+C_putc('+'); out_state=normal; break;
case minus_minus: C_putc('-');@+C_putc('-'); out_state=normal; break;
case minus_gt: C_putc('-');@+C_putc('>'); out_state=normal; break;
@@ -697,7 +702,7 @@
for (i=0;i<128;i++) sprintf(translit[i],"X%02X",(unsigned int)(128+i));
}
-@ @<Case of an identifier@>=
+@ @<Case of an identifier@>=@t\1\quad@>
case identifier:
if (out_state==num_or_id) C_putc(' ');
j=(cur_val+name_dir)->byte_start;
@@ -710,7 +715,7 @@
}
out_state=num_or_id; break;
-@ @<Case of a sec...@>=
+@ @<Case of a sec...@>=@t\1\quad@>
case section_number:
if (cur_val>0) C_printf("/*%d:*/",cur_val);
else if(cur_val<0) C_printf("/*:%d*/",-cur_val);
@@ -731,7 +736,7 @@
if (*j=='\\' || *j=='"') C_putc('\\');
C_putc(*j);
}
- C_printf("%s","\"\n");
+ C_putc('"');@+C_putc('\n');
}
break;
@@ -756,7 +761,7 @@
larger numbers are given to the control codes that denote more significant
milestones.
- at d ignore 0 /* control code of no interest to \.{CTANGLE} */
+ at d ignore 00 /* control code of no interest to \.{CTANGLE} */
@d ord 0302 /* control code for `\.{@@'}' */
@d control_text 0303 /* control code for `\.{@@t}', `\.{@@\^}', etc. */
@d translit_code 0304 /* control code for `\.{@@l}' */
@@ -817,7 +822,7 @@
proceeds until finding the end-comment token \.{*/} or a newline; in the
latter case |skip_comment| will be called again by |get_next|, since the
comment is not finished. This is done so that each newline in the
-\CEE/ part of a section is copied to the output; otherwise the \&{\#line}
+\CEE/ part of a section is copied to the output; otherwise the \#\&{line}
commands inserted into the \CEE/ file by the output routines become useless.
On the other hand, if the comment is introduced by \.{//} (i.e., if it
is a \CPLUSPLUS/ ``short comment''), it always is simply delimited by the next
@@ -831,15 +836,15 @@
static boolean comment_continues=false; /* are we scanning a comment? */
@ @c
-static boolean skip_comment(@t\1\1@> /* skips over comments */
-boolean is_long_comment at t\2\2@>)
+static boolean skip_comment( /* skips over comments */
+boolean is_long_comment)
{
char c; /* current character */
while (true) {
if (loc>limit) {
if (is_long_comment) {
- if(get_line()) return comment_continues=true;
- else{
+ if (get_line()) return comment_continues=true;
+ else {
err_print("! Input ended in mid-comment");
@.Input ended in mid-comment@>
return comment_continues=false;
@@ -864,8 +869,6 @@
@* Inputting the next token.
- at d constant 03
-
@<Private...@>=
static name_pointer cur_section_name; /* name of section just scanned */
static boolean no_where; /* suppress |print_where|? */
@@ -873,20 +876,15 @@
@ As one might expect, |get_next| consists mostly of a big switch
that branches to the various special cases that can arise.
- at d isxalpha(c) ((c)=='_' || (c)=='$')
- /* non-alpha characters allowed in identifier */
- at d ishigh(c) ((eight_bits)(c)>0177)
-@^high-bit character handling@>
-
@c
static eight_bits
get_next(void) /* produces the next input token */
{
- static int preprocessing=0;
+ static boolean preprocessing=false;
eight_bits c; /* the current character */
while (true) {
if (loc>limit) {
- if (preprocessing && *(limit-1)!='\\') preprocessing=0;
+ if (preprocessing && *(limit-1)!='\\') preprocessing=false;
if (get_line()==false) return new_section;
else if (print_where && !no_where) {
print_where=false;
@@ -913,9 +911,9 @@
else if (xisspace(c)) {
if (!preprocessing || loc>limit) continue;
/* we don't want a blank after a final backslash */
- else return ' '; /* ignore spaces and tabs, unless preprocessing */
+ else return ' '; /* ignore spaces and tabs, unless |preprocessing| */
}
- else if (c=='#' && loc==buffer+1) preprocessing=1;
+ else if (c=='#' && loc==buffer+1) preprocessing=true;
mistake: @<Compress two-symbol operator@>@;
return c;
}
@@ -930,24 +928,23 @@
The compound assignment operators (e.g., \.{+=}) are
treated as separate tokens.
- at d compress(c) if (loc++<=limit) return c
-
@<Compress tw...@>=
switch(c) {
case '+': if (*loc=='+') compress(plus_plus); break;
- case '-': if (*loc=='-') {compress(minus_minus);}
- else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt); } } break;
- case '.': if (*loc=='*') {compress(period_ast);}
+ case '-': if (*loc=='-') {@+compress(minus_minus);@+}
+ else if (*loc=='>') {
+ if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+ else compress(minus_gt);
+ } break;
+ case '.': if (*loc=='*') {@+compress(period_ast);@+}
else if (*loc=='.' && *(loc+1)=='.') {
- loc++; compress(dot_dot_dot);
- }
- break;
+ loc++;@+compress(dot_dot_dot);
+ } break;
case ':': if (*loc==':') compress(colon_colon); break;
case '=': if (*loc=='=') compress(eq_eq); break;
- case '>': if (*loc=='=') {compress(gt_eq);}
+ case '>': if (*loc=='=') {@+compress(gt_eq);@+}
else if (*loc=='>') compress(gt_gt); break;
- case '<': if (*loc=='=') {compress(lt_eq);}
+ case '<': if (*loc=='=') {@+compress(lt_eq);@+}
else if (*loc=='<') compress(lt_lt); break;
case '&': if (*loc=='&') compress(and_and); break;
case '|': if (*loc=='|') compress(or_or); break;
@@ -956,30 +953,41 @@
@ @<Get an identifier@>= {
id_first=--loc;
- while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+ do {
+ ++loc;
+ } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
|| isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
id_loc=loc; return identifier;
}
@ @<Get a constant@>= {
+ boolean hex_flag = false; /* are we reading a hexadecimal literal? */
id_first=loc-1;
if (*id_first=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
if (*id_first=='0') {
if (*loc=='x' || *loc=='X') { /* hex constant */
- loc++; while (xisxdigit(*loc)) loc++; goto found;
+ hex_flag = true;
+ loc++; while (xisxdigit(*loc) || *loc=='\'') loc++;
}
+ else if (*loc=='b' || *loc=='B') { /* binary constant */
+ loc++; while (*loc=='0' || *loc=='1' || *loc=='\'') loc++; goto found;
+ }
}
- while (xisdigit(*loc)) loc++;
+ while (xisdigit(*loc) || *loc=='\'') loc++;
if (*loc=='.') {
- loc++;
- while (xisdigit(*loc)) loc++;
+ loc++;
+ while ((hex_flag && xisxdigit(*loc)) || xisdigit(*loc) || *loc=='\'') loc++;
}
if (*loc=='e' || *loc=='E') { /* float constant */
if (*++loc=='+' || *loc=='-') loc++;
- while (xisdigit(*loc)) loc++;
+ while (xisdigit(*loc) || *loc=='\'') loc++;
}
- found: while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
- || *loc=='f' || *loc=='F') loc++;
+ else if (hex_flag && (*loc=='p' || *loc=='P')) { /* hex float constant */
+ if (*++loc=='+' || *loc=='-') loc++;
+ while (xisxdigit(*loc) || *loc=='\'') loc++;
+ }
+found: while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
+ || *loc=='f' || *loc=='F') loc++;
id_loc=loc;
return constant;
}
@@ -994,7 +1002,7 @@
id_first = section_text+1;
id_loc = section_text; *++id_loc=delim;
if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
- if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
+ if (delim=='u' && *loc=='8') *++id_loc=*loc++;
delim=*loc++; *++id_loc=delim;
}
while (true) {
@@ -1035,8 +1043,7 @@
whether there is more work to do.
@<Get control code and possible section name@>= {
- c=ccode[(eight_bits)*loc++];
- switch(c) {
+ switch(c=ccode[(eight_bits)*loc++]) {
case ignore: continue;
case translit_code: err_print("! Use @@l in limbo only"); continue;
@.Use @@l in limbo...@>
@@ -1063,9 +1070,8 @@
@<Scan an ASCII constant@>=
id_first=loc;
- if (*loc=='\\') {
+ if (*loc=='\\')
if (*++loc=='\'') loc++;
- }
while (*loc!='\'') {
if (*loc=='@@') {
if (*(loc+1)!='@@')
@@ -1086,8 +1092,10 @@
char *k; /* pointer into |section_text| */
@<Put section name into |section_text|@>@;
if (k-section_text>3 && strncmp(k-2,"...",3)==0)
- cur_section_name=section_lookup(section_text+1,k-3,1); /* 1 means is a prefix */
- else cur_section_name=section_lookup(section_text+1,k,0);
+ cur_section_name=section_lookup(section_text+1,k-3,true);
+ /* |true| means it's a prefix */
+ else cur_section_name=section_lookup(section_text+1,k,false);
+ /* |false| means it's not */
if (cur_section_name_char=='(')
@<If it's not there, add |cur_section_name| to the output file stack, or
complain we're out of room@>@;
@@ -1176,7 +1184,6 @@
acted, |cur_text| will point to the replacement text just generated, and
|next_control| will contain the control code that terminated the activity.
- at d macro 0
@d app_repl(c) {if (tok_ptr==tok_mem_end) overflow("token"); *tok_ptr++=c;}
@<Private...@>=
@@ -1185,11 +1192,11 @@
@ @c
static void
-scan_repl(@t\1\1@> /* creates a replacement text */
-eight_bits t at t\2\2@>)
+scan_repl( /* creates a replacement text */
+eight_bits t)
{
sixteen_bits a; /* the current token */
- if (t==section_name) {@<Insert the line number into |tok_mem|@>@;}
+ if (t==section_name) @<Insert the line number into |tok_mem|@>@;
while (true) switch (a=get_next()) {
@<In cases that |a| is a non-|char| token (|identifier|,
|section_name|, etc.), either process it and change |a| to a byte
@@ -1212,19 +1219,21 @@
file name.
@<Insert the line...@>=
-store_two_bytes(0150000);
-if (changing && include_depth==change_depth) { /* correction made Feb 2017 */
- id_first=change_file_name;
- store_two_bytes((sixteen_bits)change_line);
-}@+else {
- id_first=cur_file_name;
- store_two_bytes((sixteen_bits)cur_line);
+{
+ store_two_bytes(0150000);
+ if (changing && include_depth==change_depth) { /* correction made Feb 2017 */
+ id_first=change_file_name;
+ store_two_bytes((sixteen_bits)change_line);
+ }@+else {
+ id_first=cur_file_name;
+ store_two_bytes((sixteen_bits)cur_line);
+ }
+ id_loc=id_first+strlen(id_first);
+ {int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
+ app_repl(a_l % 0400);}
}
-id_loc=id_first+strlen(id_first);
-{int a_l=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a_l / 0400)+0200);
- app_repl(a_l % 0400);}
-@ @<In cases that |a| is...@>=
+@ @<In cases that |a| is...@>=@t\1\quad@>
case identifier: a=id_lookup(id_first,id_loc,0)-name_dir;
app_repl((a / 0400)+0200);
app_repl(a % 0400); break;
@@ -1268,7 +1277,13 @@
as explained in the manual */
}
-@ @<Copy a string...@>=
+@ By default, \.{CTANGLE} purges single-quote characters from \CPLUSPLUS/-style
+literals, e.g., \.{1'000'000}, so that you can use this notation also in \CEE/
+code. The \.{+k} switch will `keep' the single quotes in the output.
+
+ at d keep_digit_separators flags['k']
+
+@<Copy a string...@>=
app_repl(a); /* |string| or |constant| */
while (id_first < id_loc) { /* simplify \.{@@@@} pairs */
if (*id_first=='@@') {
@@ -1276,6 +1291,8 @@
else err_print("! Double @@ should be used in string");
@.Double @@ should be used...@>
}
+ else if (a==constant && *id_first=='\'' && !keep_digit_separators)
+ id_first++;
app_repl(*id_first++);
}
app_repl(a); break;
@@ -1354,7 +1371,7 @@
if (*(loc-1)=='*' && show_progress) { /* starred section */
printf("*%d",section_count); update_terminal;
}
- next_control=0;
+ next_control=ignore;
while (true) {
@<Skip ahead until |next_control| corresponds to \.{@@d}, \.{@@<},
\.{@@\ } or the like@>@;
@@ -1431,7 +1448,7 @@
/* |0150000==0320*0400| */
@ @<Update the data...@>=
-if (p==name_dir||p==0) { /* unnamed section, or bad section name */
+if (p==name_dir||p==NULL) { /* unnamed section, or bad section name */
(last_unnamed)->text_link=cur_text-text_info; last_unnamed=cur_text;
}
else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;
Modified: trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctproofmac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,8 +1,8 @@
% standard macros for CWEB listings (in addition to plain.tex)
-% Version 3.6 --- May 2000
+% Version 4.3 --- April 2021
% Modified for proofs in CTWILL
\ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CWEB3.6+PROOFS}
+\xdef\fmtversion{\fmtversion+CWEB4.3+PROOFS}
\let\:=\. % preserve a way to get the dot accent
% (all other accents will still work as usual)
@@ -107,6 +107,7 @@
\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
\let\yskip=\smallskip
\def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
\def\lapstar{\rlap{*}}
\def\stsec{\rightskip=0pt % get out of C mode (cf. \B)
@@ -162,7 +163,8 @@
\hbox{$\def\?{\kern.2em}%
\def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
\def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
- \let\~=\oct \let\^=\hex {#1}$}}
+ \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+ \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
\def\U{\note{This code is used in section}} % xref for use of a section
\def\Us{\note{This code is used in sections}} % xref for uses of a section
\let\V=\lor % logical or
@@ -176,8 +178,12 @@
%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
\hbox{\strut\kern2pt\.{#1}\kern2pt}}
\hrule}\vrule\kern2pt}} % verbatim string
@@ -339,9 +345,6 @@
\def\printtwodigits{\advance\twodigits100
\expandafter\gobbleone\number\twodigits
\advance\twodigits-100 }
-\def\TeX{{\ifmmode\it\fi
- \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\datethis{\def\startsection{\leftline{\sc\today\ at \hours}\bigskip
\let\startsection=\stsec\stsec}}
% say `\datethis' in limbo, to get your listing timestamped before section 1
Modified: trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cttwinxmac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,8 +2,6 @@
\let\:=\. % preserve a way to get the dot accent
% (all other accents will still work as usual)
-\def\TeX{{\ifmmode\it\fi
- \hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\let\mc=\ninerm % medium caps
\def\CEE/{{\mc C\spacefactor1000}}
Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-mini.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -14,7 +14,7 @@
@z
@x
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
@y
\bigskip
{\font\itt=cmitt10 \font\bit=cmbxti10
@@ -35,7 +35,7 @@
faithful overall rendering of {\itt CTWILL}'s code, though. \hfill
---Enjoy!\bigskip}
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
@z
Section 2.
@@ -43,7 +43,7 @@
@x
@ Here is a sort of user manual for \.{CTWILL}---which is exactly like
@y
-@* \.{CTWILL} user manual.
+@* {\tentex CTWILL} user manual.
Here is a sort of user manual for \.{CTWILL}---which is exactly like
@z
@@ -93,14 +93,29 @@
@x
internationalization.
+
+ at d _(S) gettext(S)
+
+@<Include files@>=
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+@#
@y
internationalization.
+
+ at d _(S) gettext(S)
+ at -S@>
+
+ at r @ @<Include files@>=
@-A@>
@-HAVE_GETTEXT@>
- at -S@>
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
@z
-Section 9.
+Section 10.
@x
@ Code related to input routines:
@@ -109,7 +124,7 @@
@-c@>
@z
-Section 13.
+Section 14.
@x
@ Code related to identifier and section name storage:
@@ -118,7 +133,7 @@
@-c@>
@z
-Section 15.
+Section 16.
@x
@ Code related to error handling:
@@ -127,7 +142,7 @@
@-s@>
@z
-Section 17.
+Section 18.
@x
extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
@@ -135,7 +150,7 @@
extern const char *use_language; /* prefix to \.{ctwimac.tex} in \TEX/ output */
@z
-Section 18.
+Section 19.
@x
@ Code related to output:
@@ -146,7 +161,7 @@
@-c@>
@z
-Section 23.
+Section 24.
@x
@* Data structures exclusive to {\tt CWEAVE}.
@@ -158,32 +173,24 @@
Section 25.
@x
-@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
+@ We keep track of the current section number in |section_count|, which
@y
-@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
- at -p@>
- at -x@>
+ at r @ We keep track of the current section number in |section_count|, which
@z
-Section 27.
+Section 26.
@x
-@ \.{CTWILL} also has special data structures to keep track of current
+@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
@y
- at r @ \.{CTWILL} also has special data structures to keep track of current
+@ The other large memory area in \.{CWEAVE} keeps the cross-reference data.
+ at -p@>
+ at -x@>
@z
-Section 32.
+Section 36.
@x
-@ The |new_meaning| routine changes the current ``permanent meaning''
- at y
- at r @ The |new_meaning| routine changes the current ``permanent meaning''
- at z
-
-Section 35.
-
- at x
@ A new cross-reference for an identifier is formed by calling |new_xref|,
@y
@ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -191,23 +198,6 @@
@-c@>
@z
-Section 44.
-
- at x
-@ We have to get \CEE/'s
- at y
- at r @ We have to get \CEE/'s
- at z
-
-Section 45.
-
- at x
-id_lookup("goto",NULL,case_like);
- at y
-@ @<Store all...@>=
-id_lookup("goto",NULL,case_like);
- at z
-
Section 49.
@x
@@ -259,42 +249,133 @@
@-c@>
@z
-Section 66.
+ at x
+ if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+ at y
+ if (*(loc+1)=='*') {@+loc++;@+compress(minus_gt_ast);@+}
+ at z
@x
-@<Get a string@>= {
+ else if (*loc=='.' && *(loc+1)=='.') {
+ loc++;@+compress(dot_dot_dot);
+ } break;
@y
-@<Get a string@>= {@+
+ else if (*loc=='.' && *(loc+1)=='.') {@+
+ loc++;@+compress(dot_dot_dot);@+
+ } break;
@z
+Section 64.
+
+ at x
+ id_first=--loc;
+ do {
+ ++loc;
+ } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
+ || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
+ id_loc=loc; return identifier;
+}
+ at y
+ id_first=--loc;@/
+ do {
+ ++loc;
+ } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
+ || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));@/
+ id_loc=loc;@/
+ return identifier;
+}
+ at z
+
+Section 67.
+
+ at x
+@ @<Get a bin...@>={
+ at y
+ at r @ @<Get a bin...@>={
+ at z
+
Section 70.
@x
+@ @<Get a wide...@>={
+ at y
+ at r @ @<Get a wide...@>={
+ at z
+
+Section 74.
+
+ at x
@ @<Put section name...@>=
@y
- at r @ @<Put section name...@>=
+@ @<Put section name...@>=
@z
-Section 84.
+Section 75.
@x
+@ @<If end of name...@>=
+ at y
+ at r @ @<If end of name...@>=
+ at z
+
+Section 87.
+
+ at x
+C_xref( /* makes cross-references for \CEE/ identifiers */
+ eight_bits spec_ctrl)
+ at y
+C_xref(eight_bits spec_ctrl)
+ /* makes cross-references for \CEE/ identifiers */
+ at z
+
+Section 88--89.
+
+ at x
+@ The |outer_xref| subroutine is like |C_xref| except that it begins
with |next_control!='|'| and ends with |next_control>=format_code|. Thus, it
+handles \CEE/ text with embedded comments.
+
+ at c
+static void
+outer_xref(void) /* extension of |C_xref| */
+{
+ int bal; /* brace level in comment */
@y
+@ The |outer_xref| subroutine is like |C_xref| except that it begins
with |next_control| |!='|'| and ends with |next_control>=format_code|.
Thus, it
+handles \CEE/ text with embedded comments.
+
+@ @c
+static void
+outer_xref(void) /* extension of |C_xref| */
+{@+
+ int bal; /* brace level in comment */
@z
Section 91.
@x
+@ @<Replace |"@@@@"| by |"@@"| @>=
+{
+ char *src=id_first,*dst=id_first;
+ at y
+@ @<Replace |"@@@@"| by |"@@"| @>=
+{@+
+ char *src=id_first,*dst=id_first;
+ at z
+
+Section 96.
+
+ at x
@ Finally, when the \TEX/ and definition parts have been treated, we have
|next_control>=begin_C|.
@y
-@ Finally, when the \TEX/ and definition parts have been treated, we have
+ at r @ Finally, when the \TEX/ and definition parts have been treated, we have
\hfil\break|next_control>=begin_C|.
@z
-Section 97.
+Section 102.
@x
@ The |flush_buffer| routine empties the buffer up to a given breakpoint,
@@ -303,32 +384,34 @@
@-c@>
@z
-Section 99.
+Section 106.
@x
-@ When we are copying \TEX/ source material, we retain line breaks
+@ When we wish to append one character |c| to the output buffer, we write
@y
- at r @ When we are copying \TEX/ source material, we retain line breaks
+@ When we wish to append one character |c| to the output buffer, we write
+ at -c@>
@z
-Section 101.
+Section 107.
@x
-@ When we wish to append one character |c| to the output buffer, we write
+out_str( /* output characters from |s| to end of string */
+const char*s)
@y
-@ When we wish to append one character |c| to the output buffer, we write
- at -c@>
+out_str(const char*s)
+ /* output characters from |s| to end of string */
@z
-Section 105.
+Section 113.
@x
-@ We get to this section only in the unusual case that the entire output line
+@ The |out_name| procedure is used to output an identifier or index
@y
- at r @ We get to this section only in the unusual case that the entire output line
+ at r @ The |out_name| procedure is used to output an identifier or index
@z
-Section 111.
+Section 116.
@x
@ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
@@ -336,18 +419,8 @@
@r @ The |copy_TeX| routine processes the \TEX/ code at the beginning of a
@z
- at x
-static eight_bits
-copy_TeX(void)
-{
- at y
-static eight_bits
-copy_TeX(void)
-{@+
- at z
+Section 117.
-Section 112.
-
@x
@ The |copy_comment| function issues a warning if more braces are opened than
@y
@@ -356,17 +429,23 @@
@z
@x
-int bal at t\2\2@>) /* brace balance */
-{
- char c; /* current character being copied */
+static int copy_comment( /* copies \TeX\ code in comments */
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal) /* brace balance */
@y
-int bal at t\2\2@>) /* brace balance */
-{@+
- char c; /* current character being copied */
+static int copy_comment(
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal) /* brace balance */
@z
-Section 117.
+ at x
+ } else {
+ at y
+ } @+ else {
+ at z
+Section 122.
+
@x
@ Here is a list of the category codes that scraps can have.
@y
@@ -373,7 +452,7 @@
@r @ Here is a list of the category codes that scraps can have.
@z
-Section 121.
+Section 126.
@x
@ The token lists for translated \TEX/ output contain some special control
@@ -382,7 +461,7 @@
@-n@>
@z
-Section 122.
+Section 127.
@x
\yskip\noindent All of these tokens are removed from the \TEX/ output that
@@ -391,7 +470,7 @@
@-n@>
@z
-Section 123.
+Section 128.
@x
@ The raw input is converted into scraps according to the following table,
@@ -409,12 +488,12 @@
\yskip\halign{\quad#\hfil&\quad\hbox to11cm{#\hfil}&\quad\hfil#\hfil\cr
@z
-Section 124.
+Section 129.
@x
-\.>&|prerangle|: \.{\\rangle}&yes\cr
+\./&|binop|: \./&yes\cr
@y
-\.>&|prerangle|: \.{\\rangle}&yes\cr}
+\./&|binop|: \./&yes\cr}
@ Cont.
@@ -421,24 +500,24 @@
\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
@z
-Section 125.
+Section 130.
@x
-\.{continue}&|case_like|: \stars&maybe\cr
+\.{complex}&|int_like|: \stars&yes\cr
@y
-\.{continue}&|case_like|: \stars&maybe\cr}
+\.{complex}&|int_like|: \stars&yes\cr}
- at r @ Cont.
+@ Cont.
\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
@z
-Section 126.
+Section 131.
@x
-\.{long}&|raw_int|: \stars&maybe\cr
+\.{friend}&|int_like|: \stars&maybe\cr
@y
-\.{long}&|raw_int|: \stars&maybe\cr}
+\.{friend}&|int_like|: \stars&maybe\cr}
@ Cont.
@@ -445,20 +524,32 @@
\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
@z
-Section 127.
+Section 132.
@x
-\.{try}&|else_like|: \stars&maybe\cr
+\.{static\_cast}&|raw_int|: \stars&maybe\cr
@y
-\.{try}&|else_like|: \stars&maybe\cr}
+\.{static\_cast}&|raw_int|: \stars&maybe\cr}
- at r @ Cont.
+@ Cont.
\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
@z
-Sections 128--135.
+Section 133.
+ at x
+\.{xor\_eq}&|alfop|: \stars&yes\cr
+ at y
+\.{xor\_eq}&|alfop|: \stars&yes\cr}
+
+@ Cont.
+
+\yskip\halign{\quad#\hfil&\quad#\hfil&\quad\hfil#\hfil\cr
+ at z
+
+Sections 134--142.
+
@x l.7 line numbers refer to 'prod.w'
@ Here is a table of all the productions. Each production that
@y
@@ -489,9 +580,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -in@>@-x@>@-y@>
\prodno=13 \midcol=2.5in
@@ -519,9 +610,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -in@>
\prodno=27 \midcol=2.5in
@@ -549,9 +640,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -in@>
\prodno=47 \midcol=2.5in
@@ -565,9 +656,9 @@
@z
@x l.164
- $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+ $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
@y
- $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+ $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
\endgroup
@ Cont.
@@ -579,9 +670,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -any@>@-z@>@-g@>@-a@>@-x@>@-y@>@-f@>
\prodno=61 \midcol=2.5in
@@ -610,9 +701,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -any@>@-z@>@-g@>@-a@>
\prodno=86 \midcol=2.5in
@@ -632,6 +723,11 @@
\endgroup
@ Cont.
+ at -deprecated@>
+ at -fallthrough@>
+ at -likely@>
+ at -nodiscard@>
+ at -unlikely@>
\begingroup \lineskip=4pt
\def\alt #1 #2
{$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
@@ -640,9 +736,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip at -any_other@>@-z@>@-f@>@-x@>@-p@>
\prodno=100 \midcol=2.5in
@@ -669,15 +765,56 @@
@y
@z
- at x l.272
-\+& |any_other| |end_arg| & |end_arg| & \&{char}$*$\.{@@]}\cr
+ at x l.291
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+ at y
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\endgroup
+
+@ Cont.
+ at -deprecated@>
+ at -fallthrough@>
+ at -likely@>
+ at -nodiscard@>
+ at -unlikely@>
+\begingroup \lineskip=4pt
+\def\alt #1 #2
+{$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
+ \strut\hbox{#2}\cr}\!\Bigr\}$ }
+\def\altt #1 #2 #3
+{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
+ \strut\hbox{#3}\cr}\!\Biggr\}$ }
+\def\malt #1 #2
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+\def\maltt #1 #2 #3
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+ \strut\hbox{#3}\hfill\cr}$}
+\yskip at -any_other@>@-z@>@-f@>@-x@>@-p@>
+\prodno=143 \midcol=2.5in
+\def\theprodno{\number\prodno \global\advance\prodno by1\enspace}
+\def\dagit{\dag\theprodno}
+\def\+#1\cr{\def\next{#1}%
+ \line{\hbox to 2em{\hss
+ \ifx\next\empty\theprodno\else\next\fi}\strut
+ \ignorespaces#2\hfil\hbox to\midcol{$\RA$
+ \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
+\advance\midcol20pt
+ at z
+
+ at x l.326
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
\yskip
\yskip
\yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
\parindent=0pt
\dag{\bf Notes}
@y
-\+& |any_other| |end_arg| & |end_arg| & \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
\advance\midcol-3pt
\+\dag200\enspace& |typedef_like| |decl_head| \alt|exp| |int_like| &
|typedef_like| |decl_head| \hfill $D=D$\alt $E^{**}$ $I^{**}$ \unskip &
@@ -689,15 +826,18 @@
\&{typedef} \&{int} \&{foo}\cr
\endgroup
- at r @-any_other@>@-z@>@ \begingroup\dag{\bf Notes}
+ at -any_other@>@-z@>@ \begingroup\dag{\bf Notes}
+\advance \hsize by -4cm
+\parindent=0pt
+\everypar={\hangindent=2em}
@z
-Section 136.
+Section 143.
@x
@* Implementing the productions.
@y
-@* Implementing the productions. \advance \hsize by -4cm
+@* Implementing the productions.\advance \hsize by -4cm
\ifx\undefined\pdfpagewidth \else \advance \pdfpagewidth by -4cm \fi
@z
@@ -707,7 +847,7 @@
the category codes |pp->cat|, |(pp+1)->cat|, $\,\ldots\,$
@z
-Section 139.
+Section 146.
@x
@ Token lists in |@!tok_mem| are composed of the following kinds of
@@ -716,17 +856,9 @@
@-p@>
@z
-Section 141.
+Section 149.
@x
-@ @<Print token |r|...@>=
- at y
- at r @ @<Print token |r|...@>=
- at z
-
-Section 142.
-
- at x
@ The production rules listed above are embedded directly into \.{CWEAVE},
@y
@ The production rules listed above are embedded directly into \.{CWEAVE},
@@ -739,7 +871,7 @@
@-pp@>
@z
-Section 143.
+Section 150.
@x
The code below is an exact translation of the production rules into
@@ -748,7 +880,7 @@
@-a@>
@z
-Section 146.
+Section 153.
@x
@ Let us consider the big switch for productions now, before looking
@@ -756,9 +888,23 @@
@r @ Let us consider the big switch for productions now, before looking
@z
-Section 147.
+ at x
+ && pp->cat!=new_exp
+ && pp->cat!=ftemplate @|
+ at y
+ && pp->cat!=new_exp @|
+ && pp->cat!=ftemplate
+ at z
@x
+ && pp->cat!=const_like
+ at y
+ && pp->cat!=const_like @|
+ at z
+
+Section 154.
+
+ at x
switch (pp->cat) {
case exp: @<Cases for |exp|@>@; @+break;
case lpar: @<Cases for |lpar|@>@; @+break;
@@ -807,6 +953,11 @@
case typedef_like: @<Cases for |typedef_like|@>@; @+break;
case delete_like: @<Cases for |delete_like|@>@; @+break;
case question: @<Cases for |question|@>@; @+break;
+ case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+ case lbrack: @<Cases for |lbrack|@>@; @+break;
+ case attr_head: @<Cases for |attr_head|@>@; @+break;
+ case attr: @<Cases for |attr|@>@; @+break;
+ case default_like: @<Cases for |default_like|@>@; @+break;
}
pp++; /* if no match was found, we move to the right */
}
@@ -817,7 +968,7 @@
pp++; /* if no match was found, we move to the right */
}
-@ @<Cases for |pp->cat|@>=
+@ @<Cases for |pp->cat|@>=@t\1\5\5@>
case exp: @<Cases for |exp|@>@; @+break;
case lpar: @<Cases for |lpar|@>@; @+break;
case unop: @<Cases for |unop|@>@; @+break;
@@ -865,9 +1016,14 @@
case typedef_like: @<Cases for |typedef_like|@>@; @+break;
case delete_like: @<Cases for |delete_like|@>@; @+break;
case question: @<Cases for |question|@>@; @+break;
+ case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+ case lbrack: @<Cases for |lbrack|@>@; @+break;
+ case attr_head: @<Cases for |attr_head|@>@; @+break;
+ case attr: @<Cases for |attr|@>@; @+break;
+ case default_like: @<Cases for |default_like|@>@; @+break;
@z
-Section 148.
+Section 155.
@x
of identifiers in case labels.
@@ -878,7 +1034,7 @@
If the first identifier is the keyword `\&{operator}', we give up;
@z
-Section 150.
+Section 157.
@x
@ The scraps currently being parsed must be inspected for any
@@ -892,15 +1048,34 @@
\hfil\break|make_reserved|, hence |tok_loc| has been set.
@z
-Section 154.
+ at x
+make_reserved( /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p)
+ at y
+make_reserved(scrap_pointer p)
+ /* make the first identifier in |p->trans| like |int| */
+ at z
+Section 158.
+
@x
+make_underlined(
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p)
+ at y
+make_underlined(scrap_pointer p)
+ /* underline the entry for the first identifier in |p->trans| */
+ at z
+
+Section 161.
+
+ at x
@ \.{CTWILL} needs the following procedure, which appends tokens of a
@y
@r @ \.{CTWILL} needs the following procedure, which appends tokens of a
@z
-Section 155.
+Section 162.
@x
@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
@@ -917,49 +1092,77 @@
{@+
@z
-Section 159.
+Section 163.
@x
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }
+ at y
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }@+
+ at z
+
+Section 164.
+
+ at x
+ && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at y
+ @|&& *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+ at z
+
+Section 166.
+
+ at x
@ @<Cases for |lpar|@>=
@y
@r @ @<Cases for |lpar|@>=
@z
-Section 168.
+Section 180.
@x
-@ @<Cases for |decl_head|@>=
+ if (indent_param_decl) {
+ app(outdent); app(outdent);
+ }
@y
- at r @ @<Cases for |decl_head|@>=
+ if (indent_param_decl) {@+app(outdent); app(outdent);@+}
@z
-Section 173.
+Section 189.
@x
-@ @<Cases for |fn_decl|@>=
+@ @<Cases for |case_like|@>=
@y
- at r @ @<Cases for |fn_decl|@>=
+ at r @ @<Cases for |case_like|@>=
@z
-Section 208.
+Section 206.
@x
-@ Here's the |squash| procedure, which
+@ @<Cases for |raw_ubin|@>=
@y
- at r @ Here's the |squash| procedure, which
+ at r @ @<Cases for |raw_ubin|@>=
@z
-Section 212.
+Section 221.
@x
-@ @<Print a snapsh...@>=
+@ And here now is the code that applies productions as long as possible.
@y
- at r @ @<Print a snapsh...@>=
+ at r @ And here now is the code that applies productions as long as possible.
@z
-Section 220.
+Section 230.
@x
+ if (next_control=='|' || next_control==begin_comment ||
+ next_control==begin_short_comment) return;
+ at y
+ if (next_control=='|' || next_control==begin_comment @| ||
+ next_control==begin_short_comment) return;
+ at z
+
+Section 232.
+
+ at x
@ The following macro is used to append a scrap whose tokens have just
@y
@ The following macro is used to append a scrap whose tokens have just
@@ -967,71 +1170,280 @@
@-c@>
@z
-Section 229.
+Section 233.
@x
-@ The |outer_parse| routine is to |C_parse| as |outer_xref|
+@ @<Append the scr...@>=
+@<Make sure that there is room for the new scraps, tokens, and texts@>@;
@y
- at r @ The |outer_parse| routine is to |C_parse| as |outer_xref|
+ at r @ @<Append the scr...@>=
+@#
+@<Make sure that there is room for the new scraps, tokens, and texts@>@;
+@#
@z
-Section 235.
+ at x
+ case '/': case '.':
+ app(next_control);@+app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+ at .\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+ at .\\rangle@>
+ case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+ at .\\K@>
+ case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+ at .\\OR@>
+ case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+ at .\\XOR@>
+ case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+ at .\\MOD@>
+ case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+ at .\\R@>
+ case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+ at .\\CM@>
+ case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+ at .\\AND@>
+ case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+ at .\\?@>
+ case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+ at .\\\#@>
+ at y
+@#
+ @t\4@> @<Cases for operators@>@;
+@#
+ at z
@x
-@ To insert token-list |p| into the output, the |push_level| subroutine
+ case ignore: case xref_roman: case xref_wildcard:
+ case meaning: case suppress:
@y
- at r @ To insert token-list |p| into the output, the |push_level| subroutine
+ case ignore: case xref_roman: case xref_wildcard:@/
+ case meaning: case suppress:@/
@z
-Section 237.
+ at x
+ case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+ case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+ case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+ at .\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+ at q{@>@.\\\}@>
+ case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+ case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+ case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ at y
+@#
+ @t\4@> @<Cases for syntax markers@>@;
+ at z
@x
-called when |stack_ptr==1|.
+ @t\4@> @<Cases involving nonstandard characters@>@;
@y
-called when |stack_ptr| |==1|.
+ @t\4@> @<Cases involving nonstandard characters@>@;
+@#
@z
-Section 241.
+ at x
+ overflow(_("scrap/token/text"));
+}
+ at y
+ overflow(_("scrap/token/text"));
+}
+@ @<Cases for operators@>=@t\1\5\5@>
+ case '/': case '.':
+ app(next_control);@+app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+ at .\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+ at .\\rangle@>
+ case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+ at .\\K@>
+ case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+ at .\\OR@>
+ case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+ at .\\XOR@>
+ case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+ at .\\MOD@>
+ case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+ at .\\R@>
+ case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+ at .\\CM@>
+ case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+ at .\\AND@>
+ case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+ at .\\?@>
+ case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+ at .\\\#@>
+
+@ @<Cases for syntax markers@>=@t\1\5\5@>
+ case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+ case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+ case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+ at .\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+ at q{@>@.\\\}@>
+ case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+ case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+ case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ at z
+
+Section 237.
+
@x
- text_pointer save_text_ptr;
- sixteen_bits save_next_control; /* values to be restored */
- text_pointer p; /* translation of the \CEE/ text */
+@ Some nonstandard characters may have entered \.{CWEAVE} by means of
@y
- text_pointer save_text_ptr, p; /* translation of the \CEE/ text */
- sixteen_bits save_next_control; /* values to be restored */
+ at r @ Some nonstandard characters may have entered \.{CWEAVE} by means of
@z
-Section 244.
+Section 239.
@x
-else @<Look ahead for strongest line break, |goto reswitch|@>
+@<Append a \TEX/ string, without forming a scrap@>=
@y
-else {@<Look ahead for strongest line break, |goto reswitch|@>}
+ at r @ @<Append a \TEX/ string, without forming a scrap@>=
@z
Section 245.
@x
-@<Look ahead for st...@>= {
+make_pb=true;
+
+@ @c
@y
-@<Look ahead for st...@>=
+make_pb=true;
+
+ at r @ @c
@z
+Section 249.
+
@x
+@<Private...@>=
+ at y
+ at r @ @<Private...@>=
+ at z
+
+Section 252.
+
+ at x
+@ @c
+static void
+push_level( /* suspends the current level */
+text_pointer p)
+ at y
+@ Suspend the current level.
+ at c
+static void
+push_level(text_pointer p)@/
+ at z
+
+Section 253.
+
+ at x
+called when |stack_ptr==1|.
+ at y
+called when |stack_ptr| |==1|.
+ at z
+
+Section 257.
+
+ at x
+@ The real work associated with token output is done by |make_output|.
+ at y
+ at r @ The real work associated with token output is done by |make_output|.
+ at z
+
+Section 258.
+
+ at x
+ reswitch: switch(a) {
+ case end_translation: return;
+ case identifier: case res_word: @<Output an identifier@>@; break;
+ case section_code: @<Output a section name@>@; break;
+ case math_rel: out_str("\\MRL{"@q}@>);
+ at .\\MRL@>
+ case noop: case inserted: break;
+ case cancel: case big_cancel: c=0; b=a;
+ while (true) {
+ a=get_output();
+ if (a==inserted) continue;
+ if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
+ if (a==indent) c++;
+ else if (a==outdent) c--;
+ else if (a==opt) a=get_output();
+ }
+ @<Output saved |indent| or |outdent| tokens@>@;
+ goto reswitch;
+ case dindent: a=get_output();
+ if (a!=big_force) {
+ out_str("\\1\\1"); goto reswitch;
+ }
+ else dindent_pending=true; /* fall through */
+ case indent: case outdent: case opt: case backup: case break_space:
+ case force: case big_force: case preproc_line: @<Output a control,
+ look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
+ case quoted_char: out(*(cur_tok++));
+ case qualifier: break;
+ default: out(a); /* otherwise |a| is an ordinary character */
+ }
+ }
}
@y
+ reswitch: @/@<The output |switch|@>@;
+ }
+}
+
+ at r @ @<The output |switch|@>=
+ switch(a) {
+ case end_translation: return;
+ case identifier: case res_word: @<Output an identifier@>@; break;
+ case section_code: @<Output a section name@>@; break;
+ case math_rel: out_str("\\MRL{"@q}@>);
+ at .\\MRL@>
+ case noop: case inserted: break;
+ case cancel: case big_cancel: c=0; b=a;
+ while (true) {
+ a=get_output();
+ if (a==inserted) continue;
+ if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
+ if (a==indent) c++;
+ else if (a==outdent) c--;
+ else if (a==opt) a=get_output();
+ }
+ @<Output saved |indent| or |outdent| tokens@>@;
+ goto reswitch;
+ case dindent: a=get_output();
+ if (a!=big_force) {
+ out_str("\\1\\1"); goto reswitch;
+ }
+ else dindent_pending=true; /* fall through */
+ case indent: case outdent: case opt: case backup: case break_space:
+ case force: case big_force: case preproc_line: @<Output a control,
+ look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
+ case quoted_char: out(*(cur_tok++));
+ case qualifier: break;
+ default: out(a); /* otherwise |a| is an ordinary character */
+ }
@z
-Section 246.
+Section 264.
@x
-@ @<Output saved...@>=
+@ The remaining part of |make_output| is somewhat more complicated. When we
@y
- at r @ @<Output saved...@>=
+ at r @ The remaining part of |make_output| is somewhat more complicated. When we
@z
-Section 250.
+Section 267.
@x
@ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
@@ -1039,7 +1451,7 @@
@r @ The \CEE/ text enclosed in \pb\ should not contain `\.{\v}' characters,
@z
-Section 256.
+Section 273.
@x
@ The output file will contain the control sequence \.{\\Y} between non-null
@@ -1047,7 +1459,7 @@
@r @ The output file will contain the control sequence \.{\\Y} between non-null
@z
-Section 259.
+Section 276.
@x
@<Translate the \T...@>= do {
@@ -1055,15 +1467,29 @@
@<Translate the \T...@>= do {@+
@z
-Section 267.
+Section 282.
@x
+@<Start a macro...@>= {
+ at y
+ at r @ @<Start a macro...@>= {
+ at z
+
+ at x
+ if(!space_checked){emit_space_if_needed;save_position;}
+ at y
+ if(!space_checked){@+emit_space_if_needed;save_position;@+}
+ at z
+
+Section 285.
+
+ at x
|next_control>=begin_C|. We will make the global variable |this_section|
@y
\hfil\break|next_control>=begin_C|. We will make the global variable |this_section|
@z
-Section 268.
+Section 286.
@x
@ @<Translate the \CEE/...@>=
@@ -1071,7 +1497,7 @@
@r @ @<Translate the \CEE/...@>=
@z
-Section 272.
+Section 290.
@x
@ The |footnote| procedure gives cross-reference information about
@@ -1079,26 +1505,26 @@
@r @ The |footnote| procedure gives cross-reference information about
@z
-Section 284.
+Section 302.
@x
@ A left-to-right radix sorting method is used, since this makes it easy to
@y
-@ A left-to-right radix sorting method is used, since this makes it easy to
+ at r @ A left-to-right radix sorting method is used, since this makes it easy to
@-c@>
@z
-Section 286.
+Section 304.
@x
-@ During the sorting phase we shall use the |cat| and |trans| arrays from
+@<Rest of |trans_plus| union@>=
@y
-@ During the sorting phase we shall use the |cat| and |trans| arrays from
+@ @<Rest of |trans_plus| union@>=
@-j@>
@-k@>
@z
-Section 289.
+Section 308.
@x
$|collate|[0]<|collate|[1]<\cdots<|collate|[100]$.
@@ -1106,15 +1532,17 @@
|collate[0]| $<$|collate[1]|$<\cdots<$|collate[100]|.
@z
-Section 296.
+Section 310.
@x
- else {char *j;
+unbucket( /* empties buckets having depth |d| */
+eight_bits d)
@y
- else {@+char *j;
+unbucket(eight_bits d)
+ /* empties buckets having depth |d| */
@z
-Section 303.
+Section 322.
@x
@ Because on some systems the difference between two pointers is a |ptrdiff_t|
@@ -1124,18 +1552,80 @@
|ptrdiff_t| rather than an |int|, we use \.{\%ld} to print these quantities.
@z
-Section 304.
+ at x
+ puts(_("\nMemory usage statistics:"));
+ at .Memory usage statistics:@>
+ printf(_("%ld names (out of %ld)\n"),
+ (ptrdiff_t)(name_ptr-name_dir),(long)max_names);
+ printf(_("%ld cross-references (out of %ld)\n"),
+ (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);
+ printf(_("%ld bytes (out of %ld)\n"),
+ (ptrdiff_t)(byte_ptr-byte_mem),(long)max_bytes);
+ printf(_("%ld temp meanings (out of %ld)\n"),
+ (ptrdiff_t)(max_temp_meaning_ptr-temp_meaning_stack),
+ (long)max_meanings);
+ printf(_("%ld titles (out of %ld)\n"),
+ (ptrdiff_t)(title_code_ptr-title_code),(long)max_titles);
+ puts(_("Parsing:"));
+ printf(_("%ld scraps (out of %ld)\n"),
+ (ptrdiff_t)(max_scr_ptr-scrap_info),(long)max_scraps);
+ printf(_("%ld texts (out of %ld)\n"),
+ (ptrdiff_t)(max_text_ptr-tok_start),(long)max_texts);
+ printf(_("%ld tokens (out of %ld)\n"),
+ (ptrdiff_t)(max_tok_ptr-tok_mem),(long)max_toks);
+ printf(_("%ld levels (out of %ld)\n"),
+ (ptrdiff_t)(max_stack_ptr-stack),(long)stack_size);
+ puts(_("Sorting:"));
+ printf(_("%ld levels (out of %ld)\n"),
+ (ptrdiff_t)(max_sort_ptr-scrap_info),(long)max_scraps);
+ at y
+ puts(_("\nMemory usage statistics:"));@/
+ at .Memory usage statistics:@>
+ printf(_("%ld names (out of %ld)\n"),
+ (ptrdiff_t)(name_ptr-name_dir),@/
+ @t\5\5\5\5@>(long)max_names);@/
+ printf(_("%ld cross-references (out of %ld)\n"),
+ (ptrdiff_t)(xref_ptr-xmem),(long)max_refs);@/
+ printf(_("%ld bytes (out of %ld)\n"),
+ (ptrdiff_t)(byte_ptr-byte_mem),@/
+ @t\5\5\5\5@>(long)max_bytes);@/
+ printf(_("%ld temp meanings (out of %ld)\n"),
+ (ptrdiff_t)(max_temp_meaning_ptr-temp_meaning_stack),@/
+ @t\5\5\5\5@>(long)max_meanings);@/
+ printf(_("%ld titles (out of %ld)\n"),
+ (ptrdiff_t)(title_code_ptr-title_code),@/
+ @t\5\5\5\5@>(long)max_titles);@/
+ puts(_("Parsing:"));@/
+ printf(_("%ld scraps (out of %ld)\n"),
+ (ptrdiff_t)(max_scr_ptr-scrap_info),@/
+ @t\5\5\5\5@>(long)max_scraps);@/
+ printf(_("%ld texts (out of %ld)\n"),
+ (ptrdiff_t)(max_text_ptr-tok_start),@/
+ @t\5\5\5\5@>(long)max_texts);@/
+ printf(_("%ld tokens (out of %ld)\n"),
+ (ptrdiff_t)(max_tok_ptr-tok_mem),@/
+ @t\5\5\5\5@>(long)max_toks);@/
+ printf(_("%ld levels (out of %ld)\n"),
+ (ptrdiff_t)(max_stack_ptr-stack),@/
+ @t\5\5\5\5@>(long)stack_size);@/
+ puts(_("Sorting:"));@/
+ printf(_("%ld levels (out of %ld)\n"),
+ (ptrdiff_t)(max_sort_ptr-scrap_info),@/
+ @t\5\5\5\5@>(long)max_scraps);
+ at z
+Section 323.
+
@x
\bigskip
\font\itt=cmitt10
-{\noindent \it Although \.{\itt CTWILL} is based on \.{\itt cweave.w}, new and
+{\noindent \it Although {\itt CTWILL} is based on {\itt cweave.w}, new and
modified material is incorporated all over the place, without taking special
care for keeping the original section numbering intact.}
@y
@z
-Section 312.
+Section 331.
@x
@** Index.
Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -34,9 +34,9 @@
@z
@x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
@y
-\def\title{CTWILL (Version 4.2 [\TeX~Live])}
+\def\title{CTWILL (Version 4.3 [\TeX~Live])}
@z
@x
@@ -46,9 +46,9 @@
@z
@x
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
@y
- \centerline{(Version 4.2 [\TeX~Live])}
+ \centerline{(Version 4.3 [\TeX~Live])}
@z
@x
@@ -75,7 +75,7 @@
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
is modified.
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
This is the \.{CTWILL} program by D. E. Knuth, based
on \.{CWEAVE} by Silvio Levy and D.~E. Knuth. It is also based on
@@ -94,7 +94,7 @@
The ``banner line'' defined here should be changed whenever \.{CTWILL} is
modified. The version number parallels the corresponding version of \.{CWEAVE}.
- at d banner "This is CTWILL, Version 4.2"
+ at d banner "This is CTWILL, Version 4.3"
/* will be extended by the \TeX~Live |versionstring| */
@z
@@ -628,6 +628,10 @@
@x
@.Control codes are forbidden...@>
+ }
+}
+
+@ @<Predecl...@>=@+static void skip_restricted(void);
@y
@.Control codes are forbidden...@>
if (c==meaning && phase==2) @<Process a user-generated meaning@>@;
@@ -635,15 +639,7 @@
}
}
-@ @<Suppress mini-index entry@>=
-{ char *first=id_first,*last=id_loc;
- while (xisspace(*first)) first++;
- while (xisspace(*(last-1))) last--;
- if (first<last) {
- struct perm_meaning *q=id_lookup(first,last,normal)-name_dir+cur_meaning;
- q->stamp=section_count; /* this is what actually suppresses output */
- }
-}
+@ @<Predecl...@>=@+static void skip_restricted(void);
@ @<Process a user-generated meaning@>=
{ char *first=id_first;
@@ -664,6 +660,16 @@
loc=id_loc+2;
}
+@ @<Suppress mini-index entry@>=
+{ char *first=id_first,*last=id_loc;
+ while (xisspace(*first)) first++;
+ while (xisspace(*(last-1))) last--;
+ if (first<last) {
+ struct perm_meaning *q=id_lookup(first,last,normal)-name_dir+cur_meaning;
+ q->stamp=section_count; /* this is what actually suppresses output */
+ }
+}
+
@ @<Digest...@>=
{ meaning_struct *m;
struct perm_meaning *q=p-name_dir+cur_meaning;
@@ -683,6 +689,8 @@
else { char *q=m->tex_part;
while (loc<id_loc) *q++=*loc++;
*q='\0';
+ }
+}
@z
@x
@@ -872,10 +880,10 @@
@z
@x
- at d end_arg 62 /* \.{@@]} */
+ at d attr_head 69 /* denotes beginning of attribute */
@y
- at d end_arg 62 /* \.{@@]} */
- at d title 63 /* program name or header name in a ``meaning'' */
+ at d attr_head 69 /* denotes beginning of attribute */
+ at d title 70 /* program name or header name in a ``meaning'' */
@z
@x
@@ -903,14 +911,14 @@
@c
static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+print_text( /* prints a token list for debugging; not used in |main| */
@y
@d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
@c
#if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
@z
@x
@@ -964,9 +972,9 @@
@z
@x
- r->num=m; /* everything from |q| on is left undisturbed */
+r->num=m; /* everything from |q| on is left undisturbed */
@y
- r->num=m; /* everything from |q| on is left undisturbed */
+r->num=m; /* everything from |q| on is left undisturbed */
@ \.{CTWILL} needs the following procedure, which appends tokens of a
translated text until coming to |tok_loc|, then suppresses text that may
@@ -973,7 +981,7 @@
appear between parentheses or brackets. The calling routine should set
|ident_seen=false| first. (This is admittedly tricky.)
- at c boolean ident_seen;
+ at c static boolean ident_seen;
static boolean app_supp(
text_pointer p)
{ token_pointer j;
@@ -1089,7 +1097,7 @@
@x
@<Cases for |exp|@>=
if (cat1==lbrace || cat1==int_like || cat1==decl) {
- make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ make_underlined(pp); big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,1);
}
@y
@@ -1097,16 +1105,13 @@
if(cat1==lbrace || cat1==int_like || cat1==decl) {
make_underlined(pp);
make_ministring(0);
- big_app1(pp);
- if (indent_param_decl) {
- big_app(indent); app(indent);
- }
+ if (indent_param_decl) big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,1);
}
@z
@x
- make_underlined (pp); squash(pp,2,tag,-1,7);
+ make_underlined (pp); squash(pp,2,tag,-1,7);
@y
make_underlined (pp);
if (tok_loc>operator_found) {
@@ -1123,8 +1128,7 @@
big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
}
else if (cat1==ubinop) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
- reduce(pp,2,decl_head,-1,34);
+ big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -1134,7 +1138,7 @@
squash(pp,3,decl_head,-1,36);
else if (cat1==cast) squash(pp,2,decl_head,-1,37);
else if (cat1==lbrace || cat1==int_like || cat1==decl) {
- big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+ big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
}
else if (cat1==semi) squash(pp,2,decl,-1,39);
@y
@@ -1143,7 +1147,7 @@
big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
}
else if (cat1==ubinop) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ big_app1_insert(pp,'{'); big_app('}');
reduce(pp,2,decl_head,-1,34);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
@@ -1156,10 +1160,7 @@
squash(pp,3,decl_head,-1,36);
else if (cat1==cast) squash(pp,2,decl_head,-1,37);
else if (cat1==lbrace || cat1==int_like || cat1==decl) {
- big_app1(pp);
- if (indent_param_decl) {
- big_app(indent); app(indent);
- }
+ if (indent_param_decl) big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,38);
}
else if (cat1==semi) squash(pp,2,decl,-1,39);
@@ -1168,24 +1169,19 @@
@x
@ @<Cases for |decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1);
- reduce(pp,2,decl,-1,40);
+ big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
}
else if (cat1==stmt || cat1==function) {
- big_app1(pp); big_app(big_force);
- big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+ big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
}
@y
@ @<Cases for |decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1);
- reduce(pp,2,decl,-1,40);
+ big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
}
else if (cat1==stmt || cat1==function) {
- big_app1(pp);
- if(order_decl_stmt) big_app(big_force);
- else big_app(force);
- big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+ big_app1_insert(pp,order_decl_stmt ? big_force : force);
+ reduce(pp,2,cat1,-1,41);
}
@z
@@ -1199,7 +1195,7 @@
@x
@ @<Cases for |fn_decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+ big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
}
else if (cat1==stmt) {
big_app1(pp); app(outdent); app(outdent); big_app(force);
@@ -1208,7 +1204,7 @@
@y
@ @<Cases for |fn_decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+ big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
}
else if (cat1==stmt) {
big_app1(pp);
@@ -1215,12 +1211,18 @@
if (indent_param_decl) {
app(outdent); app(outdent);
}
- big_app(force);
- big_app1(pp+1); reduce(pp,2,function,-1,52);
+ big_app(force); big_app1(pp+1); reduce(pp,2,function,-1,52);
}
@z
@x
+ big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
+ at y
+ big_app1(pp); if (indent_param_decl) big_app(dindent);
+ big_app1(pp+1); reduce(pp,2,fn_decl,0,73);
+ at z
+
+ at x
if (cat1==define_like) make_underlined(pp+2);
@y
if (cat1==define_like) { /* \.{\#define} is analogous to \&{extern} */
@@ -1241,9 +1243,9 @@
@z
@x
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,102);
+ big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,102);
@y
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,123);
+ big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,123);
@z
@x
@@ -1251,11 +1253,11 @@
if ((cat1==int_like || cat1==cast) && (cat2==comma || cat2==semi))
squash(pp+1,1,exp,-1,115);
else if (cat1==int_like) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,116);
+ big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,116);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
make_underlined(pp+1); make_reserved(pp+1);
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,117);
+ big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,117);
}
else if (cat1==comma) {
big_app2(pp); big_app(' '); reduce(pp,2,typedef_like,0,118);
@@ -1262,8 +1264,7 @@
}
else if (cat1==semi) squash(pp,2,decl,-1,119);
else if (cat1==ubinop && (cat2==ubinop || cat2==cast)) {
- big_app('{'); big_app1(pp+1); big_app('}'); big_app1(pp+2);
- reduce(pp+1,2,cat2,0,120);
+ big_app('{'); big_app1_insert(pp+1,'}'); reduce(pp+1,2,cat2,0,120);
}
@y
@ Here \.{CTWILL} deviates from the normal productions introduced in
@@ -1353,11 +1354,9 @@
@z
@x
-to \.{\\PB}, if the user has invoked \.{CWEAVE} with the \.{+e} flag.
-Although \.{cwebmac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}. Although \.{cwebmac} ignores \.{\\PB}, other macro packages
@y
-to \.{\\PB}, if the user has invoked \.{CTWILL} with the \.{+e} flag.
-Although \.{ctwimac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}. Although \.{ctwimac} ignores \.{\\PB}, other macro packages
@z
@x
@@ -1412,12 +1411,10 @@
@z
@x
-while (!input_has_ended) @<Translate the current section@>@;
-}
+@ @<Predecl...@>=@+static void phase_two(void);
@y
-while (!input_has_ended) @<Translate the current section@>@;
-}
+@ @<Predecl...@>=@+static void phase_two(void);
@ @<Private...@>=
static FILE *aux_file;
@@ -1479,15 +1476,15 @@
@y
@.\\N@>
if (right_start_switch) {
- out_str("N"); right_start_switch=false;
+ out('N'); right_start_switch=false;
@.\\NN@>
}
@z
@x
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
@y
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
flush_buffer(out_ptr,false,false);
@z
@@ -1551,12 +1548,12 @@
@x
@.Improper macro definition@>
else {
- app('$'); app_cur_id(false);
+ app_cur_id(false);
@y
@.Improper macro definition@>
else {
id_being_defined=id_lookup(id_first,id_loc,normal);
- app('$'); app_cur_id(false);
+ app_cur_id(false);
def_diff=*loc-'(';
@z
@@ -1809,9 +1806,9 @@
@z
@x
- case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
+ case normal: case func_template:
@y
- case normal: if (is_tiny(cur_name)) out_str("\\|");
+ case normal:
@z
@x
@@ -1900,20 +1897,20 @@
@x
@** Index.
@y
-@** Extensions to \.{CWEB}. The following sections introduce new or improved
-features that have been created by numerous contributors over the course of a
-quarter century.
+@** Extensions to {\tentex CWEB}. The following sections introduce new or
+improved features that have been created by numerous contributors over the
+course of a quarter century.
\bigskip
\font\itt=cmitt10
-{\noindent \it Although \.{\itt CTWILL} is based on \.{\itt cweave.w}, new and
+{\noindent \it Although {\itt CTWILL} is based on {\itt cweave.w}, new and
modified material is incorporated all over the place, without taking special
care for keeping the original section numbering intact.}
@* Formatting alternatives.
-\.{CWEAVE} indents declarations after old-style function definitions.
-With the \.{-i} option they will come out flush left. You won't see
-any difference if you use ANSI-style function definitions.
+\.{CWEAVE} indents declarations after old-style function definitions and
+long parameter lists of modern function definitions.
+With the \.{-i} option they will come out flush left.
@d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
@@ -1947,7 +1944,7 @@
fatal(_("! Cannot open output file "),check_file_name);
@.Cannot open output file@>
- if (temporary_output) @<Compare the temporary output...@>@;
+ if (check_for_change) @<Compare the temporary output...@>@;
fclose(tex_file); tex_file=NULL;
fclose(check_file); check_file=NULL;
@@ -1979,7 +1976,7 @@
rename(check_file_name,tex_file_name);
}
-@* Put ``version'' information in \.{COMMON}.
+@* Put ``version'' information in a single spot.
Don't do this at home, kids! Push our local macro to the variable in \.{COMMON}
for printing the |banner| and the |versionstring| from there.
Modified: trunk/Build/source/texk/web2c/cwebdir/ctwill.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwill.bux 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwill.bux 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,17 +1,17 @@
@$program {COMMON.W}18 \&{int}@>
-@$ctangle {COMMON.W}18 \&{int}@>
-@$ctwill {COMMON.W}18 \&{int}@>
-@$cweave {COMMON.W}18 \&{int}@>
+@$ctangle {COMMON.W}2 \&{int}@>
+@$ctwill {COMMON.W}2 \&{int}@>
+@$cweave {COMMON.W}2 \&{int}@>
@$phase {COMMON.W}19 \&{int}@>
@$common_init {COMMON.W}20 \&{void} (\,)@>
+@$section_text {COMMON.W}21 \&{char} [\,][\,]@>
+@$section_text_end {COMMON.W}21 \&{char} ${*}$@>
@$id_first {COMMON.W}21 \&{char} ${*}$@>
@$id_loc {COMMON.W}21 \&{char} ${*}$@>
-@$section_text {COMMON.W}21 \&{char} [\,][\,]@>
-@$section_text_end {COMMON.W}21 \&{char} ${*}$@>
@$buffer {COMMON.W}22 \&{char} [\,]@>
@$buffer_end {COMMON.W}22 \&{char} ${*}$@>
+@$loc {COMMON.W}22 \&{char} ${*}$@>
@$limit {COMMON.W}22 \&{char} ${*}$@>
-@$loc {COMMON.W}22 \&{char} ${*}$@>
@$include_depth {COMMON.W}25 \&{int}@>
@$file {COMMON.W}25 \&{FILE} ${*}$ [\,]@>
@@ -18,7 +18,6 @@
@$change_file {COMMON.W}25 \&{FILE} ${*}$@>
@$file_name {COMMON.W}25 \&{char} [\,][\,]@>
@$change_file_name {COMMON.W}25 \&{char} [\,]@>
-@$alt_web_file_name {COMMON.W}25 \&{char} [\,]@>
@$line {COMMON.W}25 \&{int} [\,]@>
@$change_line {COMMON.W}25 \&{int}@>
@$change_depth {COMMON.W}25 \&{int}@>
@@ -43,9 +42,9 @@
@$byte_ptr {COMMON.W}44 \&{char} ${*}$@>
@$name_ptr {COMMON.W}44 \&{name\_pointer}@>
-@$h {COMMON.W}46 \&{hash\_pointer}@>
@$hash {COMMON.W}46 \&{name\_pointer} [\,]@>
@$hash_end {COMMON.W}46 \&{hash\_pointer}@>
+@$h {COMMON.W}46 \&{hash\_pointer}@>
@$id_lookup {COMMON.W}48 \&{name\_pointer} (\,)@>
@@ -72,7 +71,6 @@
@$scn_file_name {COMMON.W}73 \&{char} [\,]@>
@$check_file_name {COMMON.W}73 \&{char} [\,]@>
@$flags {COMMON.W}73 \&{boolean} [\,]@>
-@$use_language {COMMON.W}86 \&{const char} ${*}$@>
@$C_file {COMMON.W}83 \&{FILE} ${*}$@>
@$tex_file {COMMON.W}83 \&{FILE} ${*}$@>
@@ -81,6 +79,8 @@
@$check_file {COMMON.W}83 \&{FILE} ${*}$@>
@$active_file {COMMON.W}83 \&{FILE} ${*}$@>
+@$use_language {COMMON.W}86 \&{const char} ${*}$@>
+
@$cb_banner {COMMON.W}87 \&{char} [\,]@>
@$cb_show_banner {COMMON.W}99 \&{void} (\,)@>
Modified: trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/ctwimac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,9 +1,9 @@
% standard macros for CWEB listings (in addition to plain.tex)
-% Version 3.6 --- May 2000
+% Version 4.3 --- April 2021
% modified for pages produced by CTWILL
% further modified for page size of the MMIXware book
\ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CTWILL3.6+LNCS}
+\xdef\fmtversion{\fmtversion+CTWILL4.3+LNCS}
\let\:=\. % preserve a way to get the dot accent
% (all other accents will still work as usual)
@@ -218,6 +218,7 @@
\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
\let\yskip=\smallskip
\def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\note#1#2.{\par\penalty5000
\Y\noindent{\hangindent2\em\baselineskip10pt\eightrm#1~#2.\par}}
\def\lapstar{\rlap{*}}
@@ -278,7 +279,8 @@
\hbox{$\def\?{\kern.2em}%
\def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
\def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
- \let\~=\oct \let\^=\hex {#1}$}}
+ \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+ \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
\def\U{\note{This code is used in section}} % xref for use of a section
\def\Us{\note{This code is used in sections}} % xref for uses of a section
\let\V=\lor % logical or
@@ -292,16 +294,16 @@
%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
\hbox{\strut\kern2pt\.{#1}\kern2pt}}
\hrule}\vrule\kern2pt}} % verbatim string
-\def\TeX{{\ifmmode\it\fi
- \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
-
% now here's the mini-index formatting control
\newcount\nrefs % total number of references in partial page
\newcount\baseno % smallest section number in partial page
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-bs.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -20,16 +20,16 @@
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
is modified.
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
is modified.
- at d banner "This is CWEAVE (Version 4.2pc/big)"
+ at d banner "This is CWEAVE (Version 4.3pc/big)"
@z
- at x Section 7.
+ at x Section 10.
for section names */
@<Common code...@>=
@@ -119,11 +119,11 @@
@x Section 24.
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
xmem->num=0; /* sentinel value */
@y
xmem_end = xmem + max_refs - 1;
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
xmem->num=0; /* sentinel value */
@z
@@ -165,7 +165,7 @@
@z
- at x Section 74.
+ at x Section 78.
if (unindexed(lhs)) { /* retain only underlined entries */
xref_pointer q,r=NULL;
for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
@@ -186,7 +186,7 @@
@z
- at x Section 93.
+ at x Section 97.
char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
out('{');
for (k=p->byte_start; k<k_end; k++) {
@@ -197,7 +197,7 @@
@z
- at x Section 209.
+ at x Section 218.
char *p; /* index into |byte_mem| */
@y
char huge *p; /* index into |byte_mem| */
@@ -204,7 +204,7 @@
@z
- at x Section 244.
+ at x Section 253.
if (cur_name->xref!=(void *)xmem) {
@y
if (cur_name->xref!=(void huge*)xmem) {
@@ -211,7 +211,7 @@
@z
- at x Section 246.
+ at x Section 255.
static char *cur_byte; /* index into |byte_mem| */
@y
static char huge* cur_byte; /* index into |byte_mem| */
@@ -218,18 +218,20 @@
@z
- at x Section 255.
+ at x Section 264.
switch (cur_name->ilk) {
- case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
- else {char *j;
+ case normal: case func_template:
+ if (is_tiny(cur_name)) out_str("\\|");
+ else {@+char *j;
@y
switch (cur_name->ilk) {
- case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
- else {char huge* j;
+ case normal: case func_template:
+ if (is_tiny(cur_name)) out_str("\\|");
+ else {@+char huge* j;
@z
- at x Section 255.
+ at x Section 264.
case custom: {char *j; out_str("$\\");
@y
case custom: {char huge* j; out_str("$\\");
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-man.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -16,7 +16,7 @@
}
@y
\def\botofcontents{\vfill\titlefalse}
-\def\contentspagenumber{111}
+\def\contentspagenumber{109}
\def\title{APPENDIX F: CWEAVE}
\let\K=\leftarrow
@z
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-pc.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -11,12 +11,12 @@
change files that have -bs in their name instead of -pc.)
@x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
- at d banner "This is CWEAVE (Version 4.2pc)"
+ at d banner "This is CWEAVE (Version 4.3pc)"
@z
- at x section 4
+ at x section 17
@d max_bytes 1000000 /* the number of bytes in identifiers,
@y
@d max_bytes (unsigned)60000 /* the number of bytes in identifiers,
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-ql.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,15 +7,15 @@
@x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
@y
-\def\title{CWEAVE (QL Version 4.2)}
+\def\title{CWEAVE (QL Version 4.3)}
@z
@x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
- at d banner "This is CWEAVE (QL Version 4.2)"
+ at d banner "This is CWEAVE (QL Version 4.3)"
@z
@x
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-vms.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -13,12 +13,12 @@
(also modified by Don Knuth to keep version numbers uptodate)
@x section 1 (01-FEB-1992 ST)
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
- at d banner "This is CWEAVE (VAX/VMS Version 4.2)"
+ at d banner "This is CWEAVE (VAX/VMS Version 4.3)"
@z
- at x section 3 (01-FEB-1992 ST)
+ at x section 4 (01-FEB-1992 ST)
#include <ctype.h> /* definition of |@!isalpha|, |@!isdigit| and so on */
#include <stdbool.h> /* definition of |@!bool|, |@!true| and |@!false| */
#include <stddef.h> /* definition of |@!ptrdiff_t| */
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w2c.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -17,15 +17,15 @@
@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
@x
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
@y
-\def\title{CWEAVE (Version 4.2 [\TeX~Live])}
+\def\title{CWEAVE (Version 4.3 [\TeX~Live])}
@z
@x
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
@y
- \centerline{(Version 4.2 [\TeX~Live])}
+ \centerline{(Version 4.3 [\TeX~Live])}
@z
@x
@@ -41,9 +41,9 @@
@z
@x
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
- at d banner "This is CWEAVE, Version 4.2"
+ at d banner "This is CWEAVE, Version 4.3"
/* will be extended by the \TeX~Live |versionstring| */
@z
@@ -252,14 +252,14 @@
@c
static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+print_text( /* prints a token list for debugging; not used in |main| */
@y
@d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
@c
#if 0
-static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+ at t\4\4@>static void
+print_text( /* prints a token list for debugging; not used in |main| */
@z
@x
@@ -281,16 +281,13 @@
@x
@<Cases for |exp|@>=
if (cat1==lbrace || cat1==int_like || cat1==decl) {
- make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ make_underlined(pp); big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,1);
}
@y
@<Cases for |exp|@>=
if(cat1==lbrace || cat1==int_like || cat1==decl) {
- make_underlined(pp); big_app1(pp);
- if (indent_param_decl) {
- big_app(indent); app(indent);
- }
+ make_underlined(pp); if (indent_param_decl) big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,1);
}
@z
@@ -301,8 +298,7 @@
big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
}
else if (cat1==ubinop) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
- reduce(pp,2,decl_head,-1,34);
+ big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -312,7 +308,7 @@
squash(pp,3,decl_head,-1,36);
else if (cat1==cast) squash(pp,2,decl_head,-1,37);
else if (cat1==lbrace || cat1==int_like || cat1==decl) {
- big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+ big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
}
else if (cat1==semi) squash(pp,2,decl,-1,39);
@y
@@ -321,7 +317,7 @@
big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
}
else if (cat1==ubinop) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ big_app1_insert(pp,'{'); big_app('}');
reduce(pp,2,decl_head,-1,34);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
@@ -332,10 +328,7 @@
squash(pp,3,decl_head,-1,36);
else if (cat1==cast) squash(pp,2,decl_head,-1,37);
else if (cat1==lbrace || cat1==int_like || cat1==decl) {
- big_app1(pp);
- if (indent_param_decl) {
- big_app(indent); app(indent);
- }
+ if (indent_param_decl) big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,38);
}
else if (cat1==semi) squash(pp,2,decl,-1,39);
@@ -344,24 +337,19 @@
@x
@ @<Cases for |decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1);
- reduce(pp,2,decl,-1,40);
+ big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
}
else if (cat1==stmt || cat1==function) {
- big_app1(pp); big_app(big_force);
- big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+ big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
}
@y
@ @<Cases for |decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1);
- reduce(pp,2,decl,-1,40);
+ big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
}
else if (cat1==stmt || cat1==function) {
- big_app1(pp);
- if(order_decl_stmt) big_app(big_force);
- else big_app(force);
- big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+ big_app1_insert(pp,order_decl_stmt ? big_force : force);
+ reduce(pp,2,cat1,-1,41);
}
@z
@@ -368,7 +356,7 @@
@x
@ @<Cases for |fn_decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+ big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
}
else if (cat1==stmt) {
big_app1(pp); app(outdent); app(outdent); big_app(force);
@@ -377,7 +365,7 @@
@y
@ @<Cases for |fn_decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+ big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
}
else if (cat1==stmt) {
big_app1(pp);
@@ -384,12 +372,18 @@
if (indent_param_decl) {
app(outdent); app(outdent);
}
- big_app(force);
- big_app1(pp+1); reduce(pp,2,function,-1,52);
+ big_app(force); big_app1(pp+1); reduce(pp,2,function,-1,52);
}
@z
@x
+ big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
+ at y
+ big_app1(pp); if (indent_param_decl) big_app(dindent);
+ big_app1(pp+1); reduce(pp,2,fn_decl,0,73);
+ at z
+
+ at x
overflow("token");
@y
overflow(_("token"));
@@ -620,17 +614,17 @@
@x
@** Index.
@y
-@** Extensions to \.{CWEB}. The following sections introduce new or improved
-features that have been created by numerous contributors over the course of a
-quarter century.
+@** Extensions to {\tentex CWEB}. The following sections introduce new or
+improved features that have been created by numerous contributors over the
+course of a quarter century.
Care has been taken to keep the original section numbering intact, so this new
-material should nicely integrate with the original ``\&{263.~Index}.''
+material should nicely integrate with the original ``\&{272.~Index}.''
@* Formatting alternatives.
-\.{CWEAVE} indents declarations after old-style function definitions.
-With the \.{-i} option they will come out flush left. You won't see
-any difference if you use ANSI-style function definitions.
+\.{CWEAVE} indents declarations after old-style function definitions and
+long parameter lists of modern function definitions.
+With the \.{-i} option they will come out flush left.
@d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
@@ -664,7 +658,7 @@
fatal(_("! Cannot open output file "),check_file_name);
@.Cannot open output file@>
- if (temporary_output) @<Compare the temporary output...@>@;
+ if (check_for_change) @<Compare the temporary output...@>@;
fclose(tex_file); tex_file=NULL;
fclose(check_file); check_file=NULL;
Modified: trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweav-w32.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,23 +2,23 @@
(Contributed by Fabrice Popineau, February 2002)
@x section 1
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
@y
- at d banner "This is CWEAVE (Version 4.2win32)"
+ at d banner "This is CWEAVE (Version 4.3win32)"
@z
@x
-boolean names_match(@t\1\1@>
+boolean names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
@y
-boolean __cdecl names_match(@t\1\1@>
+boolean __cdecl names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
@z
@x
Modified: trunk/Build/source/texk/web2c/cwebdir/cweave.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweave.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweave.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -2,7 +2,7 @@
% This program by Silvio Levy and Donald E. Knuth
% is based on a program by Knuth.
% It is distributed WITHOUT ANY WARRANTY, express or implied.
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
% Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth
@@ -32,11 +32,11 @@
\def\skipxTeX{\\{skip\_\TEX/}}
\def\copyxTeX{\\{copy\_\TEX/}}
-\def\title{CWEAVE (Version 4.2)}
+\def\title{CWEAVE (Version 4.3)}
\def\topofcontents{\null\vfill
\centerline{\titlefont The {\ttitlefont CWEAVE} processor}
\vskip 15pt
- \centerline{(Version 4.2)}
+ \centerline{(Version 4.3)}
\vfill}
\def\botofcontents{\vfill
\noindent
@@ -67,9 +67,10 @@
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
is modified.
- at d banner "This is CWEAVE (Version 4.2)"
+ at d banner "This is CWEAVE (Version 4.3)"
- at c @<Include files@>@/
+ at c
+@<Include files@>@/
@h
@<Common code for \.{CWEAVE} and \.{CTANGLE}@>@/
@<Typedef declarations@>@/
@@ -85,9 +86,9 @@
to \.{CTANGLE} and \.{CWEAVE}, before proceeding further.
@c
-int main (@t\1\1@>
+int main (
int ac, /* argument count */
-char **av at t\2\2@>) /* argument values */
+char **av) /* argument values */
{
argc=ac; argv=av;
program=cweave;
@@ -99,7 +100,7 @@
phase_one(); /* read all the user's text and store the cross-references */
phase_two(); /* read all the text again and translate it to \TEX/ form */
phase_three(); /* output the cross-reference index */
- if (tracing==2 && !show_progress) new_line;
+ if (tracing==fully && !show_progress) new_line;
return wrap_up(); /* and exit gracefully */
}
@@ -143,7 +144,7 @@
\yskip\hang |typewriter| identifiers are index entries that appear after
\.{@@.} in the \.{CWEB} file.
-\yskip\hang |alfop|, \dots, |template_like|
+\yskip\hang |alfop|, \dots, |attr|
identifiers are \CEE/ or \CPLUSPLUS/ reserved words whose |ilk|
explains how they are to be treated when \CEE/ code is being
formatted.
@@ -176,6 +177,10 @@
@d typedef_like 56 /* \&{typedef} */
@d define_like 57 /* \&{define} */
@d template_like 58 /* \&{template} */
+ at d alignas_like 59 /* \&{alignas} */
+ at d using_like 60 /* \&{using} */
+ at d default_like 61 /* \&{default} */
+ at d attr 62 /* \&{noexcept} and attributes */
@ We keep track of the current section number in |section_count|, which
is the total number of sections that have started. Sections which have
@@ -229,7 +234,7 @@
@d xref equiv_or_xref
@<Set init...@>=
-xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+xref_ptr=xmem; init_node(name_dir); xref_switch=section_xref_switch=0;
xmem->num=0; /* sentinel value */
@ A new cross-reference for an identifier is formed by calling |new_xref|,
@@ -239,7 +244,7 @@
If the user has sent the |no_xref| flag (the \.{-x} option of the command line),
it is unnecessary to keep track of cross-references for identifiers.
If one were careful, one could probably make more changes around section
-100 to avoid a lot of identifier looking up.
+115 to avoid a lot of identifier looking up.
@d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
else (++xref_ptr)->num=c;
@@ -289,9 +294,9 @@
new_section_xref(
name_pointer p)
{
- xref_pointer q,r; /* pointers to previous cross-references */
- q=(xref_pointer)p->xref; r=xmem;
- if (q>xmem)
+ xref_pointer q=(xref_pointer)p->xref;
+ xref_pointer r=xmem; /* pointers to previous cross-references */
+ if (q>r)
while (q->num>section_xref_switch) {r=q; q=q->xlink;}
if (r->num==section_count+section_xref_switch)
return; /* don't duplicate entries */
@@ -309,8 +314,7 @@
set_file_flag(
name_pointer p)
{
- xref_pointer q;
- q=(xref_pointer)p->xref;
+ xref_pointer q=(xref_pointer)p->xref;
if (q->num==file_flag) return;
append_xref(file_flag);
xref_ptr->xlink = q;
@@ -350,11 +354,11 @@
@ Here are the three procedures needed to complete |id_lookup|:
@c
-boolean names_match(@t\1\1@>
+boolean names_match(
name_pointer p, /* points to the proposed match */
const char *first, /* position of first character of string */
size_t l, /* length of identifier */
-eight_bits t at t\2\2@>) /* desired |ilk| */
+eight_bits t) /* desired |ilk| */
{
if (length(p)!=l) return false;
if (p->ilk!=t && !(t==normal && abnormal(p))) return false;
@@ -385,14 +389,18 @@
@ @<Predecl...@>=@+static void update_node(name_pointer p);
-@ We have to get \CEE/'s
+@ We have to get \CEE/'s and \CPLUSPLUS/'s
reserved words into the hash table, and the simplest way to do this is
to insert them every time \.{CWEAVE} is run. Fortunately there are relatively
few reserved words. (Some of these are not strictly ``reserved,'' but
-are defined in header files of the ISO Standard \CEE/ Library.)
+are defined in header files of the ISO Standard \CEE/ Library.
+An ever growing list of \CPLUSPLUS/ keywords can be found here:
+\.{https://en.cppreference.com/w/cpp/keyword}.)
@^reserved words@>
@<Store all the reserved words@>=
+id_lookup("alignas",NULL,alignas_like);
+id_lookup("alignof",NULL,sizeof_like);
id_lookup("and",NULL,alfop);
id_lookup("and_eq",NULL,alfop);
id_lookup("asm",NULL,sizeof_like);
@@ -404,13 +412,24 @@
id_lookup("case",NULL,case_like);
id_lookup("catch",NULL,catch_like);
id_lookup("char",NULL,raw_int);
+id_lookup("char8_t",NULL,raw_int);
+id_lookup("char16_t",NULL,raw_int);
+id_lookup("char32_t",NULL,raw_int);
id_lookup("class",NULL,struct_like);
id_lookup("clock_t",NULL,raw_int);
id_lookup("compl",NULL,alfop);
+id_lookup("concept",NULL,int_like);
id_lookup("const",NULL,const_like);
+id_lookup("consteval",NULL,const_like);
+id_lookup("constexpr",NULL,const_like);
+id_lookup("constinit",NULL,const_like);
id_lookup("const_cast",NULL,raw_int);
id_lookup("continue",NULL,case_like);
-id_lookup("default",NULL,case_like);
+id_lookup("co_await",NULL,case_like);
+id_lookup("co_return",NULL,case_like);
+id_lookup("co_yield",NULL,case_like);
+id_lookup("decltype",NULL,sizeof_like);
+id_lookup("default",NULL,default_like);
id_lookup("define",NULL,define_like);
id_lookup("defined",NULL,sizeof_like);
id_lookup("delete",NULL,delete_like);
@@ -427,6 +446,7 @@
id_lookup("export",NULL,int_like);
id_lookup("extern",NULL,int_like);
id_lookup("FILE",NULL,raw_int);
+id_lookup("false",NULL,normal);
id_lookup("float",NULL,raw_int);
id_lookup("for",NULL,for_like);
id_lookup("fpos_t",NULL,raw_int);
@@ -445,9 +465,11 @@
id_lookup("mutable",NULL,int_like);
id_lookup("namespace",NULL,struct_like);
id_lookup("new",NULL,new_like);
+id_lookup("noexcept",NULL,attr);
id_lookup("not",NULL,alfop);
id_lookup("not_eq",NULL,alfop);
id_lookup("NULL",NULL,custom);
+id_lookup("nullptr",NULL,custom);
id_lookup("offsetof",NULL,raw_int);
id_lookup("operator",NULL,operator_like);
id_lookup("or",NULL,alfop);
@@ -459,6 +481,8 @@
id_lookup("public",NULL,public_like);
id_lookup("register",NULL,int_like);
id_lookup("reinterpret_cast",NULL,raw_int);
+id_lookup("requires",NULL,int_like);
+id_lookup("restrict",NULL,int_like);
id_lookup("return",NULL,case_like);
id_lookup("short",NULL,raw_int);
id_lookup("sig_atomic_t",NULL,raw_int);
@@ -466,21 +490,24 @@
id_lookup("size_t",NULL,raw_int);
id_lookup("sizeof",NULL,sizeof_like);
id_lookup("static",NULL,int_like);
+id_lookup("static_assert",NULL,sizeof_like);
id_lookup("static_cast",NULL,raw_int);
id_lookup("struct",NULL,struct_like);
id_lookup("switch",NULL,for_like);
id_lookup("template",NULL,template_like);
id_lookup("this",NULL,custom);
+id_lookup("thread_local",NULL,raw_int);
id_lookup("throw",NULL,case_like);
id_lookup("time_t",NULL,raw_int);
+id_lookup("true",NULL,normal);
id_lookup("try",NULL,else_like);
id_lookup("typedef",NULL,typedef_like);
-id_lookup("typeid",NULL,raw_int);
+id_lookup("typeid",NULL,sizeof_like);
id_lookup("typename",NULL,struct_like);
id_lookup("undef",NULL,if_like);
id_lookup("union",NULL,struct_like);
id_lookup("unsigned",NULL,raw_int);
-id_lookup("using",NULL,int_like);
+id_lookup("using",NULL,using_like);
id_lookup("va_dcl",NULL,decl); /* Berkeley's variable-arg-list convention */
id_lookup("va_list",NULL,raw_int); /* ditto */
id_lookup("virtual",NULL,int_like);
@@ -491,6 +518,8 @@
id_lookup("xor",NULL,alfop);
id_lookup("xor_eq",NULL,alfop);@+ res_wd_end=name_ptr;
id_lookup("TeX",NULL,custom);
+id_lookup("complex",NULL,int_like);
+id_lookup("imaginary",NULL,int_like);
id_lookup("make_pair",NULL,func_template);
@* Lexical scanning.
@@ -513,11 +542,11 @@
@^ASCII code dependencies@>
@d ignore 00 /* control code of no interest to \.{CWEAVE} */
- at d verbatim 02 /* takes the place of extended ASCII \.{\char2} */
+ at d verbatim 02 /* takes the place of ASCII \.{STX} */
@d begin_short_comment 03 /* \CPLUSPLUS/ short comment */
@d begin_comment '\t' /* tab marks will not appear */
@d underline '\n' /* this code will be intercepted without confusion */
- at d noop 0177 /* takes the place of ASCII delete */
+ at d noop 0177 /* takes the place of ASCII \.{DEL} */
@d xref_roman 0203 /* control code for `\.{@@\^}' */
@d xref_wildcard 0204 /* control code for `\.{@@:}' */
@d xref_typewriter 0205 /* control code for `\.{@@.}' */
@@ -549,7 +578,7 @@
static eight_bits ccode[256]; /* meaning of a char following \.{@@} */
@ @<Set ini...@>=
-{int c; for (c=0; c<256; c++) ccode[c]=0;}
+{int c; for (c=0; c<256; c++) ccode[c]=ignore;}
ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']
=ccode['*']=new_section;
ccode['@@']='@@'; /* `quoted' at sign */
@@ -671,14 +700,7 @@
@ As one might expect, |get_next| consists mostly of a big switch
that branches to the various special cases that can arise.
-\CEE/ allows underscores to appear in identifiers, and some \CEE/
-compilers even allow the dollar sign.
- at d isxalpha(c) ((c)=='_' || (c)=='$')
- /* non-alpha characters allowed in identifier */
- at d ishigh(c) ((eight_bits)(c)>0177)
-@^high-bit character handling@>
-
@c
static eight_bits
get_next(void) /* produces the next input token */
@@ -694,7 +716,7 @@
|| ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
|| (c=='<' && sharp_include_line==true))
@<Get a string@>@;
- else if (xisalpha(c) || isxalpha(c) || ishigh(c))
+ else if (isalpha(c) || isxalpha(c) || ishigh(c))
@<Get an identifier@>@;
else if (c=='@@') @<Get control code and possible section name@>@;
else if (xisspace(c)) continue; /* ignore spaces and tabs */
@@ -733,7 +755,8 @@
name as a string.
@<Private...@>=
-static boolean sharp_include_line=false; /* are we scanning a \&{\#include} line? */
+static boolean sharp_include_line=false;
+ /* are we scanning a \#\&{include} line? */
@ @<Check if next token is |include|@>=
while (loc<=buffer_end-7 && xisspace(*loc)) loc++;
@@ -758,26 +781,25 @@
The compound assignment operators (e.g., \.{+=}) are
treated as separate tokens.
- at d compress(c) if (loc++<=limit) return c
-
@<Compress tw...@>=
switch(c) {
- case '/': if (*loc=='*') {compress(begin_comment);}
+ case '/': if (*loc=='*') {@+compress(begin_comment);@+}
else if (*loc=='/') compress(begin_short_comment); break;
case '+': if (*loc=='+') compress(plus_plus); break;
- case '-': if (*loc=='-') {compress(minus_minus);}
- else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt); } } break;
- case '.': if (*loc=='*') {compress(period_ast);}
+ case '-': if (*loc=='-') {@+compress(minus_minus);@+}
+ else if (*loc=='>') {
+ if (*(loc+1)=='*') {loc++;@+compress(minus_gt_ast);}
+ else compress(minus_gt);
+ } break;
+ case '.': if (*loc=='*') {@+compress(period_ast);@+}
else if (*loc=='.' && *(loc+1)=='.') {
- loc++; compress(dot_dot_dot);
- }
- break;
+ loc++;@+compress(dot_dot_dot);
+ } break;
case ':': if (*loc==':') compress(colon_colon); break;
case '=': if (*loc=='=') compress(eq_eq); break;
- case '>': if (*loc=='=') {compress(gt_eq);}
+ case '>': if (*loc=='=') {@+compress(gt_eq);@+}
else if (*loc=='>') compress(gt_gt); break;
- case '<': if (*loc=='=') {compress(lt_eq);}
+ case '<': if (*loc=='=') {@+compress(lt_eq);@+}
else if (*loc=='<') compress(lt_lt); break;
case '&': if (*loc=='&') compress(and_and); break;
case '|': if (*loc=='|') compress(or_or); break;
@@ -786,7 +808,9 @@
@ @<Get an identifier@>= {
id_first=--loc;
- while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+ do {
+ ++loc;
+ } while (isalpha((eight_bits)*loc) || isdigit((eight_bits)*loc) @|
|| isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
id_loc=loc; return identifier;
}
@@ -798,28 +822,38 @@
with \TEX/ macros that the user can redefine to fit the context.
In order to simplify such macros, we replace some of the characters.
+On output, the \.{\ } that replaces \.{'} in \CPLUSPLUS/ literals will become
+``\.{\\\ }''.
+
Notice that in this section and the next, |id_first| and |id_loc|
are pointers into the array |section_text|, not into |buffer|.
+ at d gather_digits_while(t) while (t || *loc=='\'')
+ if (*loc=='\'') { /* \CPLUSPLUS/-style digit separator */
+ *id_loc++=' '; loc++; /* insert a little bit of space */
+ }@+else *id_loc++=*loc++;
+
@<Get a constant@>= {
id_first=id_loc=section_text+1;
+ if (*(loc-1)=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
if (*(loc-1)=='0') {
- if (*loc=='x' || *loc=='X') {*id_loc++='^'; loc++;
- while (xisxdigit(*loc)) *id_loc++=*loc++;} /* hex constant */
- else if (xisdigit(*loc)) {*id_loc++='~';
- while (xisdigit(*loc)) *id_loc++=*loc++;} /* octal constant */
- else goto dec; /* decimal constant */
+ if (*loc=='x' || *loc=='X') @<Get a hexadecimal constant@>@;
+ else if (*loc=='b' || *loc=='B') @<Get a binary constant@>@;
+ else if (xisdigit(*loc)) @<Get an octal constant@>@;
}
- else { /* decimal constant */
- if (*(loc-1)=='.' && !xisdigit(*loc)) goto mistake; /* not a constant */
- dec: *id_loc++=*(loc-1);
- while (xisdigit(*loc) || *loc=='.') *id_loc++=*loc++;
- if (*loc=='e' || *loc=='E') { /* float constant */
- *id_loc++='_'; loc++;
- if (*loc=='+' || *loc=='-') *id_loc++=*loc++;
- while (xisdigit(*loc)) *id_loc++=*loc++;
- }
- }
+ *id_loc++=*(loc-1); /* decimal constant */
+ gather_digits_while(xisdigit(*loc) || *loc=='.');
+get_exponent:
+ if (*loc=='e' || *loc=='E')
+ *id_loc++='_';
+ else if (*loc=='p' || *loc=='P')
+ *id_loc++='%';
+ else
+ goto digit_suffix;
+ loc++;
+ if (*loc=='+' || *loc=='-') *id_loc++=*loc++;
+ gather_digits_while(xisdigit(*loc));
+digit_suffix:
while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
|| *loc=='f' || *loc=='F') {
*id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
@@ -827,22 +861,37 @@
return constant;
}
+@ @<Get a hex...@>={
+ *id_loc++='^'; loc++;
+ gather_digits_while(xisxdigit(*loc) || *loc=='.');
+ *id_loc++='/'; goto get_exponent;
+}
+
+@ @<Get a bin...@>={
+ *id_loc++='\\'; loc++;
+ gather_digits_while(*loc=='0' || *loc=='1');
+ *id_loc++='/'; goto digit_suffix;
+}
+
+@ @<Get an oct...@>={
+ *id_loc++='~'; gather_digits_while(xisdigit(*loc));
+ *id_loc++='/'; goto digit_suffix;
+}
+
@ \CEE/ strings and character constants, delimited by double and single
quotes, respectively, can contain newlines or instances of their own
delimiters if they are protected by a backslash. We follow this
convention, but do not allow the string to be longer than |longest_name|.
-@<Get a string@>= {
+@<Get a string@>= {@+
char delim = c; /* what started the string */
id_first = section_text+1;
id_loc = section_text;
if (delim=='\'' && *(loc-2)=='@@') {*++id_loc='@@'; *++id_loc='@@';}
*++id_loc=delim;
- if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
- if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
- delim=*loc++; *++id_loc=delim;
- }
- if (delim=='<') delim='>'; /* for file names in \&{\#include} lines */
+ if (delim=='L' || delim=='u' || delim=='U')
+ @<Get a wide character constant@>@;
+ if (delim=='<') delim='>'; /* for file names in \#\&{include} lines */
while (true) {
if (loc>=limit) {
if(*(limit-1)!='\\') {
@@ -858,10 +907,14 @@
if (++id_loc<=section_text_end) *id_loc=c;
break;
}
- if (c=='\\') { if (loc>=limit) continue;
- else { if (++id_loc<=section_text_end) {
- *id_loc = '\\'; c=*loc++;
- } } }
+ if (c=='\\') {
+ if (loc>=limit) continue;
+ else {
+ if (++id_loc<=section_text_end) {
+ *id_loc = '\\'; c=*loc++;
+ }
+ }
+ }
if (++id_loc<=section_text_end) *id_loc=c;
}
if (id_loc>=section_text_end) {
@@ -874,6 +927,11 @@
return string;
}
+@ @<Get a wide...@>={
+ if (delim=='u' && *loc=='8') *++id_loc=*loc++;
+ delim=*loc++; *++id_loc=delim;
+}
+
@ After an \.{@@} sign has been scanned, the next character tells us
whether there is more work to do.
@@ -885,7 +943,7 @@
case underline: xref_switch=def_flag; continue;
case trace: tracing=c-'0'; continue;
case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
- case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return c;
+ case TeX_string: skip_restricted(); return ccode[(eight_bits)c];
case section_name:
@<Scan the section name and make |cur_section| point to it@>@;
case verbatim: @<Scan a verbatim string@>@;
@@ -902,8 +960,9 @@
cur_section_char=*(loc-1);
@<Put section name into |section_text|@>@;
if (k-section_text>3 && strncmp(k-2,"...",3)==0)
- cur_section=section_lookup(section_text+1,k-3,1); /* 1 indicates a prefix */
- else cur_section=section_lookup(section_text+1,k,0);
+ cur_section=section_lookup(section_text+1,k-3,true);
+ /* |true| indicates a prefix */
+ else cur_section=section_lookup(section_text+1,k,false);
xref_switch=0; return section_name;
}
@@ -969,8 +1028,7 @@
if (loc++>limit) {
err_print("! Control text didn't end"); loc=limit;
@.Control text didn't end@>
- }
- else {
+ } else {
if (*loc=='@@'&&loc<=limit) {loc++; goto false_alarm;}
if (*loc++!='>')
err_print("! Control codes are forbidden in control text");
@@ -1067,8 +1125,8 @@
@ @c
static void
-C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
- eight_bits spec_ctrl at t\2\2@>)
+C_xref( /* makes cross-references for \CEE/ identifiers */
+ eight_bits spec_ctrl)
{
name_pointer p; /* a referenced name */
while (next_control<format_code || next_control==spec_ctrl) {
@@ -1297,7 +1355,7 @@
less than |out_buf_end|. If the |per_cent| parameter is |false|,
trailing blanks are suppressed.
The characters emptied from the buffer form a new line of output;
-if the |carryover| parameter is true, a |"%"| in that line will be
+if the |carryover| parameter is |true|, a |"%"| in that line will be
carried over to the next line (so that \TEX/ will ignore the completion
of commented-out text).
@@ -1313,11 +1371,11 @@
@ @c
static void
-flush_buffer(@t\1\1@>
+flush_buffer(
char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
-boolean per_cent,boolean carryover at t\2\2@>)
+boolean per_cent,boolean carryover)
{
- char *j; j=b; /* pointer into |out_buf| */
+ char *j=b; /* pointer into |out_buf| */
if (! per_cent) /* remove trailing blanks */
while (j>out_buf && *j==' ') j--;
c_line_write(j-out_buf);
@@ -1378,8 +1436,8 @@
@ @c
static void
-out_str(@t\1\1@> /* output characters from |s| to end of string */
-const char*s at t\2\2@>)
+out_str( /* output characters from |s| to end of string */
+const char*s)
{
while (*s) out(*s++);
}
@@ -1546,9 +1604,9 @@
@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
@c
-static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
+static int copy_comment( /* copies \TeX\ code in comments */
boolean is_long_comment, /* is this a traditional \CEE/ comment? */
-int bal at t\2\2@>) /* brace balance */
+int bal) /* brace balance */
{
char c; /* current character being copied */
while (true) {
@@ -1559,8 +1617,7 @@
@.Input ended in mid-comment@>
loc=buffer+1; goto done;
}
- }
- else {
+ } else {
if (bal>1) err_print("! Missing } in comment");
@.Missing \} in comment@>
goto done;
@@ -1583,7 +1640,7 @@
}
}
}
-done:@<Clear |bal| and |return|@>@;
+done: @<Clear |bal| and |return|@>@;
}
@ @<Check for end of comment@>=
@@ -1601,9 +1658,11 @@
@.Illegal use of @@...@>
loc-=2; if (phase==2) *(tok_ptr-1)=' '; goto done;
}
+} else {
+ if (c=='\\' && *loc!='@@') {
+ if (phase==2) app_tok(*(loc++))@; else loc++;
+ }
}
-else { if (c=='\\' && *loc!='@@') {
- if (phase==2) app_tok(*(loc++))@; else loc++; } }
@ We output
enough right braces to keep \TEX/ happy.
@@ -1683,8 +1742,8 @@
@d rbrace 8 /* denotes a right brace */
@d decl_head 9 /* denotes an incomplete declaration */
@d comma 10 /* denotes a comma */
- at d lpar 11 /* denotes a left parenthesis or left bracket */
- at d rpar 12 /* denotes a right parenthesis or right bracket */
+ at d lpar 11 /* denotes a left parenthesis */
+ at d rpar 12 /* denotes a right parenthesis */
@d prelangle 13 /* denotes `$<$' before we know what it is */
@d prerangle 14 /* denotes `$>$' before we know what it is */
@d langle 15 /* denotes `$<$' when it's used as angle bracket in a template */
@@ -1706,10 +1765,13 @@
@d insert 37 /* a scrap that gets combined with its neighbor */
@d section_scrap 38 /* section name */
@d dead 39 /* scrap that won't combine */
- at d ftemplate 59 /* \\{make\_pair} */
- at d new_exp 60 /* \&{new} and a following type identifier */
- at d begin_arg 61 /* \.{@@[} */
- at d end_arg 62 /* \.{@@]} */
+ at d ftemplate 63 /* \\{make\_pair} */
+ at d new_exp 64 /* \&{new} and a following type identifier */
+ at d begin_arg 65 /* \.{@@[} */
+ at d end_arg 66 /* \.{@@]} */
+ at d lbrack 67 /* denotes a left bracket */
+ at d rbrack 68 /* denotes a right bracket */
+ at d attr_head 69 /* denotes beginning of attribute */
@<Private...@>=
static char cat_name[256][12];
@@ -1774,6 +1836,13 @@
strcpy(cat_name[new_exp],"new_exp");
strcpy(cat_name[begin_arg],"@@["@q]@>);
strcpy(cat_name[end_arg], at q[@>"@@]");
+ strcpy(cat_name[lbrack],"[");
+ strcpy(cat_name[rbrack],"]");
+ strcpy(cat_name[attr_head],"attr_head");
+ strcpy(cat_name[attr],"attr");
+ strcpy(cat_name[alignas_like],"alignas");
+ strcpy(cat_name[using_like],"using");
+ strcpy(cat_name[default_like],"default");
strcpy(cat_name[0],"zero");
@ This code allows \.{CWEAVE} to display its parsing steps.
@@ -1780,8 +1849,8 @@
@c
static void
-print_cat(@t\1\1@> /* symbolic printout of a category */
-eight_bits c at t\2\2@>)
+print_cat( /* symbolic printout of a category */
+eight_bits c)
{
fputs(cat_name[c],stdout);
}
@@ -1813,8 +1882,10 @@
\yskip\hang |indent| causes future lines to be indented one more em;
-\yskip\hang |outdent| causes future lines to be indented one less em.
+\yskip\hang |outdent| causes future lines to be indented one less em;
+\yskip\hang |dindent| causes future lines to be indented two more ems.
+
\yskip\noindent All of these tokens are removed from the \TEX/ output that
comes from \CEE/ text between \pb\ signs; |break_space| and |force| and
|big_force| become single spaces in this mode. The translation of other
@@ -1827,6 +1898,10 @@
|force|, and/or |big_force| tokens is first replaced by a single token
(the maximum of the given ones).
+A |dindent| token becomes \.{\\1\\1}. It is equivalent to a pair of |indent|
+tokens. However, if |dindent| immediately precedes |big_force|, the two tokens
+are swapped, so that the indentation happens after the line break.
+
The token |math_rel| will be translated into
\.{\\MRL\{}, and it will get a matching \.\} later.
Other control sequences in the \TEX/ output will be
@@ -1854,6 +1929,7 @@
@d end_translation 0223 /* special sentinel token at end of list */
@d inserted 0224 /* sentinel to mark translations of inserts */
@d qualifier 0225 /* introduces an explicit namespace qualifier */
+ at d dindent 0226 /* two more tabs (\.{\\1\\1}) */
@ The raw input is converted into scraps according to the following table,
which gives category codes followed by the translations.
@@ -1892,11 +1968,14 @@
\.{@@=}string\.{@@>}&|exp|: \.{\\vb\{}string with special characters
quoted\.\}&maybe\cr
\.{@@'7'}&|exp|: \.{\\.\{@@'7'\}}&maybe\cr
-\.{077} or \.{\\77}&|exp|: \.{\\T\{\\\~77\}}&maybe\cr
-\.{0x7f}&|exp|: \.{\\T\{\\\^7f\}}&maybe\cr
+\.{077} or \.{\\77}&|exp|: \.{\\T\{\\\~77/\}}&maybe\cr
+\.{0x7f}&|exp|: \.{\\T\{\\\^7f/\}}&maybe\cr
+\.{0b10111}&|exp|: \.{\\T\{\\\\10111/\}}&maybe\cr
\.{77}&|exp|: \.{\\T\{77\}}&maybe\cr
\.{77L}&|exp|: \.{\\T\{77\\\$L\}}&maybe\cr
\.{0.1E5}&|exp|: \.{\\T\{0.1\\\_5\}}&maybe\cr
+\.{0x10p3}&|exp|: \.{\\T\{\\\^10/\\\%3\}}&maybe\cr
+\.{1'000'000}&|exp|: \.{\\T\{1\\\ 000\\\ 000\}}&maybe\cr
\.+&|ubinop|: \.+&yes\cr
\.-&|ubinop|: \.-&yes\cr
\.*&|raw_ubin|: \.*&yes\cr
@@ -1913,9 +1992,9 @@
\.\~&|unop|: \.{\\CM}&yes\cr
\.\&&|raw_ubin|: \.{\\AND}&yes\cr
\.(&|lpar|: \.(&maybe\cr
-\.[&|lpar|: \.[&maybe\cr
\.)&|rpar|: \.)&maybe\cr
-\.]&|rpar|: \.]&maybe\cr
+\.[&|lbrack|: \.[&maybe\cr
+\.]&|rbrack|: \.]&maybe\cr
\.\{&|lbrace|: \.\{&yes\cr
\.\}&|lbrace|: \.\}&yes\cr
\.,&|comma|: \.,&yes\cr
@@ -1926,6 +2005,8 @@
end of \.\# line&|rproc|: |force|&no\cr
identifier&|exp|: \.{\\\\\{}identifier with underlines and
dollar signs quoted\.\}&maybe\cr
+\.{alignas}&|alignas_like|: \stars&maybe\cr
+\.{alignof}&|sizeof_like|: \stars&maybe\cr
\.{and}&|alfop|: \stars&yes\cr
\.{and\_eq}&|alfop|: \stars&yes\cr
\.{asm}&|sizeof_like|: \stars&maybe\cr
@@ -1937,13 +2018,25 @@
\.{case}&|case_like|: \stars&maybe\cr
\.{catch}&|catch_like|: \stars&maybe\cr
\.{char}&|raw_int|: \stars&maybe\cr
+\.{char8\_t}&|raw_int|: \stars&maybe\cr
+\.{char16\_t}&|raw_int|: \stars&maybe\cr
+\.{char32\_t}&|raw_int|: \stars&maybe\cr
\.{class}&|struct_like|: \stars&maybe\cr
\.{clock\_t}&|raw_int|: \stars&maybe\cr
\.{compl}&|alfop|: \stars&yes\cr
+\.{complex}&|int_like|: \stars&yes\cr
+\.{concept}&|int_like|: \stars&maybe\cr
\.{const}&|const_like|: \stars&maybe\cr
+\.{consteval}&|const_like|: \stars&maybe\cr
+\.{constexpr}&|const_like|: \stars&maybe\cr
+\.{constinit}&|const_like|: \stars&maybe\cr
\.{const\_cast}&|raw_int|: \stars&maybe\cr
\.{continue}&|case_like|: \stars&maybe\cr
-\.{default}&|case_like|: \stars&maybe\cr
+\.{co\_await}&|case_like|: \stars&maybe\cr
+\.{co\_return}&|case_like|: \stars&maybe\cr
+\.{co\_yield}&|case_like|: \stars&maybe\cr
+\.{decltype}&|sizeof_like|: \stars&maybe\cr
+\.{default}&|default_like|: \stars&maybe\cr
\.{define}&|define_like|: \stars&maybe\cr
\.{defined}&|sizeof_like|: \stars&maybe\cr
\.{delete}&|delete_like|: \stars&maybe\cr
@@ -1960,6 +2053,7 @@
\.{export}&|int_like|: \stars&maybe\cr
\.{extern}&|int_like|: \stars&maybe\cr
\.{FILE}&|raw_int|: \stars&maybe\cr
+\.{false}&|normal|: \stars&maybe\cr
\.{float}&|raw_int|: \stars&maybe\cr
\.{for}&|for_like|: \stars&maybe\cr
\.{fpos\_t}&|raw_int|: \stars&maybe\cr
@@ -1968,6 +2062,7 @@
\.{if}&|if_like|: \stars&maybe\cr
\.{ifdef}&|if_like|: \stars&maybe\cr
\.{ifndef}&|if_like|: \stars&maybe\cr
+\.{imaginary}&|int_like|: \stars&maybe\cr
\.{include}&|if_like|: \stars&maybe\cr
\.{inline}&|int_like|: \stars&maybe\cr
\.{int}&|raw_int|: \stars&maybe\cr
@@ -1979,9 +2074,11 @@
\.{mutable}&|int_like|: \stars&maybe\cr
\.{namespace}&|struct_like|: \stars&maybe\cr
\.{new}&|new_like|: \stars&maybe\cr
+\.{noexcept}&|attr|: \stars&maybe\cr
\.{not}&|alfop|: \stars&yes\cr
\.{not\_eq}&|alfop|: \stars&yes\cr
\.{NULL}&|exp|: \.{\\NULL}&yes\cr
+\.{nullptr}&|exp|: \.{\\NULL}&yes\cr
\.{offsetof}&|raw_int|: \stars&maybe\cr
\.{operator}&|operator_like|: \stars&maybe\cr
\.{or}&|alfop|: \stars&yes\cr
@@ -1993,6 +2090,8 @@
\.{public}&|public_like|: \stars&maybe\cr
\.{register}&|int_like|: \stars&maybe\cr
\.{reinterpret\_cast}&|raw_int|: \stars&maybe\cr
+\.{requires}&|int_like|: \stars&maybe\cr
+\.{restrict}&|int_like|: \stars&maybe\cr
\.{return}&|case_like|: \stars&maybe\cr
\.{short}&|raw_int|: \stars&maybe\cr
\.{sig\_atomic\_t}&|raw_int|: \stars&maybe\cr
@@ -2000,6 +2099,7 @@
\.{size\_t}&|raw_int|: \stars&maybe\cr
\.{sizeof}&|sizeof_like|: \stars&maybe\cr
\.{static}&|int_like|: \stars&maybe\cr
+\.{static\_assert}&|sizeof_like|: \stars&maybe\cr
\.{static\_cast}&|raw_int|: \stars&maybe\cr
\.{struct}&|struct_like|: \stars&maybe\cr
\.{switch}&|for_like|: \stars&maybe\cr
@@ -2006,16 +2106,17 @@
\.{template}&|template_like|: \stars&maybe\cr
\.{TeX}&|exp|: \.{\\TeX}&yes\cr
\.{this}&|exp|: \.{\\this}&yes\cr
+\.{thread\_local}&|raw_int|: \stars&maybe\cr
\.{throw}&|case_like|: \stars&maybe\cr
\.{time\_t}&|raw_int|: \stars&maybe\cr
\.{try}&|else_like|: \stars&maybe\cr
\.{typedef}&|typedef_like|: \stars&maybe\cr
-\.{typeid}&|raw_int|: \stars&maybe\cr
+\.{typeid}&|sizeof_like|: \stars&maybe\cr
\.{typename}&|struct_like|: \stars&maybe\cr
\.{undef}&|if_like|: \stars&maybe\cr
\.{union}&|struct_like|: \stars&maybe\cr
\.{unsigned}&|raw_int|: \stars&maybe\cr
-\.{using}&|int_like|: \stars&maybe\cr
+\.{using}&|using_like|: \stars&maybe\cr
\.{va\_dcl}&|decl|: \stars&maybe\cr
\.{va\_list}&|raw_int|: \stars&maybe\cr
\.{virtual}&|int_like|: \stars&maybe\cr
@@ -2137,8 +2238,8 @@
@c
static void
-print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
-text_pointer p at t\2\2@>)
+print_text( /* prints a token list for debugging; not used in |main| */
+text_pointer p)
{
token_pointer j; /* index into |tok_mem| */
sixteen_bits r; /* remainder of token after the flag has been stripped off */
@@ -2150,7 +2251,7 @@
break; /* |id_flag| */
case 2: printf("\\&{"@q}@>); print_id((name_dir+r)); printf(@q{@>"}");
break; /* |res_flag| */
- case 3: printf("<"); print_section_name((name_dir+r)); printf(">");
+ case 3: putchar('<'); print_section_name((name_dir+r)); putchar('>');
break; /* |section_flag| */
case 4: printf("[[%d]]",r); break; /* |tok_flag| */
case 5: printf("|[[%d]]|",r); break; /* |inner_tok_flag| */
@@ -2169,6 +2270,7 @@
case cancel: printf("[cancel]"); break;
case indent: printf("[indent]"); break;
case outdent: printf("[outdent]"); break;
+ case dindent: printf("[dindent]"); break;
case backup: printf("[backup]"); break;
case opt: printf("[opt]"); break;
case break_space: printf("[break]"); break;
@@ -2178,7 +2280,7 @@
case quoted_char: j++; printf("[%o]",(unsigned int)*j); break;
case end_translation: printf("[quit]"); break;
case inserted: printf("[inserted]"); break;
- default: putxchar(r);
+ default: putchar(r);
}
@ The production rules listed above are embedded directly into \.{CWEAVE},
@@ -2253,8 +2355,9 @@
@d no_math 2 /* should be in horizontal mode */
@d yes_math 1 /* should be in math mode */
@d maybe_math 0 /* works in either horizontal or math mode */
- at d big_app2(a) big_app1(a);big_app1(a+1)
- at d big_app3(a) big_app2(a);big_app1(a+2)
+ at d big_app2(a) big_app1(a);@+big_app1(a+1)
+ at d big_app3(a) big_app2(a);@+big_app1(a+2)
+ at d big_app1_insert(p,c) big_app1(p);@+big_app(c);@+big_app1(p+1)
@d app(a) *(tok_ptr++)=(token)(a)
@d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
@@ -2278,12 +2381,12 @@
big_app(
token a)
{
- if (a==' ' || (a>=big_cancel && a<=big_force)) /* non-math token */ {
+ if (a==' ' || (a>=big_cancel && a<=big_force) || a==dindent)
+ /* non-math token */ {
if (cur_mathness==maybe_math) init_mathness=no_math;
else if (cur_mathness==yes_math) app_str("{}$");
cur_mathness=no_math;
- }
- else {
+ } else {
if (cur_mathness==maybe_math) init_mathness=yes_math;
else if (cur_mathness==no_math) app_str("${}");
cur_mathness=yes_math;
@@ -2320,7 +2423,7 @@
@d cat2 (pp+2)->cat
@d cat3 (pp+3)->cat
@d lhs_not_simple (pp->cat!=public_like
- && pp->cat!=semi
+ && pp->cat!=semi
&& pp->cat!=prelangle
&& pp->cat!=prerangle @|
&& pp->cat!=template_like
@@ -2337,6 +2440,8 @@
if (cat1==end_arg && lhs_not_simple)
if (pp->cat==begin_arg) squash(pp,2,exp,-2,124);
else squash(pp,2,end_arg,-1,125);
+ else if (pp->cat==rbrack) squash(pp,1,rpar,-3,130);
+ else if (pp->cat==using_like) squash(pp,1,int_like,-3,140);
else if (cat1==insert) squash(pp,2,pp->cat,-2,0);
else if (cat2==insert) squash(pp+1,2,(pp+1)->cat,-1,0);
else if (cat3==insert) squash(pp+2,2,(pp+2)->cat,0,0);
@@ -2389,6 +2494,11 @@
case typedef_like: @<Cases for |typedef_like|@>@; @+break;
case delete_like: @<Cases for |delete_like|@>@; @+break;
case question: @<Cases for |question|@>@; @+break;
+ case alignas_like: @<Cases for |alignas_like|@>@; @+break;
+ case lbrack: @<Cases for |lbrack|@>@; @+break;
+ case attr_head: @<Cases for |attr_head|@>@; @+break;
+ case attr: @<Cases for |attr|@>@; @+break;
+ case default_like: @<Cases for |default_like|@>@; @+break;
}
pp++; /* if no match was found, we move to the right */
}
@@ -2457,8 +2567,8 @@
@c
static void
-make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
-scrap_pointer p at t\2\2@>)
+make_reserved( /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p)
{
sixteen_bits tok_value; /* the name of this identifier, plus its flag */
token_pointer tok_loc; /* pointer to |tok_value| */
@@ -2488,9 +2598,9 @@
@c
static void
-make_underlined(@t\1\1@>
+make_underlined(
/* underline the entry for the first identifier in |p->trans| */
-scrap_pointer p at t\2\2@>)
+scrap_pointer p)
{
token_pointer tok_loc; /* where the first identifier appears */
if ((tok_loc=find_first_ident(p->trans))<=operator_found)
@@ -2535,11 +2645,11 @@
(namely, at |p->xref|), but rather right before |q|.
@<Insert new cross-reference at |q|...@>=
- append_xref(0); /* this number doesn't matter */
- xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
- update_node(p);
- while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
- r->num=m; /* everything from |q| on is left undisturbed */
+append_xref(0); /* this number doesn't matter */
+xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
+update_node(p);
+while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
+r->num=m; /* everything from |q| on is left undisturbed */
@ Now comes the code that tries to match each production starting
with a particular type of scrap. Whenever a match is discovered,
@@ -2548,7 +2658,7 @@
@<Cases for |exp|@>=
if (cat1==lbrace || cat1==int_like || cat1==decl) {
- make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ make_underlined(pp); big_app(dindent); big_app1(pp);
reduce(pp,1,fn_decl,0,1);
}
else if (cat1==unop) squash(pp,2,exp,-2,2);
@@ -2562,16 +2672,20 @@
else if (cat1==cast && cat2==colon) squash(pp+2,1,base,0,5);
else if (cat1==semi) squash(pp,2,stmt,-1,6);
else if (cat1==colon) {
- make_underlined (pp); squash(pp,2,tag,-1,7);
+ make_underlined (pp); squash(pp,2,tag,-1,7);
}
else if (cat1==rbrace) squash(pp,1,stmt,-1,8);
else if (cat1==lpar && cat2==rpar && (cat3==const_like || cat3==case_like)) {
- big_app1(pp+2); big_app(' '); big_app1(pp+3); reduce(pp+2,2,rpar,0,9);
+ big_app1_insert(pp+2,' '); reduce(pp+2,2,rpar,0,9);
}
else if (cat1==cast && (cat2==const_like || cat2==case_like)) {
- big_app1(pp+1); big_app(' '); big_app1(pp+2); reduce(pp+1,2,cast,0,9);
+ big_app1_insert(pp+1,' '); reduce(pp+1,2,cast,0,9);
}
else if (cat1==exp || cat1==cast) squash(pp,2,exp,-2,10);
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,142);
+}
+else if (cat1==colcol && cat2==int_like) squash(pp,3,int_like,-2,152);
@ @<Cases for |lpar|@>=
if ((cat1==exp||cat1==ubinop) && cat2==rpar) squash(pp,3,exp,-2,11);
@@ -2594,15 +2708,13 @@
@ @<Cases for |ubinop|@>=
if (cat1==cast && cat2==rpar) {
- big_app('{'); big_app1(pp); big_app('}'); big_app1(pp+1);
- reduce(pp,2,cast,-2,17);
+ big_app('{'); big_app1_insert(pp,'}'); reduce(pp,2,cast,-2,17);
}
else if (cat1==exp || cat1==int_like) {
- big_app('{'); big_app1(pp); big_app('}'); big_app1(pp+1);
- reduce(pp,2,cat1,-2,18);
+ big_app('{'); big_app1_insert(pp,'}'); reduce(pp,2,cat1,-2,18);
}
else if (cat1==binop) {
- big_app(math_rel); big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ big_app(math_rel); big_app1_insert(pp,'{'); big_app('}');
big_app('}'); reduce(pp,2,binop,-1,19);
}
@@ -2616,7 +2728,7 @@
@ @<Cases for |cast|@>=
if (cat1==lpar) squash(pp,2,lpar,-1,21);
else if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,21);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,21);
}
else if (cat1==semi) squash(pp,1,exp,-2,22);
@@ -2623,12 +2735,12 @@
@ @<Cases for |sizeof_like|@>=
if (cat1==cast) squash(pp,2,exp,-2,23);
else if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,24);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,24);
}
@ @<Cases for |int_like|@>=
if (cat1==int_like|| cat1==struct_like) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,cat1,-2,25);
+ big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,25);
}
else if (cat1==exp && (cat2==raw_int||cat2==struct_like))
squash(pp,2,int_like,-2,26);
@@ -2644,7 +2756,8 @@
@ @<Cases for |colcol|@>=
if (cat1==exp||cat1==int_like) {
app(qualifier); squash(pp,2,cat1,-2,31);
-}@+else if (cat1==colcol) squash(pp,2,colcol,-1,32);
+}
+else if (cat1==colcol) squash(pp,2,colcol,-1,32);
@ @<Cases for |decl_head|@>=
if (cat1==comma) {
@@ -2651,8 +2764,7 @@
big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
}
else if (cat1==ubinop) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
- reduce(pp,2,decl_head,-1,34);
+ big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,decl_head,-1,34);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
@@ -2662,18 +2774,19 @@
squash(pp,3,decl_head,-1,36);
else if (cat1==cast) squash(pp,2,decl_head,-1,37);
else if (cat1==lbrace || cat1==int_like || cat1==decl) {
- big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+ big_app(dindent); big_app1(pp); reduce(pp,1,fn_decl,0,38);
}
else if (cat1==semi) squash(pp,2,decl,-1,39);
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,decl_head,-1,139);
+}
@ @<Cases for |decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1);
- reduce(pp,2,decl,-1,40);
+ big_app1_insert(pp,force); reduce(pp,2,decl,-1,40);
}
else if (cat1==stmt || cat1==function) {
- big_app1(pp); big_app(big_force);
- big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+ big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,41);
}
@ @<Cases for |base|@>=
@@ -2683,7 +2796,7 @@
app(opt); app('9'); reduce(pp,3,base,0,42);
}
else if (cat2==lbrace) {
- big_app1(pp); big_app(' '); big_app1(pp+1); big_app(' '); big_app1(pp+2);
+ big_app1_insert(pp,' '); big_app(' '); big_app1(pp+2);
reduce(pp,3,lbrace,-2,43);
}
}
@@ -2690,12 +2803,12 @@
@ @<Cases for |struct_like|@>=
if (cat1==lbrace) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,struct_head,0,44);
+ big_app1_insert(pp,' '); reduce(pp,2,struct_head,0,44);
}
else if (cat1==exp||cat1==int_like) {
if (cat2==lbrace || cat2==semi) {
make_underlined(pp+1); make_reserved(pp+1);
- big_app1(pp); big_app(' '); big_app1(pp+1);
+ big_app1_insert(pp,' ');
if (cat2==semi) reduce(pp,2,decl_head,0,45);
else {
big_app(' '); big_app1(pp+2);reduce(pp,3,struct_head,0,46);
@@ -2703,14 +2816,20 @@
}
else if (cat2==colon) squash(pp+2,1,base,2,47);
else if (cat2!=base) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,int_like,-2,48);
+ big_app1_insert(pp,' '); reduce(pp,2,int_like,-2,48);
}
}
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,struct_like,-3,141);
+}
+else if (cat1==struct_like) {
+ big_app1_insert(pp,' '); reduce(pp,2,struct_like,-3,151);
+}
@ @<Cases for |struct_head|@>=
if ((cat1==decl || cat1==stmt || cat1==function) && cat2==rbrace) {
big_app1(pp); big_app(indent); big_app(force); big_app1(pp+1);
- big_app(outdent); big_app(force); big_app1(pp+2);
+ big_app(outdent); big_app(force); big_app1(pp+2);
reduce(pp,3,int_like,-2,49);
}
else if (cat1==rbrace) {
@@ -2721,16 +2840,19 @@
@ @<Cases for |fn_decl|@>=
if (cat1==decl) {
- big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+ big_app1_insert(pp,force); reduce(pp,2,fn_decl,0,51);
}
else if (cat1==stmt) {
big_app1(pp); app(outdent); app(outdent); big_app(force);
big_app1(pp+1); reduce(pp,2,function,-1,52);
}
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,fn_decl,0,157);
+}
@ @<Cases for |function|@>=
if (cat1==function || cat1==decl || cat1==stmt) {
- big_app1(pp); big_app(big_force); big_app1(pp+1); reduce(pp,2,cat1,-1,53);
+ big_app1_insert(pp,big_force); reduce(pp,2,cat1,-1,53);
}
@ @<Cases for |lbrace|@>=
@@ -2740,8 +2862,8 @@
reduce(pp,2,stmt,-1,54);
}
else if ((cat1==stmt||cat1==decl||cat1==function) && cat2==rbrace) {
- big_app(force); big_app1(pp); big_app(indent); big_app(force);
- big_app1(pp+1); big_app(force); big_app(backup); big_app1(pp+2);
+ big_app(force); big_app1(pp); big_app(indent); big_app(force);
+ big_app1(pp+1); big_app(force); big_app(backup); big_app1(pp+2);
big_app(outdent); big_app(force); reduce(pp,3,stmt,-1,55);
}
else if (cat1==exp) {
@@ -2751,7 +2873,7 @@
@ @<Cases for |if_like|@>=
if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,if_clause,0,57);
+ big_app1_insert(pp,' '); reduce(pp,2,if_clause,0,57);
}
@ @<Cases for |else_like|@>=
@@ -2778,19 +2900,24 @@
big_app1(pp+1); big_app(outdent); big_app(force); big_app1(pp+2);
if (cat3==if_like) {
big_app(' '); big_app1(pp+3); reduce(pp,4,if_like,0,63);
- }@+else reduce(pp,3,else_like,0,64);
+ }
+ else reduce(pp,3,else_like,0,64);
}
else squash(pp,1,else_like,0,65);
}
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,if_head,0,146);
+}
@ @<Cases for |if_head|@>=
if (cat1==stmt || cat1==exp) {
if (cat2==else_like) {
big_app(force); big_app1(pp); big_app(break_space); app(noop);
- big_app(cancel); big_app1(pp+1); big_app(force); big_app1(pp+2);
+ big_app(cancel); big_app1_insert(pp+1,force);
if (cat3==if_like) {
big_app(' '); big_app1(pp+3); reduce(pp,4,if_like,0,66);
- }@+else reduce(pp,3,else_like,0,67);
+ }
+ else reduce(pp,3,else_like,0,67);
}
else squash(pp,1,else_head,0,68);
}
@@ -2806,22 +2933,23 @@
if (cat1==semi) squash(pp,2,stmt,-1,70);
else if (cat1==colon) squash(pp,2,tag,-1,71);
else if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,72);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,72);
}
@ @<Cases for |catch_like|@>=
if (cat1==cast || cat1==exp) {
- big_app2(pp); big_app(indent); big_app(indent); reduce(pp,2,fn_decl,0,73);
+ big_app1_insert(pp,dindent); reduce(pp,2,fn_decl,0,73);
}
@ @<Cases for |tag|@>=
if (cat1==tag) {
- big_app1(pp); big_app(break_space); big_app1(pp+1); reduce(pp,2,tag,-1,74);
+ big_app1_insert(pp,break_space); reduce(pp,2,tag,-1,74);
}
else if (cat1==stmt||cat1==decl||cat1==function) {
- big_app(force); big_app(backup); big_app1(pp); big_app(break_space);
- big_app1(pp+1); reduce(pp,2,cat1,-1,75);
+ big_app(force); big_app(backup); big_app1_insert(pp,break_space);
+ reduce(pp,2,cat1,-1,75);
}
+else if (cat1==rbrace) squash(pp,1,decl,-1,156);
@ The user can decide at run-time whether short statements should be
grouped together on the same line.
@@ -2833,12 +2961,8 @@
@ @<Cases for |stmt|@>=
if (cat1==stmt||cat1==decl||cat1==function) {
- big_app1(pp);
- if (cat1==function) big_app(big_force);
- else if (cat1==decl) big_app(big_force);
- else if (force_lines) big_app(force);
- else big_app(break_space);
- big_app1(pp+1); reduce(pp,2,cat1,-1,76);
+ big_app1_insert(pp, (cat1==function || cat1==decl) ? big_force :
+ force_lines ? force : break_space); reduce(pp,2,cat1,-1,76);
}
@ @<Cases for |semi|@>=
@@ -2846,7 +2970,7 @@
@ @<Cases for |lproc|@>=
if (cat1==define_like) make_underlined(pp+2);
-if (cat1==else_like || cat1==if_like ||cat1==define_like)
+if (cat1==else_like || cat1==if_like || cat1==define_like)
squash(pp,2,lproc,0,78);
else if (cat1==rproc) {
app(inserted); big_app2(pp); reduce(pp,2,insert,-1,79);
@@ -2856,7 +2980,7 @@
reduce(pp,3,insert,-1,80);
}
else if (cat2==exp && cat3==rproc && cat1==exp) {
- app(inserted); big_app1(pp); big_app(' '); big_app1(pp+1); app_str(" \\5");
+ app(inserted); big_app1_insert(pp,' '); app_str("\\5");
@.\\5@>
big_app2(pp+2); reduce(pp,4,insert,-1,80);
}
@@ -2880,7 +3004,10 @@
init_mathness=cur_mathness=yes_math;
app('>'); reduce(pp,1,binop,-2,85);
-@ @<Cases for |langle|@>=
+@ @d reserve_typenames flags['t']
+ /* should we treat \&{typename} in a template like \&{typedef}? */
+
+@<Cases for |langle|@>=
if (cat1==prerangle) {
big_app1(pp); app('\\'); app(','); big_app1(pp+1);
@.\\,@>
@@ -2892,31 +3019,42 @@
big_app3(pp); app(opt); app('9'); reduce(pp,3,langle,0,88);
}
}
+else if (cat1==struct_like) {
+ if ((cat2==exp || cat2==int_like) && (cat3==comma || cat3==prerangle)) {
+ make_underlined(pp+2); if (reserve_typenames) make_reserved(pp+2);
+ big_app2(pp); big_app(' '); big_app2(pp+2);
+ if (cat3==comma) reduce(pp,4,langle,0,153);
+ else reduce(pp,4,cast,-1,154);
+ }
+}
@ @<Cases for |template_like|@>=
if (cat1==exp && cat2==prelangle) squash(pp+2,1,langle,2,89);
else if (cat1==exp || cat1==raw_int) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,cat1,-2,90);
-}@+ else squash(pp,1,raw_int,0,91);
+ big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,90);
+}
+else if (cat1==cast && cat2==struct_like) {
+ big_app1_insert(pp,' '); reduce(pp,2,struct_like,0,155);
+}
+else squash(pp,1,raw_int,0,91);
@ @<Cases for |new_like|@>=
if (cat1==lpar && cat2==exp && cat3==rpar) squash(pp,4,new_like,0,92);
else if (cat1==cast) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,93);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,93);
}
else if (cat1!=lpar) squash(pp,1,new_exp,0,94);
@ @<Cases for |new_exp|@>=
if (cat1==int_like || cat1==const_like) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,new_exp,0,95);
+ big_app1_insert(pp,' '); reduce(pp,2,new_exp,0,95);
}
else if (cat1==struct_like && (cat2==exp || cat2==int_like)) {
- big_app1(pp); big_app(' '); big_app1(pp+1); big_app(' ');
+ big_app1_insert(pp,' '); big_app(' ');
big_app1(pp+2); reduce(pp,3,new_exp,0,96);
}
else if (cat1==raw_ubin) {
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
- reduce(pp,2,new_exp,0,97);
+ big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,new_exp,0,97);
}
else if (cat1==lpar) squash(pp,1,exp,-2,98);
else if (cat1==exp) {
@@ -2931,7 +3069,7 @@
@ @<Cases for |for_like|@>=
if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,102);
+ big_app1_insert(pp,' '); reduce(pp,2,else_like,-2,102);
}
@ @<Cases for |raw_ubin|@>=
@@ -2938,7 +3076,8 @@
if (cat1==const_like) {
big_app2(pp); app_str("\\ "); reduce(pp,2,raw_ubin,0,103);
@.\\\ @>
-} else squash(pp,1,ubinop,-2,104);
+}
+else squash(pp,1,ubinop,-2,104);
@ @<Cases for |const_like|@>=
squash(pp,1,int_like,-2,105);
@@ -2948,16 +3087,16 @@
else if (cat1==colcol) squash(pp,2,colcol,-1,107);
else if (cat1==cast) squash(pp,2,raw_int,0,108);
else if (cat1==lpar) squash(pp,1,exp,-2,109);
+else if (cat1==lbrack) squash(pp,1,exp,-2,144);
else if (cat1!=langle) squash(pp,1,int_like,-3,110);
@ @<Cases for |operator_like|@>=
if (cat1==binop || cat1==unop || cat1==ubinop) {
if (cat2==binop) break;
- big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
- reduce(pp,2,exp,-2,111);
+ big_app1_insert(pp,'{'); big_app('}'); reduce(pp,2,exp,-2,111);
}
else if (cat1==new_like || cat1==delete_like) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,112);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,112);
}
else if (cat1==comma) squash(pp,2,exp,-2,113);
else if (cat1!=raw_ubin) squash(pp,1,new_exp,0,114);
@@ -2966,11 +3105,11 @@
if ((cat1==int_like || cat1==cast) && (cat2==comma || cat2==semi))
squash(pp+1,1,exp,-1,115);
else if (cat1==int_like) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,116);
+ big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,116);
}
else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
make_underlined(pp+1); make_reserved(pp+1);
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,117);
+ big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,117);
}
else if (cat1==comma) {
big_app2(pp); big_app(' '); reduce(pp,2,typedef_like,0,118);
@@ -2977,8 +3116,7 @@
}
else if (cat1==semi) squash(pp,2,decl,-1,119);
else if (cat1==ubinop && (cat2==ubinop || cat2==cast)) {
- big_app('{'); big_app1(pp+1); big_app('}'); big_app1(pp+2);
- reduce(pp+1,2,cat2,0,120);
+ big_app('{'); big_app1_insert(pp+1,'}'); reduce(pp+1,2,cat2,0,120);
}
@ @<Cases for |delete_like|@>=
@@ -2988,7 +3126,7 @@
reduce(pp,3,delete_like,0,121);
}
else if (cat1==exp) {
- big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,exp,-2,122);
+ big_app1_insert(pp,' '); reduce(pp,2,exp,-2,122);
}
@ @<Cases for |question|@>=
@@ -2997,6 +3135,51 @@
squash(pp,3,binop,-2,123);
}
+@ @<Cases for |alignas_like|@>=
+if (cat1==decl_head) squash(pp,2,attr,-1,126);
+else if (cat1==exp) squash(pp,2,attr,-1,127);
+else if (cat1==cast) squash(pp,2,attr,-1,158);
+
+@ @<Cases for |lbrack|@>=
+if (cat1==lbrack)
+ if (cat2==rbrack && cat3==rbrack) squash(pp,4,exp,-2,147);
+ else squash(pp,2,attr_head,-1,128);
+else squash(pp,1,lpar,-1,129);
+
+@ @<Cases for |attr_head|@>=
+if (cat1==rbrack && cat2==rbrack) squash(pp,3,attr,-1,131);
+else if (cat1==exp) squash(pp,2,attr_head,0,132);
+else if (cat1==using_like && cat2==exp && cat3==colon) {
+ big_app2(pp); big_app(' '); big_app2(pp+2); big_app(' ');
+ reduce(pp,4,attr_head,0,133);
+}
+else if (cat1==comma) squash(pp,2,attr_head,0,145);
+
+@ @<Cases for |attr|@>=
+if (cat1==lbrace || cat1==stmt) {
+ big_app1_insert(pp,' '); reduce(pp,2,cat1,-2,134);
+}
+else if (cat1==tag) {
+ big_app1_insert(pp,' '); reduce(pp,2,tag,-1,135);
+}
+else if (cat1==semi) squash(pp,2,stmt,-2,136);
+else if (cat1==attr) {
+ big_app1_insert(pp,' '); reduce(pp,2,attr,-1,137);
+}
+else if (cat1==decl_head) {
+ big_app1_insert(pp,' '); reduce(pp,2,decl_head,-1,138);
+}
+else if (cat1==typedef_like) {
+ big_app1_insert(pp,' '); reduce(pp,2,typedef_like,0,143);
+}
+else if (cat1==function) {
+ big_app1_insert(pp,' '); reduce(pp,2,function,-1,148);
+}
+
+@ @<Cases for |default_like|@>=
+if (cat1==colon) squash(pp,1,case_like,-3,149);
+else squash(pp,1,exp,-2,150);
+
@ Now here's the |reduce| procedure used in our code for productions.
The `|freeze_text|' macro is used to give official status to a token list.
@@ -3103,19 +3286,23 @@
}
@ If \.{CWEAVE} is being run in debugging mode, the production numbers and
-current stack categories will be printed out when |tracing| is set to 2;
+current stack categories will be printed out when |tracing| is set to |fully|;
a sequence of two or more irreducible scraps will be printed out when
-|tracing| is set to 1.
+|tracing| is set to |partly|.
+ at d off 0
+ at d partly 1
+ at d fully 2
+
@<Private...@>=
-static int tracing; /* can be used to show parsing details */
+static int tracing=off; /* can be used to show parsing details */
@ @<Print a snapsh...@>=
{ scrap_pointer k_l; /* pointer into |scrap_info| */
- if (tracing==2) {
+ if (tracing==fully) {
printf("\n%d:",n);
for (k_l=scrap_base; k_l<=lo_ptr; k_l++) {
- if (k_l==pp) putxchar('*'); else putxchar(' ');
+ if (k_l==pp) putchar('*'); else putchar(' ');
if (k_l->mathness %4 == yes_math) putchar('+');
else if (k_l->mathness %4 == no_math) putchar('-');
print_cat(k_l->cat);
@@ -3122,7 +3309,7 @@
if (k_l->mathness /4 == yes_math) putchar('+');
else if (k_l->mathness /4 == no_math) putchar('-');
}
- if (hi_ptr<=scrap_ptr) fputs("...",stdout); /* indicate that more is coming */
+ if (hi_ptr<=scrap_ptr) printf("..."); /* indicate that more is coming */
}
}
@@ -3143,8 +3330,8 @@
static text_pointer
translate(void) /* converts a sequence of scraps */
{
- scrap_pointer i, /* index into |cat| */
- j; /* runs through final scraps */
+ scrap_pointer i; /* index into |cat| */
+ scrap_pointer j; /* runs through final scraps */
pp=scrap_base; lo_ptr=pp-1; hi_ptr=pp;
@<If tracing, print an indication of where we are@>@;
@<Reduce the scraps...@>@;
@@ -3171,17 +3358,17 @@
}
@ @<If semi-tracing, show the irreducible scraps@>=
-if (lo_ptr>scrap_base && tracing==1) {
+if (lo_ptr>scrap_base && tracing==partly) {
printf("\nIrreducible scrap sequence in section %d:",section_count);
@.Irreducible scrap sequence...@>
mark_harmless;
for (j=scrap_base; j<=lo_ptr; j++) {
- printf(" "); print_cat(j->cat);
+ putchar(' '); print_cat(j->cat);
}
}
@ @<If tracing,...@>=
-if (tracing==2) {
+if (tracing==fully) {
printf("\nTracing after l. %d:\n",cur_line); mark_harmless;
@.Tracing after...@>
if (loc>buffer+50) {
@@ -3208,8 +3395,8 @@
@c
static void
-C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
- eight_bits spec_ctrl at t\2\2@>)
+C_parse( /* creates scraps from \CEE/ tokens */
+ eight_bits spec_ctrl)
{
int count; /* characters remaining before string break */
while (next_control<format_code || next_control==spec_ctrl) {
@@ -3236,7 +3423,7 @@
switch (next_control) {
case section_name:
app(section_flag+(int)(cur_section-name_dir));
- app_scrap(section_scrap,maybe_math);
+ app_scrap(section_scrap,maybe_math);@+
app_scrap(exp,yes_math);@+break;
case string: case constant: case verbatim:
@<Append a string or constant@>@;@+break;
@@ -3271,8 +3458,10 @@
@.\\\#@>
case ignore: case xref_roman: case xref_wildcard:
case xref_typewriter: case noop:@+break;
- case '(': case '[': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
- case ')': case ']': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '(': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+ case ')': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '[': app(next_control);@+app_scrap(lbrack,maybe_math);@+break;
+ case ']': app(next_control);@+app_scrap(rbrack,maybe_math);@+break;
case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
@.\\\{@>@q}@>
case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
@@ -3320,7 +3509,7 @@
standard ones. They are converted to \TEX/ control sequences so that it is
possible to keep \.{CWEAVE} from outputting unusual |char| codes.
-@<Cases involving nonstandard...@>=
+@<Cases involving nonstandard...@>=@t\1\quad@>
case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
@.\\I@>
case lt_eq: app_str("\\Z");@+app_scrap(binop,yes_math);@+break;
@@ -3447,8 +3636,8 @@
@ @c
static void
-app_cur_id(@t\1\1@>
-boolean scrapping at t\2\2@>) /* are we making this into a scrap? */
+app_cur_id(
+boolean scrapping) /* are we making this into a scrap? */
{
name_pointer p=id_lookup(id_first,id_loc,normal);
if (p->ilk<=custom) { /* not a reserved word */
@@ -3475,8 +3664,8 @@
C_translate(void)
{
text_pointer p; /* points to the translation */
- scrap_pointer save_base; /* holds original value of |scrap_base| */
- save_base=scrap_base; scrap_base=scrap_ptr+1;
+ scrap_pointer save_base=scrap_base; /* holds original value of |scrap_base| */
+ scrap_base=scrap_ptr+1;
C_parse(section_name); /* get the scraps together */
if (next_control!='|') err_print("! Missing '|' after C text");
@.Missing '|'...@>
@@ -3493,8 +3682,7 @@
until |next_control>=format_code|. Thus, it takes care of embedded comments.
The token list created from within `\pb' brackets is output as an argument
-to \.{\\PB}, if the user has invoked \.{CWEAVE} with the \.{+e} flag.
-Although \.{cwebmac} ignores \.{\\PB}, other macro packages
+to \.{\\PB}. Although \.{cwebmac} ignores \.{\\PB}, other macro packages
might use it to localize the special meaning of the macros that mark up
program text.
@@ -3615,8 +3803,8 @@
@ @c
static void
-push_level(@t\1\1@> /* suspends the current level */
-text_pointer p at t\2\2@>)
+push_level( /* suspends the current level */
+text_pointer p)
{
if (stack_ptr==stack_end) overflow("stack");
if (stack_ptr>stack) { /* save current state */
@@ -3701,12 +3889,11 @@
static void
output_C(void) /* outputs the current token list */
{
- token_pointer save_tok_ptr;
- text_pointer save_text_ptr;
- sixteen_bits save_next_control; /* values to be restored */
+ token_pointer save_tok_ptr=tok_ptr;
+ text_pointer save_text_ptr=text_ptr;
+ sixteen_bits save_next_control=next_control; /* values to be restored */
text_pointer p; /* translation of the \CEE/ text */
- save_tok_ptr=tok_ptr; save_text_ptr=text_ptr;
- save_next_control=next_control; next_control=ignore; p=C_translate();
+ next_control=ignore; p=C_translate();
app(inner_tok_flag+(int)(p-tok_start));
if (make_pb) {
out_str("\\PB{"); make_output(); out('}');
@@ -3724,8 +3911,8 @@
static void
make_output(void) /* outputs the equivalents of tokens */
{
- eight_bits a=0, /* current output byte */
- b; /* next output byte */
+ eight_bits a=0; /* current output byte */
+ eight_bits b; /* next output byte */
int c; /* count of |indent| and |outdent| tokens */
char scratch[longest_name+1]; /* scratch area for section names */
char *k, *k_limit; /* indices into |scratch| */
@@ -3735,6 +3922,7 @@
char *save_loc, *save_limit; /* |loc| and |limit| to be restored */
name_pointer cur_section_name; /* name of section being output */
boolean save_mode; /* value of |cur_mode| before a sequence of breaks */
+ boolean dindent_pending=false; /* should a |dindent| be output? */
app(end_translation); /* append a sentinel */
freeze_text; push_level(text_ptr-1);
while (true) {
@@ -3751,11 +3939,17 @@
a=get_output();
if (a==inserted) continue;
if ((a<indent && !(b==big_cancel&&a==' ')) || a>big_force) break;
- if (a==indent) c++; else if (a==outdent) c--;
- else if (a==opt) a=get_output();
+ if (a==indent) c++;
+ else if (a==outdent) c--;
+ else if (a==opt) a=get_output();
}
@<Output saved |indent| or |outdent| tokens@>@;
goto reswitch;
+ case dindent: a=get_output();
+ if (a!=big_force) {
+ out_str("\\1\\1"); goto reswitch;
+ }
+ else dindent_pending=true; /* fall through */
case indent: case outdent: case opt: case backup: case break_space:
case force: case big_force: case preproc_line: @<Output a control,
look ahead in case of line breaks, possibly |goto reswitch|@>@; break;
@@ -3779,7 +3973,8 @@
for (p=cur_name->byte_start;p<(cur_name+1)->byte_start;p++)
out(*p=='_'? 'x': *p=='$'? 'X': *p);
break;
- } else if (is_tiny(cur_name)) out('|')@;
+ }
+ else if (is_tiny(cur_name)) out('|')@;
@.\\|@>
else { delim='.';
for (p=cur_name->byte_start;p<(cur_name+1)->byte_start;p++)
@@ -3790,10 +3985,12 @@
}
@.\\\\@>
@.\\.@>
-}@+else if (cur_name->ilk==alfop) {
+}
+else if (cur_name->ilk==alfop) {
out('X');
goto custom_out;
-}@+else out('&'); /* |a==res_word| */
+}
+else out('&'); /* |a==res_word| */
@.\\\&@>
if (is_tiny(cur_name)) {
if (isxalpha((cur_name->byte_start)[0]))
@@ -3820,7 +4017,7 @@
else out_str("{-1}"); /* |force_lines| encourages more \.{@@\v} breaks */
}
} else if (a==opt) b=get_output(); /* ignore digit following |opt| */
- }
+}
else @<Look ahead for strongest line break, |goto reswitch|@>
@ If several of the tokens |break_space|, |force|, |big_force| occur in a
@@ -3830,7 +4027,10 @@
is suppressed (i.e., a line break that follows `\.{\\Y\\B}').
@<Look ahead for st...@>= {
- b=a; save_mode=cur_mode; c=0;
+ b=a; save_mode=cur_mode;
+ if (dindent_pending) {
+ c=2; dindent_pending=false;
+ } else c=0;
while (true) {
a=get_output();
if (a==inserted) continue;
@@ -3908,9 +4108,9 @@
if (b=='@@') @<Skip next character, give error if not `\.{@@}'@>@;
if (an_output)
switch (b) {
- case ' ':case '\\':case '#':case '%':case '$':case '^':
- case '{': case '}': case '~': case '&': case '_':
- out('\\'); /* falls through */
+ case ' ': case '\\': case '#': case '%': case '$': case '^':
+ case '{': case '}': case '~': case '&': case '_':
+ out('\\'); /* falls through */
@.\\\ @>
@.\\\\@>
@.\\\#@>
@@ -3922,15 +4122,16 @@
@.\\\~@>
@.\\\&@>
@.\\\_@>
- default: out(b);
+ default: out(b);
}
- else { if (b!='|') out(b)@;
- else {
- @<Copy the \CEE/ text into the |buffer| array@>@;
- save_loc=loc; save_limit=limit; loc=limit+2; limit=j+1;
- *limit='|'; output_C();
- loc=save_loc; limit=save_limit;
- } }
+ else
+ if (b!='|') out(b)@;
+ else {
+ @<Copy the \CEE/ text into the |buffer| array@>@;
+ save_loc=loc; save_limit=limit; loc=limit+2; limit=j+1;
+ *limit='|'; output_C();
+ loc=save_loc; limit=save_limit;
+ }
}
@ @<Skip next char...@>=
@@ -4055,14 +4256,13 @@
if (show_progress)
printf("*%d",section_count); update_terminal; /* print a progress report */
}
-out_str("{");out_section(section_count); out_str("}");
+out('{'); out_section(section_count); out('}');
@ In the \TEX/ part of a section, we simply copy the source text, except that
index entries are not copied and \CEE/ text within \pb\ is translated.
@<Translate the \T...@>= do {
- next_control=copy_TeX();
- switch (next_control) {
+ switch (next_control=copy_TeX()) {
case '|': init_stack; output_C(); break;
case '@@': out('@@'); break;
case TeX_string: case noop:
@@ -4105,8 +4305,8 @@
@c
static void
-finish_C(@t\1\1@> /* finishes a definition or a \CEE/ part */
- boolean visible at t\2\2@>) /* nonzero if we should produce \TeX\ output */
+finish_C( /* finishes a definition or a \CEE/ part */
+ boolean visible) /* |true| if we should produce \TeX\ output */
{
text_pointer p; /* translation of the scraps */
if (visible) {
@@ -4114,7 +4314,7 @@
p=translate();
@.\\B@>
app(tok_flag+(int)(p-tok_start)); make_output(); /* output the list */
- if (out_ptr>out_buf+1) {
+ if (out_ptr>out_buf+1)
if (*(out_ptr-1)=='\\') {
@.\\6@>
@.\\7@>
@@ -4122,7 +4322,6 @@
if (*out_ptr=='6') out_ptr-=2;
else if (*out_ptr=='7') *out_ptr='Y';
}
- }
out_str("\\par"); finish_line();
}
if (text_ptr>max_text_ptr) max_text_ptr=text_ptr;
@@ -4145,22 +4344,30 @@
@<Start a macro...@>= {
if (save_line!=out_line || save_place!=out_ptr || space_checked) app(backup);
if(!space_checked){emit_space_if_needed;save_position;}
- app_str("\\D"); /* this will produce `\&{define }' */
+ app_str("\\D"); /* this will produce `\#\&{define }' */
@.\\D@>
if ((next_control=get_next())!=identifier)
err_print("! Improper macro definition");
@.Improper macro definition@>
else {
- app('$'); app_cur_id(false);
- if (*loc=='(')
+ app_cur_id(false);
+ if (*loc=='(') {
+ app('$');
reswitch: switch (next_control=get_next()) {
case '(': case ',': app(next_control); goto reswitch;
case identifier: app_cur_id(false); goto reswitch;
case ')': app(next_control); next_control=get_next(); break;
+ case dot_dot_dot: app_str("\\,\\ldots\\,"); @.\\,@> @.\\ldots@>
+ app_scrap(raw_int,no_math);
+ if ((next_control=get_next())==')') {
+ app(next_control); next_control=get_next(); break;
+ } /* otherwise fall through */
default: err_print("! Improper macro definition"); break;
+ }
+ app('$');
}
else next_control=get_next();
- app_str("$ "); app(break_space);
+ app(break_space);
app_scrap(dead,no_math); /* scrap won't take part in the parsing */
}
}
@@ -4174,7 +4381,6 @@
next_control=get_next();
if (next_control==identifier) {
app(id_flag+(int)(id_lookup(id_first, id_loc,normal)-name_dir));
- app(' ');
app(break_space); /* this is syntactically separate from what follows */
next_control=get_next();
if (next_control==identifier) {
@@ -4220,7 +4426,7 @@
if (next_control!='=' && next_control!=eq_eq)
err_print("! You need an = sign after the section name");
@.You need an = sign...@>
- else next_control=get_next();
+else next_control=get_next();
if (out_ptr>out_buf+1 && *out_ptr=='Y' && *(out_ptr-1)=='\\') app(backup);
/* the section name will be flush left */
@.\\Y@>
@@ -4277,8 +4483,8 @@
@c
static void
-footnote(@t\1\1@> /* outputs section cross-references */
-sixteen_bits flag at t\2\2@>)
+footnote( /* outputs section cross-references */
+sixteen_bits flag)
{
xref_pointer q; /* cross-reference pointer variable */
if (cur_xref->num<=flag) return;
@@ -4519,8 +4725,8 @@
@c
static void
-unbucket(@t\1\1@> /* empties buckets having depth |d| */
-eight_bits d at t\2\2@>)
+unbucket( /* empties buckets having depth |d| */
+eight_bits d)
{
int c; /* index into |bucket|; cannot be a simple |char| because of sign
comparison below */
@@ -4576,14 +4782,15 @@
@ @<Output the name...@>=
switch (cur_name->ilk) {
- case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
- else {char *j;
+ case normal: case func_template:
+ if (is_tiny(cur_name)) out_str("\\|");
+ else {@+char *j;
for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
if (xislower(*j)) goto lowcase;
out_str("\\."); break;
lowcase: out_str("\\\\");
}
- break;
+ break;
@.\\|@>
@.\\.@>
@.\\\\@>
@@ -4621,6 +4828,7 @@
@ List inversion is best thought of as popping elements off one stack and
pushing them onto another. In this case |cur_xref| will be the head of
the stack that we push things onto.
+
@<Private...@>=
static xref_pointer next_xref, this_xref;
/* pointer variables for rearranging a list */
@@ -4638,8 +4846,8 @@
@c
static void
-section_print(@t\1\1@> /* print all section names in subtree |p| */
-name_pointer p at t\2\2@>)
+section_print( /* print all section names in subtree |p| */
+name_pointer p)
{
if (p) {
section_print(p->llink); out_str("\\I");
Modified: trunk/Build/source/texk/web2c/cwebdir/cweb.1
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cweb.1 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cweb.1 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,4 +1,4 @@
-.TH CWEB 1 2018-Dec-16
+.TH CWEB 1 2021-Mar-24
.
.SH NAME
ctangle, cweave \- translate CWEB to C and/or TeX
@@ -9,7 +9,7 @@
[
.B \-bhp
] [
-.B +s
+.B +ks
] webfile[.w] [{changefile[.ch]|-} [outputfile[.c]]]
.br
.B cweave
@@ -16,7 +16,7 @@
[
.B \-befhpx
] [
-.B +s
+.B +st
] webfile[.w] [{changefile[.ch]|-} [outputfile[.tex]]]
.ad
.
@@ -80,7 +80,13 @@
.B +s
option prints statistics about memory usage at the end of a run.
.PP
-There are three other options applicable to
+There is one other option applicable to
+.I ctangle
+only:
+.B +k
+means keep '-separators in numeric literals in the C/C++\ output.
+.PP
+There are four other options applicable to
.I cweave
only:
.B \-f
@@ -89,13 +95,15 @@
inhibits the enclosure of C\ material formatted by
.I cweave
in brackets
-\ePB{...}.
-Such brackets are normally inserted so that special hooks
+\ePB{...};
+such brackets are normally inserted so that special hooks
can be used by
.I cweb-latex
and similar programs.
.B \-x
-means omit the index and table of contents.
+means omit the index, the names of the sections, and the table of contents.
+.B +t
+means treat 'typename' in templates like 'typedef'.
.
.SH FILES
The location of the files mentioned below varies from system to system.
Modified: trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebmac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,7 +1,7 @@
% standard macros for CWEB listings (in addition to plain.tex)
-% Version 4.2 --- February 2021
+% Version 4.3 --- April 2021
\ifx\renewenvironment\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+CWEB4.2}
+\xdef\fmtversion{\fmtversion+CWEB4.3}
\chardef\cwebversion=4 \chardef\cwebrevision=1
\newif\ifpdf
\ifx\pdf+\pdftrue\fi
@@ -31,6 +31,7 @@
\def\TEX/{\TeX}
\def\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
\def\Cee{\CEE/} % for backward compatibility
+\def\Cpp{\CPLUSPLUS/} % for backward compatibility
\def\9#1{}
% with this definition of \9 you can say @:sort key}{TeX code@>
% to alphabetize an index entry by the sort key but format with the TeX code
@@ -124,6 +125,7 @@
\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
\let\yskip=\smallskip
\def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\note#1#2.{\Y\noindent{\hangindent2em%
\baselineskip10pt\eightrm#1~\ifacro{\pdfnote#2.}\else#2\fi.\par}}
@@ -287,7 +289,7 @@
\else \special{pdf: dest (\romannumeral\secstar)
[ @thispage /FitH @ypos ]}\fi}}\fi}
\let\startsection=\stsec
-\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
\def\A{\note{See also section}} % xref for doubly defined section name
\def\As{\note{See also sections}} % xref for multiply defined section name
\def\B{\rightskip=0pt plus 100pt minus 10pt % go into C mode
@@ -300,7 +302,7 @@
\let\SHC\C % "// short comments" treated like "/* ordinary comments */"
%\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
%\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
-\def\D{\defin{\#define}} % macro definition
+\def\D{\defin{{\rm\#}define}} % macro definition
\let\E=\equiv % equivalence sign
\def\ET{ and~} % conjunction between two section numbers
\def\ETs{, and~} % conjunction between the last two of several section numbers
@@ -341,12 +343,15 @@
\def\Qs{\note{This code is cited in sections}} % xref for mentions of a section
\let\R=\lnot % logical not
% \S is section sign
+\def\digitseparator{\,} % a bit of extra space
\def\T#1{\leavevmode % octal, hex or decimal constant
\hbox{$\def\?{\kern.2em}%
+ \let\ \digitseparator%
% \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant % versions < 3.67
\def\$##1{\egroup_{\rm##1}\bgroup}% suffix to constant % in version 3.67
\def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
- \let\~=\oct \let\^=\hex {#1}$}}
+ \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+ \let\~=\oct \let\^=\hex \let\\=\bin {#1}$}}
\def\U{\note{This code is used in section}} % xref for use of a section
\def\Us{\note{This code is used in sections}} % xref for uses of a section
\let\V=\lor % logical or
@@ -365,8 +370,12 @@
%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
\hbox{\strut\kern2pt\.{#1}\kern2pt}}
\hrule}\vrule\kern2pt}} % verbatim string
@@ -482,14 +491,13 @@
\def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
{\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
\pdfoutline goto num \the\toksA \expandafter{\the\toksE}}
- \else\ifpdf
- \special{pdf: outline -1 << /Title (\outsecname)
+ \else \special{pdf: outline -1 << /Title (\outsecname)
/Dest [ @thispage /FitH @ypos ] >>}
\def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
{\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
\special{pdf: outline 0 << /Title (\the\toksE)
/A << /S /GoTo /D (\romannumeral\the\toksA) >> >>}}
- \fi\fi\fi
+ \fi\fi
\readsections}
\def\makebookmarks{\let\ZZ=\writebookmarkline \readcontents\relax}
\def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
@@ -536,9 +544,6 @@
\def\printtwodigits{\advance\twodigits100
\expandafter\gobbleone\number\twodigits
\advance\twodigits-100 }
-\def\TeX{{\ifmmode\it\fi
- \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\datethis{\def\startsection{\leftline{\sc\today\ at \hours}\bigskip
\let\startsection=\stsec\stsec}}
% say `\datethis' in limbo, to get your listing timestamped before section 1
Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman-w2c.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -93,17 +93,17 @@
@z
@x
-\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.2)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.3)}
@y
\def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}}
-\def\runninghead{{\tentt CWEB} USER MANUAL (Version 4.2 [\TeX~Live])}
+\def\runninghead{{\tentt CWEB} USER MANUAL (Version 4.3 [\TeX~Live])}
@z
@x
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)}
@y
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)%
-\footnote*{This document describes the extended \.{CWEB} (Version 4.2 [\TeX~Live]).}}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)%
+\footnote*{This document describes the extended \.{CWEB} (Version 4.3 [\TeX~Live]).}}
@z
@x
@@ -159,35 +159,38 @@
@z
@x
-output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)
+options are currently implemented:
+
+\yskip
+\def\option#1 {\textindent{\.#1}\hangindent2\parindent}
@y
-output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)%
+\def\option#1 {\textindent{\.#1}\hangindent2\parindent}%
+options are currently implemented:%
\cwebfootnote{This extended version of \.{CWEB} adds the following options
to the list:
\hfil\smallskip
+\option c Overwrite output files with temporary output only if changes occur.
+(On by default.)
+\hfil\vskip\normallineskip
\option d Set the debugging variable \\{kpathsea\_debug} to the numeric
value $N\in[0,127]$ of this option. See section~93 % FIXME
of \pdfURL{appendix~D}{common-changes.pdf} for details.
\hfil\vskip\normallineskip
-\option i Indent parameters in function declarations. This causes the
-formal parameter declarations in function heads to be indented. (On by
-default; \.{-i} typesets declarations flush left; some people think this
-to be more logical than indenting them) (Has no effect on \.{CTANGLE}.)
+\option i Indent parameters in function declarations. (On by default;
+\.{-i} typesets declarations flush left; some people think this to be
+more logical than indenting them.) (Has no effect on \.{CTANGLE}.)
\hfil\vskip\normallineskip
\option l This option takes the string of characters to its right as its
argument to switch between different user languages and macro packages.
For example, if you call \.{CWEAVE} with the `\.{+ld}' (or `\.{-ld}') option,
the German \.{CWEB} macros \.{dcwebmac.tex} will be loaded in the first line
-of output instead of the English ones. To avoid conflicts, the Danish
-macros could be called \.{dkcwebmac.tex} and would be included by `\.{+ldk}'.
-(Off by default) (Has no effect on \.{CTANGLE}.)
+of output instead of the English ones. (Off by default.) (Has no effect on
+\.{CTANGLE}.)
\hfil\vskip\normallineskip
\option o Separate declarations and the first statement in a function block.
-\.{CWEAVE} automatically inserts a bit of extra space. (On by default.)
-(Has no effect on \.{CTANGLE}.)
-\hfil\vskip\normallineskip
-\option t Overwrite output files with temporary output only if changes occur.
-(On by default.)}
+(On by default.) (Has no effect on\break\hbox{}\qquad\.{CTANGLE}.)}
+
+\yskip
@z
@x
@@ -311,9 +314,9 @@
@z
@x
- \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+ \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
@y
- \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+ \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
@z
@x
Modified: trunk/Build/source/texk/web2c/cwebdir/cwebman.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/cwebman.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/cwebman.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,5 +1,4 @@
% This file generates the user manual; TeX it, don't read it!
-% update 14 Nov 2016 by DEK: corrected obsolete remarks re debugging info
\def\tangref{3} % where the main explanation of CTANGLing is given
\input cwebmac
@@ -36,7 +35,7 @@
\def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill}
\def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno}
-\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.2)}
+\def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 4.3)}
% This verbatim mode assumes that ! marks are !! in the text being copied.
\def\verbatim{\begingroup
@@ -50,7 +49,7 @@
\null\vfill
\centerline{\titlefont The {\ttitlefont CWEB} System of
Structured Documentation}
-\vskip 18pt\centerline{(Version 4.2 --- February 2021)}
+\vskip 18pt\centerline{(Version 4.3 --- April 2021)}
\vskip 24pt
\centerline{\authorfont Donald E. Knuth and Silvio Levy}
\vfill
@@ -394,9 +393,9 @@
\CEE/ editing within \TEX/ text, if you place `\.|' marks before and
after the \CEE/ material. For example, suppose you want to say something
like this:
-$$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
-the assignment $\\{pa}\K{\AND}\|a[\T{0}]$ makes \\{pa}
-point to the zeroth element of \|a.}$$
+$$\hbox{If \PB{\\{pa}} is declared as `\PB{\&{int} ${}{*}\\{pa}$}',
+the assignment \PB{$\\{pa}\K{\AND}\|a[\T{0}]$} makes \PB{\\{pa}}
+point to the zeroth element of \PB{\|a}.}$$
The \TEX/ text would look like this in your \.{CWEB} file:
$$\lpile{\.{If |pa| is declared as `|int *pa|', the assignment}\cr
\.{|pa=\&a[0]| makes |pa| point to the zeroth element of |a|.}\cr}$$
@@ -477,14 +476,17 @@
or \.{0x}. In \.{CWEB} it seems reasonable to let each convention hold
in its respective realm; so in \CEE/ text you get $40_8$ by typing
`\.{040}', which \.{CTANGLE} faithfully copies into the \CEE/ file (for
-the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40}$.
+the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40/}$.
Similarly, \.{CWEAVE} prints the hexadecimal \CEE/ constant `\.{0x20}'
-as \T{\^20}. The use of italic font for octal digits and typewriter font
+as \T{\^20/}. The use of italic font for octal digits and typewriter font
for hexadecimal digits makes the meaning of such constants clearer in
-a document. For consistency, then, you
-should type `\.{|040|}' or `\.{|0x20|}'
-in the \TEX/ part of the section.
+a document. For consistency, then, you should type `\.{|040|}' or
+`\.{|0x20|}' in the \TEX/ part of the section.
+And if you type a binary constant like `\.{0b00101010}', \.{CWEAVE} prints
+it as $\T{\\00101010/}$. In all numeric literals you may add \.' separators
+for improved readability.
+
\section Control codes.
A \.{CWEB} {\sl control code\/}
is a two-character combination of which the first is `\.@'.
@@ -761,11 +763,11 @@
them by standard ASCII alphanumeric characters or
\.{\_}, in order to generate legal \CEE/ code. It does this by means
of a transliteration table, which by default associates the string
-\.{Xab} to the character with ASCII code \T{\^}$ab$ (where $a$ and $b$ are
+\.{Xab} to the character with ASCII code \T{\^/}$ab$ (where $a$ and $b$ are
hexadecimal digits, and $a\ge8$). By placing the
construction \.{@l\ ab\ newstring} in limbo, you are telling
\.{CTANGLE} to replace this character by \.{newstring} instead.
-For example, the ISO Latin-1 code for the letter `\"u' is \T{\^FC}
+For example, the ISO Latin-1 code for the letter `\"u' is \T{\^FC/}
(or \.{'\char`\\374'}),
and \.{CTANGLE} will normally change this code to the
three-character sequence \.{XFC} if it
@@ -1042,7 +1044,7 @@
\option e Enclose \CEE/ material formatted by \.{CWEAVE} in
brackets \.{\\PB\{...\}}, so that special hooks can be used.
-(On by default; has no effect on \.{CTANGLE}.)
+(On by default.) (Has no effect on \.{CTANGLE}.)
\option f Force line breaks after each \CEE/ statement formatted
by \.{CWEAVE}. (On by default; \.{-f} saves paper but looks less \CEE/-like
@@ -1051,14 +1053,19 @@
\option h Print a happy message at the conclusion of a successful
run. (On by default.)
+\option k Keep single quotes (\.') in numeric literals in the
+\CEE//\CPLUSPLUS/ output. (Off by default.) (\.{CTANGLE} only.)
+
\option p Give progress reports as the program runs. (On by default.)
\option s Show statistics about memory usage after the program
runs to completion. (Off by default.)
-If you
-have large \.{CWEB} files or sections, you may need to see
-how close you come to exceeding the capacity of \.{CTANGLE} and/or \.{CWEAVE}.
+If you have large \.{CWEB} files or sections, you may need to see how close
+you come to exceeding the capacity of \.{CTANGLE} and/or \.{CWEAVE}.
+\option t Treat \&{typename} in a template like \&{typedef}.
+(Off by default.) (Has no effect on \.{CTANGLE}.)
+
\option x Include indexes and a table of contents in the \TEX/ file
output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)
@@ -1155,7 +1162,7 @@
Alternatively, thanks to H\`an Th\^e\kern-.3em\raise.3ex\hbox{\'{}} Th\`anh
and Andreas Scherer, you can generate \.{cob.pdf} in one step by simply
saying `\.{pdftex}~\.{cob}'.
-A third way to create PDF output from \.{CWEB} input is to say
+And a third way to create PDF output from \.{CWEB} input is to say
`\.{xetex}~\.{cob}'.
A more elaborate system called \.{CTWILL}, which extends the usual cross
@@ -1211,10 +1218,7 @@
the change file is exhausted. This procedure is called only when
|changing| is |true|; hence error messages will be reported correctly.
-@<Predecl...@>=
-static void prime_the_change_buffer(void);@/
-
-@ @c
+ at c
static void
prime_the_change_buffer(void)
{
@@ -1224,6 +1228,8 @@
@<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>@;
}
+@ @<Predecl...@>=@+static void prime_the_change_buffer(void);
+
@ While looking for a line that begins with \.{@@x} in the change file, we
allow lines that begin with \.{@@}, as long as they don't begin with \.{@@y},
\.{@@z}, or \.{@@i} (which would probably mean that the change file is fouled up).
@@ -1268,13 +1274,13 @@
Here's the portion of the \CEE/ code generated by \.{CTANGLE} that corresponds
to the source on the preceding page. Notice that sections~29, 30 and~31
-have been tangled into section~28.
+have been tangled into section~27.
\vskip6pt
\begingroup \def\tt{\eighttt} \baselineskip9pt
\verbatim
-/*:24*//*28:*/
-#line 234 "common.w"
+/*:23*//*27:*/
+#line 227 "common.w"
static void
prime_the_change_buffer(void)
@@ -1281,7 +1287,7 @@
{
change_limit= change_buffer;
/*29:*/
-#line 248 "common.w"
+#line 243 "common.w"
while(true){
change_line++;
@@ -1298,10 +1304,10 @@
}
/*:29*/
-#line 239 "common.w"
+#line 232 "common.w"
/*30:*/
-#line 265 "common.w"
+#line 260 "common.w"
do{
change_line++;
@@ -1313,10 +1319,10 @@
}while(limit==buffer);
/*:30*/
-#line 240 "common.w"
+#line 233 "common.w"
/*31:*/
-#line 275 "common.w"
+#line 270 "common.w"
{
change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
@@ -1324,11 +1330,11 @@
}
/*:31*/
-#line 241 "common.w"
+#line 234 "common.w"
}
-/*:28*//*33:*/
+/*:27*//*32:*/
!endgroup
\endgroup
\vfill\eject
@@ -1349,11 +1355,7 @@
\PB{\\{changing}} is \PB{\\{true}}; hence error messages will be reported
correctly.
-\Y\B\4\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\6
-\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
-\fi
-
-\M{28}\B\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\1\1\2\2\6
+\Y\B\1\1\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\2\2\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
change file ends }\6
@@ -1365,6 +1367,10 @@
\4${}\}{}$\2\par
\fi
+\M{28}\B\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\5
+\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
+\fi
+
\M{29}While looking for a line that begins with \.{@x} in the change file, we
allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
\.{@z}, or \.{@i} (which would probably mean that the change file is fouled
@@ -1392,7 +1398,7 @@
\\{err\_print}(\.{"!!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
-\U28.\fi
+\U27.\fi
\M{30}Here we are looking at lines following the \.{@x}.
@@ -1408,7 +1414,7 @@
\4${}\}{}$\2\6
\4${}\}{}$\2\5
\&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U28.\fi
+\U27.\fi
!endgroup
\endgroup
\vfil\eject
@@ -1427,11 +1433,7 @@
\PB{\\{changing}} is \PB{\\{true}}; hence error messages will be reported
correctly.
-\Y\B\4\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\6
-\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
-\fi
-
-\M{28}\B\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\1\1\2\2\6
+\Y\B\1\1\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void})\2\2\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
change file ends }\6
@@ -1443,6 +1445,10 @@
\4${}\}{}$\2\par
\fi
+\M{28}\B\X7:Predeclaration of procedures\X${}\mathrel+\E{}$\5
+\&{static} \&{void} \\{prime\_the\_change\_buffer}(\&{void});\par
+\fi
+
\M{29}While looking for a line that begins with \.{@x} in the change file, we
allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
\.{@z}, or \.{@i} (which would probably mean that the change file is fouled
@@ -1470,7 +1476,7 @@
\\{err\_print}(\.{"!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
-\U28.\fi
+\U27.\fi
\M{30}Here we are looking at lines following the \.{@x}.
@@ -1486,7 +1492,7 @@
\4${}\}{}$\2\6
\4${}\}{}$\2\5
\&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
-\U28.\fi
+\U27.\fi
\M{31}\B\X31:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
and \PB{\\{change\_limit}}\X${}\E{}$\6
@@ -1496,7 +1502,7 @@
${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39(\&{size\_t})(\\{limit}-%
\\{buffer}+\T{1}));{}$\6
\4${}\}{}$\2\par
-\Us28\ET33.\fi
+\Us27\ET32.\fi
\vfil\eject\titletrue
\rightskip=0pt % get out of C mode (cf. \B)
\sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
@@ -1591,7 +1597,7 @@
\.{ { }\\titlefalse \% include headline on the contents page}\cr
\.{ { }\\def\\rheader\{\\mainfont The \{\\tt CWEAVE\}{ }processor\\hfil\}}\cr
\.{ { }\\centerline\{\\titlefont The \{\\ttitlefont CWEAVE\}{ }processor\}}\cr
- \.{ { }\\vskip 15pt \\centerline\{(Version 4.2)\}{ }\\vfill\}}\cr}$$
+ \.{ { }\\vskip 15pt \\centerline\{(Version 4.3)\}{ }\\vfill\}}\cr}$$
Redefining \.{\\rheader}, which is the headline for right-hand pages,
suffices in this case to put the desired information at the top of the
contents page.
Added: trunk/Build/source/texk/web2c/cwebdir/iso_types.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/iso_types.w (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/iso_types.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,95 @@
+ at q This file defines type names introduced in modern dialects @>
+ at q of C and C++ as special entities for TeX formatting @>
+
+ at q C99 and C11 underscore keywords @>
+ at q http://en.cppreference.com/w/c/keyword @>
+
+ at s _Alignas alignas
+ at s _Alignof alignof
+ at s _Atomic int
+ at s _Bool bool
+ at s _Complex complex
+ at s _Generic class
+ at s _Imaginary imaginary
+ at s _Noreturn noreturn
+ at s _Static_assert static_assert
+ at s _Thread_local thread_local
+
+ at q C99 and C11 core language atomic types @>
+ at q http://en.cppreference.com/w/c/atomic @>
+
+ at s atomic_bool bool
+ at s atomic_char char
+ at s atomic_schar char
+ at s atomic_uchar char
+ at s atomic_short short
+ at s atomic_ushort short
+ at s atomic_int int
+ at s atomic_uint int
+ at s atomic_long long
+ at s atomic_ulong long
+ at s atomic_llong long
+ at s atomic_ullong long
+ at s atomic_char8_t char8_t
+ at s atomic_char16_t char16_t
+ at s atomic_char32_t char32_t
+ at s atomic_wchar_t wchar_t
+ at s atomic_int_least8_t int
+ at s atomic_uint_least8_t int
+ at s atomic_int_least16_t int
+ at s atomic_uint_least16_t int
+ at s atomic_int_least32_t int
+ at s atomic_uint_least32_t int
+ at s atomic_int_least64_t int
+ at s atomic_uint_least64_t int
+ at s atomic_int_fast8_t int
+ at s atomic_uint_fast8_t int
+ at s atomic_int_fast16_t int
+ at s atomic_uint_fast16_t int
+ at s atomic_int_fast32_t int
+ at s atomic_uint_fast32_t int
+ at s atomic_int_fast64_t int
+ at s atomic_uint_fast64_t int
+ at s atomic_intptr_t int
+ at s atomic_uintptr_t int
+ at s atomic_ptrdiff_t ptrdiff_t
+ at s atomic_size_t size_t
+ at s atomic_intmax_t int
+ at s atomic_uintmax_t int
+
+ at q C99 preprocessor @>
+
+ at s _Pragma pragma
+
+ at q Integral types of C99 and C++, see @>
+ at q http://en.cppreference.com/w/c/types/integer and @>
+ at q http://en.cppreference.com/w/cpp/types/integer @>
+
+ at s int8_t int
+ at s int16_t int
+ at s int32_t int
+ at s int64_t int
+ at s int_fast8_t int
+ at s int_fast16_t int
+ at s int_fast32_t int
+ at s int_fast64_t int
+ at s int_least8_t int
+ at s int_least16_t int
+ at s int_least32_t int
+ at s int_least64_t int
+ at s intmax_t int
+ at s intptr_t int
+ at s uint8_t int
+ at s uint16_t int
+ at s uint32_t int
+ at s uint64_t int
+ at s uint_fast8_t int
+ at s uint_fast16_t int
+ at s uint_fast32_t int
+ at s uint_fast64_t int
+ at s uint_least8_t int
+ at s uint_least16_t int
+ at s uint_least32_t int
+ at s uint_least64_t int
+ at s uintmax_t int
+ at s uintptr_t int
Property changes on: trunk/Build/source/texk/web2c/cwebdir/iso_types.w
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot 2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: CWEBbin 2021\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:43+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -30,15 +30,15 @@
msgstr ""
#: ctang-texlive.ch:39
-msgid "This is CTANGLE, Version 4.2"
+msgid "This is CTANGLE, Version 4.3"
msgstr ""
#: ctwill-texlive.ch:39
-msgid "This is CTWILL, Version 4.2"
+msgid "This is CTWILL, Version 4.3"
msgstr ""
#: cweav-texlive.ch:39
-msgid "This is CWEAVE, Version 4.2"
+msgid "This is CWEAVE, Version 4.3"
msgstr ""
#: comm-texlive.ch:512
Modified: trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/cweb.pot 2021-04-16 12:49:28 UTC (rev 58884)
@@ -523,15 +523,15 @@
msgstr ""
#: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
msgstr ""
#: cweav-twill.ch:61
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
msgstr ""
#: cweav-i18n.ch:17 cweav-twill.ch:42
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
msgstr ""
#: cweav-i18n.ch:301 cweav-i18n.ch:309
Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po 2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
msgstr ""
"Project-Id-Version: CWEBbin 2021\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:43+0100\n"
-"PO-Revision-Date: 2021-02-06 15:58+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
+"PO-Revision-Date: 2021-04-13 16:46+0200\n"
"Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
"Language-Team: German\n"
"Language: de\n"
@@ -32,16 +32,16 @@
msgstr "%s: Benötige ein bis drei Dateiargumente.\n"
#: ctang-texlive.ch:39
-msgid "This is CTANGLE, Version 4.2"
-msgstr "Dies ist CTANGLE, Version 4.2"
+msgid "This is CTANGLE, Version 4.3"
+msgstr "Dies ist CTANGLE, Version 4.3"
#: ctwill-texlive.ch:39
-msgid "This is CTWILL, Version 4.2"
-msgstr "Dies ist CTWILL, Version 4.2"
+msgid "This is CTWILL, Version 4.3"
+msgstr "Dies ist CTWILL, Version 4.3"
#: cweav-texlive.ch:39
-msgid "This is CWEAVE, Version 4.2"
-msgstr "Dies ist CWEAVE, Version 4.2"
+msgid "This is CWEAVE, Version 4.3"
+msgstr "Dies ist CWEAVE, Version 4.3"
#: comm-texlive.ch:512
#, c-format
Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/cweb.po 2021-04-16 12:49:28 UTC (rev 58884)
@@ -603,16 +603,16 @@
msgstr "Sortieren:"
#: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CTANGLE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CTANGLE (Version 4.3 [CWEBbin 2021])"
#: cweav-twill.ch:61
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CTWILL (Version 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CTWILL (Version 4.3 [CWEBbin 2021])"
#: cweav-i18n.ch:17 cweav-twill.ch:42
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
-msgstr "Dies ist CWEAVE (Version 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
+msgstr "Dies ist CWEAVE (Version 4.3 [CWEBbin 2021])"
#: cweav-i18n.ch:301 cweav-i18n.ch:309
msgid "buffer"
Modified: trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po 2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
msgstr ""
"Project-Id-Version: CWEBbin 2021\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:10+0200\n"
-"PO-Revision-Date: 2021-02-06 15:58+0100\n"
+"POT-Creation-Date: 2021-03-24 12:04+0100\n"
+"PO-Revision-Date: 2021-03-24 12:04+0100\n"
"Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
"Language-Team: German\n"
"Language: de\n"
@@ -55,6 +55,10 @@
msgid "+h print success message on completion"
msgstr "+h schreibe die Erfolgsmeldung am Ende"
+#: help.h:66
+msgid "+k keep separators in numeric literals in the output"
+msgstr "+k konserviere '-Trenner in Zahlen in der Ausgabe"
+
#: help.h:61 help.h:81 help.h:107
msgid "+p print progress report messages"
msgstr "+p schreibe die Fortschrittsmeldungen"
@@ -67,13 +71,17 @@
msgid "+/-v shortcut for '+bhp'; also '--verbose'"
msgstr "+/-v Kurzform für '+bhp'; auch '--verbose'"
-#: help.h:64 help.h:90 help.h:117
+#: help.h:64 help.h:85 help.h:112
+msgid "-c ignore temporary output irrespective of changes"
+msgstr "-c ignoriere temporäre Ausgabe unabhängig von Änderungen"
+
+#: help.h:66 help.h:93 help.h:121
msgid "+s print usage statistics"
msgstr "+s melde die Verbrauchsstatistik"
-#: help.h:65 help.h:91 help.h:118
-msgid "-t ignore temporary output irrespective of changes"
-msgstr "-t ignoriere temporäre Ausgabe unabhängig von Änderungen"
+#: help.h:95 help.h:124
+msgid "+t treat 'typename' in a template like 'typedef'"
+msgstr "+t behandle 'typename' in Templates wie 'typedef'"
#: help.h:66 help.h:92 help.h:119
msgid "--help display this help and exit"
Modified: trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/it/cweb.po 2021-04-16 12:49:28 UTC (rev 58884)
@@ -7,8 +7,8 @@
msgstr ""
"Project-Id-Version: CWEBbin 2021\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:25+0100\n"
-"PO-Revision-Date: 2021-02-06 15:57+0100\n"
+"POT-Creation-Date: 2021-04-13 16:44+0200\n"
+"PO-Revision-Date: 2021-04-13 16:47+0200\n"
"Last-Translator: Andreas Scherer <andreas_github at freenet.de>\n"
"Language-Team: Italian\n"
"Language: it\n"
@@ -598,16 +598,16 @@
msgstr "Ordinamento:"
#: ctang-i18n.ch:17
-msgid "This is CTANGLE (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CTANGLE (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CTANGLE (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CTANGLE (Versione 4.3 [CWEBbin 2021])"
#: cweav-i18n.ch:17
-msgid "This is CWEAVE (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CWEAVE (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CWEAVE (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CWEAVE (Versione 4.3 [CWEBbin 2021])"
#: cweav-twill.ch:68
-msgid "This is CTWILL (Version 4.2 [CWEBbin 2021])"
-msgstr "Questo è CTWILL (Versione 4.2 [CWEBbin 2021])"
+msgid "This is CTWILL (Version 4.3 [CWEBbin 2021])"
+msgstr "Questo è CTWILL (Versione 4.3 [CWEBbin 2021])"
#: cweav-i18n.ch:301 cweav-i18n.ch:309
msgid "buffer"
Modified: trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/po/web2c-help.pot 2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: CWEBbin 2021\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-06 15:10+0200\n"
+"POT-Creation-Date: 2021-03-24 12:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -54,6 +54,10 @@
msgid "+h print success message on completion"
msgstr ""
+#: help.h:66
+msgid "+k keep separators in numeric literals in the output"
+msgstr ""
+
#: help.h:61 help.h:81 help.h:107
msgid "+p print progress report messages"
msgstr ""
@@ -66,12 +70,16 @@
msgid "+/-v shortcut for '+bhp'; also '--verbose'"
msgstr ""
-#: help.h:64 help.h:90 help.h:117
+#: help.h:64 help.h:85 help.h:112
+msgid "-c ignore temporary output irrespective of changes"
+msgstr ""
+
+#: help.h:66 help.h:93 help.h:121
msgid "+s print usage statistics"
msgstr ""
-#: help.h:65 help.h:91 help.h:118
-msgid "-t ignore temporary output irrespective of changes"
+#: help.h:95 help.h:124
+msgid "+t treat 'typename' in a template like 'typedef'"
msgstr ""
#: help.h:66 help.h:92 help.h:119
Modified: trunk/Build/source/texk/web2c/cwebdir/prod-twill.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/prod-twill.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/prod-twill.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,9 +26,8 @@
production number refers to the notes at the end of this section,
which deal with various exceptional cases.
-We use \\{in}, \\{out}, \\{back} and
-\\{bsp} as shorthands for |indent|, |outdent|, |backup| and
-|break_space|, respectively.
+We use \\{in}, \\{out}, \\{back}, \\{bsp}, and \\{din} as shorthands for
+|indent|, |outdent|, |backup|, |break_space|, and |dindent|, respectively.
\begingroup \lineskip=4pt
\def\alt #1 #2
@@ -38,9 +37,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip
\prodno=0 \midcol=2.5in
@@ -58,7 +57,7 @@
& stmt; \ /$\ast\,$comment$\,*$/\cr
\+& |exp| \altt|lbrace| |int_like| |decl|
& |fn_decl| \altt|lbrace| |int_like| |decl|
- \hfill $F=E^*\,|in|\,|in|$ & \malt {\\{main}()$\{$}
+ \hfill $F=E^*\,\\{din}$ & \malt {\\{main}()$\{$}
{\\{main}$(\\{ac},\\{av})$ \&{int} \\{ac};} \cr
\+& |exp| |unop| & |exp| & |x++|\cr
\+& |exp| \alt |binop| |ubinop| |exp| & |exp| & \malt {|x/y|} {|x+y|} \cr
@@ -65,7 +64,7 @@
\+& |exp| |comma| |exp| & |exp| \hfill $EC\,|opt|9\,E$& |f(x,y)|\cr
\+& |exp| \alt {|lpar| |rpar|} |cast| |colon| &
|exp| \alt {|lpar| |rpar|} |cast| |base| &
- \malt \&C|()|: {\&C|int i)|:} \cr
+ \malt \&C|()|: {\&C|(int i)|:} \cr
\+& |exp| |semi| & |stmt| & |x=0;|\cr
\+& |exp| |colon| & |tag| \hfill $E^*C$ & |found:|\cr
\+& |exp| |rbrace| & |stmt| |rbrace| & end of \&{enum} list\cr
@@ -118,7 +117,7 @@
$D=D$\alt $B$ $C$ \unskip$E$ & \malt {\&{int} $f(\&{int}\ x=2)$} |int b:1| \cr
\+& |decl_head| |cast| & |decl_head| & |int f(int)|\cr
\+& |decl_head| \altt|int_like| |lbrace| |decl| & |fn_decl|
- \altt|int_like| |lbrace| |decl| \hfill $F=D\,|in|\,|in|$
+ \altt|int_like| |lbrace| |decl| \hfill $F=D\,\\{din}$
& |long time () {|\cr
\+& |decl_head| |semi| & |decl| & |int n;|\cr
\+& |decl| |decl| & |decl| \hfill $D_1\,|force|\,D_2$ & |int n;double x;|\cr
@@ -161,24 +160,24 @@
\+& |else_like| |colon| & |else_like| |base| & \&{try} :\cr
\+& |else_like| |lbrace| & |else_head| |lbrace| & \&{else} $\{$\cr
\+& |else_like| |stmt| & |stmt| \hfill
- $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+ $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
\+& |else_head| \alt|stmt| |exp| & |stmt| \hfill
- $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & |else{x=0;}|\cr
+ $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & $\!\!$|else{x=0;}|\cr
\+& |if_clause| |lbrace| & |if_head| |lbrace| & |if (x) {|\cr
\+& |if_clause| |stmt| |else_like| |if_like| & |if_like| \hfill
$|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E\,\.\ I$ &
- |if (x) y; else if|\cr
+ $\!\!$|if (x) y; else if|\cr
\+& |if_clause| |stmt| |else_like| & |else_like| \hfill
$|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E$ &
- |if (x) y; else|\cr
+ $\!\!$|if (x) y; else|\cr
\+& |if_clause| |stmt| & |else_like| |stmt| & |if (x)|\cr
\+& |if_head| \alt|stmt| |exp| |else_like| |if_like| & |if_like| \hfill
$|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E\,\.\ I$ &
- |if (x){y;}else if|\cr
+ $\!\!$|if (x){y;}else if|\cr
\+& |if_head| \alt|stmt| |exp| |else_like| & |else_like| \hfill
$|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E$ &
- |if (x){y;}else|\cr
-\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & |if (x){y;}|\cr
+ $\!\!$|if (x){y;}else|\cr
+\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & $\!\!$|if (x){y;}|\cr
\advance\midcol20pt
\+& |do_like| |stmt| |else_like| |semi| & |stmt| \hfill
$D\,\\{bsp}\,|noop|\,|cancel|\,S\,|cancel|\,|noop|\,\\{bsp}\,ES$%
@@ -191,7 +190,7 @@
$C$\alt $C$ $E$ \\{in}\,\\{in} & |catch (...)|\cr
\+& |tag| |tag| & |tag| \hfill $T_1\,\\{bsp}\,T_2$ & |case 0: case 1:|\cr
\+& |tag| \altt|stmt| |decl| |function| & \altt|stmt| |decl| |function|
- \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & |case 0: z=0;|\cr
+ \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & $\!\!$|case 0: z=0;|\cr
\+\dagit& |stmt| \altt|stmt| |decl| |function| &
\altt|stmt| |decl| |function|
\hfill $S\,$\altt$|force|\,S$ $|big_force|\,D$ $|big_force|\,F$ &
@@ -198,11 +197,11 @@
|x=1;y=2;|\cr
\+& |semi| & |stmt| \hfill \.\ $S$& empty statement\cr
\+\dagit& |lproc| \altt |if_like| |else_like| |define_like| & |lproc| &
- \maltt {{\bf \#include}} {\bf\#else} {\bf\#define} \cr
-\+& |lproc| |rproc| & |insert| & {\bf\#endif} \cr
+ \maltt {\#\&{include}} \#\&{else} \#\&{define} \cr
+\+& |lproc| |rproc| & |insert| & \#\&{endif} \cr
\+& |lproc| \alt {|exp| [|exp|]} |function| |rproc| & |insert| \hfill
$I$\.\ \alt {$E{[\.{\ \\5}E]}$} {$F$} &
- \malt{{\bf\#define} $a$\enspace 1} {{\bf\#define} $a$\enspace$\{\,b;\,\}$} \cr
+ \malt{\#\&{define} $a$\enspace 1} {\#\&{define} $a$\enspace$\{\,b;\,\}$} \cr
\+& |section_scrap| |semi| & |stmt|\hfill $MS$ |force|
&$\langle\,$section name$\,\rangle$;\cr
\+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
@@ -265,9 +264,58 @@
\malt |?x:| |?f():| \cr
\+& |begin_arg| |end_arg| & |exp| & \.{@@[}\&{char}$*$\.{@@]}\cr
\+& |any_other| |end_arg| & |end_arg| & \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |decl_head| & |attr| & |alignas(struct s *)| \cr
+\+& |alignas_like| |exp| & |attr| & |alignas(8)| \cr
+\+& |lbrack| |lbrack| & |attr_head| & attribute begins \cr
+\+& |lbrack| & |lpar| & |[| elsewhere \cr
+\+& |rbrack| & |rpar| & |]| elsewhere \cr
+\+& |attr_head| |rbrack| |rbrack| & |attr| & $[[\ldots]]$ \cr
+\+& |attr_head| |exp| & |attr_head| & $[[$|deprecated| \cr
+\+& |attr_head| |using_like| |exp| |colon| & |attr_head| & $[[$|using NS:| \cr
+\+& |attr| \alt|lbrace| |stmt| & \alt|lbrace| |stmt| \hfill $A\.\ $ \alt $S$ $L$ &
+ |[[likely]] {|\cr
+\+& |attr| |tag| & |tag| \hfill $A\.\ T$ & |[[likely]] case 0:| \cr
+\+& |attr| |semi| & |stmt| & |[[fallthrough]];| \cr
+\+& |attr| |attr| & |attr| \hfill $A\.\ A$ & |alignas(x)| $[[\ldots]]$ \cr
+\+& |attr| |decl_head| & |decl_head| & |[[nodiscard]] f()| \cr
+\+& |decl_head| |attr| & |decl_head| & |(int x [[deprecated]])|\cr
+\+& |using_like| & |int_like| & \&{using} not in attributes \cr
+\+& |struct_like| |attr| & |struct_like| \hfill $S\.\ A$ &
+ |struct [[deprecated]]|\cr
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\+& |attr| |typedef_like| & |typedef_like| \hfill $A\.\ T$ &
+ |[[deprecated]] typedef| \cr
+\+& |raw_int| |lbrack| & |exp| & |int[3]| \cr
+\+& |attr_head| |comma| & |attr_head| & $[[$|x, y| \cr
+\+& |if_head| |attr| & |if_head| \hfill $I\.\ A$ & |if (x) [[unlikely]] {| \cr
+\+& |lbrack| |lbrack| |rbrack| |rbrack| & |exp| & |[[]]| \cr
+\+& |attr| |function| & |function| \hfill $A\.\ F$ &
+ attribute and function \cr
+\+& |default_like| |colon| & |case_like| |colon| & |default:| \cr
+\+& |default_like| & |exp| & |f()=default;| \cr
+\+& |struct_like| |struct_like| & |struct_like| \hfill $S\.\ S$ &
+ |enum class| \cr
+\+& |exp| |colcol| |int_like| & |int_like| & $\\{std}\DC\&{atomic}$ \cr
+\advance\midcol-60pt
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |comma| &
+ |langle| \hfill $LS$\alt $E^{**}$ $I^{**}$ $C$ & $\langle$\&{typename} $t,$\cr
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |prerangle| &
+ |cast| \hfill $LS$\alt $E^{**}$ $I^{**}$ $P$ &
+ \hbox{$\langle$\&{typename} $t\rangle$} \hss \cr
+\advance\midcol60pt
+\+& |template_like| |cast| |struct_like| & |struct_like| \hfill $T\.\ CS$ &
+ |template<@t\dots@>> class| \cr
+\+& |tag| |rbrace| & |decl| |rbrace| & @q{@>|public: }| \cr
+\+& |fn_decl| |attr| & |fn_decl| \hfill $F\.\ A$ & |void f() noexcept| \cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
\yskip
\yskip
\yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
\parindent=0pt
\dag{\bf Notes}
\yskip
@@ -296,6 +344,9 @@
Rule 123: The mathness of the |colon| or |base| changes to `yes'.
+Rules 153, 154: |make_reserved| is called only if the \.{+t} option is given
+to \.{CWEAVE}.
+
Rule 200: The |exp| must not be immediately followed by |lpar| or~|exp|.
Rule 202: The |raw_int| must be immediately followed by |semi| or |comma|.
Modified: trunk/Build/source/texk/web2c/cwebdir/prod.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/prod.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/prod.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,9 +26,8 @@
production number refers to the notes at the end of this section,
which deal with various exceptional cases.
-We use \\{in}, \\{out}, \\{back} and
-\\{bsp} as shorthands for |indent|, |outdent|, |backup| and
-|break_space|, respectively.
+We use \\{in}, \\{out}, \\{back}, \\{bsp}, and \\{din} as shorthands for
+|indent|, |outdent|, |backup|, |break_space|, and |dindent|, respectively.
\begingroup \lineskip=4pt
\def\alt #1 #2
@@ -38,9 +37,9 @@
{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
\strut\hbox{#3}\cr}\!\Biggr\}$ }
\def\malt #1 #2
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
\def\maltt #1 #2 #3
-{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+{$\displaystyle\!\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
\strut\hbox{#3}\hfill\cr}$}
\yskip
\prodno=0 \midcol=2.5in
@@ -58,7 +57,7 @@
& stmt; \ /$\ast\,$comment$\,*$/\cr
\+& |exp| \altt|lbrace| |int_like| |decl|
& |fn_decl| \altt|lbrace| |int_like| |decl|
- \hfill $F=E^*\,|in|\,|in|$ & \malt {\\{main}()$\{$}
+ \hfill $F=E^*\,\\{din}$ & \malt {\\{main}()$\{$}
{\\{main}$(\\{ac},\\{av})$ \&{int} \\{ac};} \cr
\+& |exp| |unop| & |exp| & |x++|\cr
\+& |exp| \alt |binop| |ubinop| |exp| & |exp| & \malt {|x/y|} {|x+y|} \cr
@@ -65,7 +64,7 @@
\+& |exp| |comma| |exp| & |exp| \hfill $EC\,|opt|9\,E$& |f(x,y)|\cr
\+& |exp| \alt {|lpar| |rpar|} |cast| |colon| &
|exp| \alt {|lpar| |rpar|} |cast| |base| &
- \malt \&C|()|: {\&C|int i)|:} \cr
+ \malt \&C|()|: {\&C|(int i)|:} \cr
\+& |exp| |semi| & |stmt| & |x=0;|\cr
\+& |exp| |colon| & |tag| \hfill $E^*C$ & |found:|\cr
\+& |exp| |rbrace| & |stmt| |rbrace| & end of \&{enum} list\cr
@@ -118,7 +117,7 @@
$D=D$\alt $B$ $C$ \unskip$E$ & \malt {\&{int} $f(\&{int}\ x=2)$} |int b:1| \cr
\+& |decl_head| |cast| & |decl_head| & |int f(int)|\cr
\+& |decl_head| \altt|int_like| |lbrace| |decl| & |fn_decl|
- \altt|int_like| |lbrace| |decl| \hfill $F=D\,|in|\,|in|$
+ \altt|int_like| |lbrace| |decl| \hfill $F=D\,\\{din}$
& |long time () {|\cr
\+& |decl_head| |semi| & |decl| & |int n;|\cr
\+& |decl| |decl| & |decl| \hfill $D_1\,|force|\,D_2$ & |int n;double x;|\cr
@@ -161,24 +160,24 @@
\+& |else_like| |colon| & |else_like| |base| & \&{try} :\cr
\+& |else_like| |lbrace| & |else_head| |lbrace| & \&{else} $\{$\cr
\+& |else_like| |stmt| & |stmt| \hfill
- $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+ $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & $\!\!$|else x=0;|\cr
\+& |else_head| \alt|stmt| |exp| & |stmt| \hfill
- $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & |else{x=0;}|\cr
+ $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & $\!\!$|else{x=0;}|\cr
\+& |if_clause| |lbrace| & |if_head| |lbrace| & |if (x) {|\cr
\+& |if_clause| |stmt| |else_like| |if_like| & |if_like| \hfill
$|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E\,\.\ I$ &
- |if (x) y; else if|\cr
+ $\!\!$|if (x) y; else if|\cr
\+& |if_clause| |stmt| |else_like| & |else_like| \hfill
$|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E$ &
- |if (x) y; else|\cr
+ $\!\!$|if (x) y; else|\cr
\+& |if_clause| |stmt| & |else_like| |stmt| & |if (x)|\cr
\+& |if_head| \alt|stmt| |exp| |else_like| |if_like| & |if_like| \hfill
$|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E\,\.\ I$ &
- |if (x){y;}else if|\cr
+ $\!\!$|if (x){y;}else if|\cr
\+& |if_head| \alt|stmt| |exp| |else_like| & |else_like| \hfill
$|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E$ &
- |if (x){y;}else|\cr
-\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & |if (x){y;}|\cr
+ $\!\!$|if (x){y;}else|\cr
+\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & $\!\!$|if (x){y;}|\cr
\advance\midcol20pt
\+& |do_like| |stmt| |else_like| |semi| & |stmt| \hfill
$D\,\\{bsp}\,|noop|\,|cancel|\,S\,|cancel|\,|noop|\,\\{bsp}\,ES$%
@@ -191,7 +190,7 @@
$C$\alt $C$ $E$ \\{in}\,\\{in} & |catch (...)|\cr
\+& |tag| |tag| & |tag| \hfill $T_1\,\\{bsp}\,T_2$ & |case 0: case 1:|\cr
\+& |tag| \altt|stmt| |decl| |function| & \altt|stmt| |decl| |function|
- \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & |case 0: z=0;|\cr
+ \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & $\!\!$|case 0: z=0;|\cr
\+\dagit& |stmt| \altt|stmt| |decl| |function| &
\altt|stmt| |decl| |function|
\hfill $S\,$\altt$|force|\,S$ $|big_force|\,D$ $|big_force|\,F$ &
@@ -198,11 +197,11 @@
|x=1;y=2;|\cr
\+& |semi| & |stmt| \hfill \.\ $S$& empty statement\cr
\+\dagit& |lproc| \altt |if_like| |else_like| |define_like| & |lproc| &
- \maltt {{\bf \#include}} {\bf\#else} {\bf\#define} \cr
-\+& |lproc| |rproc| & |insert| & {\bf\#endif} \cr
+ \maltt {\#\&{include}} \#\&{else} \#\&{define} \cr
+\+& |lproc| |rproc| & |insert| & \#\&{endif} \cr
\+& |lproc| \alt {|exp| [|exp|]} |function| |rproc| & |insert| \hfill
$I$\.\ \alt {$E{[\.{\ \\5}E]}$} {$F$} &
- \malt{{\bf\#define} $a$\enspace 1} {{\bf\#define} $a$\enspace$\{\,b;\,\}$} \cr
+ \malt{\#\&{define} $a$\enspace 1} {\#\&{define} $a$\enspace$\{\,b;\,\}$} \cr
\+& |section_scrap| |semi| & |stmt|\hfill $MS$ |force|
&$\langle\,$section name$\,\rangle$;\cr
\+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
@@ -270,9 +269,58 @@
\malt |?x:| |?f():| \cr
\+& |begin_arg| |end_arg| & |exp| & \.{@@[}\&{char}$*$\.{@@]}\cr
\+& |any_other| |end_arg| & |end_arg| & \&{char}$*$\.{@@]}\cr
+\+& |alignas_like| |decl_head| & |attr| & |alignas(struct s *)| \cr
+\+& |alignas_like| |exp| & |attr| & |alignas(8)| \cr
+\+& |lbrack| |lbrack| & |attr_head| & attribute begins \cr
+\+& |lbrack| & |lpar| & |[| elsewhere \cr
+\+& |rbrack| & |rpar| & |]| elsewhere \cr
+\+& |attr_head| |rbrack| |rbrack| & |attr| & $[[\ldots]]$ \cr
+\+& |attr_head| |exp| & |attr_head| & $[[$|deprecated| \cr
+\+& |attr_head| |using_like| |exp| |colon| & |attr_head| & $[[$|using NS:| \cr
+\+& |attr| \alt|lbrace| |stmt| & \alt|lbrace| |stmt| \hfill $A\.\ $ \alt $S$ $L$ &
+ |[[likely]] {|\cr
+\+& |attr| |tag| & |tag| \hfill $A\.\ T$ & |[[likely]] case 0:| \cr
+\+& |attr| |semi| & |stmt| & |[[fallthrough]];| \cr
+\+& |attr| |attr| & |attr| \hfill $A\.\ A$ & |alignas(x)| $[[\ldots]]$ \cr
+\+& |attr| |decl_head| & |decl_head| & |[[nodiscard]] f()| \cr
+\+& |decl_head| |attr| & |decl_head| & |(int x [[deprecated]])|\cr
+\+& |using_like| & |int_like| & \&{using} not in attributes \cr
+\+& |struct_like| |attr| & |struct_like| \hfill $S\.\ A$ &
+ |struct [[deprecated]]|\cr
+\+& |exp| |attr| & |attr| \hfill $E\.\ A$ & \&{enum} $\{x\ [[\ldots]]\}$ \cr
+\+& |attr| |typedef_like| & |typedef_like| \hfill $A\.\ T$ &
+ |[[deprecated]] typedef| \cr
+\+& |raw_int| |lbrack| & |exp| & |int[3]| \cr
+\+& |attr_head| |comma| & |attr_head| & $[[$|x, y| \cr
+\+& |if_head| |attr| & |if_head| \hfill $I\.\ A$ & |if (x) [[unlikely]] {| \cr
+\+& |lbrack| |lbrack| |rbrack| |rbrack| & |exp| & |[[]]| \cr
+\+& |attr| |function| & |function| \hfill $A\.\ F$ &
+ attribute and function \cr
+\+& |default_like| |colon| & |case_like| |colon| & |default:| \cr
+\+& |default_like| & |exp| & |f()=default;| \cr
+\+& |struct_like| |struct_like| & |struct_like| \hfill $S\.\ S$ &
+ |enum class| \cr
+\+& |exp| |colcol| |int_like| & |int_like| & $\\{std}\DC\&{atomic}$ \cr
+\advance\midcol-60pt
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |comma| &
+ |langle| \hfill $LS$\alt $E^{**}$ $I^{**}$ $C$ & $\langle$\&{typename} $t,$\cr
+\+\dagit& |langle| |struct_like| \alt |exp| |int_like| |prerangle| &
+ |cast| \hfill $LS$\alt $E^{**}$ $I^{**}$ $P$ &
+ \hbox{$\langle$\&{typename} $t\rangle$} \hss \cr
+\advance\midcol60pt
+\+& |template_like| |cast| |struct_like| & |struct_like| \hfill $T\.\ CS$ &
+ |template<@t\dots@>> class| \cr
+\+& |tag| |rbrace| & |decl| |rbrace| & @q{@>|public: }| \cr
+\+& |fn_decl| |attr| & |fn_decl| \hfill $F\.\ A$ & |void f() noexcept| \cr
+\+& |alignas_like| |cast| & |attr| & |alignas(int)| \cr
\yskip
\yskip
\yskip
+\yskip
+\yskip
+\yskip
+\yskip
+\yskip
\parindent=0pt
\dag{\bf Notes}
\yskip
@@ -304,4 +352,7 @@
Rule 123: The mathness of the |colon| or |base| changes to `yes'.
+Rules 153, 154: |make_reserved| is called only if the \.{+t} option is given
+to \.{CWEAVE}.
+
\endgroup
Added: trunk/Build/source/texk/web2c/cwebdir/refsort.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/refsort.ch (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/refsort.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,44 @@
+Changes for the REFSORT utility from the CTWILL tarball.
+
+This minimal set of changes tries to satisfy the GCC compiler.
+
+This file is not copyrighted and can be used freely.
+
+ at x
+\datethis
+ at y
+\datethis
+\let\maybe=\iffalse % print only sections that change
+ at z
+
+ at x standard C library interface
+#include "stdio.h"
+#include "strings.h"
+#include "ctype.h"
+ at y
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+ at z
+
+ at x declare return type
+main()
+ at y
+int main()
+ at z
+
+ at x variable not used
+{ register int k;
+ at y
+{
+ at z
+
+ at x add 'Index.' section
+ for (;*p;p++) *q++=*p;
+}
+ at y
+ for (;*p;p++) *q++=*p;
+}
+
+@* Index.
+ at z
Property changes on: trunk/Build/source/texk/web2c/cwebdir/refsort.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/refsort.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/refsort.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/refsort.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -40,9 +40,9 @@
@d abort(c,m) { fprintf(stderr,"%s!\n%s",m,buf); return c; }
@c
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
+#include "stdio.h"
+#include "strings.h"
+#include "ctype.h"
@#
typedef struct {
char key[max_key];
@@ -54,7 +54,7 @@
char buf[max_size]; /* current line of input */
char *input_status; /* |NULL| if end of input reached, else |buf| */
@#
-int main()
+main()
{
register char *p,*q;
register int n; /* current number of items */
@@ -86,7 +86,7 @@
}
@ @<Output the current group@>=
-{
+{ register int k;
for (y=sorted;y<sorted+n;y++) printf("%s\n",(*y)->entry);
printf("\\donewithpage%s\n",cur_page);
}
@@ -162,4 +162,3 @@
for (;*p;p++) *q++=*p;
}
-@* Index.
Modified: trunk/Build/source/texk/web2c/cwebdir/system.bux
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/system.bux 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/system.bux 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,13 +1,16 @@
@$memcmp "<string.h>" \zip@>
@$memcpy "<string.h>" \zip@>
@$strcat "<string.h>" \zip@>
+@$strchr "<string.h>" \zip@>
@$strcmp "<string.h>" \zip@>
@$strcpy "<string.h>" \zip@>
@$strlen "<string.h>" \zip@>
@$strncmp "<string.h>" \zip@>
@$strncpy "<string.h>" \zip@>
+@$strrchr "<string.h>" \zip@>
@$BUFSIZ "<stdio.h>" \zip@>
+@$EOF "<stdio.h>" \zip@>
@$fclose "<stdio.h>" \zip@>
@$feof "<stdio.h>" \zip@>
@$fflush "<stdio.h>" \zip@>
@@ -16,6 +19,7 @@
@$fputs "<stdio.h>" \zip@>
@$fread "<stdio.h>" \zip@>
@$fwrite "<stdio.h>" \zip@>
+@$getc "<stdio.h>" \zip@>
@$printf "<stdio.h>" \zip@>
@$putc "<stdio.h>" \zip@>
@$putchar "<stdio.h>" \zip@>
@@ -24,6 +28,7 @@
@$remove "<stdio.h>" \zip@>
@$sprintf "<stdio.h>" \zip@>
@$stdout "<stdio.h>" \zip@>
+@$ungetc "<stdio.h>" \zip@>
@$getenv "<stdlib.h>" \zip@>
@$exit "<stdlib.h>" \zip@>
@@ -43,7 +48,14 @@
@$bool "<stdbool.h>" \zip@>
@$false "<stdbool.h>" \zip@>
@$true "<stdbool.h>" \zip@>
+
@$ptrdiff_t "<stddef.h>" \zip@>
@$size_t "<stddef.h>" \zip@>
+
@$uint8_t "<stdint.h>" \zip@>
@$uint16_t "<stdint.h>" \zip@>
+
+@$bindtextdomain "<locale.h>" \zip@>
+@$setlocale "<locale.h>" \zip@>
+@$LC_CTYPE "<locale.h>" \zip@>
+@$LC_MESSAGES "<locale.h>" \zip@>
Modified: trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -26,13 +26,12 @@
% Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
% Version 3.64 [2018] --- Andreas Scherer, Octobre 2018
% Version 3.64 [2020] --- Andreas Scherer, May 2020
+% Version 4.3 [2021] --- Andreas Scherer, April 2021
\ifx\undefined\botofcontents\input cwebmac.tex\fi
-\xdef\fmtversion{\fmtversion[2020]}
+\xdef\fmtversion{\fmtversion[2021]}
-\def\Cpp{\CPLUSPLUS/} % for backward compatibility
-
\font\tenss=cmss10 \let\cmntfont\tenss % comment font
\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
Modified: trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/texinputs/pdfctwimac.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -234,6 +234,7 @@
\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
\let\yskip=\smallskip
\def\?{\mathrel?}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
\def\note#1#2.{\par\penalty5000
\Y\noindent{\hangindent2\em\baselineskip10pt%
\eightrm#1~\ifacro{\pdfnote#2.}\else#2\fi.\par}}
@@ -400,7 +401,7 @@
\def\startsection{\titletrue
\line{\smash{\titlefont\title}\quad\hrulefill}\bigskip
\let\startsection=\stsec\stsec}
-\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
\def\A{\note{See also section}} % xref for doubly defined section name
\def\As{\note{See also sections}} % xref for multiply defined section name
\def\B{\iftenpoint\ninepoint\fi
@@ -415,7 +416,7 @@
%\let\SHC\C % "// short comments" treated like "/* ordinary comments */"
\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
-\def\D{\defin{\#define}} % macro definition
+\def\D{\defin{{\rm\#}define}} % macro definition
\let\E=\equiv % equivalence sign
\def\ET{ and~} % conjunction between two section numbers
\def\ETs{, and~} % conjunction between the last two of several section numbers
@@ -469,7 +470,8 @@
\hbox{$\def\?{\kern.2em}%$%
\def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
\def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
- \let\~=\oct \let\^=\hex {#1}$}}%$%
+ \def\%{\cdot 16^{\aftergroup}}% power of sixteen (via dirty trick)
+ \let\~=\oct \let\^=\hex \let\\=\bin{#1}$}}%$%
\def\U{\note{This code is used in section}} % xref for use of a section
\def\Us{\note{This code is used in sections}} % xref for uses of a section
\let\V=\lor % logical or
@@ -484,16 +486,16 @@
%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
-\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
-\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\oct{\hbox{$^\circ$\kern-.1em}\Od}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$}\Hd} % CWEB style
+\def\bin{\hbox{$^{\scriptscriptstyle b}$}\Bd}
+\def\Od#1/{{\it#1}} % octal digit
+\def\Hd#1/{{\tt#1}} % hexadecimal digit
+\def\Bd#1/{{\tt#1}} % binary digit
\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
\hbox{\strut\kern2pt\.{#1}\kern2pt}}
\hrule}\vrule\kern2pt}} % verbatim string
-\def\TeX{{\ifmmode\it\fi
- \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
-\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
-
% now here's the mini-index formatting control
\newcount\nrefs % total number of references in partial page
\newcount\baseno % smallest section number in partial page
@@ -639,7 +641,26 @@
\hsize=\pagewd \vsize=\maxdimen \output={\twillout}
+%\let\page=\pagebody \raggedbottom
+% \def\page{\box255 }\normalbottom % faster, but loses plain TeX footnotes
+%\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
+ %\shipout\vbox{
+ %\vbox to\fullpageht{
+ %\iftitle\global\titlefalse
+ %\else\hbox to\pagewd{\vbox to10pt{}\ifodd\pageno #3\else#2\fi}\fi
+ %\vfill#1}} % parameter #1 is the page itself
+ %\global\advance\pageno by1}
+%\def\topofcontents{\centerline{\titlefont\title}\vskip.7in
+ %\vfill} % this material will start the table of contents page
+%\def\startpdf{\ifpdftex\pdfcatalog{/PageMode /UseOutlines}\else
+ %\ifpdf{\special{pdf: docview << /PageMode /UseOutlines >>}}\fi\fi}
+%\def\botofcontents{\vfill
+ %\centerline{\covernote}} % this material will end the table of contents page
+%\def\covernote{}
\def\contentspagenumber{0} % default page number for table of contents
+%\newdimen\pageshift \pageshift=\hoffset
+ %% shift righthand pages wrt lefthand ones (changed in version 3.70)
+%\def\setpage{\hsize\pagewd\vsize\pageht} % use after changing page size
\def\contentsfile{\jobname.toc} % file that gets table of contents info
\def\readcontents{\input \contentsfile}
\def\readsections{\input \jobname.scn}
@@ -675,6 +696,28 @@
\let\(=\let \let\)=\let \let\[=\let \let\]=\let \let\/=\let
\pdfoutline goto num #3 count -\expnumber{chunk#2.#3} {#5}}}
\let\con=\end % no table of contents
+%\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+ %\rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ %\setpage \output={\normaloutput\page\lheader\rheader}
+ %\titletrue % prepare to output the table of contents
+ %\pageno=\contentspagenumber
+ %\def\grouptitle{TABLE OF CONTENTS}
+ %\message{Table of contents:}
+ %\topofcontents \startpdf
+ %\line{\hfil Section\hbox to3em{\hss Page}}
+ %\let\ZZ=\contentsline
+ %\readcontents\relax % read the contents info
+ %\botofcontents \end} % print the contents page(s) and terminate
+%\def\contentsline#1#2#3#4#5{\ifnum#2=0 \smallbreak\fi
+ %\line{\consetup{#2}#1
+ %\rm\leaders\hbox to .5em{.\hfil}\hfil
+ %\ \ifacro\pdflink{#3}{\romannumeral#3}\else#3\fi\hbox to3em{\hss#4}}}
+%\def\consetup#1{\ifcase#1 \bf % depth -1 (@**)
+ %\or % depth 0 (@*)
+ %\or \hskip2em % depth 1 (@*1)
+ %\or \hskip4em \or \hskip6em \or \hskip8em \or \hskip10em % depth 2,3,4,5
+ %\else \hskip12em \fi} % depth 6 or more
\def\datethis{} \def\datecontentspage{}
% To produce only a subset of pages, put the page numbers on separate
Added: trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,9 @@
+% special TeX strings from 'ctwill.w':
+\def\copyxTeX{\\{copy\_\TEX/}}
+\def\skipxTeX{\\{skip\_\TEX/}}
+\def\TeXxstring{\\{\TEX/\_string}}
+
+\pageno=101 % dummy page number
+\preinx % pre-index text on full pagewidth
+\noindent Some introductory words about this full index.
+\inx % two-column index
Property changes on: trunk/Build/source/texk/web2c/cwebdir/twinx-startup.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/texk/web2c/cwebdir/twinx.ch
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx.ch (rev 0)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx.ch 2021-04-16 12:49:28 UTC (rev 58884)
@@ -0,0 +1,156 @@
+Changes for the TWINX utility from the CTWILL tarball.
+
+This minimal set of changes tries to satisfy the GCC compiler
+and it fixes a few minor issues. See the comments after '@x'.
+
+This file is not copyrighted and can be used freely.
+
+Limbo.
+
+ at x l.1
+\datethis
+ at y
+\datethis
+\let\maybe=\iffalse % print only sections that change
+ at z
+
+Section 1.
+
+ at x l.10 Standard C interface.
+#include <stdio.h>
+ at y
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+ at z
+
+ at x l.15
+main(argc,argv)
+ int argc;
+ char *argv[];
+ at y
+int main(
+ int argc,
+ char *argv[])
+ at z
+
+ at x l.21
+ f=fopen(*++argv,"r");
+ if (!f)
+ at y
+ if((f=fopen(*++argv,"r"))==NULL)
+ at z
+
+ at x l.28
+ f=fopen(*argv,"r");
+ if (!f)
+ at y
+ if((f=fopen(*argv,"r"))==NULL)
+ at z
+
+Section 3.
+
+ at x l.49 Document minor change in behavior.
+@ @<Scan file |f|...@>=
+ at y
+@ For your convenience, \.{TWINX} grabs the first ``word'' in \.{\\title} and
+turns it into uppercase form.
+
+@<Scan file |f|...@>=
+ at z
+
+ at x l.57 FIX: Fetch only the first word from the '\title'.
+ for (p=buf+11,q=title;*p && *p!='}';p++) *q++=*p;
+ at y
+ for (p=buf+11,q=title;*p&&*p!=' '&&*p!='}';p++) *q++=toupper(*p);
+ at z
+
+Section 4.
+
+ at x l.96
+@<Type...@>=
+ at y
+ at s node_struct int
+
+@<Type...@>=
+ at z
+
+ at x l.102 Compiler warning.
+ char *id;
+ at y
+ const char *id;
+ at z
+
+Section 5.
+
+ at x l.115
+char *save_string(s)
+ char *s;
+ at y
+char *save_string(
+ char *s)
+ at z
+
+Section 6.
+
+ at x l.145
+node *new_node()
+ at y
+node *new_node(void)
+ at z
+
+Section 11.
+
+ at x l.216 FIX: Don't count masked braces.
+ if (*p=='{') bal++;
+ else if (*p=='}') bal--;
+ at y
+ switch (*p) {
+ case '\\': *q++=*p++; break;
+ case '{': bal++; break;
+ case '}': bal--; break;
+ }
+ at z
+
+Section 17.
+
+ at x l.347
+int compare(p,q)
+ node *p,*q;
+ at y
+int compare(
+ node *p, node *q)
+ at z
+
+Section 19.
+
+ at x l.379 Compiler warning.
+ for (j=1;collate[j];j++) ord[collate[j]]=j;
+ at y
+ for (j=1;collate[j];j++) ord[(int)collate[j]]=j;
+ at z
+
+Section 20.
+
+ at x l.390
+collapse(p,q)
+ node *p,*q;
+ at y
+void collapse(
+ node *p, node *q)
+ at z
+
+Section 22.
+
+ at x l.414 Compiler warning.
+{@+register char *p=x->id;
+ at y
+{@+register const char *p=x->id;
+ at z
+
+ at x l.434 FIX: Don't mask already masked underscore.
+ if (*p=='_') putchar('\\');
+ at y
+ if (*p=='_'&&*(p-1)!='\\') putchar('\\');
+ at z
Property changes on: trunk/Build/source/texk/web2c/cwebdir/twinx.ch
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/cwebdir/twinx.w
===================================================================
--- trunk/Build/source/texk/web2c/cwebdir/twinx.w 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/cwebdir/twinx.w 2021-04-16 12:49:28 UTC (rev 58884)
@@ -8,16 +8,13 @@
@c
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
@<Type definitions@>@;
@<Global variables@>@;
@<Procedures@>@;
@#
-int main(
- int argc,
- char *argv[])
+main(argc,argv)
+ int argc;
+ char *argv[];
{ @<Local variables@>;
@<Initialize the data structures@>;
while (--argc) {
@@ -102,7 +99,7 @@
struct node_struct *n;
} mixed;
typedef struct node_struct {
- const char *id;
+ char *id;
mixed data;
struct node_struct *next;
} node;
@@ -115,8 +112,8 @@
@d string_block_size 8192 /* number of bytes per string block */
@<Proc...@>=
-char *save_string(
- char *s)
+char *save_string(s)
+ char *s;
{
register char *p,*q; register int l;
for (p=s;*p;p++) ;
@@ -145,7 +142,7 @@
@d nodes_per_block 340
@<Proc...@>=
-node *new_node(void)
+node *new_node()
{
if (next_node==bad_node) {
next_node=(node*)calloc(nodes_per_block,sizeof(node));
@@ -347,8 +344,8 @@
two characters of the |id| field).
@<Proc...@>=
-int compare(
- node *p, node *q)
+int compare(p,q)
+ node *p,*q;
{@+register unsigned char *pp,*qq;
for (pp=(unsigned char*)p->id+3,qq=(unsigned char*)q->id+3;
*pp&&ord[*pp]==ord[*qq];pp++,qq++) ;
@@ -379,7 +376,7 @@
!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|~_\
abcdefghijklmnopqrstuvwxyz0123456789");
{@+register int j;
- for (j=1;collate[j];j++) ord[(int)collate[j]]=j;
+ for (j=1;collate[j];j++) ord[collate[j]]=j;
ord[128]=j; /* this affects the ordering of |sentinel.id| */
for (j='A';j<='Z';j++) ord[j]=ord[tolower(j)];
}
@@ -390,8 +387,8 @@
|q->data.n| should not be considered an active pointer.
@<Proc...@>=
-void collapse(
- node *p, node *q)
+collapse(p,q)
+ node *p,*q;
{@+register node *x;
for (x=q->data.n;x->next;x=x->next) ;
x->next=p->data.n;
@@ -414,7 +411,7 @@
}
@ @<Output |x->id|...@>=
-{@+register const char *p=x->id;
+{@+register char *p=x->id;
if (*p==' ') {
if (*(p+1)!=' ') goto unknown;
goto known;
Modified: trunk/Build/source/texk/web2c/help.h
===================================================================
--- trunk/Build/source/texk/web2c/help.h 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/help.h 2021-04-16 12:49:28 UTC (rev 58884)
@@ -61,9 +61,10 @@
"+p print progress report messages",
"+/-q shortcut for '-bhp'; also '--quiet' (default)",
"+/-v shortcut for '+bhp'; also '--verbose'",
+ "-c ignore temporary output irrespective of changes",
"-dN set 'kpathsea_debug' to N (0..127)",
+ "+k keep separators in numeric literals in the output",
"+s print usage statistics",
- "-t ignore temporary output irrespective of changes",
"--help display this help and exit",
"--version output version information and exit",
NULL
@@ -82,6 +83,7 @@
"+p print progress report messages",
"+/-q shortcut for '-bhp'; also '--quiet' (default)",
"+/-v shortcut for '+bhp'; also '--verbose'",
+ "-c ignore temporary output irrespective of changes",
"-dN set 'kpathsea_debug' to N (0..127)",
"-e do not enclose C material in \\PB{...}",
"-f do not force a newline after every C statement in output",
@@ -90,7 +92,7 @@
"-x omit indices, section names, table of contents",
"+lX use macros for language X as of Xcwebmac.tex",
"+s print usage statistics",
- "-t ignore temporary output irrespective of changes",
+ "+t treat 'typename' in a template like 'typedef'",
"--help display this help and exit",
"--version output version information and exit",
NULL
@@ -109,6 +111,7 @@
"+p print progress report messages",
"+/-q shortcut for '-bhp'; also '--quiet' (default)",
"+/-v shortcut for '+bhp'; also '--verbose'",
+ "-c ignore temporary output irrespective of changes",
"-dN set 'kpathsea_debug' to N (0..127)",
"-e do not enclose C material in \\PB{...}",
"-f do not force a newline after every C statement in output",
@@ -118,7 +121,7 @@
"+P \\input ctproofmac.tex instead of ctwimac.tex",
"+/-lX use macros for language X as of Xct{wi|proof}mac.tex",
"+s print usage statistics",
- "-t ignore temporary output irrespective of changes",
+ "+t treat 'typename' in a template like 'typedef'",
"--help display this help and exit",
"--version output version information and exit",
NULL
Modified: trunk/Build/source/texk/web2c/man/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/man/ChangeLog 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/ChangeLog 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,3 +1,12 @@
+2021-04-16 Andreas Scherer <https://ascherer.github.io>
+
+ * ctwill.man,
+ * cweb.man: CWEB 4.3 release.
+
+2021-03-07 Andreas Scherer <https://ascherer.github.io>
+
+ * ctwill.man: Document 'ctwill-twinx' a bit more.
+
2021-03-04 Karl Berry <karl at freefriends.org>
* gftodvi.man: font and spacing fixes from Debian.
Modified: trunk/Build/source/texk/web2c/man/ctwill.man
===================================================================
--- trunk/Build/source/texk/web2c/man/ctwill.man 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/ctwill.man 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 2.11.4
+.\" Automatically generated by Pandoc 2.12
.\"
-.TH "CTWILL" "1" "February 6, 2021" "Web2c @VERSION@" "General Commands Manual"
+.TH "CTWILL" "1" "April 13, 2021" "Web2c @VERSION@" "General Commands Manual"
.hy
.SH NAME
.PP
@@ -48,7 +48,7 @@
change file to apply, you can use `\f[B]-\f[R]' as the second argument.
.PP
\f[B]ctwill\f[R] is exactly like \f[B]cweave\f[R] except that it
-produces much better documentation, for which you must work harder.
+produces much better documentation, for which you must work much harder.
You should run \f[B]ctwill\f[R] twice, once to prime the pump and once
to get decent answers.
Moreover, you must run the output twice through TeX.
@@ -60,9 +60,14 @@
foo\f[R] will produce alphabetized output.
.PP
The \f[B]ctwill-twinx\f[R] program compiles a master index for a set of related
-programs that have been processed by \f[B]ctwill\f[R].
+programs that have been processed by \f[B]ctwill\f[R] (\f[I]not\f[R] by
+\f[B]cweave\f[R], mind you!).
The individual programs should define their names with a line of the
form \f[B]\[rs]def\[rs]title{NAME}\f[R].
+For your convenience, \f[B]ctwill-twinx\f[R] grabs the first \[lq]word\[rq] in
+\f[B]\[rs]title\f[R] and turns it into uppercase form.
+You should adapt file \f[B]twinx-startup.tex\f[R] for the first page of
+the master index.
.PP
The mini-indexes list identifiers that are used but not defined on each
two-page spread.
@@ -106,13 +111,13 @@
to be a drop-in replacement for the original package.
There are, however, a few differences worth noting:
.IP \[bu] 2
-This version is based on the most recent version of CWEB (4.2).
+This version is based on the most recent version of CWEB (4.3).
.IP \[bu] 2
In TeX\ Live the utility programs are prefixed with \f[B]ctwill-\f[R]
and the macro files with \f[B]ct\f[R] for technical reasons.
.IP \[bu] 2
Options \f[B]--help\f[R], \f[B]--quiet\f[R], \f[B]--verbose\f[R],
-\f[B]--version\f[R], and flags \f[B]-i\f[R], \f[B]-o\f[R], \f[B]-t\f[R],
+\f[B]--version\f[R], and flags \f[B]-c\f[R], \f[B]-i\f[R], \f[B]-o\f[R],
and \f[B]+lX\f[R] are new in CWEBbin and TeX\ Live.
.IP \[bu] 2
Option \f[B]+lX\f[R] is accompanied by example wrapper files for
@@ -153,6 +158,8 @@
\f[B]+v\f[R]/\f[B]-v\f[R]: shortcut for \f[B]+bhp\f[R]; also
\f[B]--verbose\f[R]
.IP \[bu] 2
+\f[B]-c\f[R]: ignore temporary output irrespective of changes
+.IP \[bu] 2
\f[B]-e\f[R]: do not enclose C/C++\ material in \f[B]\[rs]PB{\&...}\f[R]
.IP \[bu] 2
\f[B]-f\f[R]: do not force a newline after every C/C++\ statement in
@@ -162,8 +169,6 @@
.IP \[bu] 2
\f[B]-o\f[R]: suppress separation of declarations and statements
.IP \[bu] 2
-\f[B]-t\f[R]: ignore temporary output irrespective of changes
-.IP \[bu] 2
\f[B]-x\f[R]: omit indices, section names, table of contents
.IP \[bu] 2
\f[B]+P\f[R]: \f[B]\[rs]input ctproofmac.tex\f[R] instead of
@@ -174,6 +179,9 @@
.IP \[bu] 2
\f[B]+s\f[R]: print usage statistics
.IP \[bu] 2
+\f[B]+t\f[R]: treat \f[B]typename\f[R] in a template like
+\f[B]typedef\f[R]
+.IP \[bu] 2
\f[B]--help\f[R]: display help message and exit
.IP \[bu] 2
\f[B]--version\f[R]: output version information and exit
Modified: trunk/Build/source/texk/web2c/man/cweb.man
===================================================================
--- trunk/Build/source/texk/web2c/man/cweb.man 2021-04-15 23:42:56 UTC (rev 58883)
+++ trunk/Build/source/texk/web2c/man/cweb.man 2021-04-16 12:49:28 UTC (rev 58884)
@@ -1,6 +1,6 @@
-.\" Automatically generated by Pandoc 2.11.4
+.\" Automatically generated by Pandoc 2.12
.\"
-.TH "CWEB" "1" "September 23, 2020" "Web2c @VERSION@" "General Commands Manual"
+.TH "CWEB" "1" "April 13, 2021" "Web2c @VERSION@" "General Commands Manual"
.hy
.SH NAME
.PP
@@ -55,7 +55,7 @@
There are, however, a few differences worth noting:
.IP \[bu] 2
Options \f[B]--help\f[R], \f[B]--quiet\f[R], \f[B]--verbose\f[R],
-\f[B]--version\f[R], and flags \f[B]-i\f[R], \f[B]-o\f[R], \f[B]-t\f[R],
+\f[B]--version\f[R], and flags \f[B]-c\f[R], \f[B]-i\f[R], \f[B]-o\f[R],
and \f[B]+lX\f[R] are new in CWEBbin and TeX\ Live.
.IP \[bu] 2
Option \f[B]+lX\f[R] is accompanied by several wrapper files for
@@ -95,16 +95,20 @@
\f[B]+v\f[R]/\f[B]-v\f[R]: shortcut for \f[B]+bhp\f[R]; also
\f[B]--verbose\f[R]
.IP \[bu] 2
+\f[B]-c\f[R]: ignore temporary output irrespective of changes
+.IP \[bu] 2
\f[B]+s\f[R]: print usage statistics
.IP \[bu] 2
-\f[B]-t\f[R]: ignore temporary output irrespective of changes
-.IP \[bu] 2
\f[B]--help\f[R]: display help message and exit
.IP \[bu] 2
\f[B]--version\f[R]: output version information and exit
.PP
-There are six other options applicable to \f[B]cweave\f[R] only:
+There is one other option applicable to \f[B]ctangle\f[R] only:
.IP \[bu] 2
+\f[B]+k\f[R]: keep separators in numeric literals in the output
+.PP
+There are seven other options applicable to \f[B]cweave\f[R] only:
+.IP \[bu] 2
\f[B]-e\f[R]: do not enclose C/C++\ material in \f[B]\[rs]PB{\&...}\f[R]
.IP \[bu] 2
\f[B]-f\f[R]: do not force a newline after every C/C++\ statement in
@@ -118,6 +122,9 @@
.IP \[bu] 2
\f[B]+lX\f[R]/\f[B]-lX\f[R]: use macros for language \f[I]X\f[R] as of
\f[I]X\f[R]\f[B]cwebmac.tex\f[R]
+.IP \[bu] 2
+\f[B]+t\f[R]: treat \f[B]typename\f[R] in a template like
+\f[B]typedef\f[R]
.SH ENVIRONMENT
.PP
The environment variable CWEBINPUTS is used to search for the input
More information about the tex-live-commits
mailing list.