1151497Sru/*
2151497Sru * page.c
3151497Sru *
4151497Sru * map page numbers to file position
5151497Sru */
6151497Sru
7151497Sru#include <X11/Xos.h>
8151497Sru#include <X11/IntrinsicP.h>
9151497Sru#include <X11/StringDefs.h>
10151497Sru#include <stdio.h>
11151497Sru#include <ctype.h>
12151497Sru#include "DviP.h"
13151497Sru
14151497Sru#ifdef X_NOT_STDC_ENV
15151497Sruextern long	ftell();
16151497Sru#endif
17151497Sru
18151497Srustatic DviFileMap *
19151497SruMapPageNumberToFileMap (DviWidget dw, int number)
20151497Sru{
21151497Sru	DviFileMap	*m;
22151497Sru
23151497Sru	for (m = dw->dvi.file_map; m; m=m->next)
24151497Sru		if (m->page_number == number)
25151497Sru			break;
26151497Sru	return m;
27151497Sru}
28151497Sru
29151497Sruvoid
30151497SruDestroyFileMap (DviFileMap *m)
31151497Sru{
32151497Sru	DviFileMap	*next;
33151497Sru
34151497Sru	for (; m; m = next) {
35151497Sru		next = m->next;
36151497Sru		XtFree ((char *) m);
37151497Sru	}
38151497Sru}
39151497Sru
40151497Sruvoid
41151497SruForgetPagePositions (DviWidget dw)
42151497Sru{
43151497Sru	DestroyFileMap (dw->dvi.file_map);
44151497Sru	dw->dvi.file_map = 0;
45151497Sru}
46151497Sru
47151497Sruvoid
48151497SruRememberPagePosition(DviWidget dw, int number)
49151497Sru{
50151497Sru	DviFileMap	*m;
51151497Sru
52151497Sru	if (!(m = MapPageNumberToFileMap (dw, number))) {
53151497Sru		m = (DviFileMap *) XtMalloc (sizeof *m);
54151497Sru		m->page_number = number;
55151497Sru		m->next = dw->dvi.file_map;
56151497Sru		dw->dvi.file_map = m;
57151497Sru	}
58151497Sru	if (dw->dvi.tmpFile)
59151497Sru		m->position = ftell (dw->dvi.tmpFile);
60151497Sru	else
61151497Sru		m->position = ftell (dw->dvi.file);
62151497Sru}
63151497Sru
64151497Srulong
65151497SruSearchPagePosition (DviWidget dw, int number)
66151497Sru{
67151497Sru	DviFileMap	*m;
68151497Sru
69151497Sru	if (!(m = MapPageNumberToFileMap (dw, number)))
70151497Sru		return -1;
71151497Sru	return m->position;
72151497Sru}
73151497Sru
74151497Sruvoid
75151497SruFileSeek(DviWidget dw, long position)
76151497Sru{
77151497Sru	if (dw->dvi.tmpFile) {
78151497Sru		dw->dvi.readingTmp = 1;
79151497Sru		fseek (dw->dvi.tmpFile, position, 0);
80151497Sru	} else
81151497Sru		fseek (dw->dvi.file, position, 0);
82151497Sru}
83