Home | History | Annotate | Line # | Download | only in xditview
      1 /*	$NetBSD: page.c,v 1.1.1.1 2016/01/13 18:41:49 christos Exp $	*/
      2 
      3 /*
      4  * page.c
      5  *
      6  * map page numbers to file position
      7  */
      8 
      9 #include <X11/Xos.h>
     10 #include <X11/IntrinsicP.h>
     11 #include <X11/StringDefs.h>
     12 #include <stdio.h>
     13 #include <ctype.h>
     14 #include "DviP.h"
     15 
     16 #ifdef X_NOT_STDC_ENV
     17 extern long	ftell();
     18 #endif
     19 
     20 static DviFileMap *
     21 MapPageNumberToFileMap (DviWidget dw, int number)
     22 {
     23 	DviFileMap	*m;
     24 
     25 	for (m = dw->dvi.file_map; m; m=m->next)
     26 		if (m->page_number == number)
     27 			break;
     28 	return m;
     29 }
     30 
     31 void
     32 DestroyFileMap (DviFileMap *m)
     33 {
     34 	DviFileMap	*next;
     35 
     36 	for (; m; m = next) {
     37 		next = m->next;
     38 		XtFree ((char *) m);
     39 	}
     40 }
     41 
     42 void
     43 ForgetPagePositions (DviWidget dw)
     44 {
     45 	DestroyFileMap (dw->dvi.file_map);
     46 	dw->dvi.file_map = 0;
     47 }
     48 
     49 void
     50 RememberPagePosition(DviWidget dw, int number)
     51 {
     52 	DviFileMap	*m;
     53 
     54 	if (!(m = MapPageNumberToFileMap (dw, number))) {
     55 		m = (DviFileMap *) XtMalloc (sizeof *m);
     56 		m->page_number = number;
     57 		m->next = dw->dvi.file_map;
     58 		dw->dvi.file_map = m;
     59 	}
     60 	if (dw->dvi.tmpFile)
     61 		m->position = ftell (dw->dvi.tmpFile);
     62 	else
     63 		m->position = ftell (dw->dvi.file);
     64 }
     65 
     66 long
     67 SearchPagePosition (DviWidget dw, int number)
     68 {
     69 	DviFileMap	*m;
     70 
     71 	if (!(m = MapPageNumberToFileMap (dw, number)))
     72 		return -1;
     73 	return m->position;
     74 }
     75 
     76 void
     77 FileSeek(DviWidget dw, long position)
     78 {
     79 	if (dw->dvi.tmpFile) {
     80 		dw->dvi.readingTmp = 1;
     81 		fseek (dw->dvi.tmpFile, position, 0);
     82 	} else
     83 		fseek (dw->dvi.file, position, 0);
     84 }
     85