1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test data conversions and fill value handling.
6
7   $Id: tst_converts.c,v 1.16 2008/10/20 01:48:09 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include "netcdf.h"
13
14#define FILE_NAME "tst_converts.nc"
15#define ATT1_NAME "att1"
16#define ATT2_NAME "att2"
17#define DIM1_NAME "dim1"
18#define DIM1_LEN 3
19#define DIM2_NAME "dim2"
20#define DIM2_LEN 15
21#define VAR1_NAME "var1"
22#define VAR2_NAME "var2"
23
24/* This is handy for print statements. */
25static char *format_name[] = {"", "classic", "64-bit offset", "netCDF-4",
26       "netCDF-4 classic model"};
27
28int check_file(int format, unsigned char *uchar_out);
29int create_file(int format, unsigned char *uchar_out);
30
31int
32main(int argc, char **argv)
33{
34   unsigned char uchar_out[DIM1_LEN] = {0, 128, 255};
35   int format;
36
37   printf("\n*** Testing netcdf data conversion.\n");
38
39   for (format = 1; format < 5; format++)
40   {
41      printf("*** Testing conversion in netCDF %s files... ", format_name[format]);
42      create_file(formatuchar_out);
43      check_file(formatuchar_out);
44      SUMMARIZE_ERR;
45   }
46
47   FINAL_RESULTS;
48}
49
50/* Create a test file with one var of type NC_BYTE. */
51int
52create_file(int format, unsigned char *uchar_out)
53{
54   int ncidvaridcflags=0, dimids[1];
55   int retval;
56
57   if (format == NC_FORMAT_64BIT_OFFSET)
58      cflags |= NC_64BIT_OFFSET;
59   else if (format == NC_FORMAT_CDF5)
60      cflags |= NC_CDF5;
61   else if (format == NC_FORMAT_NETCDF4_CLASSIC)
62   {
63      cflags |= (NC_NETCDF4|NC_CLASSIC_MODEL);
64   }
65   else if (format == NC_FORMAT_NETCDF4)
66      cflags |= NC_NETCDF4;
67
68   if (nc_create(FILE_NAMEcflags, &ncid)) ERR;
69   if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
70   if (nc_def_var(ncidVAR1_NAMENC_BYTE, 1, dimids, &varid)) ERR;
71   if (nc_enddef(ncid)) ERR;
72   retval = nc_put_var_uchar(ncidvariduchar_out);
73   if ((format != NC_FORMAT_NETCDF4) && retvalERR;
74   if ((format == NC_FORMAT_NETCDF4) && (retval != NC_ERANGE)) ERR;
75   if (nc_close(ncid)) ERR;
76   return NC_NOERR;
77}
78
79int
80check_file(int format, unsigned char *uchar_out)
81{
82
83   int ncid;
84   int ndimsnatts;
85   int dimids_var[1], var_type;
86   char var_name[NC_MAX_NAME+1];
87   unsigned char uchar_in[DIM1_LEN];
88   signed char char_in[DIM1_LEN];
89   unsigned short ushort_in[DIM1_LEN];
90   short short_in[DIM1_LEN];
91   unsigned int uint_in[DIM1_LEN];
92   int int_in[DIM1_LEN];
93   long long int64_in[DIM1_LEN];
94   unsigned long long uint64_in[DIM1_LEN];
95   int ires;
96
97   /* Read it back in, and check conversions. */
98   if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
99   if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
100   if (strcmp(var_nameVAR1_NAME) || natts !=0 || ndims != 1 ||
101       dimids_var[0] != 0 || var_type != NC_BYTEERR;
102
103   /* This is actually an NC_BYTE, with some negatives, so this should
104    * generate a range error for netcdf-4, but not for netcdf-3,
105    * because range errors are not generated for byte type
106    * conversions. */
107   res = nc_get_var_uchar(ncid, 0, uchar_in);
108   if (format == NC_FORMAT_NETCDF4)
109   {
110      if (res != NC_ERANGEERR;
111   }
112   else if (resERR;
113
114   for (i=0; i<DIM1_LENi++)
115      if (uchar_in[i] != uchar_out[i]) ERR;
116
117   if (nc_get_var_schar(ncid, 0, char_in)) ERR;
118   for (i=0; i<DIM1_LENi++)
119      if (char_in[i] != (signed char)uchar_out[i]) ERR;
120
121   if (nc_get_var_short(ncid, 0, short_in)) ERR;
122   for (i=0; i<DIM1_LENi++)
123      if (short_in[i] != (signed char)uchar_out[i]) ERR;
124
125   if (nc_get_var_int(ncid, 0, int_in)) ERR;
126   for (i=0; i<DIM1_LENi++)
127      if (int_in[i] != (signed char)uchar_out[i]) ERR;
128
129   if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_NETCDF4_CLASSIC)
130   {
131      /* Since we wrote them as NC_BYTE, some of these are negative
132       * values, and will return a range error when reading into
133       * unsigned type. To compare values, first cast uchar_out to
134       * signed int, then cast again to the type we are reading it
135       * as. */
136      if (nc_get_var_ushort(ncid, 0, ushort_in) != NC_ERANGEERR;
137      for (i=0; i<DIM1_LENi++)
138  if (ushort_in[i] != (unsigned short)(signed char)uchar_out[i]) ERR;
139
140      if (nc_get_var_uint(ncid, 0, uint_in) != NC_ERANGEERR;
141      for (i=0; i<DIM1_LENi++)
142  if (uint_in[i] != (unsigned int)(signed char)uchar_out[i]) ERR;
143
144      if (nc_get_var_ulonglong(ncid, 0, uint64_in) != NC_ERANGEERR;
145      for (i=0; i<DIM1_LENi++)
146  if (uint64_in[i] != (unsigned long long)(signed char)uchar_out[i]) ERR;
147
148      if (nc_get_var_longlong(ncid, 0, int64_in)) ERR;
149      for (i=0; i<DIM1_LENi++)
150  if (int64_in[i] != (signed char)uchar_out[i]) ERR;
151
152   }
153
154   if (nc_close(ncid)) ERR;
155   return 0;
156}


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