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