Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / groff / src / xditview / page.c
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 *
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
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
42 ForgetPagePositions (dw)
43         DviWidget       dw;
44 {
45         DestroyFileMap (dw->dvi.file_map);
46         dw->dvi.file_map = 0;
47 }
48
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
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
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