11 static unsigned char clearMask[9] =
 
   12     { 255, 128, 192, 224, 240, 248, 252, 254, 255 };
 
   16 static void G3d_float2xdrFloat(
float *f, 
float *xdrf)
 
   20     xdrmem_create(&xdrEncodeStream, (caddr_t) xdrf, 4, XDR_ENCODE);
 
   22     if (!xdr_setpos(&xdrEncodeStream, 0))
 
   25     if (!xdr_float(&xdrEncodeStream, f))
 
   28     xdr_destroy(&xdrEncodeStream);
 
   33 static void G3d_double2xdrDouble(
double *d, 
double *xdrd)
 
   37     xdrmem_create(&xdrEncodeStream, (caddr_t) xdrd, 8, XDR_ENCODE);
 
   39     if (!xdr_setpos(&xdrEncodeStream, 0))
 
   42     if (!xdr_double(&xdrEncodeStream, d))
 
   45     xdr_destroy(&xdrEncodeStream);
 
   50 static void G3d_truncFloat(
float *f, 
int p)
 
   54     if ((p == -1) || (p >= 23))
 
   57     c = (
unsigned char *)f;
 
   61         *c++ &= clearMask[(p + 1) % 8];
 
   69         *c++ &= clearMask[(p + 1) % 8];
 
   75     *c &= clearMask[(p + 1) % 8];
 
   81 static void G3d_truncDouble(
double *d, 
int p)
 
   85     if ((p == -1) || (p >= 52))
 
   88     c = (
unsigned char *)d;
 
   92         *c++ &= clearMask[(p + 4) % 8];
 
  104         *c++ &= clearMask[(p + 4) % 8];
 
  115         *c++ &= clearMask[(p + 4) % 8];
 
  125         *c++ &= clearMask[(p + 4) % 8];
 
  134         *c++ &= clearMask[(p + 4) % 8];
 
  142         *c++ &= clearMask[(p + 4) % 8];
 
  148     *c &= clearMask[(p + 4) % 8];
 
  154 static void G3d_float2Double(
float *f, 
double *d)
 
  156     unsigned char *c1, *c2, 
