diff options
Diffstat (limited to 'dviware/beebe/src/dviinit.h')
-rw-r--r-- | dviware/beebe/src/dviinit.h | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/dviware/beebe/src/dviinit.h b/dviware/beebe/src/dviinit.h new file mode 100644 index 0000000000..4cbdefcef7 --- /dev/null +++ b/dviware/beebe/src/dviinit.h @@ -0,0 +1,374 @@ +/* -*-C-*- dviinit.h */ +/*-->dviinit*/ +/**********************************************************************/ +/****************************** dviinit *******************************/ +/**********************************************************************/ + +void +dviinit(filestr) /* initialize DVI file processing */ +char *filestr; /* command line filename string */ +{ + int i; /* temporary */ + INT16 k; /* index in curpath[] and curname[] */ + char* tcp; /* temporary string pointers */ + char* tcp1; /* temporary string pointers */ + +#if OS_UNIX +/*********************************************************************** +Unix allows binary I/O on stdin and stdout; most other operating systems +do not. In order to support this, we use the convention that a null +filestr (NOT a (char*)NULL) means the dvifile is on stdin, and the +translated output is on stdout. Error logging will be to dvixxx.err or +dvixxx.dvi-err. Because random access is required of the dvifile, stdin +may NOT be a pipe; it must be a disk file. +***********************************************************************/ +#define NO_FILENAME (filestr[0] == '\0') +#endif + +#if CANON_A2 + +#ifdef CANON_TEST + char modestring[10]; /* for dynamic fopen() mode string */ +#endif /* CANON_TEST */ + +#endif + +#if (OS_TOPS20 | OS_VAXVMS) + char* tcp2; /* temporary string pointers */ +#endif + + for (k = 0; k < 10; ++k) + tex_counter[k] = (INT32)0L; + + fontptr = (struct font_entry *)NULL; + hfontptr = (struct font_entry *)NULL; + pfontptr = (struct font_entry *)NULL; + fontfp = (FILE *)NULL; + cache_size = 0; + nopen = 0; + + /*********************************************************** + Set up file names and open dvi and plot files. Simple + filename parsing assumes forms like: + + Unix: name + name.ext + /dir/subdir/.../subdir/name + /dir/subdir/.../subdir/name.ext + TOPS-20: any Unix style (supported by PCC-20) + <directory>name + <directory>name.ext + <directory>name.ext.gen + device:<directory>name + device:<directory>name.ext + device:<directory>name.ext.gen + [directory]name + [directory]name.ext + [directory]name.ext.gen + device:[directory]name + device:[directory]name.ext + device:[directory]name.ext.gen + logname:name + logname:name.ext + logname:name.ext.gen + + The Unix style should work under IBM PC DOS (backslash can + usually be replaced for forward slash), and the TOPS-20 + style contains VAX VMS as a subset. Fancier TOPS-20 names + are possible (control-V quoting of arbitrary characters, and + attributes), but they are rare enough that we do not support + them. For TOPS-20 and VAX VMS, generation numbers are + recognized as a digit following the last dot, and they are + preserved for the DVI file only. For the output files, the + highest generation will always be assumed. This is for + convenience with the TOPS-20 TeX implementation, which on + completion types in a command "TeXspool: foo.dvi.13" and + waits for the user to type a carriage return. + + We only need to extract the directory path, name, and + extension, so the parsing is simple-minded. + + ***********************************************************/ + + tcp = strrchr(filestr,'/'); /* find end of Unix file path */ + +#if (OS_ATARI | OS_PCDOS) + if (tcp == (char*)NULL) /* no Unix-style file path */ + tcp = strrchr(filestr, '\\'); /* try \dos\path\ */ +#endif + +#if OS_TOPS20 + if (tcp == (char*)NULL) /* no Unix-style file path */ + { + tcp = strrchr(filestr, '>'); /* try <dir> */ + if (tcp == (char*)NULL) /* no <dir> */ + tcp = strrchr(filestr, ']'); /* try [dir] */ + if (tcp == (char*)NULL) /* no [dir] */ + tcp = strrchr(filestr, ':'); /* try logname: */ + } +#endif + +#if OS_VAXVMS + if (tcp == (char*)NULL) /* no Unix-style file path */ + { + tcp = strrchr(filestr, ']'); /* try [dir] */ + if (tcp == (char*)NULL) /* no [dir] */ + tcp = strrchr(filestr, ':'); /* try logname: */ + } +#endif + + if (tcp == (char*)NULL) /* no file path */ + { + curpath[0] = '\0'; /* empty path */ + tcp = filestr; /* point to start of name */ + } + else /* save path for later use */ + { + k = (INT16)(tcp-filestr+1); + (void)strncpy(curpath, filestr, (int)k); + curpath[k] = '\0'; + tcp++; /* point to start of name */ + } + + tcp1 = strrchr(tcp, '.'); /* find last dot in filename */ + +#if (OS_TOPS20 | OS_VAXVMS) + if ((tcp1 != (char*)NULL) && isdigit(*(tcp1+1))) + { /* then assume generation number */ + tcp2 = tcp1; /* remember dot position */ + *tcp1 = '\0'; /* discard generation number */ + tcp1 = strrchr(tcp,'.');/* find last dot in filename */ + *tcp2 = '.'; /* restore dot */ + } +#endif + + if (tcp1 == (char*)NULL) + { /* no dot, so name has no extension */ + (void)strcpy(curname, tcp); /* save name */ + tcp1 = strchr(tcp, '\0'); /* set empty extension */ + } + else /* save name part */ + { + k = (INT16)(tcp1-tcp); + (void)strncpy(curname, tcp, (int)k); + curname[k] = '\0'; + } + + (void)strcpy(curext, tcp1); /* save extension */ + + + /* DVI file must always have extension DVIEXT; supply one if + necessary (e.g /u/jones/foo.dvi) */ + + (void)strcpy(dviname, curpath); + (void)strcat(dviname, curname); + if (curext[0] == '\0') + (void)strcat(dviname, DVIEXT); + else + (void)strcat(dviname, curext); + + /* Device output file is PATH NAME . DVIPREFIX OUTFILE_EXT (e.g. + /u/jones/foo.dvi-alw) */ + + (void)strcpy(dvoname, curpath); + (void)strcat(dvoname, curname); + (void)strcat(dvoname, "."); + (void)strcat(dvoname, DVIPREFIX); + (void)strcat(dvoname, OUTFILE_EXT); + + /* Font substitution file is PATH NAME SUBEXT (e.g. + /u/jones/foo.sub). We do not tell user (via stderr) + about it until it is needed. */ + + if (subfile[0] == '\0') /* no -fsubfile; make default */ + { + (void)strcpy(subfile, curpath); + (void)strcat(subfile, curname); + (void)strcat(subfile, subext); + } + + +#if OS_UNIX + if (NO_FILENAME) + { + dvifp = stdin; /* already open, so no DEBUG_OPEN call */ + if (fseek(dvifp,0L,0)) + { + (void)fprintf(stderr, + "%s: Unable to fseek() on stdin--was it a pipe?\n", + g_progname); + (void)EXIT(1); + } + } + else + { + dvifp = FOPEN(dviname,RB_OPEN); + DEBUG_OPEN(dvifp,dviname,RB_OPEN); + } +#else + + dvifp = FOPEN(dviname,RB_OPEN); + DEBUG_OPEN(dvifp,dviname,RB_OPEN); +#endif + + if (dvifp == (FILE*)NULL) + { + (void)sprintf(message,"dviinit(): %s: can't open [%s]", + g_progname, dviname); + (void)fatal(message); + } + + /* We try both + PATH NAME . DVIPREFIX OUTFILE_EXT and + NAME . DVIPREFIX OUTFILE_EXT, + in case the user does not have write access to the directory PATH */ + for (i = 1; i <= 2; ++i) /* two tries here */ + { + +#if BBNBITGRAPH + strcpy(dvoname,"stdout"); /* BitGraph always goes to stdout */ + plotfp = stdout; +#else /* NOT BBNBITGRAPH */ + +#if OS_VAXVMS + +#if POSTSCRIPT + plotfp = FOPEN(dvoname,WB_OPEN); +#else + /* Create binary files for other devices; they cause less trouble + with VMS spooler programs. */ + plotfp = FOPEN(dvoname,WB_OPEN,"rfm=fix","bls=512","mrs=512"); +#endif /* POSTSCRIPT */ + +#else /* NOT OS_VAXVMS */ + +#if OS_UNIX + plotfp = NO_FILENAME ? stdout : FOPEN(dvoname,WB_OPEN); +#else + plotfp = FOPEN(dvoname,WB_OPEN); +#endif /* OS_UNIX */ + +#endif /* OS_VAXVMS */ + +#endif /* BBNBITGRAPH */ + +#if OS_UNIX + if (!NO_FILENAME) +#endif + + DEBUG_OPEN(plotfp,dvoname,WB_OPEN); + if (plotfp != (FILE*)NULL) + break; /* open okay */ + if (i == 2) + { + (void)strcpy(dvoname, curname); + (void)strcat(dvoname, "."); + (void)strcat(dvoname, DVIPREFIX); + (void)strcat(dvoname, OUTFILE_EXT); + } + } + + if (plotfp == (FILE*)NULL) + { + (void)sprintf(message,"dviinit(): %s: can't open [%s]", + g_progname, dvoname); + (void)fatal(message); + } + +#if OS_TOPS20 + /* Because of the PCC-20 arithmetic (instead of logical) + shift bug wherein a constant expression (1<<35) evaluates + to 0 instead of 400000,,000000, we must set CF_nud using a + variable, instead of just using a constant */ + /* "ac1 = makefield(CF_nud,1);" */ + ac1 = 1; + ac1 = makefield(CF_nud,ac1); + setfield(ac1,CF_jfn,jfnof(fileno(plotfp))); /* jfn */ + setfield(ac1,CF_dsp,FBbyv); /* generation number index in fdb */ + ac2 = makefield(FB_ret,-1); + ac3 = makefield(FB_ret,0); /* set generation count to 0 (infinite) */ + (void)jsys(JSchfdb,acs); /* ignore any errors */ +#endif /* OS_TOPS20 */ + +#if CANON_A2 + +#ifdef CANON_TEST + +#if OS_ATARI + strcpy(tmoname,"\\ca2XXX\."); +#else + strcpy(tmoname,"ca2XXXXXX"); +#endif + + mktemp(tmoname); + savefp = plotfp; + (void)sprintf(modestring,"%s+",WB_OPEN); + plotfp = FOPEN(tmoname, modestring); + stor_total = 0; +#endif /* CANON_TEST */ + +#endif /* CANON_A2 */ + + if (!quiet + +#if OS_UNIX + && !NO_FILENAME +#endif + + ) + { + (void)fprintf(stderr,"[Input from DVI file %s]",dviname); + NEWLINE(stderr); + (void)fprintf(stderr,"[Output on file %s]",dvoname); + NEWLINE(stderr); + } + + if (strncmp(curpath,dvoname,strlen(curpath)) == 0) + (void)strcpy(g_logname, curpath); /* used PATH on output file */ + else + g_logname[0] = '\0'; /* no PATH on output file */ + +#if OS_UNIX + if (NO_FILENAME) /* use dvixxx as file prefix */ + { + (void)strcpy(g_logname, "dvi"); + (void)strcat(g_logname, OUTFILE_EXT); + } +#endif + + (void)strcat(g_logname, curname); + (void)strcat(g_logname, "."); + (void)strcat(g_logname, DVIPREFIX); + +#if (OS_ATARI | OS_PCDOS | OS_UNIX) + (void)strcat(g_logname, "err"); +#endif + +#if (OS_TOPS20 | OS_VAXVMS) + /* Force new generation; otherwise fopen(,"w+") reuses existing file */ + (void)strcat(g_logname, "err.-1"); +#endif + + lmargin = (COORDINATE)(leftmargin*((float)XDPI)); + tmargin = (COORDINATE)(topmargin*((float)YDPI)); + +#if (CANON_A2 | IMPRESS | HPJETPLUS) + /* Printer has (0,0) origin at (XORIGIN,YORIGIN) near, but not at, + upper left corner */ + lmargin -= XORIGIN; + tmargin -= YORIGIN; +#endif /* (CANON_A2 | IMPRESS | HPJETPLUS) */ + + if ((BYTE)nosignex(dvifp,(BYTE)1) != PRE) + (void)fatal("dviinit(): PRE doesn't occur first--are you sure \ +this is a DVI file?"); + + i = (int)signex(dvifp,(BYTE)1); + if (i != DVIFORMAT) + { + (void)sprintf(message, + "dviinit(): DVI format = %d, can only process DVI format %d files.", + i, (int)DVIFORMAT); + (void)fatal(message); + } +} |