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(DviWidget dw,int number)19 MapPageNumberToFileMap (DviWidget dw, int number)
20 {
21 DviFileMap *m;
22
23 for (m = dw->dvi.file_map; m; m=m->next)
24 if (m->page_number == number)
25 break;
26 return m;
27 }
28
29 void
DestroyFileMap(DviFileMap * m)30 DestroyFileMap (DviFileMap *m)
31 {
32 DviFileMap *next;
33
34 for (; m; m = next) {
35 next = m->next;
36 XtFree ((char *) m);
37 }
38 }
39
40 void
ForgetPagePositions(DviWidget dw)41 ForgetPagePositions (DviWidget dw)
42 {
43 DestroyFileMap (dw->dvi.file_map);
44 dw->dvi.file_map = 0;
45 }
46
47 void
RememberPagePosition(DviWidget dw,int number)48 RememberPagePosition(DviWidget dw, int number)
49 {
50 DviFileMap *m;
51
52 if (!(m = MapPageNumberToFileMap (dw, number))) {
53 m = (DviFileMap *) XtMalloc (sizeof *m);
54 m->page_number = number;
55 m->next = dw->dvi.file_map;
56 dw->dvi.file_map = m;
57 }
58 if (dw->dvi.tmpFile)
59 m->position = ftell (dw->dvi.tmpFile);
60 else
61 m->position = ftell (dw->dvi.file);
62 }
63
64 long
SearchPagePosition(DviWidget dw,int number)65 SearchPagePosition (DviWidget dw, int number)
66 {
67 DviFileMap *m;
68
69 if (!(m = MapPageNumberToFileMap (dw, number)))
70 return -1;
71 return m->position;
72 }
73
74 void
FileSeek(DviWidget dw,long position)75 FileSeek(DviWidget dw, long position)
76 {
77 if (dw->dvi.tmpFile) {
78 dw->dvi.readingTmp = 1;
79 fseek (dw->dvi.tmpFile, position, 0);
80 } else
81 fseek (dw->dvi.file, position, 0);
82 }
83