GRASS 8 Programmer's Manual 8.6.0dev(2026)-1d1e47ad9d
Loading...
Searching...
No Matches
fpcompress.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3#include <sys/types.h>
4#include <unistd.h>
5#include "raster3d_intern.h"
6
7/*--------------------------------------------------------------------------*/
8
9#define XDR_DOUBLE_LENGTH 8
10#define XDR_DOUBLE_NOF_EXP_BYTES 2
11#define XDR_FLOAT_LENGTH 4
12#define XDR_FLOAT_NOF_EXP_BYTES 1
13
14/*--------------------------------------------------------------------------*/
15
17{
18 unsigned char bit;
19 int i;
20
21 bit = 1 << (numBits - 1);
22
23 for (i = 0; i < numBits; i++) {
24 printf("%d", (*((unsigned char *)c) & bit) != 0);
25 bit >>= 1;
26 }
27}
28
29/*--------------------------------------------------------------------------*/
30
32{
33 char sign, exponent;
34
35 sign = *numPointer >> 7;
36 exponent = (*numPointer << 1) | (*(numPointer + 1) >> 7);
37
38 printf("%f: sign = ", *((float *)numPointer));
40 printf(" exp = ");
42 printf(" mantissa = ");
46 printf("\n");
47}
48
49/*--------------------------------------------------------------------------*/
50
51static unsigned char clearMask[9] = {255, 128, 192, 224, 240,
52 248, 252, 254, 255};
53
54/*--------------------------------------------------------------------------*/
55
56#define ALL_NULL_CODE 2
57#define ZERO_NULL_CODE 1
58#define SOME_NULL_CODE 0
59
60/*--------------------------------------------------------------------------*/
61
62static void G_fpcompress_rearrangeEncodeFloats(unsigned char *src, int size,
63 int precision,
64 unsigned char *dst, int *length,
65 int *offsetMantissa)
66{
67 unsigned int nNullBits, nBits;
68 register unsigned char *srcStop;
69 register unsigned char *cp0, *cp1, *cp2, *cp3, *nullBits;
70 unsigned char mask, isNull;
72 float *f;
73
74 srcStop = src + size * XDR_FLOAT_LENGTH;
75
76 if ((precision >= 23) || (precision == -1)) {
77 cp3 = dst;
78 cp2 = cp3 + size;
79 cp1 = cp2 + size;
80 cp0 = cp1 + size;
81 while (srcStop != src) {
82 *cp3++ = *src++; /* sign + 7 exponent bits */
83 *cp2++ = *src++; /* 1 exponent bit + 7 ms mantissa bits */
84 *cp1++ = *src++; /* 8 mantissa bits */
85 *cp0++ = *src++; /* 8 ls mantissa bits */
86 }
87
88 *length = size * XDR_FLOAT_LENGTH;
89 *offsetMantissa = size;
90
91 return;
92 }
93
94 f = (float *)src;
95 nofNull = 0;
96 while (srcStop != (unsigned char *)f)
98
99 if (nofNull == size) {
100 *dst = (unsigned char)ALL_NULL_CODE;
101
102 *length = 1;
103 *offsetMantissa = 1;
104
105 return;
106 }
107
108 precision += 1; /* treat the ls exponent bit like an addl mantissa bit */
109
110 *dst = (unsigned char)(nofNull == 0 ? ZERO_NULL_CODE : SOME_NULL_CODE);
111
112 gt16 = precision > 16;
113 gt8 = precision > 8;
114 srcIncrement = 1 + (!gt8) + (!gt16);
115
116 precision %= 8;
117
118 nullBits = dst + 1;
119 if (nofNull)
120 cp0 = nullBits + size / 8 + ((size % 8) != 0);
121 else
122 cp0 = nullBits;
123 cp3 = cp0 + size - nofNull;
124 cp2 = cp3 + size - nofNull;
125 cp1 = cp3 + (gt8 + gt16) * (size - nofNull);
126
127 mask = clearMask[precision];
128 nBits = nNullBits = 0;
129
130 while (srcStop != src) {
131 if (nofNull) {
132 isNull = Rast3d_is_xdr_null_float((float *)src);
133
134 if (nNullBits) {
135 *nullBits |= ((unsigned char)isNull << nNullBits++);
136 if (nNullBits == 8) {
137 nullBits++;
138 nNullBits = 0;
139 }
140 }
141 else {
142 *nullBits = (unsigned char)isNull;
143 nNullBits++;
144 }
145
146 if (isNull) {
147 src += XDR_FLOAT_LENGTH;
148 continue;
149 }
150 }
151
152 /* printf ("write src cp0 %d %d (%d %d) %d\n", *src, *cp0, src, cp0,
153 * nullBits); */
154
155 *cp0++ = *src++;
156 if (gt8)
157 *cp3++ = *src++;
158 if (gt16)
159 *cp2++ = *src++;
160
161 if (nBits && precision) {
162 *cp1 |= (unsigned char)((unsigned char)(*src & mask) >> nBits);
163
164 /*printf ("%d\n", ((*src & mask) >> nBits) << nBits); */
165
166 if (8 - nBits < (unsigned int)precision) {
167 cp1++;
168
169 /*printf ("%d %d\n", *cp1, (*src & mask) << (8 - nBits)); */
170
171 *cp1 = (unsigned char)((unsigned char)((*src & mask))
172 << (8 - nBits));
173 nBits += precision - 8;
174 }
175 else {
176 nBits = (nBits + precision) % 8;
177 if (!nBits)
178 cp1++;
179 }
180 }
181 else {
182 *cp1 = (unsigned char)(*src & mask);
183 /* printf ("%d %d %d\n", *cp1, *src, nBits); */
184 nBits = (nBits + precision) % 8;
185 if (!nBits)
186 cp1++;
187 }
188
189 src += srcIncrement;
190 }
191
192 *length = 1; /* null-bit-vector indicator-byte */
193
194 if (nofNull) /* length of null-bit-vector */
195 *length += size / 8 + ((size % 8) != 0);
196
197 /* length of data */
198 *length += (gt8 + gt16 + (precision == 0) + 1) * (size - nofNull) +
199 ((precision * (size - nofNull)) / 8) +
200 (((precision * (size - nofNull)) % 8) != 0);
201
202 *offsetMantissa = size - nofNull;
203}
204
205/*--------------------------------------------------------------------------*/
206
207static void G_fpcompress_rearrangeEncodeDoubles(unsigned char *src, int size,
208 int precision,
209 unsigned char *dst, int *length,
210 int *offsetMantissa)
211{
212 unsigned int nNullBits, nBits;
213 unsigned char isNull;
214 register unsigned char *srcStop;
215 register unsigned char *cp0, *cp1, *cp2, *cp3;
216 register unsigned char *cp4, *cp5, *cp6, *cp7, *nullBits;
217 unsigned char mask;
219 double *d;
220
221 srcStop = src + size * XDR_DOUBLE_LENGTH;
222
223 if ((precision >= 52) || (precision == -1)) {
224 cp7 = dst;
225 cp6 = cp7 + size;
226 cp5 = cp6 + size;
227 cp4 = cp5 + size;
228 cp3 = cp4 + size;
229 cp2 = cp3 + size;
230 cp1 = cp2 + size;
231 cp0 = cp1 + size;
232
233 while (srcStop != src) {
234 *cp7++ = *src++; /* sign + 7 ms exponent bits */
235 *cp6++ = *src++; /* 4 exponent bits + 4 ms mantissa bits */
236 *cp5++ = *src++; /* 8 mantissa bits */
237 *cp4++ = *src++;
238 *cp3++ = *src++;
239 *cp2++ = *src++;
240 *cp1++ = *src++;
241 *cp0++ = *src++; /* 8 ls mantissa bits */
242 }
243
244 *length = size * XDR_DOUBLE_LENGTH;
245 *offsetMantissa = size;
246
247 return;
248 }
249
250 precision += 4; /* treat the 4 ls exponent bits like addl mantissa bits */
251
252 d = (double *)src;
253 nofNull = 0;
254 while (srcStop != (unsigned char *)d)
256
257 if (nofNull == size) {
258 *dst = (unsigned char)ALL_NULL_CODE;
259
260 *length = 1;
261 *offsetMantissa = 1;
262
263 return;
264 }
265
266 *dst = (unsigned char)(nofNull == 0 ? ZERO_NULL_CODE : SOME_NULL_CODE);
267
268 gt48 = precision > 48;
269 gt40 = precision > 40;
270 gt32 = precision > 32;
271 gt24 = precision > 24;
272 gt16 = precision > 16;
273 gt8 = precision > 8;
274 srcIncrement = 1 + (!gt8) + (!gt16) + (!gt24) + (!gt32) + (!gt40) + (!gt48);
275
276 precision %= 8;
277
278 nullBits = dst + 1;
279 if (nofNull)
280 cp0 = nullBits + size / 8 + ((size % 8) != 0);
281 else
282 cp0 = nullBits;
283 cp7 = cp0 + size - nofNull;
284 cp6 = cp7 + size - nofNull;
285 cp5 = cp6 + size - nofNull;
286 cp4 = cp5 + size - nofNull;
287 cp3 = cp4 + size - nofNull;
288 cp2 = cp3 + size - nofNull;
289 cp1 = cp7 + (gt8 + gt16 + gt24 + gt32 + gt40 + gt48) * (size - nofNull);
290
291 mask = clearMask[precision];
292 nBits = nNullBits = 0;
293
294 while (srcStop != src) {
295 if (nofNull) {
296 isNull = Rast3d_is_xdr_null_double((double *)src);
297
298 if (nNullBits) {
299 *nullBits |= ((unsigned char)isNull << nNullBits++);
300 if (nNullBits == 8) {
301 nullBits++;
302 nNullBits = 0;
303 }
304 }
305 else {
306 *nullBits = (unsigned char)isNull;
307 nNullBits++;
308 }
309
310 if (isNull) {
311 src += XDR_DOUBLE_LENGTH;
312 continue;
313 }
314 }
315
316 *cp0++ = *src++;
317 if (gt32) {
318 *cp7++ = *src++;
319 *cp6++ = *src++;
320 *cp5++ = *src++;
321
322 if (gt32)
323 *cp4++ = *src++;
324 if (gt40)
325 *cp3++ = *src++;
326 if (gt48)
327 *cp2++ = *src++;
328 }
329 else {
330 if (gt8)
331 *cp7++ = *src++;
332 if (gt16)
333 *cp6++ = *src++;
334 if (gt24)
335 *cp5++ = *src++;
336 }
337
338 if (nBits && precision) {
339 *cp1 |= (unsigned char)((unsigned char)(*src & mask) >> nBits);
340 if (8 - nBits < (unsigned int)precision) {
341 cp1++;
342 *cp1 = (unsigned char)(((unsigned char)(*src & mask))
343 << (8 - nBits));
344 nBits += precision - 8;
345 }
346 else {
347 nBits = (nBits + precision) % 8;
348 if (!nBits)
349 cp1++;
350 }
351 }
352 else {
353 *cp1 = (unsigned char)(*src & mask);
354 nBits = (nBits + precision) % 8;
355 if (!nBits)
356 cp1++;
357 }
358
359 src += srcIncrement;
360 }
361
362 *length = 1;
363
364 if (nofNull)
365 *length += size / 8 + ((size % 8) != 0);
366
367 *length += (1 + gt8 + gt16 + gt24 + gt32 + gt40 + gt48 + (precision == 0)) *
368 (size - nofNull) +
369 ((precision * (size - nofNull)) / 8) +
370 (((precision * (size - nofNull)) % 8) != 0);
371
372 if (gt8)
373 *offsetMantissa = 2 * (size - nofNull);
374 else
375 *offsetMantissa = *length;
376}
377
378/*--------------------------------------------------------------------------*/
379
380static void G_fpcompress_rearrangeDecodeFloats(unsigned char *src, int size,
381 int precision,
382 unsigned char *dst)
383{
384 unsigned int nNullBits, nBits;
385 register unsigned char *dstStop;
386 register unsigned char *cp0, *cp1, *cp2, *cp3, *nullBits;
387 unsigned char mask, isNull;
389 float *f, *fStop;
390
391 if ((precision != -1) && (precision <= 15)) { /* 23 - 8 */
392 cp3 = dst + 3;
393 dstStop = dst + XDR_FLOAT_LENGTH * size + 3;
394 while (dstStop != cp3) {
395 *cp3 = 0;
397 }
398
399 if (precision <= 7) {
400 cp3 = dst + 2;
401 dstStop = dst + XDR_FLOAT_LENGTH * size + 2;
402 while (dstStop != cp3) {
403 *cp3 = 0;
405 }
406 }
407 }
408
409 dstStop = dst + size * XDR_FLOAT_LENGTH;
410
411 if ((precision >= 23) || (precision == -1)) {
412 cp3 = src;
413 cp2 = cp3 + size;
414 cp1 = cp2 + size;
415 cp0 = cp1 + size;
416 while (dstStop != dst) {
417 *dst++ = *cp3++;
418 *dst++ = *cp2++;
419 *dst++ = *cp1++;
420 *dst++ = *cp0++;
421 }
422
423 return;
424 }
425
426 if (*src == (unsigned char)ALL_NULL_CODE) {
427 f = (float *)dst;
428 while (dstStop != (unsigned char *)f)
430
431 return;
432 }
433
434 precision += 1; /* treat the ls exponent bit like an addl mantissa bit */
435
436 gt16 = precision > 16;
437 gt8 = precision > 8;
438 dstIncrement = 1 + (!gt8) + (!gt16);
439
440 precision %= 8;
441
442 nofNull = 0;
443 nullBits = src + 1;
444 nNullBits = 0;
445 if (*src == (unsigned char)SOME_NULL_CODE) {
446 f = (float *)src;
447 fStop = (float *)(src + size * XDR_FLOAT_LENGTH);
448 while (fStop != f++) {
449 nofNull += ((*nullBits & ((unsigned char)1 << nNullBits++)) != 0);
450 if (nNullBits == 8) {
451 nullBits++;
452 nNullBits = 0;
453 }
454 }
455 }
456
457 nullBits = src + 1;
458 if (nofNull)
459 cp0 = nullBits + size / 8 + ((size % 8) != 0);
460 else
461 cp0 = nullBits;
462 cp3 = cp0 + size - nofNull;
463 cp2 = cp3 + size - nofNull;
464 cp1 = cp3 + (gt8 + gt16) * (size - nofNull);
465
466 mask = clearMask[precision];
467 nBits = nNullBits = 0;
468
469 while (dstStop != dst) {
470 if (nofNull) {
471 isNull = *nullBits & ((unsigned char)1 << nNullBits++);
472
473 if (nNullBits == 8) {
474 nullBits++;
475 nNullBits = 0;
476 }
477
478 if (isNull) {
479 Rast3d_set_xdr_null_float((float *)dst);
480 dst += XDR_FLOAT_LENGTH;
481 continue;
482 }
483 }
484
485 *dst++ = *cp0++;
486 if (gt8)
487 *dst++ = *cp3++;
488 if (gt16)
489 *dst++ = *cp2++;
490
491 if (nBits && precision) {
492 *dst = (unsigned char)((*cp1 << nBits) & mask);
493
494 if (8 - nBits < (unsigned int)precision) {
495 cp1++;
496 *dst |= (unsigned char)((*cp1 >> (8 - nBits)) & mask);
497 nBits += precision - 8;
498 }
499 else {
500 nBits = (nBits + precision) % 8;
501 if (!nBits)
502 cp1++;
503 }
504 }
505 else {
506 *dst = (unsigned char)(*cp1 & mask);
507 nBits = (nBits + precision) % 8;
508 if (!nBits)
509 cp1++;
510 }
511
512 dst += dstIncrement;
513 }
514}
515
516/*--------------------------------------------------------------------------*/
517
518static void G_fpcompress_rearrangeDecodeDoubles(unsigned char *src, int size,
519 int precision,
520 unsigned char *dst)
521{
522 unsigned int nNullBits, nBits;
523 register unsigned char *dstStop;
524 register unsigned char *cp0, *cp1, *cp2, *cp3;
525 register unsigned char *cp4, *cp5, *cp6, *cp7, *nullBits;
526 unsigned char mask, isNull;
528 double *d, *dStop;
529
530 if ((precision != -1) && (precision <= 44)) {
531 for (offs = 7; offs >= (precision + 19) / 8; offs--) {
532 cp7 = dst + offs;
533 dstStop = dst + XDR_DOUBLE_LENGTH * size + offs;
534 while (dstStop != cp7) {
535 *cp7 = 0;
537 }
538 }
539 }
540
541 dstStop = dst + size * XDR_DOUBLE_LENGTH;
542
543 if ((precision >= 52) || (precision == -1)) {
544 cp7 = src;
545 cp6 = cp7 + size;
546 cp5 = cp6 + size;
547 cp4 = cp5 + size;
548 cp3 = cp4 + size;
549 cp2 = cp3 + size;
550 cp1 = cp2 + size;
551 cp0 = cp1 + size;
552
553 while (dstStop != dst) {
554 *dst++ = *cp7++;
555 *dst++ = *cp6++;
556 *dst++ = *cp5++;
557 *dst++ = *cp4++;
558 *dst++ = *cp3++;
559 *dst++ = *cp2++;
560 *dst++ = *cp1++;
561 *dst++ = *cp0++;
562 }
563
564 return;
565 }
566
567 if (*src == (unsigned char)ALL_NULL_CODE) {
568 /*printf ("all null\n"); */
569 d = (double *)dst;
570 while (dstStop != (unsigned char *)d)
572
573 return;
574 }
575
576 precision += 4; /* treat the 4 ls exponent bits like addl mantissa bits */
577
578 gt48 = precision > 48;
579 gt40 = precision > 40;
580 gt32 = precision > 32;
581 gt24 = precision > 24;
582 gt16 = precision > 16;
583 gt8 = precision > 8;
584
585 dstIncrement = 1 + (!gt8) + (!gt16) + (!gt24) + (!gt32) + (!gt40) + (!gt48);
586
587 precision %= 8;
588
589 nofNull = 0;
590 nullBits = src + 1;
591 nNullBits = 0;
592 if (*src == (unsigned char)SOME_NULL_CODE) {
593 d = (double *)src;
594 dStop = (double *)(src + size * XDR_DOUBLE_LENGTH);
595 while (dStop != d++) {
596 nofNull += ((*nullBits & ((unsigned char)1 << nNullBits++)) != 0);
597 if (nNullBits == 8) {
598 nullBits++;
599 nNullBits = 0;
600 }
601 }
602 }
603
604 nullBits = src + 1;
605 if (nofNull)
606 cp0 = nullBits + size / 8 + ((size % 8) != 0);
607 else
608 cp0 = nullBits;
609 cp7 = cp0 + size - nofNull;
610 cp6 = cp7 + size - nofNull;
611 cp5 = cp6 + size - nofNull;
612 cp4 = cp5 + size - nofNull;
613 cp3 = cp4 + size - nofNull;
614 cp2 = cp3 + size - nofNull;
615 cp1 = cp7 + (gt8 + gt16 + gt24 + gt32 + gt40 + gt48) * (size - nofNull);
616
617 mask = clearMask[precision];
618 nBits = nNullBits = 0;
619
620 while (dstStop != dst) {
621 if (nofNull) {
622 isNull = *nullBits & ((unsigned char)1 << nNullBits++);
623
624 if (nNullBits == 8) {
625 nullBits++;
626 nNullBits = 0;
627 }
628
629 if (isNull) {
630 Rast3d_set_xdr_null_double((double *)dst);
631 dst += XDR_DOUBLE_LENGTH;
632 continue;
633 }
634 }
635
636 *dst++ = *cp0++;
637 if (gt32) {
638 *dst++ = *cp7++;
639 *dst++ = *cp6++;
640 *dst++ = *cp5++;
641
642 if (gt32)
643 *dst++ = *cp4++;
644 if (gt40)
645 *dst++ = *cp3++;
646 if (gt48)
647 *dst++ = *cp2++;
648 }
649 else {
650 if (gt8)
651 *dst++ = *cp7++;
652 if (gt16)
653 *dst++ = *cp6++;
654 if (gt24)
655 *dst++ = *cp5++;
656 }
657
658 if (nBits && precision) {
659 *dst = (unsigned char)((*cp1 << nBits) & mask);
660
661 if (8 - nBits < (unsigned int)precision) {
662 cp1++;
663 *dst |= (unsigned char)((*cp1 >> (8 - nBits)) & mask);
664 nBits += precision - 8;
665 }
666 else {
667 nBits = (nBits + precision) % 8;
668 if (!nBits)
669 cp1++;
670 }
671 }
672 else {
673 *dst = (unsigned char)(*cp1 & mask);
674 nBits = (nBits + precision) % 8;
675 if (!nBits)
676 cp1++;
677 }
678
679 dst += dstIncrement;
680 }
681}
682
683/*--------------------------------------------------------------------------*/
684
685int Rast3d_fpcompress_write_xdr_nums(int fd, char *src, int nofNum,
686 int precision, char *compressBuf,
687 int isFloat)
688{
689 int status;
690 int nBytes;
691 int offsetMantissa;
692
693 if (isFloat)
694 G_fpcompress_rearrangeEncodeFloats(
695 (unsigned char *)src, nofNum, precision,
696 (unsigned char *)(compressBuf + 1), &nBytes, &offsetMantissa);
697 else
698 G_fpcompress_rearrangeEncodeDoubles(
699 (unsigned char *)src, nofNum, precision,
700 (unsigned char *)(compressBuf + 1), &nBytes, &offsetMantissa);
701
702 *compressBuf = 0;
703 status =
704 G_write_compressed(fd, (unsigned char *)compressBuf, nBytes + 1, 2);
705
706 if (status < 0) {
707 Rast3d_error("Rast3d_fpcompress_write_xdr_nums: write error");
708 return 0;
709 }
710
711 return 1;
712}
713
714/*--------------------------------------------------------------------------*/
715
716int Rast3d_fpcompress_read_xdr_nums(int fd, char *dst, int nofNum,
717 int fileBytes, int precision,
718 char *compressBuf, int isFloat)
719{
720 int status;
722 int nBytes;
723 char *src, *dest, *srcStop;
724
726
727 status = G_read_compressed(fd, fileBytes, (unsigned char *)compressBuf,
728 nofNum * nBytes + 1, 2);
729
730 if (status < 0) {
731 Rast3d_error("Rast3d_fpcompress_read_xdr_nums: read error");
732 return 0;
733 }
734
735 /* This code is kept for backward compatibility */
736 if (*compressBuf++ == 1) {
737 status--;
739 &lengthDecode);
740 if (*dst == ALL_NULL_CODE)
741 Rast3d_fatal_error("Rast3d_fpcompress_read_xdr_nums: wrong code");
742
743 if (status == nofNum * nBytes)
744 status -= lengthDecode - lengthEncode;
745
746 src = compressBuf + status - 1;
748 dest = compressBuf + (status - lengthEncode) + lengthDecode - 1;
749 while (src != srcStop)
750 *dest-- = *src--;
751
752 src = dst;
753 srcStop = src + lengthDecode;
755 while (src != srcStop)
756 *dest++ = *src++;
757 }
758
759 if (isFloat)
760 G_fpcompress_rearrangeDecodeFloats((unsigned char *)compressBuf, nofNum,
761 precision, (unsigned char *)dst);
762 else
763 G_fpcompress_rearrangeDecodeDoubles((unsigned char *)compressBuf,
764 nofNum, precision,
765 (unsigned char *)dst);
766
767 return 1;
768}
int G_read_compressed(int, int, unsigned char *, int, int)
Definition compress.c:244
int G_write_compressed(int, unsigned char *, int, int)
Definition compress.c:323
int Rast3d_is_xdr_null_double(const double *)
Definition fpxdr.c:31
void Rast3d_set_xdr_null_double(double *)
Definition fpxdr.c:49
void Rast3d_error(const char *,...) __attribute__((format(printf
int Rast3d_is_xdr_null_float(const float *)
Definition fpxdr.c:24
void Rast3d_set_xdr_null_float(float *)
Definition fpxdr.c:56
void Rast3d_fatal_error(const char *,...) __attribute__((format(printf
void Rast3d_rle_decode(char *, char *, int, int, int *, int *)
Definition rle.c:236
dglInt32_t sign(dglInt32_t x)
Definition flow.c:25
#define XDR_FLOAT_LENGTH
Definition fpcompress.c:11
#define ALL_NULL_CODE
Definition fpcompress.c:56
#define SOME_NULL_CODE
Definition fpcompress.c:58
int Rast3d_fpcompress_read_xdr_nums(int fd, char *dst, int nofNum, int fileBytes, int precision, char *compressBuf, int isFloat)
Definition fpcompress.c:716
#define ZERO_NULL_CODE
Definition fpcompress.c:57
int Rast3d_fpcompress_write_xdr_nums(int fd, char *src, int nofNum, int precision, char *compressBuf, int isFloat)
Definition fpcompress.c:685
#define XDR_DOUBLE_LENGTH
Definition fpcompress.c:9
void Rast3d_fpcompress_print_binary(char *c, int numBits)
Definition fpcompress.c:16
void Rast3d_fpcompress_dissect_xdr_double(unsigned char *numPointer)
Definition fpcompress.c:31