diff options
author | Hironobu Yamashita <h.y.acetaminophen@gmail.com> | 2018-10-10 15:07:34 +0000 |
---|---|---|
committer | Hironobu Yamashita <h.y.acetaminophen@gmail.com> | 2018-10-10 15:07:34 +0000 |
commit | 873c3869eee3b631a4273cc59b499e94f1a4598d (patch) | |
tree | abf9261b2f03c473b63faa9f695948000c24940a /Build/source/texk/dviout-util/dvispc.c | |
parent | 4b3d47f963f4ccf49bcfe374d7dc10bf04644b9b (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.c | 98 |
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; |