1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
Copyright 2008, UCAR/Unidata
See COPYRIGHT file for copying and redistribution conditions.
This program tests the fix for a large file bug in versions previous
to netCDF-4.1.2 for 32-bit platforms, writing to a variable with
more than 1 dimension and more than 2**32 values, where the write
starts after the first 2**32 elements.
$Id: tst_big_var2.c,v 1.3 2010/05/19 16:38:44 russ Exp $
*/
#include "config.h"
#include <nc_tests.h>
#include "err_macros.h"
#include <netcdf.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FILE_NAME "tst_big_var2.nc"
/* Test with both classic and 64-bit offset files. If netcdf-4 is
* included, test with both netCDF-4 format variants also. */
#ifdef USE_NETCDF4
#define NUM_FORMATS (4)
#else
#define NUM_FORMATS (2)
#endif
#define NUMDIMS 3 /* rank of variable in tests */
#define DIM0 2149 /* just big enough to demonstrate bug */
#define DIM1 1000
#define DIM2 2000 /* DIM0*DIM1*DIM2 > 2**32 */
/*
* This program tests the fix for a large file bug in versions
* previous to netCDF-4.1.2 for 32-bit platforms, writing to a
* variable with more than 1 dimension and more than 2**32 values,
* where the write starts after the first 2**32 elements. The bug
* applies to record variables with more than 2**32 values per record
* as well, but that's not tested here.
*/
static int
test_big_var(const char *testfile)
{
int ncid, varid, dimids[NUMDIMS];
size_t start[NUMDIMS] = {0, 0, 0};
size_t count[NUMDIMS] = {1, DIM1, DIM2};
signed char data[DIM1][DIM2];
int i, j;
int nerrs = 0;
/* Create a file with one big variable. */
if (nc_create(testfile, NC_CLOBBER, &ncid)) ERR;
if (nc_set_fill(ncid, NC_NOFILL, NULL)) ERR;
if (nc_def_dim(ncid, "dim0", DIM0, &dimids[0])) ERR;
if (nc_def_dim(ncid, "dim1", DIM1, &dimids[1])) ERR;
/* if (nc_def_dim(ncid, "dim2", DIM2 - 1, &dimids[1])) ERR; */
if (nc_def_dim(ncid, "dim2", DIM2, &dimids[2])) ERR;
if (nc_def_var(ncid, "var", NC_BYTE, NUMDIMS, dimids, &varid)) ERR;
if (nc_enddef(ncid)) ERR;
/* Initialize slab of data. */
for (i = 0; i < DIM1; i++)
for (j = 0; j < DIM2; j++) {
data[i][j] = 42;
}
/* Just write the first and last slabs */
start[0] = 0;
if (nc_put_vara_schar(ncid, varid, start, count, &data[0][0])) ERR;
for (i = 0; i < DIM1; i++)
for (j = 0; j < DIM2; j++) {
data[i][j] = 19;
}
start[0] = DIM0 - 1;
if (nc_put_vara_schar(ncid, varid, start, count, &data[0][0])) ERR;
if (nc_close(ncid)) ERR;
/* Open the file and check it. */
if (nc_open(testfile, NC_NOWRITE, &ncid)) ERR;
if (nc_inq_varid(ncid, "var", &varid)) ERR;
/* Read and check data in the first and last slabs */
start[0] = 0;
if (nc_get_vara_schar(ncid, varid, start, count, &data[0][0])) ERR;
for (i = 0; i < DIM1; i++)
for (j = 0; j < DIM2; j++)
{
if (data[i][j] != 42 )
{
printf("error on start[0]: %ld i: %d j: %d expected %d got %d\n",
start[0], i, j, 42, data[i][j]);
ERR;
if(nerrs++ > 1)
return nerrs;
}
}
start[0] = DIM0 - 1;
if (nc_get_vara_schar(ncid, varid, start, count, &data[0][0])) ERR;
for (i = 0; i < DIM1; i++)
for (j = 0; j < DIM2; j++)
{
if (data[i][j] != 19 )
{
printf("error on start[0]: %ld i: %d j: %d expected %d got %d\n",
start[0], i, j, 19, data[i][j]);
ERR;
if(nerrs++ > 1)
return nerrs;
}
}
if (nc_close(ncid)) ERR;
return 0;
}
int
main(int argc, char **argv) {
int i;
char testfile[NC_MAX_NAME + 1];
printf("\n*** Testing multidimensional variable with more than 2**32 values\n");
sprintf(testfile, "%s/%s", TEMP_LARGE, FILE_NAME);
for (i = NC_FORMAT_CLASSIC; i <= NUM_FORMATS; i++)
{
printf("*** testing format %d file with byte variable with > 2**32 values...", i);
nc_set_default_format(i, NULL);
test_big_var(testfile);
(void) remove(testfile);
SUMMARIZE_ERR;
}
FINAL_RESULTS;
}
|