1/*	$NetBSD$	*/
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
17extern long	ftell();
18#endif
19
20static DviFileMap *
21MapPageNumberToFileMap (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
31void
32DestroyFileMap (DviFileMap *m)
33{
34	DviFileMap	*next;
35
36	for (; m; m = next) {
37		next = m->next;
38		XtFree ((char *) m);
39	}
40}
41
42void
43ForgetPagePositions (DviWidget dw)
44{
45	DestroyFileMap (dw->dvi.file_map);
46	dw->dvi.file_map = 0;
47}
48
49void
50RememberPagePosition(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
66long
67SearchPagePosition (DviWidget dw, int number)
68{
69	DviFileMap	*m;
70
71	if (!(m = MapPageNumberToFileMap (dw, number)))
72		return -1;
73	return m->position;
74}
75
76void
77FileSeek(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