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