summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/web2c/cwebdir/cweav-w2c.ch
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/cwebdir/cweav-w2c.ch')
-rw-r--r--Build/source/texk/web2c/cwebdir/cweav-w2c.ch713
1 files changed, 713 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/cwebdir/cweav-w2c.ch b/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
new file mode 100644
index 00000000000..3f63105075a
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
@@ -0,0 +1,713 @@
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
+
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
+
+@q This stripped change file {comm,ctang,cweav,ctwill,cwebman}-w2c.ch @>
+@q has been created from the elaborate set of change files @>
+@q {comm,ctang,cweav,cwebman}-patch.ch, @>
+@q {comm,cweav,cwebman}-extensions.ch, {comm,ctang,cweav}-output.ch, @>
+@q {comm,ctang,cweav}-i18n.ch, and cweav-twill.ch for CTWILL, and @>
+@q {comm,ctang,cweav,ctwill,cwebman}-texlive.ch with the 'tie' processor @>
+@q and is used as a monolithic changefile for {common,ctangle,cweave}.w @>
+@q and cwebman.tex in TeX Live. @>
+
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+
+@x
+\def\title{CWEAVE (Version 4.2)}
+@y
+\def\title{CWEAVE (Version 4.2 [\TeX~Live])}
+@z
+
+@x
+ \centerline{(Version 4.2)}
+@y
+ \centerline{(Version 4.2 [\TeX~Live])}
+@z
+
+@x
+\def\botofcontents{\vfill
+@y
+\def\covernote{\vbox{%
+@z
+
+@x
+}
+@y
+}}\datecontentspage
+@z
+
+@x
+@d banner "This is CWEAVE (Version 4.2)"
+@y
+@d banner "This is CWEAVE, Version 4.2"
+ /* will be extended by the \TeX~Live |versionstring| */
+@z
+
+@x
+ if (show_banner) puts(banner); /* print a ``banner line'' */
+@y
+ if (show_banner) cb_show_banner(); /* print a ``banner line'' */
+@z
+
+@x
+@i common.h
+@y
+@i comm-w2c.h
+@z
+
+@x
+@d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
+@y
+@d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
+@z
+
+@x
+ err_print("! String didn't end"); loc=limit; break;
+@y
+ err_print(_("! String didn't end")); loc=limit; break;
+@z
+
+@x
+ err_print("! Input ended in middle of string"); loc=buffer; break;
+@y
+ err_print(_("! Input ended in middle of string")); loc=buffer; break;
+@z
+
+@x
+ fputs("\n! String too long: ",stdout);
+@y
+ fputs(_("\n! String too long: "),stdout);
+@z
+
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
+
+@x
+ err_print("! Input ended in section name");
+@y
+ err_print(_("! Input ended in section name"));
+@z
+
+@x
+ fputs("\n! Section name too long: ",stdout);
+@y
+ fputs(_("\n! Section name too long: "),stdout);
+@z
+
+@x
+ err_print("! Section name didn't end"); break;
+@y
+ err_print(_("! Section name didn't end")); break;
+@z
+
+@x
+ err_print("! Control codes are forbidden in section name"); break;
+@y
+ err_print(_("! Control codes are forbidden in section name")); break;
+@z
+
+@x
+ err_print("! Control text didn't end"); loc=limit;
+@y
+ err_print(_("! Control text didn't end")); loc=limit;
+@z
+
+@x
+ err_print("! Control codes are forbidden in control text");
+@y
+ err_print(_("! Control codes are forbidden in control text"));
+@z
+
+@x
+ if (loc>=limit) err_print("! Verbatim string didn't end");
+@y
+ if (loc>=limit) err_print(_("! Verbatim string didn't end"));
+@z
+
+@x
+ if (++section_count==max_sections) overflow("section number");
+@y
+ if (++section_count==max_sections) overflow(_("section number"));
+@z
+
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
+
+@x
+ err_print("! Missing left identifier of @@s");
+@y
+ err_print(_("! Missing left identifier of @@s"));
+@z
+
+@x
+ err_print("! Missing right identifier of @@s");
+@y
+ err_print(_("! Missing right identifier of @@s"));
+@z
+
+@x
+ fputs("\n! Never defined: <",stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never defined: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@z
+
+@x
+ fputs("\n! Never used: <",stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never used: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@z
+
+@x
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be
+`\.{\\input cwebmac}'.
+
+@<Start \TEX/...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file;
+*out_ptr='c'; tex_printf("\\input cwebma");
+@y
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be dependent of
+the user language set by the `\.{+l}' option and its argument. If you call
+\.{CWEAVE} with `\.{+lX}' (or `\.{-lX}' as well), where `\.X' is the
+(possibly empty) string of characters to the right of~`\.l', `\.X'~will be
+prepended to `\.{cwebmac.tex}', e.g., if you call \.{CWEAVE} with
+`\.{+ldeutsch}', you will receive the line `\.{\\input deutschcwebmac}'.
+Without this option the first line of the output file will be
+`\.{\\input cwebmac}'.
+
+@<Start \TEX/...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file; *out_ptr='c';
+tex_puts("\\input ");
+tex_printf(use_language);
+tex_puts("cwebma");
+@z
+
+@x
+ printf("\n! Line had to be broken (output l. %d):\n",out_line);
+@y
+ printf(_("\n! Line had to be broken (output l. %d):\n"),out_line);
+@z
+
+@x
+ default: err_print("! Double @@ should be used in limbo");
+@y
+ default: err_print(_("! Double @@ should be used in limbo"));
+@z
+
+@x
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
+@y
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow(_("token")); *(tok_ptr++)=c;}
+@z
+
+@x
+ err_print("! Input ended in mid-comment");
+@y
+ err_print(_("! Input ended in mid-comment"));
+@z
+
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ else {err_print("! Extra } in comment");
+@y
+ else {err_print(_("! Extra } in comment"));
+@z
+
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ err_print("! Illegal use of @@ in comment");
+@y
+ err_print(_("! Illegal use of @@ in comment"));
+@z
+
+@x
+@d inner_tok_flag 5*id_flag /* signifies a token list in `\pb' */
+
+@c
+static void
+print_text(@t\1\1@> /* 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| */
+@z
+
+@x
+}
+@y
+}
+#endif
+@z
+
+@x
+@ @<Predecl...@>=@+static void print_text(text_pointer p);
+@y
+@ @<Predecl...@>=
+#if 0
+static void print_text(text_pointer p);
+#endif
+@z
+
+@x
+@<Cases for |exp|@>=
+if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ 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);
+ }
+ reduce(pp,1,fn_decl,0,1);
+}
+@z
+
+@x
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ 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);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ 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);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@y
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ 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);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ 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);
+ }
+ reduce(pp,1,fn_decl,0,38);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@z
+
+@x
+@ @<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ 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);
+}
+@y
+@ @<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ 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);
+}
+@z
+
+@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);
+}
+else if (cat1==stmt) {
+ big_app1(pp); app(outdent); app(outdent); big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@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);
+}
+else if (cat1==stmt) {
+ big_app1(pp);
+ if (indent_param_decl) {
+ app(outdent); app(outdent);
+ }
+ big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@z
+
+@x
+ overflow("token");
+@y
+ overflow(_("token"));
+@z
+
+@x
+ overflow("text");
+@y
+ overflow(_("text"));
+@z
+
+@x
+ if (tok_ptr+6>tok_mem_end) overflow("token");
+@y
+ if (tok_ptr+6>tok_mem_end) overflow(_("token"));
+@z
+
+@x
+ printf("\nIrreducible scrap sequence in section %d:",section_count);
+@y
+ printf(_("\nIrreducible scrap sequence in section %d:"),section_count);
+@z
+
+@x
+ printf("\nTracing after l. %d:\n",cur_line); mark_harmless;
+@y
+ printf(_("\nTracing after l. %d:\n"),cur_line); mark_harmless;
+@z
+
+@x
+ overflow("scrap/token/text");
+@y
+ overflow(_("scrap/token/text"));
+@z
+
+@x
+ else err_print("! Double @@ should be used in strings");
+@y
+ else err_print(_("! Double @@ should be used in strings"));
+@z
+
+@x
+ if (next_control!='|') err_print("! Missing '|' after C text");
+@y
+ if (next_control!='|') err_print(_("! Missing '|' after C text"));
+@z
+
+@x
+ if (stack_ptr==stack_end) overflow("stack");
+@y
+ if (stack_ptr==stack_end) overflow(_("stack"));
+@z
+
+@x
+ fputs("\n! Illegal control code in section name: <",stdout);
+@y
+ fputs(_("\n! Illegal control code in section name: <"),stdout);
+@z
+
+@x
+ fputs("\n! C text in section name didn't end: <",stdout);
+@y
+ fputs(_("\n! C text in section name didn't end: <"),stdout);
+@z
+
+@x
+ if (j>buffer+long_buf_size-3) overflow("buffer");
+@y
+ if (j>buffer+long_buf_size-3) overflow(_("buffer"));
+@z
+
+@x
+ if (j>buffer+long_buf_size-4) overflow("buffer");
+@y
+ if (j>buffer+long_buf_size-4) overflow(_("buffer"));
+@z
+
+@x
+reset_input(); if (show_progress) fputs("\nWriting the output file...",stdout);
+@y
+reset_input(); if (show_progress) fputs(_("\nWriting the output file..."),stdout);
+@z
+
+@x
+ err_print("! TeX string should be in C text only"); break;
+@y
+ err_print(_("! TeX string should be in C text only")); break;
+@z
+
+@x
+ err_print("! You can't do that in TeX text"); break;
+@y
+ err_print(_("! You can't do that in TeX text")); break;
+@z
+
+@x
+ err_print("! Improper macro definition");
+@y
+ err_print(_("! Improper macro definition"));
+@z
+
+@x
+ default: err_print("! Improper macro definition"); break;
+@y
+ default: err_print(_("! Improper macro definition")); break;
+@z
+
+@x
+ if (scrap_ptr!=scrap_info+2) err_print("! Improper format definition");
+@y
+ if (scrap_ptr!=scrap_info+2) err_print(_("! Improper format definition"));
+@z
+
+@x
+ err_print("! You need an = sign after the section name");
+@y
+ err_print(_("! You need an = sign after the section name"));
+@z
+
+@x
+ err_print("! You can't do that in C text");
+@y
+ err_print(_("! You can't do that in C text"));
+@z
+
+@x
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ finish_line();
+}
+@y
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ active_file=tex_file;
+}
+@z
+
+@x
+ phase=3; if (show_progress) fputs("\nWriting the index...",stdout);
+@y
+ phase=3; if (show_progress) fputs(_("\nWriting the index..."),stdout);
+@z
+
+@x
+ fatal("! Cannot open index file ",idx_file_name);
+@y
+ fatal(_("! Cannot open index file "),idx_file_name);
+@z
+
+@x
+ fatal("! Cannot open section file ",scn_file_name);
+@y
+ fatal(_("! Cannot open section file "),scn_file_name);
+@z
+
+@x
+@.\\end@>
+ finish_line();
+ fclose(active_file);
+}
+@y
+@.\\end@>
+}
+finish_line(); fclose(active_file); active_file=NULL;
+@<Update the result when it has changed@>@;
+@z
+
+@x
+ fputs("Done.",stdout);
+@y
+ fputs(_("Done."),stdout);
+@z
+
+@x
+ if (sort_ptr>=scrap_info_end) overflow("sorting");
+@y
+ if (sort_ptr>=scrap_info_end) overflow(_("sorting"));
+@z
+
+@x
+ puts("\nMemory usage statistics:");
+@.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);
+ 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);
+@y
+ puts(_("\nMemory usage statistics:"));
+@.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);
+ 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);
+@z
+
+@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.
+
+Care has been taken to keep the original section numbering intact, so this new
+material should nicely integrate with the original ``\&{263.~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.
+
+@d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+
+@<Set init...@>=
+indent_param_decl=true;
+
+@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
+not yet present. Here is a simple implementation. The purpose is to suppress
+the extra space between local variable declarations and the first statement in
+a function block.
+
+@d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
+
+@<Set init...@>=
+order_decl_stmt=true;
+
+@* Output file update. Most \CEE/ projects are controlled by a
+\.{Makefile} that automatically takes care of the temporal dependecies
+between the different source modules. It is suitable that \.{CWEB} doesn't
+create new output for all existing files, when there are only changes to
+some of them. Thus the \.{make} process will only recompile those modules
+where necessary. The idea and basic implementation of this mechanism can
+be found in the program \.{NUWEB} by Preston Briggs, to whom credit is due.
+
+@<Update the result...@>=
+if((tex_file=fopen(tex_file_name,"r"))!=NULL) {
+ char x[BUFSIZ],y[BUFSIZ];
+ int x_size,y_size,comparison=false;
+
+ if((check_file=fopen(check_file_name,"r"))==NULL)
+ fatal(_("! Cannot open output file "),check_file_name);
+@.Cannot open output file@>
+
+ if (temporary_output) @<Compare the temporary output...@>@;
+
+ fclose(tex_file); tex_file=NULL;
+ fclose(check_file); check_file=NULL;
+
+ @<Take appropriate action depending on the comparison@>@;
+} else
+ rename(check_file_name,tex_file_name); /* This was the first run */
+
+strcpy(check_file_name,""); /* We want to get rid of the temporary file */
+
+@ We hope that this runs fast on most systems.
+
+@<Compare the temporary output to the previous output@>=
+do {
+ x_size = fread(x,1,BUFSIZ,tex_file);
+ y_size = fread(y,1,BUFSIZ,check_file);
+ comparison = (x_size == y_size); /* Do not merge these statements! */
+ if(comparison) comparison = !memcmp(x,y,x_size);
+} while(comparison && !feof(tex_file) && !feof(check_file));
+
+@ Note the superfluous call to |remove| before |rename|. We're using it to
+get around a bug in some implementations of |rename|.
+
+@<Take appropriate action...@>=
+if(comparison)
+ remove(check_file_name); /* The output remains untouched */
+else {
+ remove(tex_file_name);
+ rename(check_file_name,tex_file_name);
+}
+
+@* 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.
+
+@d max_banner 50
+
+@<Common code...@>=
+extern char cb_banner[];
+
+@ @<Set init...@>=
+ strncpy(cb_banner,banner,max_banner-1);
+
+@** Index.
+@z
+