1f80a6dcdSmrg/*
2f80a6dcdSmrg * page.c
3f80a6dcdSmrg *
4f80a6dcdSmrg * map page numbers to file position
5f80a6dcdSmrg */
6f80a6dcdSmrg
700994698Smrg#ifdef HAVE_CONFIG_H
800994698Smrg# include "config.h"
900994698Smrg#endif
1000994698Smrg
11f80a6dcdSmrg#include <X11/IntrinsicP.h>
12f80a6dcdSmrg#include <X11/StringDefs.h>
13f80a6dcdSmrg#include <X11/Xos.h>
14f80a6dcdSmrg#include <stdio.h>
15f80a6dcdSmrg#include <ctype.h>
16f80a6dcdSmrg#include "DviP.h"
17f80a6dcdSmrg
18f80a6dcdSmrgstatic DviFileMap *
1900994698SmrgMapPageNumberToFileMap(DviWidget dw, int number)
20f80a6dcdSmrg{
2100994698Smrg    DviFileMap *m;
22f80a6dcdSmrg
2300994698Smrg    for (m = dw->dvi.file_map; m; m = m->next) {
2400994698Smrg        if (m->page_number == number)
2500994698Smrg            break;
2600994698Smrg    }
2700994698Smrg    return m;
28f80a6dcdSmrg}
29f80a6dcdSmrg
30f80a6dcdSmrgvoid
3100994698SmrgDestroyFileMap(DviFileMap *m)
32f80a6dcdSmrg{
3300994698Smrg    DviFileMap *next;
34f80a6dcdSmrg
3500994698Smrg    for (; m; m = next) {
3600994698Smrg        next = m->next;
3700994698Smrg        XtFree((char *) m);
3800994698Smrg    }
39f80a6dcdSmrg}
40f80a6dcdSmrg
41f80a6dcdSmrgvoid
4200994698SmrgForgetPagePositions(DviWidget dw)
43f80a6dcdSmrg{
4400994698Smrg    DestroyFileMap(dw->dvi.file_map);
4500994698Smrg    dw->dvi.file_map = NULL;
46f80a6dcdSmrg}
47f80a6dcdSmrg
48f80a6dcdSmrgvoid
4965912f00SmrgRememberPagePosition(DviWidget dw, int number)
50f80a6dcdSmrg{
5100994698Smrg    DviFileMap *m = MapPageNumberToFileMap(dw, number);
52f80a6dcdSmrg
5300994698Smrg    if (!m) {
5400994698Smrg        m = (DviFileMap *) XtMalloc(sizeof *m);
5500994698Smrg        m->page_number = number;
5600994698Smrg        m->next = dw->dvi.file_map;
5700994698Smrg        dw->dvi.file_map = m;
5800994698Smrg    }
5900994698Smrg    if (dw->dvi.tmpFile)
6000994698Smrg        m->position = ftell(dw->dvi.tmpFile);
6100994698Smrg    else
6200994698Smrg        m->position = ftell(dw->dvi.file);
63f80a6dcdSmrg}
64f80a6dcdSmrg
65f80a6dcdSmrglong
6600994698SmrgSearchPagePosition(DviWidget dw, int number)
67f80a6dcdSmrg{
6800994698Smrg    DviFileMap *m = MapPageNumberToFileMap(dw, number);
69f80a6dcdSmrg
7000994698Smrg    if (!m)
7100994698Smrg        return -1;
7200994698Smrg    return m->position;
73f80a6dcdSmrg}
74f80a6dcdSmrg
75f80a6dcdSmrgvoid
7665912f00SmrgFileSeek(DviWidget dw, long position)
77f80a6dcdSmrg{
7800994698Smrg    if (dw->dvi.tmpFile) {
7900994698Smrg        dw->dvi.readingTmp = 1;
8000994698Smrg        fseek(dw->dvi.tmpFile, position, SEEK_SET);
8100994698Smrg    }
8200994698Smrg    else
8300994698Smrg        fseek(dw->dvi.file, position, SEEK_SET);
84f80a6dcdSmrg}
85