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