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