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

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

PDF plugin: Poppler library updated to version 0.10.0

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