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


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed