This is dviAccessors.c in view mode; [Download] [Up]
#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[], existsize600[] ;
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 Tbasename[2000], oldbasename[2000] ;
char LastFormat[2000], CustomFormat[2000] ;
char *gotocdof(s)
char *s ;
{
char tempname[2000] ;
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(Tbasename, p) ;
last = 0 ;
for (p=Tbasename; *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[2000] ;
char *p = comline ;
char *q ;
if (Tbasename[0]) {
for (p = Tbasename; *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, Tbasename) ; 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, Tbasename) ;
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(Tbasename, 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[2000] ;
if (Tbasename[0]) {
strcpy(tempname, Tbasename) ;
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) ;
Tbasename[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 || dpi == 600) {
if (dpi == 300) existsize = existsize300 ;
if (dpi == 400) existsize = existsize400 ;
if (dpi == 600) existsize = existsize600 ;
actualdpi = dpi ;
ndpi = dpi ;
} else {
int i ;
existsize = existsize100 ;
actualdpi = 100 ;
for (i=1; i<28; i++)
if (dpi==existsize[i])
break ;
ndpi = possibmag[i + 13] ;
}
if (screendpi != ndpi) {
userdpi[zoomed] = ndpi ;
screendpi = ndpi ;
newdpi() ;
pagedrawn = 0 ;
display() ;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.