]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/groff/src/devices/xditview/page.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / groff / src / devices / 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 (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
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
41 ForgetPagePositions (DviWidget dw)
42 {
43         DestroyFileMap (dw->dvi.file_map);
44         dw->dvi.file_map = 0;
45 }
46
47 void
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
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
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 }