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 *
MapPageNumberToFileMap(DviWidget dw,int number)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
DestroyFileMap(DviFileMap * m)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
ForgetPagePositions(DviWidget dw)43 ForgetPagePositions (DviWidget dw)
44 {
45 DestroyFileMap (dw->dvi.file_map);
46 dw->dvi.file_map = 0;
47 }
48
49 void
RememberPagePosition(DviWidget dw,int number)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
SearchPagePosition(DviWidget dw,int number)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
FileSeek(DviWidget dw,long position)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