xref: /netbsd-src/external/gpl2/groff/dist/src/devices/xditview/page.c (revision 89a07cf815a29524268025a1139fac4c5190f765)
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