xref: /NextBSD/contrib/groff/src/devices/xditview/page.c (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
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