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