page.c revision c166fba9
1/*
2 * page.c
3 *
4 * map page numbers to file position
5 */
6
7#include <X11/IntrinsicP.h>
8#include <X11/StringDefs.h>
9#include <X11/Xos.h>
10#include <stdio.h>
11#include <ctype.h>
12#include "DviP.h"
13
14static DviFileMap *
15MapPageNumberToFileMap (DviWidget dw, int number)
16{
17	DviFileMap	*m;
18
19	for (m = dw->dvi.file_map; m; m=m->next)
20		if (m->page_number == number)
21			break;
22	return m;
23}
24
25void
26DestroyFileMap (DviFileMap *m)
27{
28	DviFileMap	*next;
29
30	for (; m; m = next) {
31		next = m->next;
32		XtFree ((char *) m);
33	}
34}
35
36void
37ForgetPagePositions (DviWidget dw)
38{
39	DestroyFileMap (dw->dvi.file_map);
40	dw->dvi.file_map = NULL;
41}
42
43void
44RememberPagePosition(DviWidget dw, int number)
45{
46	DviFileMap	*m;
47
48	if (!(m = MapPageNumberToFileMap (dw, number))) {
49		m = (DviFileMap *) XtMalloc (sizeof *m);
50		m->page_number = number;
51		m->next = dw->dvi.file_map;
52		dw->dvi.file_map = m;
53	}
54	if (dw->dvi.tmpFile)
55		m->position = ftell (dw->dvi.tmpFile);
56	else
57		m->position = ftell (dw->dvi.file);
58}
59
60long
61SearchPagePosition (DviWidget dw, int number)
62{
63	DviFileMap	*m;
64
65	if (!(m = MapPageNumberToFileMap (dw, number)))
66		return -1;
67	return m->position;
68}
69
70void
71FileSeek(DviWidget dw, long position)
72{
73	if (dw->dvi.tmpFile) {
74		dw->dvi.readingTmp = 1;
75		fseek (dw->dvi.tmpFile, position, SEEK_SET);
76	} else
77		fseek (dw->dvi.file, position, SEEK_SET);
78}
79
80