sign, c;
 
  159     c1 = (
unsigned char *)f;
 
  160     c2 = (
unsigned char *)d;
 
  162     sign = (*c1 & (
unsigned char)128);
 
  163     e = (((*c1 & (
unsigned char)127) << 1) |
 
  164          ((*(c1 + 1) & (
unsigned char)128) >> 7));
 
  166     if ((*c1 != 0) || (*(c1 + 1) != 0) || (*(c1 + 2) != 0) ||
 
  177     *c2++ |= ((*c1 & (
unsigned char)127) >> 3);
 
  179     *c2 = ((*c1++ & (
unsigned char)7) << 5);
 
  182     *c2 = ((*c1++ & (
unsigned char)7) << 5);
 
  185     *c2++ = ((*c1 & (
unsigned char)7) << 5);
 
  187     *c2++ = (
unsigned char)0;
 
  188     *c2++ = (
unsigned char)0;
 
  189     *c2 = (
unsigned char)0;
 
  194 static int G3d_compareFloats(
float *f1, 
int p1, 
float *f2, 
int p2)
 
  196     unsigned char *c1, *c2;
 
  202     G3d_float2xdrFloat(f1, &xdrf1);
 
  203     G3d_float2xdrFloat(f2, &xdrf2);
 
  205     c1 = (
unsigned char *)&xdrf1;
 
  206     c2 = (
unsigned char *)&xdrf2;
 
  210     if ((p1 != -1) && (p1 < 23) && ((p1 < p2) || (p2 == -1)))
 
  211         G3d_truncFloat(&xdrf2, p1);
 
  212     if ((p2 != -1) && (p2 < 23) && ((p2 < p1) || (p1 == -1)))
 
  213         G3d_truncFloat(&xdrf1, p2);
 
  217     return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
 
  218         (*(c1 + 2) == *(c2 + 2))
 
  219         && (*(c1 + 3) == *(c2 + 3));
 
  225 static int G3d_compareDoubles(
double *d1, 
int p1, 
double *d2, 
int p2)
 
  227     unsigned char *c1, *c2;
 
  233     G3d_double2xdrDouble(d1, &xdrd1);
 
  234     G3d_double2xdrDouble(d2, &xdrd2);
 
  236     c1 = (
unsigned char *)&xdrd1;
 
  237     c2 = (
unsigned char *)&xdrd2;
 
  241     if ((p1 != -1) && (p1 < 52) && ((p1 < p2) || (p2 == -1)))
 
  242         G3d_truncDouble(&xdrd2, p1);
 
  243     if ((p2 != -1) && (p2 < 52) && ((p2 < p1) || (p1 == -1)))
 
  244         G3d_truncDouble(&xdrd1, p2);
 
  248     return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
 
  249         (*(c1 + 2) == *(c2 + 2))
 
  250         && (*(c1 + 3) == *(c2 + 3)) && (*(c1 + 4) == *(c2 + 4))
 
  251         && (*(c1 + 5) == *(c2 + 5)) && (*(c1 + 6) == *(c2 + 6))
 
  252         && (*(c1 + 7) == *(c2 + 7));
 
  258 static int G3d_compareFloatDouble(
float *f, 
int p1, 
double *d, 
int p2)
 
  260     unsigned char *c1, *c2;
 
  262     double xdrd, xdrd2, dTmp;
 
  275     G3d_float2xdrFloat(f, &xdrf);
 
  276     G3d_float2Double(&xdrf, &xdrd2);
 
  277     G3d_double2xdrDouble(&dTmp, &xdrd);
 
  279     c1 = (
unsigned char *)&xdrd2;
 
  280     c2 = (
unsigned char *)&xdrd;
 
  285     if (((p1 != -1) && ((p1 < p2) || (p2 == -1))) ||
 
  286         ((p1 == -1) && ((p2 > 23) || (p2 == -1))))
 
  287         G3d_truncDouble(&xdrd, (p1 != -1 ? p1 : 23));
 
  288     if ((p2 != -1) && (p2 < 23) && ((p2 < p1) || (p1 == -1)))
 
  289         G3d_truncDouble(&xdrd2, p2);
 
  293     return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
 
  294         (*(c1 + 2) == *(c2 + 2))
 
  295         && (*(c1 + 3) == *(c2 + 3)) && (*(c1 + 4) == *(c2 + 4))
 
  296         && (*(c1 + 5) == *(c2 + 5)) && (*(c1 + 6) == *(c2 + 6))
 
  297         && (*(c1 + 7) == *(c2 + 7));
 
  302 static void compareFilesNocache(
void *map, 
void *map2)
 
  304     double n1 = 0, n2 = 0;
 
  307     int x, 
y, z, correct;
 
  309     int tileX, tileY, tileZ, typeIntern, typeIntern2;
 
  325     for (z = 0; z < nz * tileZ; z++) {
 
  326         printf(
"comparing: z = %d\n", z);
 
  328         for (y = 0; y < ny * tileY; y++) {
 
  329             for (x = 0; x < nx * tileX; x++) {
 
  334                 if (typeIntern == FCELL_TYPE) {
 
  335                     if (typeIntern2 == FCELL_TYPE)
 
  336                         correct = G3d_compareFloats(f1p, p1, f2p, p2);
 
  338                         correct = G3d_compareFloatDouble(f1p, p1, n2p, p2);
 
  341                     if (typeIntern2 == FCELL_TYPE)
 
  342                         correct = G3d_compareFloatDouble(f2p, p2, n1p, p1);
 
  344                         correct = G3d_compareDoubles(n1p, p1, n2p, p2);
 
  348                     int xTile, yTile, zTile, xOffs, yOffs, zOffs;
 
  351                                         &xOffs, &yOffs, &zOffs);
 
  352                     printf(
"(%d %d %d) (%d %d %d) (%d %d %d) %.20f %.20f\n",
 
  353                            x, y, z, xTile, yTile, zTile, xOffs, yOffs, zOffs,
 
  356                         (
"compareFilesNocache: files don't match\n");
 
  362     printf(
"Files are identical up to precision.\n");
 
  390     double n1 = 0, n2 = 0;
 
  393     int x, 
y, z, correct;
 
  395     int rows, 
cols, depths;
 
  396     int tileX, tileY, tileZ, typeIntern, typeIntern2, tileX2, tileY2, tileZ2;
 
  399     printf(
"\nComparing %s and %s\n", f1, f2);
 
  402                           G3D_TILE_SAME_AS_FILE, G3D_USE_CACHE_DEFAULT);
 
  409                            G3D_TILE_SAME_AS_FILE, G3D_USE_CACHE_DEFAULT);
 
  427         compareFilesNocache(map, map2);
 
  446     for (z = 0; z < depths; z++) {
 
  447         printf(
"comparing: z = %d\n", z);
 
  449         if ((z % tileZ) == 0) {
 
  453         if ((z % tileZ2) == 0) {
 
  458         for (y = 0; y < rows; y++) {
 
  459             for (x = 0; x < 
cols; x++) {
 
  466                 if (typeIntern == FCELL_TYPE) {
 
  467                     if (typeIntern2 == FCELL_TYPE)
 
  468                         correct = G3d_compareFloats(f1p, p1, f2p, p2);
 
  470                         correct = G3d_compareFloatDouble(f1p, p1, n2p, p2);
 
  473                     if (typeIntern2 == FCELL_TYPE)
 
  474                         correct = G3d_compareFloatDouble(f2p, p2, n1p, p1);
 
  476                         correct = G3d_compareDoubles(n1p, p1, n2p, p2);
 
  480                     int xTile, yTile, zTile, xOffs, yOffs, zOffs;
 
  483                                         &xOffs, &yOffs, &zOffs);
 
  490     printf(
"Files are identical up to precision.\n");
 
void G3d_getValueRegion(G3D_Map *map, int x, int y, int z, void *value, int type)
Returns in *value the cell-value of the cell with region-coordinate (x, y, z). The value returned is ...
 
int G3d_isNullValueNum(const void *n, int type)
 
void G3d_compareFiles(const char *f1, const char *mapset1, const char *f2, const char *mapset2)
Compares the cell-values of file f1 in mapset mapset1 and file f2 in mapset mapset2. The values are compared up to precision. Terminates in error if the files don't match. This function uses the more advanced features of the cache. The source code can be found in filecompare.c. 
 
int G3d_closeCell(G3D_Map *map)
Closes g3d-file. If map is new and cache-mode is used for map then every tile which is not flushed be...
 
int G3d_unlockAll(G3D_Map *map)
Unlocks every tile in cache of map. 
 
void * G3d_openCellOld(const char *name, const char *mapset, G3D_Region *window, int typeIntern, int cache)
Opens existing g3d-file name in mapset. Tiles are stored in memory with type which must be any of FCE...
 
void G3d_minUnlocked(G3D_Map *map, int minUnlocked)
Sets the minimum number of unlocked tiles to minUnlocked. This function should be used in combination...
 
dglInt32_t sign(dglInt32_t x)
 
void G3d_coord2tileCoord(G3D_Map *map, int x, int y, int z, int *xTile, int *yTile, int *zTile, int *xOffs, int *yOffs, int *zOffs)
Converts cell-coordinates (x, y, z) into tile-coordinates (xTile, yTile, zTile) and the coordinate of...
 
void G3d_autolockOn(G3D_Map *map)
Turns autolock mode on. 
 
void G3d_getBlock(G3D_Map *map, int x0, int y0, int z0, int nx, int ny, int nz, void *block, int type)
Copies the cells contained in the block (cube) with vertices (x0, y0, z0) and (x0 + nx - 1...
 
void G3d_fatalError(const char *,...)
This function prints the error message msg, and terminates the program with an error status...