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