16 #if defined(__APPLE_CC__) 17 #include <sys/types.h> 20 #if defined(__linux) || defined(__CYGWIN__) || defined(__APPLE_CC__) 21 #include <netinet/in.h> 26 #include <sys/socket.h> 48 lXDR::lXDR(
const char *filename,
bool open_for_write) : _fileName(0), _fp(0)
50 setFileName(filename, open_for_write);
51 if (htonl(1L) == 1L) _hasNetworkOrder =
true;
52 else _hasNetworkOrder =
false;
56 void lXDR::setFileName(
const char *filename,
bool open_for_write)
62 _error = LXDR_OPENFAILURE;
66 FILE *fp = fopen(filename, open_for_write ?
"wb" :
"rb");
68 FILE *fp = fopen(filename, open_for_write ?
"w" :
"r");
71 _error = LXDR_OPENFAILURE;
83 int n = (int)strlen(filename);
84 _fileName =
new char [n + 1];
85 strncpy(_fileName, filename, n);
88 _openForWrite = open_for_write;
90 _error = LXDR_SUCCESS;
94 double lXDR::ntohd(
double d)
const 99 if (_hasNetworkOrder ==
false) {
107 for (i = 0; i < 4; i++) {
108 unsigned char c = dd.b[i];
109 dd.b[i] = dd.b[7 - i];
117 long lXDR::checkRead(
long *l)
119 if (_openForWrite)
return(_error = LXDR_READONLY);
120 if (_fp == 0)
return(_error = LXDR_NOFILE);
128 if (fread(&buf, 4, 1, _fp) != 1)
return(_error = LXDR_READERROR);
129 *l = ((int32_t)ntohl(buf));
131 return(LXDR_SUCCESS);
134 long lXDR::checkRead(
double *d)
136 if (_openForWrite)
return(_error = LXDR_READONLY);
137 if (_fp == 0)
return(_error = LXDR_NOFILE);
139 if (fread(d, 8, 1, _fp) != 1)
return(_error = LXDR_READERROR);
142 return(LXDR_SUCCESS);
145 long lXDR::checkRead(
float *f)
147 if (_openForWrite)
return(_error = LXDR_READONLY);
148 if (_fp == 0)
return(_error = LXDR_NOFILE);
150 if (fread(f, 4, 1, _fp) != 1)
return(_error = LXDR_READERROR);
154 *((int32_t *) f) = ntohl(*((int32_t *) f));
156 return(LXDR_SUCCESS);
159 long lXDR::readLong(
void)
166 double lXDR::readDouble(
void)
173 double lXDR::readFloat(
void)
180 const char *lXDR::readString(
long &length)
182 if (checkRead(&length))
return(0);
183 long rl = (length + 3) & 0xFFFFFFFC;
184 char *s =
new char[rl + 1];
185 if (fread(s, 1, rl, _fp) != (
unsigned long) rl) {
186 _error = LXDR_READERROR;
191 _error = LXDR_SUCCESS;
195 long *lXDR::readLongArray(
long &length)
197 if (checkRead(&length))
return(0);
198 long *s =
new long[length];
207 int32_t *buf =
new int32_t[length];
208 if (fread(buf, 4, length, _fp) != (
unsigned long) length) {
209 _error = LXDR_READERROR;
214 for (
long i = 0; i < length; i++){
215 if (_hasNetworkOrder ==
false){
216 s[i] = ((int32_t)ntohl(buf[i]));
223 _error = LXDR_SUCCESS;
227 double *lXDR::readDoubleArray(
long &length)
229 if (checkRead(&length))
return(0);
230 double *s =
new double[length];
231 if (fread(s, 8, length, _fp) != (
unsigned long) length) {
232 _error = LXDR_READERROR;
236 if (_hasNetworkOrder ==
false)
for (
long i = 0; i < length; i++) s[i] = ntohd(s[i]);
237 _error = LXDR_SUCCESS;
241 double *lXDR::readFloatArray(
long &length)
243 if (checkRead(&length))
return(0);
244 long *st =
new long[length];
246 if (fread(st, 4, length, _fp) != (
unsigned long) length) {
247 _error = LXDR_READERROR;
251 double *s =
new double[length];
253 if (_hasNetworkOrder ==
false) {
254 for (
long i = 0; i < length; i++) {
255 long l = ntohl(st[i]);
256 s[i] = (double) (*((
float *) &l));
259 _error = LXDR_SUCCESS;
264 long lXDR::checkWrite(
long *l)
266 if (_openForWrite ==
false)
return(_error = LXDR_WRITEONLY);
267 if (_fp == 0)
return(_error = LXDR_NOFILE);
271 if (fwrite(&ll, 4, 1, _fp) != 4)
return(_error = LXDR_WRITEERROR);
273 return(LXDR_SUCCESS);
276 long lXDR::checkWrite(
double *d)
278 if (_openForWrite ==
false)
return(_error = LXDR_WRITEONLY);
279 if (_fp == 0)
return(_error = LXDR_NOFILE);
281 double dd = htond(*d);
282 if (fwrite(&dd, 8, 1, _fp) != 8)
return(_error = LXDR_WRITEERROR);
284 return(LXDR_SUCCESS);
287 long lXDR::writeLong(
long data)
289 return(checkWrite(&data));
292 long lXDR::writeDouble(
double data)
294 return(checkWrite(&data));
297 long lXDR::writeString(
const char *data)
299 return(writeString(data, strlen(data)));
302 long lXDR::writeString(
const char *data,
long length)
304 if (checkWrite(&length))
return(_error);
305 if (fwrite(data, 1, length, _fp) != (
unsigned long) length)
return(_error = LXDR_WRITEERROR);
306 long l = ((length + 3) & 0xFFFFFFFC) - length;
307 if (fwrite(&l, 1, l, _fp) != (
unsigned long) l)
return(_error = LXDR_WRITEERROR);
308 return(_error = LXDR_SUCCESS);
311 long lXDR::writeLongArray(
const long *data,
long length)
313 if (checkWrite(&length))
return(_error);
314 long *s = (
long *) data;
315 if (_hasNetworkOrder ==
false) {
316 s =
new long[length];
317 for (
long i = 0; i < length; i++) s[i] = htonl(data[i]);
320 long l = fwrite(s, 4, length, _fp);
321 if (_hasNetworkOrder ==
false)
delete [] s;
322 if (l != length)
return(_error = LXDR_WRITEERROR);
323 return(_error = LXDR_SUCCESS);
326 long lXDR::writeDoubleArray(
const double *data,
long length)
328 if (checkWrite(&length))
return(_error);
329 double *s = (
double *) data;
330 if (_hasNetworkOrder ==
false) {
331 s =
new double[length];
332 for (
long i = 0; i < length; i++) s[i] = htond(data[i]);
334 long l = fwrite(s, 8, length, _fp);
335 if (_hasNetworkOrder ==
false)
delete [] s;
336 if (l != length)
return(_error = LXDR_WRITEERROR);
337 return(_error = LXDR_SUCCESS);
341 long lXDR::filePosition(
long pos)
344 _error = LXDR_NOFILE;
347 if (pos == -1)
return(ftell(_fp));
348 if (fseek(_fp, pos, SEEK_SET)) {
349 _error = LXDR_SEEKERROR;