page.c revision f80a6dcd
1f80a6dcdSmrg/* $XConsortium: page.c,v 1.5 91/07/26 00:40:20 keith Exp $ */
2f80a6dcdSmrg/* $XFree86: xc/programs/xditview/page.c,v 1.3 2001/08/01 00:45:03 tsi Exp $ */
3f80a6dcdSmrg
4f80a6dcdSmrg/*
5f80a6dcdSmrg * page.c
6f80a6dcdSmrg *
7f80a6dcdSmrg * map page numbers to file position
8f80a6dcdSmrg */
9f80a6dcdSmrg
10f80a6dcdSmrg#include <X11/IntrinsicP.h>
11f80a6dcdSmrg#include <X11/StringDefs.h>
12f80a6dcdSmrg#include <X11/Xos.h>
13f80a6dcdSmrg#include <stdio.h>
14f80a6dcdSmrg#include <ctype.h>
15f80a6dcdSmrg#include "DviP.h"
16f80a6dcdSmrg
17f80a6dcdSmrgstatic DviFileMap *
18f80a6dcdSmrgMapPageNumberToFileMap (DviWidget dw, int number)
19f80a6dcdSmrg{
20f80a6dcdSmrg	DviFileMap	*m;
21f80a6dcdSmrg
22f80a6dcdSmrg	for (m = dw->dvi.file_map; m; m=m->next)
23f80a6dcdSmrg		if (m->page_number == number)
24f80a6dcdSmrg			break;
25f80a6dcdSmrg	return m;
26f80a6dcdSmrg}
27f80a6dcdSmrg
28f80a6dcdSmrgvoid
29f80a6dcdSmrgDestroyFileMap (m)
30f80a6dcdSmrg	DviFileMap	*m;
31f80a6dcdSmrg{
32f80a6dcdSmrg	DviFileMap	*next;
33f80a6dcdSmrg
34f80a6dcdSmrg	for (; m; m = next) {
35f80a6dcdSmrg		next = m->next;
36f80a6dcdSmrg		XtFree ((char *) m);
37f80a6dcdSmrg	}
38f80a6dcdSmrg}
39f80a6dcdSmrg
40f80a6dcdSmrgvoid
41f80a6dcdSmrgForgetPagePositions (dw)
42f80a6dcdSmrg	DviWidget	dw;
43f80a6dcdSmrg{
44f80a6dcdSmrg	DestroyFileMap (dw->dvi.file_map);
45f80a6dcdSmrg	dw->dvi.file_map = 0;
46f80a6dcdSmrg}
47f80a6dcdSmrg
48f80a6dcdSmrgvoid
49f80a6dcdSmrgRememberPagePosition(dw, number)
50f80a6dcdSmrg	DviWidget	dw;
51f80a6dcdSmrg	int		number;
52f80a6dcdSmrg{
53f80a6dcdSmrg	DviFileMap	*m;
54f80a6dcdSmrg
55f80a6dcdSmrg	if (!(m = MapPageNumberToFileMap (dw, number))) {
56f80a6dcdSmrg		m = (DviFileMap *) XtMalloc (sizeof *m);
57f80a6dcdSmrg		m->page_number = number;
58f80a6dcdSmrg		m->next = dw->dvi.file_map;
59f80a6dcdSmrg		dw->dvi.file_map = m;
60f80a6dcdSmrg	}
61f80a6dcdSmrg	if (dw->dvi.tmpFile)
62f80a6dcdSmrg		m->position = ftell (dw->dvi.tmpFile);
63f80a6dcdSmrg	else
64f80a6dcdSmrg		m->position = ftell (dw->dvi.file);
65f80a6dcdSmrg}
66f80a6dcdSmrg
67f80a6dcdSmrglong
68f80a6dcdSmrgSearchPagePosition (dw, number)
69f80a6dcdSmrg	DviWidget	dw;
70f80a6dcdSmrg	int		number;
71f80a6dcdSmrg{
72f80a6dcdSmrg	DviFileMap	*m;
73f80a6dcdSmrg
74f80a6dcdSmrg	if (!(m = MapPageNumberToFileMap (dw, number)))
75f80a6dcdSmrg		return -1;
76f80a6dcdSmrg	return m->position;
77f80a6dcdSmrg}
78f80a6dcdSmrg
79f80a6dcdSmrgvoid
80f80a6dcdSmrgFileSeek(dw, position)
81f80a6dcdSmrgDviWidget	dw;
82f80a6dcdSmrglong		position;
83f80a6dcdSmrg{
84f80a6dcdSmrg	if (dw->dvi.tmpFile) {
85f80a6dcdSmrg		dw->dvi.readingTmp = 1;
86f80a6dcdSmrg		fseek (dw->dvi.tmpFile, position, 0);
87f80a6dcdSmrg	} else
88f80a6dcdSmrg		fseek (dw->dvi.file, position, 0);
89f80a6dcdSmrg}
90f80a6dcdSmrg
91