home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3.4.17 [SPARC, PA-RISC] / nextstep33_risc.iso / NextLibrary / TeX / tex / src / texview / dviAccessors.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-27  |  7.1 KB  |  323 lines

  1. #include "structures.h"
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. extern int debugon ;
  6. extern integer pagenum, seq ;
  7. extern integer curpos ;
  8. extern void upformats(), dviseek() ;
  9. extern void getpagenum() ;
  10. extern int seekpage(), relativepage() ;
  11. extern int processbop() ;
  12. extern void skippage() ;
  13. extern void dopage(), error(), newdpi(), dviinit() ;
  14. extern void display() ;
  15. extern upmock() ;
  16. extern void reportname() ;
  17. extern Boolean zoomed, mocked ;
  18. extern real screendpi, userdpi[], possibmag[] ;
  19. extern int *existsize, existsize100[], existsize300[], existsize400[] ;
  20. extern int actualdpi ;
  21. extern FILE *dvifile ;
  22. extern Boolean pagedrawn ;
  23. extern char temperrorbuf[] ;
  24. extern long atol() ;
  25. extern int chdir() ;
  26. extern void unhide() ;
  27. extern void myasyncsystem() ;
  28. extern void consoletofront() ;
  29. extern void qstatus() ;
  30. long dvitime ;
  31. extern integer fakeeof ;
  32.  
  33. int dviLastPage(void) {
  34.    if (dvifile == NULL)
  35.       return(0) ;
  36.    seekpage(0, 999999) ;
  37.    pagedrawn = 0 ;
  38.    display() ;
  39.    return(1) ;
  40. }
  41. char basename[100], oldbasename[100] ;
  42. char LastFormat[100], CustomFormat[100] ;
  43. char *gotocdof(s)
  44. char *s ;
  45. {
  46.    char tempname[100] ;
  47.    register char *last, *p ;
  48.  
  49.    strcpy(tempname, s) ;
  50.    last = NULL ;
  51.    for (p=tempname; *p; p++)
  52.       if (*p == '/')
  53.          last = p ;
  54.    if (last) {
  55.       *last = 0 ;
  56.       chdir(tempname) ;
  57.       p = last + 1 ;
  58.    } else
  59.       p = tempname ;
  60.    strcpy(basename, p) ;
  61.    last = 0 ;
  62.    for (p=basename; *p; p++)
  63.       if (*p == '.')
  64.          last = p ;
  65.    if (last) {
  66.       *last = 0 ;
  67.       return last + 1 ;
  68.    } else
  69.       return "" ;
  70. }
  71. void dviSaveFormat(s)
  72. const char *s ;
  73. {
  74.    char *p ;
  75.  
  76.    while (*s <= ' ' && *s != 0)
  77.       s++ ;
  78.    if (*s == '%')
  79.       strcpy(LastFormat, CustomFormat) ;
  80.    else if (*s > 0)
  81.       strcpy(LastFormat, s) ;
  82.    p = LastFormat ;
  83.    while (*p > ' ')
  84.       p++ ;
  85.    *p = 0 ;
  86.    upformats() ;
  87. }
  88. /*
  89.  *   We also save away the last format used, so when we run again, we
  90.  *   use it automatically.  This is useful for `open' and such.
  91.  */
  92. void reTeXit(s)
  93. char *s ;
  94. {
  95.    char comline[200] ;
  96.    char *p = comline ;
  97.    char *q ;
  98.  
  99.    if (basename[0]) {
  100.       for (p = basename; *p; p++)
  101.          if (*p == ' ') {
  102.             error("TeX does not accept file names with spaces in them.") ;
  103.             return ;
  104.          }
  105.       p = comline ;
  106.       qstatus("Running command") ;
  107.       while (*s) {
  108.          if (*s == '%') {
  109.             switch(s[1]) {
  110.                case 0: s-- ; break ;
  111.                case 's': strcpy(p, basename) ; p += strlen(p) ; break ;
  112.                case 'L': strcpy(p, LastFormat) ; p += strlen(p) ; break ;
  113.                case 'C': strcpy(p, CustomFormat) ; p += strlen(p) ; break ;
  114.                default: *p++ = *s ; break ;
  115.             }
  116.             s += 2 ;
  117.          } else {
  118.             *p++ = *s++ ;
  119.          }
  120.       }
  121.       *p = 0 ;
  122.       myasyncsystem(comline) ;
  123.       p = comline ;
  124.       while (*p <= ' ' && *p != 0)
  125.          p++ ;
  126.       q = p ;
  127.       while (*p > ' ')
  128.          p++ ;
  129.       *p = 0 ;
  130.       if (strcmp(q, "bibtex") != 0)
  131.          strcpy(LastFormat, q) ;
  132.       upformats() ;
  133.   }
  134. }
  135. static char pageseq[25] ;
  136. static integer seek1, seek2 ;
  137. void gottapage(void) {
  138.    pageseq[0] = 0 ;
  139. }
  140. void checkmatch(void) {
  141.    if (pageseq[0] != 0) {
  142.       while (processbop()) {
  143.          if (pagenum == seek1 && seq == seek2) {
  144.             gottapage() ;
  145.             pagedrawn = 0 ;
  146.             display() ;
  147.             return ;
  148.          } else
  149.             skippage() ;
  150.       }
  151.    }
  152. }
  153. extern int fromipc ;
  154. int dviOpenFile(char *filename) {
  155.    FILE *newfile ;
  156.    char *suffix ;
  157.  
  158.    if (LastFormat[0] == 0)
  159.       strcpy(LastFormat, "tex") ;
  160.    newfile = fopen(filename, "r") ;
  161.    if (newfile) {
  162.       if (dvifile) {
  163.          strcpy(oldbasename, basename) ;
  164.          getpagenum(pageseq) ;
  165.       } else
  166.          pageseq[0] = 0 ;
  167.       unhide() ;
  168.       suffix = gotocdof(filename) ;
  169.       if (dvifile)
  170.          fclose(dvifile) ;
  171.       if (strcmp(suffix, "dvi") == 0) {
  172.          dvifile = newfile ;
  173.          dviinit() ;
  174.          reportname(filename) ;
  175.          if (strcmp(basename, oldbasename)==0 && pageseq[0]) {
  176.             void dviGotoPage(char *) ;
  177.  
  178.             switch (sscanf(pageseq, "%ld.%ld", &seek1, &seek2)) {
  179.                case 1: seek2 = 0 ; break ;
  180.                case 2: break ;
  181.                default: pageseq[0] = 0 ; break ;
  182.             }
  183.             if (pageseq[0] == 0 || (pagenum == seek1 && seq == seek2)) {
  184.                gottapage() ;
  185.                display() ;
  186.                return (0) ;
  187.             } else if (! fromipc) { /* change when we get 1gig dvi files */
  188.                dviGotoPage(pageseq) ;
  189.             } else {
  190.                pagedrawn = 1 ; /* fake it out */
  191.             }
  192.          } else
  193.             display() ;
  194.       } else {
  195.          dvifile = 0 ;
  196.          display() ;
  197.          if (strcmp(suffix, "latex") == 0 ||
  198.              strcmp(suffix, "ltx") == 0)
  199.             reTeXit("latex -v \"%s\"") ;
  200.          else
  201.             reTeXit("%L -v \"%s\"") ;
  202.       }
  203.    } else { 
  204.       sprintf(temperrorbuf, "Couldn't open %s\n", filename) ;
  205.       error(temperrorbuf) ;
  206.       return(1) ;
  207.    }
  208.    return(0) ;
  209. }
  210. int dviReOpenFile(void) {
  211.    char tempname[100] ;
  212.  
  213.    if (basename[0]) {
  214.       strcpy(tempname, basename) ;
  215.       strcat(tempname, ".dvi") ;
  216.       dviOpenFile(tempname) ;
  217.    }
  218.    return 1 ;
  219. }
  220. int dviNextPage(void) {
  221.    if (dvifile == NULL)
  222.       return 0 ;
  223.    if (relativepage(1)) {
  224.       display() ;
  225.       return 1 ;
  226.    } else
  227.       return 0 ;
  228. }
  229. void dviFirstPage(void) {
  230.    if (dvifile == NULL)
  231.       return ;
  232.    relativepage(-2) ;
  233.    display() ;
  234. }
  235. int dviPrevPage(void) {
  236.    if (dvifile == NULL)
  237.       return 0 ;
  238.    if (relativepage(-1)) {
  239.       display() ;
  240.       return 1 ;
  241.    } else
  242.       return 0 ;
  243. }
  244. void dviUnzoom(void) {
  245.    zoomed = 0 ;
  246.    screendpi = userdpi[zoomed] ;
  247.    newdpi() ;
  248.    display() ;
  249. }
  250. void dviZoom(void) {
  251.    zoomed = 1 ;
  252.    screendpi = userdpi[zoomed] ;
  253.    newdpi() ;
  254.    display() ;
  255. }
  256. void dviZoomUnzoom(void) {
  257.    zoomed = ! zoomed ;
  258.    screendpi = userdpi[zoomed] ;
  259.    newdpi() ;
  260.    display() ;
  261.    return ;
  262. }
  263. void dviMock(int doit) {
  264.    if (doit == 0 || doit == 1)
  265.       mocked = doit ;
  266.    else
  267.       mocked = ! mocked ;
  268.    upmock() ;
  269.    display() ;
  270. }
  271. void dviCloseFile(void) {
  272.    if (dvifile == NULL)
  273.       return ;
  274.    reportname(NOFILETITLE) ;
  275.    basename[0] = 0 ;
  276.    display() ;
  277. }
  278. void dviGotoPage(char *pagenum) {
  279.    int pnum, pno ;
  280.    int i ;
  281.  
  282.    if (dvifile == NULL)
  283.       return ;
  284.    i = sscanf(pagenum, "%d.%d", &pnum, &pno) ;
  285.    if (i==0) {
  286.       error("didn't understand that panumber") ;
  287.       return ;
  288.    }
  289.    if (i==1)
  290.       pno = 0 ;
  291.    seekpage(pnum, pno) ;
  292.    display() ;
  293. }
  294.  
  295. void todpi(s)
  296. char *s ;
  297. {
  298.    int dpi ;
  299.    real ndpi ;
  300.  
  301.    dpi = atol(s) ;
  302.    if (dpi == 300 || dpi == 400) {
  303.       existsize = ((dpi == 300) ? existsize300 : existsize400) ;
  304.       actualdpi = dpi ;
  305.       ndpi = dpi ;
  306.    } else {
  307.       int i ;
  308.       existsize = existsize100 ;
  309.       actualdpi = 100 ;
  310.       for (i=1; i<20; i++)
  311.          if (dpi==existsize[i])
  312.             break ;
  313.       ndpi = possibmag[i + 16] ;
  314.    }
  315.    if (screendpi != ndpi) {
  316.       userdpi[zoomed] = ndpi ;
  317.       screendpi = ndpi ;
  318.       newdpi() ;
  319.       pagedrawn = 0 ;
  320.       display() ;
  321.    }
  322. }
  323.