summaryrefslogtreecommitdiff
path: root/Build/source/texk/dviout-util/dvispc.c
diff options
context:
space:
mode:
authorHironobu Yamashita <h.y.acetaminophen@gmail.com>2018-10-10 15:07:34 +0000
committerHironobu Yamashita <h.y.acetaminophen@gmail.com>2018-10-10 15:07:34 +0000
commit873c3869eee3b631a4273cc59b499e94f1a4598d (patch)
treeabf9261b2f03c473b63faa9f695948000c24940a /Build/source/texk/dviout-util/dvispc.c
parent4b3d47f963f4ccf49bcfe374d7dc10bf04644b9b (diff)
dviout-util: version 20181010 from upstream
git-svn-id: svn://tug.org/texlive/trunk@48878 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dviout-util/dvispc.c')
-rw-r--r--Build/source/texk/dviout-util/dvispc.c98
1 files changed, 45 insertions, 53 deletions
diff --git a/Build/source/texk/dviout-util/dvispc.c b/Build/source/texk/dviout-util/dvispc.c
index b214730a8c7..a747df6feee 100644
--- a/Build/source/texk/dviout-util/dvispc.c
+++ b/Build/source/texk/dviout-util/dvispc.c
@@ -220,20 +220,16 @@ struct DIMENSION_REC {
#define DTL_FORM 0x8000 /* the first line: variety */
int f_dtl = 0;
-#define EXE2INDEP 0x1
-#define EXE2FLAT 0x2
-#define EXE2ACTUAL 0x3F /* above are inclusive, below are exclusive */
-#define EXE2CHECK 0x40
-#define EXE2SPECIAL 0x80
-#define EXE2TEXT 0x100
-#define EXE2DVI 0x200
-
-int f_mode = 0; /* 1: -c page_indep
- 2: -f flatten_nest
- 64: -d report only
- 128: -s show specials
- 256: -a to_Text
- 512: -x to_DVI */
+enum {
+ EXE2NONE, EXE2MODIFY, EXE2CHECK, EXE2SPECIAL, EXE2TEXT, EXE2DVI
+};
+
+int f_mode = EXE2NONE; /* 1: -c modify
+ 2: -d report only
+ 3: -s specials
+ 4: -a to_Text
+ 5: -x to_DVI */
+/* default mode will be set in main() to be page_indep */
int f_debug = 0; /* -v */
int f_overwrite = 0;
@@ -486,15 +482,9 @@ int main(int argc, char **argv)
for(len = 1; argv[i][len]; len++){
switch(argv[i][len]){
case 'c':
- f_mode &= EXE2ACTUAL;
- f_mode |= EXE2INDEP;
- break;
-#if 0
- case 'f':
- f_mode &= EXE2ACTUAL;
- f_mode |= EXE2FLAT;
+ f_mode = EXE2MODIFY;
break;
-#endif
+
case 's':
f_mode = EXE2SPECIAL;
break;
@@ -620,7 +610,7 @@ skip: ;
cf. argc = (number of all arguments) + 1
{argv[0] is the program name itself} ^^^ */
- if(!f_mode) f_mode = EXE2INDEP; /* default mode */
+ if(!f_mode) f_mode = EXE2MODIFY; /* default mode */
fnum = 0;
if(!isatty(fileno(stdin))){ /* if stdin is redirected from a file */
@@ -645,7 +635,7 @@ skip: ;
if(fp_out == NULL){
/* outfile not given, free stdout;
binary cannot be written, text is fine */
- if((f_mode & EXE2INDEP) || f_mode == EXE2DVI)
+ if(f_mode == EXE2MODIFY || f_mode == EXE2DVI)
usage(1);
fp_out = stdout;
}
@@ -664,17 +654,18 @@ skip: ;
/* outfile not given;
nonetheless binary should be written to a file,
text is fine with free stdout */
- if((f_mode & EXE2INDEP))
+ if(f_mode == EXE2MODIFY)
strcpy(outfile, argv[argc-1]);
else
fp_out = stdout;
}else
+ /* [TODO] this may not work well? (especially for EXE2DVI) */
/* if fp_out == NULL, non-empty stdin and free stdout
-> the only argument = outfile (input from stdin)
otherwise, redirected stdout
-> the only argument = infile
if fnum == 2, non-empty stdin will be discarded but don't care!
- (output to overwrite for EXE2INDEP, stdout for others) */
+ (output to overwrite for EXE2MODIFY, stdout for others) */
strcpy((fp_out == NULL)?outfile:infile, argv[argc-1]);
break;
@@ -690,7 +681,7 @@ skip: ;
usage(1);
}
#ifndef UNIX
- if(fp_out && !*outfile && (f_mode == EXE2DVI || (f_mode & EXE2INDEP)))
+ if(fp_out && !*outfile && (f_mode == EXE2DVI || f_mode == EXE2MODIFY))
setmode( fileno( stdout ), O_BINARY);
#endif
if(fp_in && !*infile && f_mode != EXE2DVI){
@@ -707,7 +698,7 @@ skip: ;
if(fp_in == NULL || *infile){
fp_in = fopen(infile, READ_TEXT);
if(fp_in == NULL){
- fprintf(stderr, "Cannot open %s\n", infile);
+ fprintf(stderr, "Cannot open %s for input\n", infile);
exit(1);
}
}
@@ -718,7 +709,7 @@ skip: ;
strcat(outfile, ".dvi");
fp_out = fopen(outfile, WRITE_BINARY);
if(fp_out == NULL){
- fprintf(stderr, "Cannot open %s\n", outfile);
+ fprintf(stderr, "Cannot open %s for output\n", outfile);
exit(1);
}
}
@@ -737,7 +728,7 @@ skip: ;
/* [TODO] comments not added yet */
if(argc - i == 1){
- if((f_mode & EXE2INDEP) && !fnum){
+ if(f_mode == EXE2MODIFY && !fnum){
#ifdef UNIX
static char tmpfile[] = "/tmp/dvispcXXXXXX";
int fd;
@@ -776,19 +767,19 @@ same: strcpy(outfile, infile);
dvi_info.file_ptr = fp_in;
dvi_info.file_name = "stdin";
}else if ((dvi_info.file_ptr = fopen(dvi_info.file_name, READ_BINARY)) == NULL){
- fprintf(stderr, "Cannot open %s\n", infile);
+ fprintf(stderr, "Cannot open %s for input\n", infile);
exit(1);
}
/* [TODO] I'd like to use outfile if given */
if(fp_out == NULL || *outfile){
if(!*outfile)
fp_out = (f_mode == EXE2TEXT || f_mode == EXE2SPECIAL)?stdout:stderr;
- else if((f_mode & EXE2INDEP))
+ else if(f_mode == EXE2MODIFY)
fp_out = stderr;
else{
fp_out = fopen(outfile, WRITE_TEXT);
if(fp_out == NULL){
- fprintf(stderr, "Cannot open %s\n", outfile);
+ fprintf(stderr, "Cannot open %s for output\n", outfile);
exit(1);
}
}
@@ -818,10 +809,10 @@ void translate(DVIFILE_INFO *dvi, DIMENSION *dim)
int page, page2, pos, count, size, former, current, flag;
FILE *fp;
- if((f_mode & EXE2INDEP)){
+ if(f_mode == EXE2MODIFY){
fp = (*outfile)?fopen(outfile, WRITE_BINARY):fp_out;
if(fp == NULL){
- fprintf(stderr, "Cannot open %s\n", outfile);
+ fprintf(stderr, "Cannot open %s for output\n", outfile);
exit(4);
}else if(fp==stdout)
f_debug = 0; /* ignore -v option, as debug output goes there, sigh */
@@ -879,24 +870,24 @@ lastpage: if(isdigit(*++out_pages)){
fclose(fp_out);
dvi->file_ptr = fp_out = NULL;
return;
- } /* if(f_mode == EXE2TEXT || f_mode == EXE2SPECIAL) */
+ } /* done for if(f_mode == EXE2TEXT || f_mode == EXE2SPECIAL),
+ the rest of translate() is meant for
+ if((f_mode == EXE2MODIFY) and (f_mode == EXE2CHECK)) */
/* Prior scanning. This ensures page independence in reverse order too,
by checking whether non-stack specials appears somewhere in DVI.
Specials with paired syntax (push/pop, bcolor/ecolor) are already safe
without pre-scanning, so these are skipped due to f_prescan = 1.
Other specials (background, pdf_bgcolor, pn) are handled in this scanning. */
- if((f_mode & EXE2INDEP) || f_mode == EXE2CHECK){
- f_prescan = 1; /* change behavior of interpret(dvi) */
- for(page = 1; page <= dim->total_page; page++){
- fseek(dvi->file_ptr, dim->page_index[page], SEEK_SET);
- interpret(dvi->file_ptr);
- }
- f_prescan = 0; /* restore interpret(dvi) */
+ f_prescan = 1; /* change behavior of interpret(dvi) */
+ for(page = 1; page <= dim->total_page; page++){
+ fseek(dvi->file_ptr, dim->page_index[page], SEEK_SET);
+ interpret(dvi->file_ptr);
}
+ f_prescan = 0; /* restore interpret(dvi) */
former = current = -1;
- if(fp){ /* ((f_mode & EXE2INDEP)) and can be opened */
+ if(fp){ /* f_mode == EXE2MODIFY and can be opened */
fseek(dvi->file_ptr, 0, SEEK_SET);
for(size = dim->page_index[1]; size > 0; size--)
write_byte(read_byte(dvi->file_ptr), fp); /* Write preamble */
@@ -907,7 +898,7 @@ lastpage: if(isdigit(*++out_pages)){
write_long(former, fp); /* ptr to the former page = -1 */
}
- for(page = 1; page <= dim->total_page; page++){
+ for(page = 1; page <= dim->total_page; page++){ /* page loop start */
fseek(dvi->file_ptr, dim->page_index[page], SEEK_SET);
f_background = 0;
f_pdf_bgcolor = 0;
@@ -944,7 +935,7 @@ lastpage: if(isdigit(*++out_pages)){
}
if(f_mode == EXE2CHECK)
continue; /* skip loop if (f_mode == EXE2CHECK);
- * remainings are for (f_mode & EXE2INDEP) */
+ * remainings in this loop are for (f_mode == EXE2MODIFY) */
/* [Process 2] at the beginning of each page,
recover from stack underflow, and put non-stack specials if necessary */
@@ -995,8 +986,8 @@ lastpage: if(isdigit(*++out_pages)){
former = current;
current = ftell(fp); /* get position of BOP/POST */
- /* [Process 5] start the next page,
- with passing not-yet-closed stacks */
+ /* [Process 5] except for the last page,
+ start the next page with passing not-yet-closed stacks */
if(page < dim->total_page){
fseek(dvi->file_ptr, dim->page_index[page+1], SEEK_SET);
for(size = 41; size > 0; size--) /* write BOP and c[] */
@@ -1018,7 +1009,8 @@ lastpage: if(isdigit(*++out_pages)){
if(tpic_pn[0])
f_needs_corr++;
}
- }
+ } /* page loop end */
+
if(f_debug) {
if(color_depth_max)
fprintf(fp_out, "\nMaximal depth of color stack:%d", color_depth_max);
@@ -1027,7 +1019,7 @@ lastpage: if(isdigit(*++out_pages)){
if(pdf_annot_depth_max)
fprintf(fp_out, "\nMaximal depth of pdf:bann ... pdf:eann stack:%d", pdf_annot_depth_max);
}
- if(!(f_mode & EXE2INDEP)){
+ if(f_mode == EXE2CHECK){
fclose(dvi->file_ptr);
fprintf(fp_out, f_needs_corr?
"\nSome corrections are necessary!\n":
@@ -1035,7 +1027,7 @@ lastpage: if(isdigit(*++out_pages)){
fclose(fp_out);
dvi->file_ptr = fp_out = NULL;
return;
- }
+ } /* done for EXE2CHECK; remainings are for EXE2MODIFY */
/* if -z option is given, add empty pages to make multiple of 4 pages */
if(f_book && dim->total_page%4 == 0)
@@ -1111,7 +1103,7 @@ lastpage: if(isdigit(*++out_pages)){
}
fprintf(stderr, "\nDVI file %s is corrected\n", infile);
}else
- fprintf(stderr, "\nCreate a new DVI file %s\n", outfile);
+ fprintf(stderr, "\nCreate a new DVI file %s\n", (fp_out==stdout)?"(stdout)":outfile);
}
@@ -2593,7 +2585,7 @@ err: fprintf(stderr, "Error(line %d, code %d): %s\n", line, code, tmp
}
num = ftell(fp_out);
fprintf(stderr, "Write %d byte (%d page): %s\n", num, page,
- (fp_out==stdout)?"":outfile);
+ (fp_out==stdout)?"(stdout)":outfile);
fclose(fp_in);
fclose(fp_out);
fp_in = fp_out = NULL;