xref: /386bsd/usr/src/usr.bin/groff/xditview/page.c (revision a2142627)
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(dw,number)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 
DestroyFileMap(m)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 
ForgetPagePositions(dw)42 ForgetPagePositions (dw)
43 	DviWidget	dw;
44 {
45 	DestroyFileMap (dw->dvi.file_map);
46 	dw->dvi.file_map = 0;
47 }
48 
RememberPagePosition(dw,number)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 
SearchPagePosition(dw,number)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 
FileSeek(dw,position)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 
89