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

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 16 years ago

First import

File size: 2.7 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 "FoFiBase.h"
18
19//------------------------------------------------------------------------
20// FoFiBase
21//------------------------------------------------------------------------
22
23FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) {
24  fileData = file = (Guchar *)fileA;
25  len = lenA;
26  freeFileData = freeFileDataA;
27}
28
29FoFiBase::~FoFiBase() {
30  if (freeFileData) {
31    gfree(fileData);
32  }
33}
34
35char *FoFiBase::readFile(char *fileName, int *fileLen) {
36  FILE *f;
37  char *buf;
38  int n;
39
40  if (!(f = fopen(fileName, "rb"))) {
41    return NULL;
42  }
43  fseek(f, 0, SEEK_END);
44  n = (int)ftell(f);
45  fseek(f, 0, SEEK_SET);
46  buf = (char *)gmalloc(n);
47  if ((int)fread(buf, 1, n, f) != n) {
48    gfree(buf);
49    fclose(f);
50    return NULL;
51  }
52  fclose(f);
53  *fileLen = n;
54  return buf;
55}
56
57int FoFiBase::getS8(int pos, GBool *ok) {
58  int x;
59
60  if (pos < 0 || pos >= len) {
61    *ok = gFalse;
62    return 0;
63  }
64  x = file[pos];
65  if (x & 0x80) {
66    x |= ~0xff;
67  }
68  return x;
69}
70
71int FoFiBase::getU8(int pos, GBool *ok) {
72  if (pos < 0 || pos >= len) {
73    *ok = gFalse;
74    return 0;
75  }
76  return file[pos];
77}
78
79int FoFiBase::getS16BE(int pos, GBool *ok) {
80  int x;
81
82  if (pos < 0 || pos+1 >= len) {
83    *ok = gFalse;
84    return 0;
85  }
86  x = file[pos];
87  x = (x << 8) + file[pos+1];
88  if (x & 0x8000) {
89    x |= ~0xffff;
90  }
91  return x;
92}
93
94int FoFiBase::getU16BE(int pos, GBool *ok) {
95  int x;
96
97  if (pos < 0 || pos+1 >= len) {
98    *ok = gFalse;
99    return 0;
100  }
101  x = file[pos];
102  x = (x << 8) + file[pos+1];
103  return x;
104}
105
106int FoFiBase::getS32BE(int pos, GBool *ok) {
107  int x;
108
109  if (pos < 0 || pos+3 >= len) {
110    *ok = gFalse;
111    return 0;
112  }
113  x = file[pos];
114  x = (x << 8) + file[pos+1];
115  x = (x << 8) + file[pos+2];
116  x = (x << 8) + file[pos+3];
117  if (x & 0x80000000) {
118    x |= ~0xffffffff;
119  }
120  return x;
121}
122
123Guint FoFiBase::getU32BE(int pos, GBool *ok) {
124  Guint x;
125
126  if (pos < 0 || pos+3 >= len) {
127    *ok = gFalse;
128    return 0;
129  }
130  x = file[pos];
131  x = (x << 8) + file[pos+1];
132  x = (x << 8) + file[pos+2];
133  x = (x << 8) + file[pos+3];
134  return x;
135}
136
137Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) {
138  Guint x;
139  int i;
140
141  if (pos < 0 || pos + size > len) {
142    *ok = gFalse;
143    return 0;
144  }
145  x = 0;
146  for (i = 0; i < size; ++i) {
147    x = (x << 8) + file[pos + i];
148  }
149  return x;
150}
151
152GBool FoFiBase::checkRegion(int pos, int size) {
153  return pos >= 0 &&
154         pos + size >= pos &&
155         pos + size <= len;
156}
Note: See TracBrowser for help on using the repository browser.