summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/cwebdir
diff options
context:
space:
mode:
authorAndreas Scherer <andreas_tex@freenet.de>2020-06-07 15:37:44 +0000
committerAndreas Scherer <andreas_tex@freenet.de>2020-06-07 15:37:44 +0000
commit004df680339fe22612e027793221d8cb4d11eec0 (patch)
tree88d5258b1e0eb4d8b17c4b537290a32ca003cf8b /Build/source/texk/web2c/cwebdir
parent488c5d94d7fc969aa9ace08e38038c6bf0d1e952 (diff)
[CWEB] Handle special 'files' as secondary output.
git-svn-id: svn://tug.org/texlive/trunk@55464 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/cwebdir')
-rw-r--r--Build/source/texk/web2c/cwebdir/ChangeLog4
-rw-r--r--Build/source/texk/web2c/cwebdir/ctang-w2c.ch59
2 files changed, 57 insertions, 6 deletions
diff --git a/Build/source/texk/web2c/cwebdir/ChangeLog b/Build/source/texk/web2c/cwebdir/ChangeLog
index ea272b92180..72a93185f46 100644
--- a/Build/source/texk/web2c/cwebdir/ChangeLog
+++ b/Build/source/texk/web2c/cwebdir/ChangeLog
@@ -1,5 +1,9 @@
2020-06-07 Andreas Scherer <https://ascherer.github.io>
+ * ctang-w2c.ch: Handle special 'files' as secondary output.
+
+2020-06-07 Andreas Scherer <https://ascherer.github.io>
+
* comm-w2c.ch,
* ctang-w2c.ch,
* cweav-w2c.ch,
diff --git a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
index a137092b111..8b980daa5c0 100644
--- a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
+++ b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
@@ -813,12 +813,25 @@ else {
rename(check_file_name,C_file_name);
}
-@ @<Update the secondary results...@>=
-if((C_file=fopen(output_file_name,"r"))!=NULL) {
- @<Set up the comparison of temporary output@>@;
- @<Create the secondary output depending on the comparison@>@;
-} else
- rename(check_file_name,output_file_name); /* This was the first run */
+@ The author of a \.{CWEB} program may want to write the \\{secondary} output
+instead of to a file (in \.{@@(...@@>}) to \.{/dev/null} or \.{/dev/stdout} or
+\.{/dev/stderr}. We must take care of the \\{temporary} output already written
+to a file and finally get rid of that file.
+
+@<Update the secondary results...@>=
+if(0==strcmp("/dev/stdout",output_file_name))
+ @<Redirect temporary output to \.{/dev/stdout}@>@;
+else if(0==strcmp("/dev/stderr",output_file_name))
+ @<Redirect temporary output to \.{/dev/stderr}@>@;
+else if(0==strcmp("/dev/null",output_file_name))
+ @<Redirect temporary output to \.{/dev/null}@>@;
+else { /* Hopefully a \\{regular} output file */
+ if((C_file=fopen(output_file_name,"r"))!=NULL) {
+ @<Set up the comparison of temporary output@>@;
+ @<Create the secondary output depending on the comparison@>@;
+ } else
+ rename(check_file_name,output_file_name); /* This was the first run */
+}
@ Again, we use a call to |remove| before |rename|.
@@ -830,6 +843,40 @@ else {
rename(check_file_name,output_file_name);
}
+@ @<Redirect temporary output to \.{/dev/stdout}@>={
+ @<Setup system redirection@>@;
+ do {
+ in_size = fread(in_buf,1,BUFSIZ,check_file);
+ in_buf[in_size]='\0';
+ fprintf(stdout,"%s",in_buf);
+ } while(!feof(check_file));@/
+ fclose(check_file); check_file=NULL;
+ @<Create the secondary output...@>@;
+}
+
+@ @<Redirect temporary output to \.{/dev/stderr}@>={
+ @<Setup system redirection@>@;
+ do {
+ in_size = fread(in_buf,1,BUFSIZ,check_file);
+ in_buf[in_size]='\0';
+ fprintf(stderr,"%s",in_buf);
+ } while(!feof(check_file));@/
+ fclose(check_file); check_file=NULL;
+ @<Create the secondary output...@>@;
+}
+
+@ @<Redirect temporary output to \.{/dev/null}@>={
+ int comparison=true;
+ @<Create the secondary output...@>@;
+}
+
+@ @<Setup system redirection@>=
+char in_buf[BUFSIZ+1];
+int in_size,comparison=true;
+if((check_file=fopen(check_file_name,"r"))==NULL)
+ fatal("! Cannot open output file ",check_file_name);
+@.Cannot open output file@>
+
@* 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.