1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/nctest/val.c,v 1.13 2006/10/31 16:22:01 ed Exp $
5 *********************************************************************/
6
7#include <config.h>
8#include <stdio.h>
9#include "netcdf.h"
10#include "testcdf.h"
11#include "val.h"
12#include "error.h"
13
14
15/* fill typed value block with values of specified type */
16void
17val_fill(typelenvals)
18     nc_type type; /* netcdf type, NC_BYTE, ..., NC_DOUBLE */
19     long len; /* number of elements to fill with */
20     void *vals; /* start of first block of values */
21{
22    static char pname[] = "val_fill";
23    long half = len/2;
24    int iel;
25    union {
26 char *cp;
27 short *sp;
28 nclong *lp;
29 float *fp;
30 double *dp;
31    } gp;
32
33    switch (type) {
34      case NC_BYTE:
35      case NC_CHAR:
36 gp.cp = (char *) vals;
37 for (iel = 0; iel < leniel++)
38   *gp.cp++ = (char) iel;
39 break;
40      case NC_SHORT:
41 gp.sp = (short *) vals;
42 for (iel = 0; iel < leniel++)
43   *gp.sp++ = (short) (iel - half); /* negative and positive values */
44 break;
45      case NC_LONG:
46 gp.lp = (nclong *) vals;
47 for (iel = 0; iel < leniel++)
48   *gp.lp++ = (nclong) (iel - half);
49 break;
50      case NC_FLOAT:
51 gp.fp = (float *) vals;
52 for (iel = 0; iel < leniel++)
53   *gp.fp++ = (float) (iel+1);
54 break;
55      case NC_DOUBLE:
56 gp.dp = (double *) vals;
57 for (iel = 0; iel < leniel++)
58   *gp.dp++ = (double) (iel - half);
59 break;
60      default:
61 error("%s: bad type, test program error", pname);
62    }
63}
64
65
66/* fill typed value block with zeros of specified type */
67void
68val_fill_zero(typelenvals)
69     nc_type type; /* netcdf type, NC_BYTE, ..., NC_DOUBLE */
70     long len; /* number of elements to fill with */
71     void *vals; /* start of first block of values */
72{
73    static char pname[] = "val_fill_zero";
74    int iel;
75    union {
76 char *cp;
77 short *sp;
78 nclong *lp;
79 float *fp;
80 double *dp;
81    } gp;
82
83    switch (type) {
84      case NC_BYTE:
85      case NC_CHAR:
86 gp.cp = (char *) vals;
87 for (iel = 0; iel < leniel++)
88   *gp.cp++ = (char) 0;
89 break;
90      case NC_SHORT:
91 gp.sp = (short *) vals;
92 for (iel = 0; iel < leniel++)
93   *gp.sp++ = (short) 0;
94 break;
95      case NC_LONG:
96 gp.lp = (nclong *) vals;
97 for (iel = 0; iel < leniel++)
98   *gp.lp++ = (nclong) 0;
99 break;
100      case NC_FLOAT:
101 gp.fp = (float *) vals;
102 for (iel = 0; iel < leniel++)
103   *gp.fp++ = (float) 0;
104 break;
105      case NC_DOUBLE:
106 gp.dp = (double *) vals;
107 for (iel = 0; iel < leniel++)
108   *gp.dp++ = (double) 0;
109 break;
110      default:
111 error("%s: bad type, test program error", pname);
112    }
113}
114
115
116
117/*
118 * compare two typed value blocks, return 0 if equal, 1+n otherwise,
119 * where n is the index of the first differing element.
120 */
121int
122val_cmp (typelenv1v2)
123     nc_type type; /* netcdf type, NC_BYTE, ..., NC_DOUBLE */
124     long len; /* number of elements of type to compare */
125     void *v1; /* start of first block of values */
126     void *v2; /* start of second block of values */
127{
128    static char pname[] = "val_cmp";
129    int iel;
130    union {
131 char *cp;
132 short *sp;
133 nclong *lp;
134 float *fp;
135 double *dp;
136    } gphp;
137
138    switch (type) {
139      case NC_CHAR:
140      case NC_BYTE:
141 gp.cp = (char *) v1;
142 hp.cp = (char *) v2;
143 for (iel = 0; iel < leniel++) {
144     if (*gp.cp != *hp.cp)
145       return (iel + 1);
146     gp.cp++;
147     hp.cp++;
148 }
149 break;
150      case NC_SHORT:
151 gp.sp = (short *) v1;
152 hp.sp = (short *) v2;
153 for (iel = 0; iel < leniel++) {
154     if (*gp.sp != *hp.sp)
155       return (iel + 1);
156     gp.sp++;
157     hp.sp++;
158 }
159 break;
160      case NC_LONG:
161 gp.lp = (nclong *) v1;
162 hp.lp = (nclong *) v2;
163 for (iel = 0; iel < leniel++) {
164     if (*gp.lp != *hp.lp)
165       return (iel + 1);
166     gp.lp++;
167     hp.lp++;
168 }
169 break;
170      case NC_FLOAT:
171 gp.fp = (float *) v1;
172 hp.fp = (float *) v2;
173 for (iel = 0; iel < leniel++) {
174     if (*gp.fp != *hp.fp)
175       return (iel + 1);
176     gp.fp++;
177     hp.fp++;
178 }
179 break;
180      case NC_DOUBLE:
181 gp.dp = (double *) v1;
182 hp.dp = (double *) v2;
183 for (iel = 0; iel < leniel++) {
184     if (*gp.dp != *hp.dp)
185       return (iel + 1);
186     gp.dp++;
187     hp.dp++;
188 }
189 break;
190      default:
191 error("%s: bad type, test program error", pname);
192    }
193    return 0; /* all values agree */
194}
195
196
197/* print typed value block with values of specified type */
198void
199val_out(typelenvals)
200     nc_type type; /* netcdf type, NC_BYTE, ..., NC_DOUBLE */
201     long len; /* number of elements to fill with */
202     void *vals; /* start of first block of values */
203{
204    static char pname[] = "val_oout";
205    int iel;
206    union {
207 char *cp;
208 short *sp;
209 nclong *lp;
210 float *fp;
211 double *dp;
212    } gp;
213
214    (void) fprintf(stderr,"   ");
215    switch (type) {
216      case NC_BYTE:
217      case NC_CHAR:
218 gp.cp = (char *) vals;
219 for (iel = 0; iel < leniel++)
220   (void)fprintf(stderr,"%d%s",*gp.cp++,iel<len-1 ? ", " : "");
221 break;
222      case NC_SHORT:
223 gp.sp = (short *) vals;
224 for (iel = 0; iel < leniel++)
225   (void)fprintf(stderr,"%d%s",*gp.sp++,iel<len-1 ? ", " : "");
226 break;
227      case NC_LONG:
228 gp.lp = (nclong *) vals;
229 for (iel = 0; iel < leniel++)
230   (void)fprintf(stderr,"%d%s",*gp.lp++,iel<len-1 ? ", " : "");
231 break;
232      case NC_FLOAT:
233 gp.fp = (float *) vals;
234 for (iel = 0; iel < leniel++)
235   (void)fprintf(stderr,"%g%s",*gp.fp++,iel<len-1 ? ", " : "");
236 break;
237      case NC_DOUBLE:
238 gp.dp = (double *) vals;
239 for (iel = 0; iel < leniel++)
240   (void)fprintf(stderr,"%g%s",*gp.dp++,iel<len-1 ? ", " : "");
241 break;
242      default:
243 error("%s: bad type, test program error", pname);
244    }
245    (void) putc('\n',stderr);
246}


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