1#include <config.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include "netcdf.h"
6
7
8#undef GENERATE
9
10#undef DEBUG
11
12/* Test (some) internal/external type conversions
13   using following DAP dataset (test.02).
14 Dataset {
15     Byte b[DIMSIZE];
16     Int32 i32[DIMSIZE];
17     UInt32 ui32[DIMSIZE];
18     Int16 i16[DIMSIZE];
19     UInt16 ui16[DIMSIZE];
20     Float32 f32[DIMSIZE];
21     Float64 f64[DIMSIZE];
22     String s[DIMSIZE];
23     Url u[DIMSIZE];
24 } OneDimensionalSimpleArrays;
25*/
26
27#define NDIMS 1
28#define DIMSIZE 25
29#define STRLEN 64
30
31#ifndef USE_NETCDF4
32#define NC_UBYTE  7 /* unsigned 1 byte int */
33#define NC_USHORT  8 /* unsigned 2-byte int */
34#define NC_UINT  9 /* unsigned 4-byte int */
35#define NC_INT64  10 /* signed 8-byte int */
36#define NC_UINT64  11 /* unsigned 8-byte int */
37#define NC_STRING  12 /* string */
38#endif
39
40
41#define CHECK(exprcheck(expr,__FILE__,__LINE__);
42
43#define COMMA (i==0?"":",")
44
45#define COMPARE(t1,t2,v1,v2compare(t1,t2,(void*)v1,(void*)v2,#v2,__FILE__,__LINE__)
46
47static int fail = 0;
48
49static void compare(nc_type,nc_type,void*,void*,char*,char*,int);
50
51static void
52report(const int i, const char* var, const int line)
53{
54    fprintf(stdout,"%s mismatch: [%d] file: %s line: %d\n",var,i,__FILE__,line);
55    fail = 1;
56}
57
58static void
59check(int ncstat, char* file, int line)
60{
61    if(ncstat == NC_NOERR) return;
62    fprintf(stderr,"*** FAIL: %d (%s) at %s:%d\n",
63     ncstat,nc_strerror(ncstat),file,line);
64    exit(1);
65}
66
67/* return 1 if |f1-f2| > 0.05 */
68static int
69fdiff(double f1, double f2)
70{
71    double delta = (f1 - f2);
72    if(delta < 0) delta = - delta;
73    if(delta > 0.05) {
74 fprintf(stdout,"fdiff: %1.3f %1.3f delta=%1.3f\n",f1,f2,delta);
75    }
76    return (delta > 0.05?1:0);
77}
78
79static char ch_data[DIMSIZE];
80static signed char int8_data[DIMSIZE];
81static unsigned char uint8_data[DIMSIZE];
82static int int8toint32_data[DIMSIZE];
83static float int82float32_data[DIMSIZE];
84static short int16_data[DIMSIZE];
85static int int16toint32_data[DIMSIZE];
86static float int162float32_data[DIMSIZE];
87static int int32_data[DIMSIZE];
88static float int32tofloat32_data[DIMSIZE];
89static long int32toilong_data[DIMSIZE];
90static float float32_data[DIMSIZE];
91static double float64_data[DIMSIZE];
92#ifndef USE_NETCDF4
93static char string3_data[DIMSIZE][STRLEN];
94#endif
95
96static char ch_tst[DIMSIZE];
97static signed char int8_tst[DIMSIZE];
98static unsigned char uint8_tst[DIMSIZE];
99static short int16_tst[DIMSIZE];
100static int int32_tst[DIMSIZE];
101static float float32_tst[DIMSIZE];
102static double float64_tst[DIMSIZE];
103static long  ilong_tst[DIMSIZE];
104#ifndef USE_NETCDF4
105static char string3_tst[DIMSIZE][STRLEN];
106#endif
107
108int main()
109{
110    int ncidvarid;
111    int ncstat = NC_NOERR;
112    char* url;
113    char* topsrcdir;
114    size_t len;
115#ifndef USE_NETCDF4
116    int i,j;
117#endif
118
119    /* location of our target url: use file// to avoid remote
120 server downtime issues
121     */
122
123    /* Assume that TESTS_ENVIRONMENT was set */
124    topsrcdir = getenv("TOPSRCDIR");
125    if(topsrcdir == NULL) {
126        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
127        exit(1);
128    }
129    len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
130#ifdef DEBUG
131    len += strlen("[log][show=fetch]");
132#endif
133    url = (char*)malloc(len);
134    url[0] = '\0';
135
136#ifdef DEBUG
137    strcat(url,"[log][show=fetch]");
138#endif
139
140    strcat(url,"file://");
141    strcat(url,topsrcdir);
142    strcat(url,"/ncdap_test/testdata3/test.02");
143
144    printf("*** Test: var conversions on URL: %s\n",url);
145
146    /* open file, get varid */
147    CHECK(nc_open(urlNC_NOWRITE, &ncid));
148
149    /* extract the string case for netcdf-3*/
150#ifndef USE_NETCDF4
151    CHECK(nc_inq_varid(ncid, "s", &varid));
152    CHECK(nc_get_var_text(ncid,varid,(char*)string3_tst));
153#ifdef GENERATE
154    printf("static %s string3_data[DIMSIZE][STRLEN]={","char");
155    for(i=0;i<DIMSIZE;i++) {
156 int j;
157 /* Do simple escape */
158 for(j=0;j<STRLEN;j++) {
159     if(string3_tst[i][j] > 0
160        && string3_tst[i][j] != '\n'
161        && string3_tst[i][j] != '\r'
162        && string3_tst[i][j] != '\t'
163        &&(string3_tst[i][j] < ' ' || string3_tst[i][j] >= '\177'))
164 string3_tst[i][j] = '?';
165 }
166 printf("%s\"%s\"",COMMA,string3_tst[i]);
167    }
168    printf("};\n");
169#else
170  fprintf(stdout,"*** testing: %s\n","string3");
171 for(i=0;i<DIMSIZE;i++) {
172        for(j=0;j<STRLEN;j++) {
173         if(string3_tst[i][j] != string3_data[i][j]) {report(i,"string3",__LINE__); break;}
174     }
175 }
176#endif
177#endif
178
179    CHECK(nc_inq_varid(ncid, "b", &varid));
180    CHECK(nc_get_var_text(ncid,varid,ch_tst));
181#ifdef GENERATE
182    printf("static %s ch_data[DIMSIZE]={","char");
183    for(i=0;i<DIMSIZE;i++) printf("%s'\\%03hho'",COMMA,ch_tst[i]);
184    printf("};\n");
185#else
186    COMPARE(NC_CHAR,NC_CHAR,ch_tst,ch_data);
187#endif
188
189    CHECK(nc_inq_varid(ncid, "b", &varid));
190    CHECK(nc_get_var_schar(ncid,varid,int8_tst));
191#ifdef GENERATE
192    printf("static %s int8_data[DIMSIZE]={","signed char");
193    for(i=0;i<DIMSIZE;i++) printf("%s%hhd",COMMA,int8_tst[i]);
194    printf("};\n");
195#else
196    COMPARE(NC_BYTE,NC_BYTE,int8_tst,int8_data);
197#endif
198
199    CHECK(nc_inq_varid(ncid, "b", &varid));
200    CHECK(nc_get_var_uchar(ncid,varid,uint8_tst));
201#ifdef GENERATE
202    printf("static %s uint8_data[DIMSIZE]={","unsigned char");
203    for(i=0;i<DIMSIZE;i++) printf("%s%hhu",COMMA,uint8_tst[i]);
204    printf("};\n");
205#else
206    COMPARE(NC_UBYTE,NC_UBYTE,uint8_tst,uint8_data);
207#endif
208
209    CHECK(nc_inq_varid(ncid, "b", &varid));
210    CHECK(nc_get_var_int(ncid,varid,int32_tst));
211#ifdef GENERATE
212    printf("static %s int8toint32_data[DIMSIZE]={","int");
213    for(i=0;i<DIMSIZE;i++) printf("%s%d",COMMA,int32_tst[i]);
214    printf("};\n");
215#else
216    COMPARE(NC_BYTE,NC_INT,int32_tst,int8toint32_data);
217#endif
218
219    CHECK(nc_inq_varid(ncid, "b", &varid));
220    CHECK(nc_get_var_float(ncid,varid,float32_tst));
221#ifdef GENERATE
222    printf("static %s int82float32_data[DIMSIZE]={","float");
223    for(i=0;i<DIMSIZE;i++) printf("%s%1.3f",COMMA,float32_tst[i]);
224    printf("};\n");
225#else
226    COMPARE(NC_FLOAT,NC_FLOAT,float32_tst,int82float32_data);
227#endif
228
229    CHECK(nc_inq_varid(ncid, "i16", &varid));
230    CHECK(nc_get_var_short(ncid,varid,int16_tst));
231#ifdef GENERATE
232    printf("static %s int16_data[DIMSIZE]={","short");
233    for(i=0;i<DIMSIZE;i++) printf("%s%hd",COMMA,int16_tst[i]);
234    printf("};\n");
235#else
236    COMPARE(NC_SHORT,NC_SHORT,int16_tst,int16_data);
237#endif
238
239    CHECK(nc_inq_varid(ncid, "i16", &varid));
240    CHECK(nc_get_var_int(ncid,varid,int32_tst));
241#ifdef GENERATE
242    printf("static %s int16toint32_data[DIMSIZE]={","int");
243    for(i=0;i<DIMSIZE;i++) printf("%s%d",COMMA,int32_tst[i]);
244    printf("};\n");
245#else
246    COMPARE(NC_SHORT,NC_INT,int32_tst,int16toint32_data);
247#endif
248
249    CHECK(nc_inq_varid(ncid, "i16", &varid));
250    CHECK(nc_get_var_float(ncid,varid,float32_tst));
251#ifdef GENERATE
252    printf("static %s int162float32_data[DIMSIZE]={","float");
253    for(i=0;i<DIMSIZE;i++) printf("%s%1.3f",COMMA,float32_tst[i]);
254    printf("};\n");
255#else
256    COMPARE(NC_SHORT,NC_FLOAT,float32_tst,int162float32_data);
257#endif
258
259    CHECK(nc_inq_varid(ncid, "i32", &varid));
260    CHECK(nc_get_var_int(ncid,varid,int32_tst));
261#ifdef GENERATE
262    printf("static %s int32_data[DIMSIZE]={","int");
263    for(i=0;i<DIMSIZE;i++) printf("%s%d",COMMA,int32_tst[i]);
264    printf("};\n");
265#else
266    COMPARE(NC_INT,NC_INT,int32_tst,int32_data);
267#endif
268
269    CHECK(nc_inq_varid(ncid, "i32", &varid));
270    CHECK(nc_get_var_float(ncid,varid,float32_tst));
271#ifdef GENERATE
272    printf("static %s int32tofloat32_data[DIMSIZE]={","float");
273    for(i=0;i<DIMSIZE;i++) printf("%s%1.3f",COMMA,float32_tst[i]);
274    printf("};\n");
275#else
276    COMPARE(NC_INT,NC_FLOAT,float32_tst,int32tofloat32_data);
277#endif
278
279    CHECK(nc_inq_varid(ncid, "i32", &varid));
280    CHECK(nc_get_var_long(ncid,varid,ilong_tst));
281#ifdef GENERATE
282    printf("static %s int32toilong_data[DIMSIZE]={","long");
283    for(i=0;i<DIMSIZE;i++) printf("%s%ld",COMMA,ilong_tst[i]);
284    printf("};\n");
285#else
286    COMPARE(NC_INT,NC_NAT,ilong_tst,int32toilong_data);
287#endif
288
289    CHECK(nc_inq_varid(ncid, "f32", &varid));
290    CHECK(nc_get_var_float(ncid,varid,float32_tst));
291#ifdef GENERATE
292    printf("static %s float32_data[DIMSIZE]={","float");
293    for(i=0;i<DIMSIZE;i++) printf("%s%1.3f",COMMA,float32_tst[i]);
294    printf("};\n");
295#else
296    COMPARE(NC_FLOAT,NC_FLOAT,float32_tst,float32_data);
297#endif
298
299    CHECK(nc_inq_varid(ncid, "f64", &varid));
300    CHECK(nc_get_var_double(ncid,varid,float64_tst));
301#ifdef GENERATE
302    printf("static %s float64_data[DIMSIZE]={","double");
303    for(i=0;i<DIMSIZE;i++) printf("%s%1.3f",COMMA,float64_tst[i]);
304    printf("};\n");
305#else
306    COMPARE(NC_DOUBLE,NC_DOUBLE,float64_tst,float64_data);
307#endif
308
309    if(fail) {
310        printf("ncstat=%d %s",ncstat,nc_strerror(ncstat));
311        exit(1);
312    }
313    return 0;
314}
315
316static char ch_data[DIMSIZE]={'\000','\001','\002','\003','\004','\005','\006','\007','\010','\011','\012','\013','\014','\015','\016','\017','\020','\021','\022','\023','\024','\025','\026','\027','\030'};
317static signed char int8_data[DIMSIZE]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
318static unsigned char uint8_data[DIMSIZE]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
319static int int8toint32_data[DIMSIZE]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
320static float int82float32_data[DIMSIZE]={0.000,1.000,2.000,3.000,4.000,5.000,6.000,7.000,8.000,9.000,10.000,11.000,12.000,13.000,14.000,15.000,16.000,17.000,18.000,19.000,20.000,21.000,22.000,23.000,24.000};
321static short int16_data[DIMSIZE]={0,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3328,3584,3840,4096,4352,4608,4864,5120,5376,5632,5888,6144};
322static int int16toint32_data[DIMSIZE]={0,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3328,3584,3840,4096,4352,4608,4864,5120,5376,5632,5888,6144};
323static float int162float32_data[DIMSIZE]={0.000,256.000,512.000,768.000,1024.000,1280.000,1536.000,1792.000,2048.000,2304.000,2560.000,2816.000,3072.000,3328.000,3584.000,3840.000,4096.000,4352.000,4608.000,4864.000,5120.000,5376.000,5632.000,5888.000,6144.000};
324static int int32_data[DIMSIZE]={0,2048,4096,6144,8192,10240,12288,14336,16384,18432,20480,22528,24576,26624,28672,30720,32768,34816,36864,38912,40960,43008,45056,47104,49152};
325static float int32tofloat32_data[DIMSIZE]={0.000,2048.000,4096.000,6144.000,8192.000,10240.000,12288.000,14336.000,16384.000,18432.000,20480.000,22528.000,24576.000,26624.000,28672.000,30720.000,32768.000,34816.000,36864.000,38912.000,40960.000,43008.000,45056.000,47104.000,49152.000};
326static long int32toilong_data[DIMSIZE]={0,2048,4096,6144,8192,10240,12288,14336,16384,18432,20480,22528,24576,26624,28672,30720,32768,34816,36864,38912,40960,43008,45056,47104,49152};
327static float float32_data[DIMSIZE]={0.000,0.010,0.020,0.030,0.040,0.050,0.060,0.070,0.080,0.090,0.100,0.110,0.120,0.130,0.140,0.149,0.159,0.169,0.179,0.189,0.199,0.208,0.218,0.228,0.238};
328static double float64_data[DIMSIZE]={1.000,1.000,1.000,1.000,0.999,0.999,0.998,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.990,0.989,0.987,0.986,0.984,0.982,0.980,0.978,0.976,0.974,0.971};
329
330#ifndef USE_NETCDF4
331static char string3_data[DIMSIZE][STRLEN]={"This is a data test string (pass 0).","This is a data test string (pass 1).","This is a data test string (pass 2).","This is a data test string (pass 3).","This is a data test string (pass 4).","This is a data test string (pass 5).","This is a data test string (pass 6).","This is a data test string (pass 7).","This is a data test string (pass 8).","This is a data test string (pass 9).","This is a data test string (pass 10).","This is a data test string (pass 11).","This is a data test string (pass 12).","This is a data test string (pass 13).","This is a data test string (pass 14).","This is a data test string (pass 15).","This is a data test string (pass 16).","This is a data test string (pass 17).","This is a data test string (pass 18).","This is a data test string (pass 19).","This is a data test string (pass 20).","This is a data test string (pass 21).","This is a data test string (pass 22).","This is a data test string (pass 23).","This is a data test string (pass 24)."};
332#endif
333
334static void
335compare(nc_type t1nc_type t2, void* v0, void* vdata0, char* tag,
336 char* file, int line)
337{
338    int i;
339    fprintf(stdout,"*** testing: %s\n",tag); \
340
341#ifdef DEBUG
342#define test \
343    printf("v ="); \
344    for(i=0;i<DIMSIZE;i++) {printf(" %llu",(unsigned long long)v[i]);} \
345    printf("\n"); \
346    printf("vdata ="); \
347    for(i=0;i<DIMSIZE;i++) {printf(" %llu",(unsigned long long)vdata[i]);} \
348    printf("\n"); \
349    for(i=0;i<DIMSIZE;i++) {\
350        if(v[i] != vdata[i]) {report(i,tag,line); break;}\
351    }
352#define ftest \
353    printf("v ="); \
354    for(i=0;i<DIMSIZE;i++) {printf(" %g",v[i]);} \
355    printf("\n"); \
356    printf("vdata ="); \
357    for(i=0;i<DIMSIZE;i++) {printf(" %g",vdata[i]);} \
358    printf("\n"); \
359    for(i=0;i<DIMSIZE;i++) {\
360        if(fdiff((double)v[i],(double)vdata[i])) {report(i,tag,line); break;}\
361    }
362#else
363#define test for(i=0;i<DIMSIZE;i++) {\
364        if(v[i] != vdata[i]) {report(i,tag,line); break;}\
365    }
366#define ftest for(i=0;i<DIMSIZE;i++) {\
367        if(fdiff((double)v[i],(double)vdata[i])) {report(i,tag,line); break;}\
368    }
369#endif
370
371#define setup(TTv = (T*)v0Tvdata = (T*)vdata0;
372
373#define CASE(nc1,nc2) (nc1*256+nc2)
374    switch(CASE(t1,t2)) {
375
376    default: {
377 printf("unexpected compare:  %d %d\n",(int)t1,(int)t2);
378 abort();
379    }
380
381case CASE(NC_CHAR,NC_CHAR): {
382    setup(char);
383    test;
384} break;
385case CASE(NC_BYTE,NC_BYTE): {
386    setup(signed char);
387    test;
388} break;
389case CASE(NC_SHORT,NC_SHORT): {
390    setup(short);
391    test;
392} break;
393case CASE(NC_INT,NC_INT): {
394    setup(int);
395    test;
396} break;
397case CASE(NC_FLOAT,NC_FLOAT): {
398    setup(float);
399    ftest;
400} break;
401case CASE(NC_DOUBLE,NC_DOUBLE): {
402    setup(double);
403    ftest;
404} break;
405
406
407/* Mixed comparisons */
408case CASE(NC_BYTE,NC_INT): {
409    setup(int);
410    test;
411} break;
412case CASE(NC_SHORT,NC_INT): {
413    setup(int);
414    test;
415} break;
416case CASE(NC_SHORT,NC_FLOAT): {
417    setup(float);
418    ftest;
419} break;
420case CASE(NC_INT,NC_FLOAT): {
421    setup(float);
422    ftest;
423} break;
424
425/* This is an get_var_long case */
426case CASE(NC_INT,NC_NAT): {
427    setup(long);
428    test;
429} break;
430
431case CASE(NC_UBYTE,NC_UBYTE): {
432    setup(unsigned char);
433    test;
434} break;
435case CASE(NC_USHORT,NC_USHORT): {
436    setup(unsigned short);
437    test;
438} break;
439case CASE(NC_UINT,NC_UINT): {
440    setup(unsigned int);
441    test;
442} break;
443
444/* Mixed cases */
445case CASE(NC_INT,NC_INT64): {
446    setup(long long);
447    test;
448} break;
449
450case CASE(NC_INT,NC_UINT64): {
451    setup(unsigned long long);
452    test;
453} break;
454
455case CASE(NC_STRING,NC_STRING):{
456    setup(char*);
457    for(i=0;i<DIMSIZE;i++) {
458 if(strcmp(v[i],vdata[i])!=0) {report(i,tag,line); break;}
459    }
460} break;
461
462case CASE(NC_CHAR,NC_STRING):{
463    setup(char*);
464    if(memcmp((void*)v[0],(void*)vdata,DIMSIZE+1)!=0)
465        {report(0,tag,line);}
466} break;
467
468    } /*switch*/
469}


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