page.c revision f80a6dcd
1f80a6dcdSmrg/* $XConsortium: page.c,v 1.5 91/07/26 00:40:20 keith Exp $ */ 2f80a6dcdSmrg/* $XFree86: xc/programs/xditview/page.c,v 1.3 2001/08/01 00:45:03 tsi Exp $ */ 3f80a6dcdSmrg 4f80a6dcdSmrg/* 5f80a6dcdSmrg * page.c 6f80a6dcdSmrg * 7f80a6dcdSmrg * map page numbers to file position 8f80a6dcdSmrg */ 9f80a6dcdSmrg 10f80a6dcdSmrg#include <X11/IntrinsicP.h> 11f80a6dcdSmrg#include <X11/StringDefs.h> 12f80a6dcdSmrg#include <X11/Xos.h> 13f80a6dcdSmrg#include <stdio.h> 14f80a6dcdSmrg#include <ctype.h> 15f80a6dcdSmrg#include "DviP.h" 16f80a6dcdSmrg 17f80a6dcdSmrgstatic DviFileMap * 18f80a6dcdSmrgMapPageNumberToFileMap (DviWidget dw, int number) 19f80a6dcdSmrg{ 20f80a6dcdSmrg DviFileMap *m; 21f80a6dcdSmrg 22f80a6dcdSmrg for (m = dw->dvi.file_map; m; m=m->next) 23f80a6dcdSmrg if (m->page_number == number) 24f80a6dcdSmrg break; 25f80a6dcdSmrg return m; 26f80a6dcdSmrg} 27f80a6dcdSmrg 28f80a6dcdSmrgvoid 29f80a6dcdSmrgDestroyFileMap (m) 30f80a6dcdSmrg DviFileMap *m; 31f80a6dcdSmrg{ 32f80a6dcdSmrg DviFileMap *next; 33f80a6dcdSmrg 34f80a6dcdSmrg for (; m; m = next) { 35f80a6dcdSmrg next = m->next; 36f80a6dcdSmrg XtFree ((char *) m); 37f80a6dcdSmrg } 38f80a6dcdSmrg} 39f80a6dcdSmrg 40f80a6dcdSmrgvoid 41f80a6dcdSmrgForgetPagePositions (dw) 42f80a6dcdSmrg DviWidget dw; 43f80a6dcdSmrg{ 44f80a6dcdSmrg DestroyFileMap (dw->dvi.file_map); 45f80a6dcdSmrg dw->dvi.file_map = 0; 46f80a6dcdSmrg} 47f80a6dcdSmrg 48f80a6dcdSmrgvoid 49f80a6dcdSmrgRememberPagePosition(dw, number) 50f80a6dcdSmrg DviWidget dw; 51f80a6dcdSmrg int number; 52f80a6dcdSmrg{ 53f80a6dcdSmrg DviFileMap *m; 54f80a6dcdSmrg 55f80a6dcdSmrg if (!(m = MapPageNumberToFileMap (dw, number))) { 56f80a6dcdSmrg m = (DviFileMap *) XtMalloc (sizeof *m); 57f80a6dcdSmrg m->page_number = number; 58f80a6dcdSmrg m->next = dw->dvi.file_map; 59f80a6dcdSmrg dw->dvi.file_map = m; 60f80a6dcdSmrg } 61f80a6dcdSmrg if (dw->dvi.tmpFile) 62f80a6dcdSmrg m->position = ftell (dw->dvi.tmpFile); 63f80a6dcdSmrg else 64f80a6dcdSmrg m->position = ftell (dw->dvi.file); 65f80a6dcdSmrg} 66f80a6dcdSmrg 67f80a6dcdSmrglong 68f80a6dcdSmrgSearchPagePosition (dw, number) 69f80a6dcdSmrg DviWidget dw; 70f80a6dcdSmrg int number; 71f80a6dcdSmrg{ 72f80a6dcdSmrg DviFileMap *m; 73f80a6dcdSmrg 74f80a6dcdSmrg if (!(m = MapPageNumberToFileMap (dw, number))) 75f80a6dcdSmrg return -1; 76f80a6dcdSmrg return m->position; 77f80a6dcdSmrg} 78f80a6dcdSmrg 79f80a6dcdSmrgvoid 80f80a6dcdSmrgFileSeek(dw, position) 81f80a6dcdSmrgDviWidget dw; 82f80a6dcdSmrglong position; 83f80a6dcdSmrg{ 84f80a6dcdSmrg if (dw->dvi.tmpFile) { 85f80a6dcdSmrg dw->dvi.readingTmp = 1; 86f80a6dcdSmrg fseek (dw->dvi.tmpFile, position, 0); 87f80a6dcdSmrg } else 88f80a6dcdSmrg fseek (dw->dvi.file, position, 0); 89f80a6dcdSmrg} 90f80a6dcdSmrg 91