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

Last change on this file since 497 was 497, checked in by Silvan Scherrer, 10 years ago

Lucide: updated fontconfig and poppler

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