home *** CD-ROM | disk | FTP | other *** search
- #include "structures.h"
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <string.h>
- extern int debugon ;
- extern integer pagenum, seq ;
- extern integer curpos ;
- extern void upformats(), dviseek() ;
- extern void getpagenum() ;
- extern int seekpage(), relativepage() ;
- extern int processbop() ;
- extern void skippage() ;
- extern void dopage(), error(), newdpi(), dviinit() ;
- extern void display() ;
- extern upmock() ;
- extern void reportname() ;
- extern Boolean zoomed, mocked ;
- extern real screendpi, userdpi[], possibmag[] ;
- extern int *existsize, existsize100[], existsize300[], existsize400[] ;
- extern int actualdpi ;
- extern FILE *dvifile ;
- extern Boolean pagedrawn ;
- extern char temperrorbuf[] ;
- extern long atol() ;
- extern int chdir() ;
- extern void unhide() ;
- extern void myasyncsystem() ;
- extern void consoletofront() ;
- extern void qstatus() ;
- long dvitime ;
- extern integer fakeeof ;
-
- int dviLastPage(void) {
- if (dvifile == NULL)
- return(0) ;
- seekpage(0, 999999) ;
- pagedrawn = 0 ;
- display() ;
- return(1) ;
- }
- char basename[100], oldbasename[100] ;
- char LastFormat[100], CustomFormat[100] ;
- char *gotocdof(s)
- char *s ;
- {
- char tempname[100] ;
- register char *last, *p ;
-
- strcpy(tempname, s) ;
- last = NULL ;
- for (p=tempname; *p; p++)
- if (*p == '/')
- last = p ;
- if (last) {
- *last = 0 ;
- chdir(tempname) ;
- p = last + 1 ;
- } else
- p = tempname ;
- strcpy(basename, p) ;
- last = 0 ;
- for (p=basename; *p; p++)
- if (*p == '.')
- last = p ;
- if (last) {
- *last = 0 ;
- return last + 1 ;
- } else
- return "" ;
- }
- void dviSaveFormat(s)
- const char *s ;
- {
- char *p ;
-
- while (*s <= ' ' && *s != 0)
- s++ ;
- if (*s == '%')
- strcpy(LastFormat, CustomFormat) ;
- else if (*s > 0)
- strcpy(LastFormat, s) ;
- p = LastFormat ;
- while (*p > ' ')
- p++ ;
- *p = 0 ;
- upformats() ;
- }
- /*
- * We also save away the last format used, so when we run again, we
- * use it automatically. This is useful for `open' and such.
- */
- void reTeXit(s)
- char *s ;
- {
- char comline[200] ;
- char *p = comline ;
- char *q ;
-
- if (basename[0]) {
- for (p = basename; *p; p++)
- if (*p == ' ') {
- error("TeX does not accept file names with spaces in them.") ;
- return ;
- }
- p = comline ;
- qstatus("Running command") ;
- while (*s) {
- if (*s == '%') {
- switch(s[1]) {
- case 0: s-- ; break ;
- case 's': strcpy(p, basename) ; p += strlen(p) ; break ;
- case 'L': strcpy(p, LastFormat) ; p += strlen(p) ; break ;
- case 'C': strcpy(p, CustomFormat) ; p += strlen(p) ; break ;
- default: *p++ = *s ; break ;
- }
- s += 2 ;
- } else {
- *p++ = *s++ ;
- }
- }
- *p = 0 ;
- myasyncsystem(comline) ;
- p = comline ;
- while (*p <= ' ' && *p != 0)
- p++ ;
- q = p ;
- while (*p > ' ')
- p++ ;
- *p = 0 ;
- if (strcmp(q, "bibtex") != 0)
- strcpy(LastFormat, q) ;
- upformats() ;
- }
- }
- static char pageseq[25] ;
- static integer seek1, seek2 ;
- void gottapage(void) {
- pageseq[0] = 0 ;
- }
- void checkmatch(void) {
- if (pageseq[0] != 0) {
- while (processbop()) {
- if (pagenum == seek1 && seq == seek2) {
- gottapage() ;
- pagedrawn = 0 ;
- display() ;
- return ;
- } else
- skippage() ;
- }
- }
- }
- extern int fromipc ;
- int dviOpenFile(char *filename) {
- FILE *newfile ;
- char *suffix ;
-
- if (LastFormat[0] == 0)
- strcpy(LastFormat, "tex") ;
- newfile = fopen(filename, "r") ;
- if (newfile) {
- if (dvifile) {
- strcpy(oldbasename, basename) ;
- getpagenum(pageseq) ;
- } else
- pageseq[0] = 0 ;
- unhide() ;
- suffix = gotocdof(filename) ;
- if (dvifile)
- fclose(dvifile) ;
- if (strcmp(suffix, "dvi") == 0) {
- dvifile = newfile ;
- dviinit() ;
- reportname(filename) ;
- if (strcmp(basename, oldbasename)==0 && pageseq[0]) {
- void dviGotoPage(char *) ;
-
- switch (sscanf(pageseq, "%ld.%ld", &seek1, &seek2)) {
- case 1: seek2 = 0 ; break ;
- case 2: break ;
- default: pageseq[0] = 0 ; break ;
- }
- if (pageseq[0] == 0 || (pagenum == seek1 && seq == seek2)) {
- gottapage() ;
- display() ;
- return (0) ;
- } else if (! fromipc) { /* change when we get 1gig dvi files */
- dviGotoPage(pageseq) ;
- } else {
- pagedrawn = 1 ; /* fake it out */
- }
- } else
- display() ;
- } else {
- dvifile = 0 ;
- display() ;
- if (strcmp(suffix, "latex") == 0 ||
- strcmp(suffix, "ltx") == 0)
- reTeXit("latex -v \"%s\"") ;
- else
- reTeXit("%L -v \"%s\"") ;
- }
- } else {
- sprintf(temperrorbuf, "Couldn't open %s\n", filename) ;
- error(temperrorbuf) ;
- return(1) ;
- }
- return(0) ;
- }
- int dviReOpenFile(void) {
- char tempname[100] ;
-
- if (basename[0]) {
- strcpy(tempname, basename) ;
- strcat(tempname, ".dvi") ;
- dviOpenFile(tempname) ;
- }
- return 1 ;
- }
- int dviNextPage(void) {
- if (dvifile == NULL)
- return 0 ;
- if (relativepage(1)) {
- display() ;
- return 1 ;
- } else
- return 0 ;
- }
- void dviFirstPage(void) {
- if (dvifile == NULL)
- return ;
- relativepage(-2) ;
- display() ;
- }
- int dviPrevPage(void) {
- if (dvifile == NULL)
- return 0 ;
- if (relativepage(-1)) {
- display() ;
- return 1 ;
- } else
- return 0 ;
- }
- void dviUnzoom(void) {
- zoomed = 0 ;
- screendpi = userdpi[zoomed] ;
- newdpi() ;
- display() ;
- }
- void dviZoom(void) {
- zoomed = 1 ;
- screendpi = userdpi[zoomed] ;
- newdpi() ;
- display() ;
- }
- void dviZoomUnzoom(void) {
- zoomed = ! zoomed ;
- screendpi = userdpi[zoomed] ;
- newdpi() ;
- display() ;
- return ;
- }
- void dviMock(int doit) {
- if (doit == 0 || doit == 1)
- mocked = doit ;
- else
- mocked = ! mocked ;
- upmock() ;
- display() ;
- }
- void dviCloseFile(void) {
- if (dvifile == NULL)
- return ;
- reportname(NOFILETITLE) ;
- basename[0] = 0 ;
- display() ;
- }
- void dviGotoPage(char *pagenum) {
- int pnum, pno ;
- int i ;
-
- if (dvifile == NULL)
- return ;
- i = sscanf(pagenum, "%d.%d", &pnum, &pno) ;
- if (i==0) {
- error("didn't understand that panumber") ;
- return ;
- }
- if (i==1)
- pno = 0 ;
- seekpage(pnum, pno) ;
- display() ;
- }
-
- void todpi(s)
- char *s ;
- {
- int dpi ;
- real ndpi ;
-
- dpi = atol(s) ;
- if (dpi == 300 || dpi == 400) {
- existsize = ((dpi == 300) ? existsize300 : existsize400) ;
- actualdpi = dpi ;
- ndpi = dpi ;
- } else {
- int i ;
- existsize = existsize100 ;
- actualdpi = 100 ;
- for (i=1; i<20; i++)
- if (dpi==existsize[i])
- break ;
- ndpi = possibmag[i + 16] ;
- }
- if (screendpi != ndpi) {
- userdpi[zoomed] = ndpi ;
- screendpi = ndpi ;
- newdpi() ;
- pagedrawn = 0 ;
- display() ;
- }
- }
-