home *** CD-ROM | disk | FTP | other *** search
- /*
- * This software is Copyright 1988 by Radical Eye Software.
- * All Rights Reserved.
- */
- /*
- * Random page motion file for dviamiga.c (now called preview.c.)
- */
- #include "structures.h"
- /*
- * The data structure we need for the linked list of pages.
- */
- struct pagetype {
- struct pagetype *next ;
- integer page, no, pos ;
- } *pages = NULL ;
- struct pagetype *last = NULL ;
- struct pagetype *currentpage = NULL ;
- /*
- * Some externals we need to get to.
- */
- extern integer curpos ;
- extern FILE *dvifile ;
- extern integer prevpage, thispage, rthispage ;
- extern integer pagenum, seq ;
- extern integer numalloc, memalloc ;
- extern struct Screen *myscreen ;
- extern Boolean pageinterrupted ;
- extern struct pagetype *mymalloc() ;
- extern integer signedquad() ;
- extern int skipnop() ;
- extern int dvierror ;
- extern long lseek() ;
- extern void free() ;
- extern void abortdvi() ;
- extern void skipover() ;
- extern void skippage() ;
- extern int debugon ;
- extern void qstatus() ;
- extern Boolean dualpage ;
- extern Boolean pagedrawn ;
- extern integer fakeeof ;
- /*
- * This 'dviseek' routine should be faster than the usual one.
- * Now we also need to check for writing, and some code needs
- * to be changed to handle a no page dvi file.
- */
- int lastwaswrite ;
- void dviseek(where)
- register integer where ;
- {
- if (debugon > 6)
- printf("Seeking to %ld\n", where) ;
- fseek(dvifile, where, 0) ;
- curpos = where ;
- }
- /*
- * This routine is called when a dvi file is closed to release all memory
- * associated with the pages and to reset the variables to NULL.
- */
- void freepages()
- {
- register struct pagetype *p ;
-
- while (pages != NULL) {
- p = pages->next ;
- free(pages) ;
- pages = p ;
- }
- pages = last = currentpage = NULL ;
- }
- /*
- * This routine adds a new page to the list we are constructing.
- */
- struct pagetype *addpage(page, where)
- integer page ;
- register integer where ;
- {
- register struct pagetype *p ;
- register integer c = 0 ;
-
- if (last == NULL || where > last->pos) {
- p = mymalloc(sizeof(struct pagetype), MEMF_CLEAR) ;
- if (last == NULL)
- pages = p ;
- else
- last->next = p ;
- last = p ;
- p->page = page ;
- p->pos = where ;
- p->next = NULL ;
- for (p=pages; p!=NULL; p=p->next)
- if (page==p->page)
- c++ ;
- last->no = c - 1 ;
- seq = c - 1 ;
- return(last) ;
- } else {
- for (p=pages; p!=NULL; p=p->next)
- if (p->pos == where) {
- seq = p->no ;
- return(p) ;
- }
- }
- return 0 ;
- }
- /*
- * Here we add a page to the list the first time we scan it. Only if it
- * is the first time, though; we check it by looking at the current
- * position and the position of the last page. (By the way, the position
- * we are referring to is always the location of the bop.)
- */
- int processbop()
- {
- register int cmd ;
- register long waswhere = curpos ;
-
- if (debugon > 6)
- printf("Processbop at %ld\n", curpos) ;
- cmd = skipnop() ;
- if (cmd==248 || cmd < 0) {
- dviseek(waswhere) ;
- return 0 ;
- } else if (cmd!=139) {
- abortdvi() ;
- }
- thispage = curpos - 1 ;
- pagenum = signedquad() ;
- currentpage = addpage(pagenum, thispage) ;
- skipover(36) ;
- prevpage = signedquad() ;
- rthispage = curpos ;
- return(1) ;
- }
-
- void missbop() {
- if (! processbop())
- abortdvi() ;
- }
- /*
- * Here we look for a page and a number. If it is not found, we skip to
- * the end and scan forward until we find it. When we find it, we seek
- * to the correct location and return. If it is not found, we return false.
- */
- Boolean seekpage(page, no)
- integer page, no ;
- {
- register struct pagetype *p ;
-
- for (p=pages; p!=NULL; p=p->next) {
- if (page==p->page && no==p->no) {
- thispage = p->pos ;
- dviseek(thispage) ;
- if (!processbop())
- abortdvi() ;
- pagedrawn = 0 ;
- return(1) ;
- }
- }
- qstatus("Looking for page") ;
- if (last == NULL)
- dviseek(thispage) ;
- else
- dviseek(last->pos) ;
- for (;;) {
- if (!processbop()) {
- dviseek(thispage) ;
- missbop() ;
- pagedrawn = 0 ;
- return(0) ;
- }
- if (last->page == page && last->no == no) {
- pagedrawn = 0 ;
- return(1) ;
- }
- skippage() ;
- }
- }
- /*
- * This one goes to a particular page. -1 means back one, 0 means same
- * page, 1 means next page.
- */
- int relativepage(loc)
- register int loc ;
- {
- #ifdef DEBUG
- if (debugon > 7) {
- printf("\nRelativepage %d %ld\n", loc, curpos) ;
- fflush(stdout) ;
- }
- #endif
- if (loc == 0) {
- dviseek(thispage) ;
- missbop() ;
- return 1 ;
- } else if (loc == 1) {
- /* if (pageinterrupted) {
- if (currentpage == NULL || currentpage->next == NULL) {
- dviseek(curpos) ;
- skippage() ;
- } else {
- dviseek(currentpage->next->pos) ;
- }
- }
- if (dualpage && ! pageinterrupted) {
- if (currentpage == NULL)
- error("! this can't happen foo") ;
- if (currentpage != NULL && currentpage->next != NULL)
- dviseek(currentpage->next->pos) ;
- } */
- if (!processbop()) {
- return 0 ;
- } else
- pagedrawn = 0 ;
- } else if (loc == -1) {
- if (prevpage > 0) {
- dviseek(prevpage) ;
- missbop() ;
- pagedrawn = 0 ;
- } else
- return 0 ;
- } else {
- dviseek(pages->pos) ;
- missbop() ;
- pagedrawn = 0 ;
- }
- return 1 ;
- }
-