1 /* $NetBSD: page.c,v 1.1.1.1 2016/01/13 18:41:49 christos Exp $ */ 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 17 extern long ftell(); 18 #endif 19 20 static DviFileMap * 21 MapPageNumberToFileMap (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 31 void 32 DestroyFileMap (DviFileMap *m) 33 { 34 DviFileMap *next; 35 36 for (; m; m = next) { 37 next = m->next; 38 XtFree ((char *) m); 39 } 40 } 41 42 void 43 ForgetPagePositions (DviWidget dw) 44 { 45 DestroyFileMap (dw->dvi.file_map); 46 dw->dvi.file_map = 0; 47 } 48 49 void 50 RememberPagePosition(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 66 long 67 SearchPagePosition (DviWidget dw, int number) 68 { 69 DviFileMap *m; 70 71 if (!(m = MapPageNumberToFileMap (dw, number))) 72 return -1; 73 return m->position; 74 } 75 76 void 77 FileSeek(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