]> git.ipfire.org Git - thirdparty/cups.git/blame - pdftops/FoFiBase.cxx
Merge changes from CUPS 1.4svn-r7199.
[thirdparty/cups.git] / pdftops / FoFiBase.cxx
CommitLineData
ef416fc2 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 "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}