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