source: trunk/poppler/mypoppler/fofi/FoFiBase.cc @ 250

Last change on this file since 250 was 250, checked in by Eugene Romanenko, 13 years ago

PDF plugin: poppler library updated to version 0.8.3

File size: 3.0 KB
Line 
1//========================================================================
2//
3// FoFiBase.cc
4//
5// Copyright 1999-2003 Glyph & Cog, LLC
6//
7//========================================================================
8
9#include <config.h>
10
11#ifdef USE_GCC_PRAGMAS
12#pragma implementation
13#endif
14
15#include <stdio.h>
16#include "goo/gmem.h"
17#include "poppler/Error.h"
18#include "FoFiBase.h"
19
20//------------------------------------------------------------------------
21// FoFiBase
22//------------------------------------------------------------------------
23
24FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) {
25  fileData = file = (Guchar *)fileA;
26  len = lenA;
27  freeFileData = freeFileDataA;
28}
29
30FoFiBase::~FoFiBase() {
31  if (freeFileData) {
32    gfree(fileData);
33  }
34}
35
36char *FoFiBase::readFile(char *fileName, int *fileLen) {
37  FILE *f;
38  char *buf;
39  int n;
40
41  if (!(f = fopen(fileName, "rb"))) {
42    error(-1, "Cannot open '%s'", fileName);
43    return NULL;
44  }
45  if (fseek(f, 0, SEEK_END) != 0) {
46    error(-1, "Cannot seek to end of '%s'", fileName);
47    fclose(f);
48    return NULL;
49  }
50  n = (int)ftell(f);
51  if (fseek(f, 0, SEEK_SET) != 0) {
52    error(-1, "Cannot seek to start of '%s'", fileName);
53    fclose(f);
54    return NULL;
55  }
56  buf = (char *)gmalloc(n);
57  if ((int)fread(buf, 1, n, f) != n) {
58    gfree(buf);
59    fclose(f);
60    return NULL;
61  }
62  fclose(f);
63  *fileLen = n;
64  return buf;
65}
66
67int FoFiBase::getS8(int pos, GBool *ok) {
68  int x;
69
70  if (pos < 0 || pos >= len) {
71    *ok = gFalse;
72    return 0;
73  }
74  x = file[pos];
75  if (x & 0x80) {
76    x |= ~0xff;
77  }
78  return x;
79}
80
81int FoFiBase::getU8(int pos, GBool *ok) {
82  if (pos < 0 || pos >= len) {
83    *ok = gFalse;
84    return 0;
85  }
86  return file[pos];
87}
88
89int FoFiBase::getS16BE(int pos, GBool *ok) {
90  int x;
91
92  if (pos < 0 || pos+1 >= len) {
93    *ok = gFalse;
94    return 0;
95  }
96  x = file[pos];
97  x = (x << 8) + file[pos+1];
98  if (x & 0x8000) {
99    x |= ~0xffff;
100  }
101  return x;
102}
103
104int FoFiBase::getU16BE(int pos, GBool *ok) {
105  int x;
106
107  if (pos < 0 || pos+1 >= len) {
108    *ok = gFalse;
109    return 0;
110  }
111  x = file[pos];
112  x = (x << 8) + file[pos+1];
113  return x;
114}
115
116int FoFiBase::getS32BE(int pos, GBool *ok) {
117  int x;
118
119  if (pos < 0 || pos+3 >= len) {
120    *ok = gFalse;
121    return 0;
122  }
123  x = file[pos];
124  x = (x << 8) + file[pos+1];
125  x = (x << 8) + file[pos+2];
126  x = (x << 8) + file[pos+3];
127  if (x & 0x80000000) {
128    x |= ~0xffffffff;
129  }
130  return x;
131}
132
133Guint FoFiBase::getU32BE(int pos, GBool *ok) {
134  Guint x;
135
136  if (pos < 0 || pos+3 >= len) {
137    *ok = gFalse;
138    return 0;
139  }
140  x = file[pos];
141  x = (x << 8) + file[pos+1];
142  x = (x << 8) + file[pos+2];
143  x = (x << 8) + file[pos+3];
144  return x;
145}
146
147Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) {
148  Guint x;
149  int i;
150
151  if (pos < 0 || pos + size > len) {
152    *ok = gFalse;
153    return 0;
154  }
155  x = 0;
156  for (i = 0; i < size; ++i) {
157    x = (x << 8) + file[pos + i];
158  }
159  return x;
160}
161
162GBool FoFiBase::checkRegion(int pos, int size) {
163  return pos >= 0 &&
164         pos + size >= pos &&
165         pos + size <= len;
166}
Note: See TracBrowser for help on using the repository browser.