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