1 | /********************************************************************* |
---|
2 | * Copyright 1993, UCAR/Unidata |
---|
3 | * See netcdf/COPYRIGHT file for copying and redistribution conditions. |
---|
4 | * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapcvt.c,v 1.14 2009/11/29 00:16:26 dmh Exp $ |
---|
5 | *********************************************************************/ |
---|
6 | #include "config.h" |
---|
7 | #include "ncdap3.h" |
---|
8 | #include "dapodom.h" |
---|
9 | |
---|
10 | NCerror |
---|
11 | dapconvert3(nc_type srctype, nc_type dsttype, char* memory0, char* value0, size_t count) |
---|
12 | { |
---|
13 | NCerror ncstat = NC_NOERR; |
---|
14 | size_t i; |
---|
15 | char* memory = memory0; |
---|
16 | char* value = value0; |
---|
17 | |
---|
18 | /* In order to deal with the DAP upgrade problem, |
---|
19 | try to preserve the bit patterns |
---|
20 | */ |
---|
21 | |
---|
22 | /* Provide space and pointer casts for intermediate results */ |
---|
23 | signed char ncbyte; |
---|
24 | signed char* ncbytep; |
---|
25 | char ncchar; |
---|
26 | char* nccharp; |
---|
27 | short ncshort; |
---|
28 | short* ncshortp; |
---|
29 | int ncint; |
---|
30 | int* ncintp; |
---|
31 | float ncfloat; |
---|
32 | float* ncfloatp; |
---|
33 | double ncdouble; |
---|
34 | double* ncdoublep; |
---|
35 | unsigned char ncubyte; |
---|
36 | unsigned char* ncubytep; |
---|
37 | unsigned short ncushort; |
---|
38 | unsigned short* ncushortp; |
---|
39 | unsigned int ncuint; |
---|
40 | unsigned int* ncuintp; |
---|
41 | long long ncint64; |
---|
42 | long long* ncint64p; |
---|
43 | unsigned long long ncuint64; |
---|
44 | unsigned long long* ncuint64p; |
---|
45 | |
---|
46 | |
---|
47 | #define CASE(nc1,nc2) (nc1*256+nc2) |
---|
48 | #define CUT8(e) ((unsigned char)((e) & 0xff)) |
---|
49 | #define CUT16(e) ((unsigned short)((e) & 0xffff)) |
---|
50 | #define CUT32(e) ((unsigned int)((e) & 0xffffffff)) |
---|
51 | #define ARM(vs,ncs,ts,vd,ncd,td) \ |
---|
52 | case CASE(ncs,ncd):\ |
---|
53 | vs##p = (ts *)value;\ |
---|
54 | vs = *vs##p;\ |
---|
55 | vd##p = (td *)memory;\ |
---|
56 | *vd##p = (td)vs;\ |
---|
57 | break; |
---|
58 | |
---|
59 | for(i=0;i<count;i++) { |
---|
60 | |
---|
61 | switch (CASE(srctype,dsttype)) { |
---|
62 | ARM(ncchar,NC_CHAR,char,ncchar,NC_CHAR,char) |
---|
63 | ARM(ncchar,NC_CHAR,char,ncbyte,NC_BYTE,signed char) |
---|
64 | ARM(ncchar,NC_CHAR,char,ncubyte,NC_UBYTE,unsigned char) |
---|
65 | ARM(ncchar,NC_CHAR,char,ncshort,NC_SHORT,short) |
---|
66 | ARM(ncchar,NC_CHAR,char,ncushort,NC_USHORT,unsigned short) |
---|
67 | ARM(ncchar,NC_CHAR,char,ncint,NC_INT,int) |
---|
68 | ARM(ncchar,NC_CHAR,char,ncuint,NC_UINT,unsigned int) |
---|
69 | ARM(ncchar,NC_CHAR,char,ncint64,NC_INT64,long long) |
---|
70 | ARM(ncchar,NC_CHAR,char,ncuint64,NC_UINT64,unsigned long long) |
---|
71 | ARM(ncchar,NC_CHAR,char,ncfloat,NC_FLOAT,float) |
---|
72 | ARM(ncchar,NC_CHAR,char,ncdouble,NC_DOUBLE,double) |
---|
73 | ARM(ncbyte,NC_BYTE,signed char,ncchar,NC_CHAR,char) |
---|
74 | ARM(ncbyte,NC_BYTE,signed char,ncbyte,NC_BYTE,signed char) |
---|
75 | ARM(ncbyte,NC_BYTE,signed char,ncubyte,NC_UBYTE,unsigned char) |
---|
76 | ARM(ncbyte,NC_BYTE,signed char,ncshort,NC_SHORT,short) |
---|
77 | ARM(ncbyte,NC_BYTE,signed char,ncushort,NC_USHORT,unsigned short) |
---|
78 | ARM(ncbyte,NC_BYTE,signed char,ncint,NC_INT,int) |
---|
79 | ARM(ncbyte,NC_BYTE,signed char,ncuint,NC_UINT,unsigned int) |
---|
80 | ARM(ncbyte,NC_BYTE,signed char,ncint64,NC_INT64,long long) |
---|
81 | ARM(ncbyte,NC_BYTE,signed char,ncuint64,NC_UINT64,unsigned long long) |
---|
82 | ARM(ncbyte,NC_BYTE,signed char,ncfloat,NC_FLOAT,float) |
---|
83 | ARM(ncbyte,NC_BYTE,signed char,ncdouble,NC_DOUBLE,double) |
---|
84 | ARM(ncubyte,NC_UBYTE,unsigned char,ncchar,NC_CHAR,char) |
---|
85 | ARM(ncubyte,NC_UBYTE,unsigned char,ncbyte,NC_BYTE,signed char) |
---|
86 | ARM(ncubyte,NC_UBYTE,unsigned char,ncubyte,NC_UBYTE,unsigned char) |
---|
87 | ARM(ncubyte,NC_UBYTE,unsigned char,ncshort,NC_SHORT,short) |
---|
88 | ARM(ncubyte,NC_UBYTE,unsigned char,ncushort,NC_USHORT,unsigned short) |
---|
89 | ARM(ncubyte,NC_UBYTE,unsigned char,ncint,NC_INT,int) |
---|
90 | ARM(ncubyte,NC_UBYTE,unsigned char,ncuint,NC_UINT,unsigned int) |
---|
91 | ARM(ncubyte,NC_UBYTE,unsigned char,ncint64,NC_INT64,long long) |
---|
92 | ARM(ncubyte,NC_UBYTE,unsigned char,ncuint64,NC_UINT64,unsigned long long) |
---|
93 | ARM(ncubyte,NC_UBYTE,unsigned char,ncfloat,NC_FLOAT,float) |
---|
94 | ARM(ncubyte,NC_UBYTE,unsigned char,ncdouble,NC_DOUBLE,double) |
---|
95 | ARM(ncshort,NC_SHORT,short,ncchar,NC_CHAR,char) |
---|
96 | ARM(ncshort,NC_SHORT,short,ncbyte,NC_BYTE,signed char) |
---|
97 | ARM(ncshort,NC_SHORT,short,ncubyte,NC_UBYTE,unsigned char) |
---|
98 | ARM(ncshort,NC_SHORT,short,ncshort,NC_SHORT,short) |
---|
99 | ARM(ncshort,NC_SHORT,short,ncushort,NC_USHORT,unsigned short) |
---|
100 | ARM(ncshort,NC_SHORT,short,ncint,NC_INT,int) |
---|
101 | ARM(ncshort,NC_SHORT,short,ncuint,NC_UINT,unsigned int) |
---|
102 | ARM(ncshort,NC_SHORT,short,ncint64,NC_INT64,long long) |
---|
103 | ARM(ncshort,NC_SHORT,short,ncuint64,NC_UINT64,unsigned long long) |
---|
104 | ARM(ncshort,NC_SHORT,short,ncfloat,NC_FLOAT,float) |
---|
105 | ARM(ncshort,NC_SHORT,short,ncdouble,NC_DOUBLE,double) |
---|
106 | ARM(ncushort,NC_USHORT,unsigned short,ncchar,NC_CHAR,char) |
---|
107 | ARM(ncushort,NC_USHORT,unsigned short,ncbyte,NC_BYTE,signed char) |
---|
108 | ARM(ncushort,NC_USHORT,unsigned short,ncubyte,NC_UBYTE,unsigned char) |
---|
109 | ARM(ncushort,NC_USHORT,unsigned short,ncshort,NC_SHORT,short) |
---|
110 | ARM(ncushort,NC_USHORT,unsigned short,ncushort,NC_USHORT,unsigned short) |
---|
111 | ARM(ncushort,NC_USHORT,unsigned short,ncint,NC_INT,int) |
---|
112 | ARM(ncushort,NC_USHORT,unsigned short,ncuint,NC_UINT,unsigned int) |
---|
113 | ARM(ncushort,NC_USHORT,unsigned short,ncint64,NC_INT64,long long) |
---|
114 | ARM(ncushort,NC_USHORT,unsigned short,ncuint64,NC_UINT64,unsigned long long) |
---|
115 | ARM(ncushort,NC_USHORT,unsigned short,ncfloat,NC_FLOAT,float) |
---|
116 | ARM(ncushort,NC_USHORT,unsigned short,ncdouble,NC_DOUBLE,double) |
---|
117 | ARM(ncint,NC_INT,int,ncchar,NC_CHAR,char) |
---|
118 | ARM(ncint,NC_INT,int,ncbyte,NC_BYTE,signed char) |
---|
119 | ARM(ncint,NC_INT,int,ncubyte,NC_UBYTE,unsigned char) |
---|
120 | ARM(ncint,NC_INT,int,ncshort,NC_SHORT,short) |
---|
121 | ARM(ncint,NC_INT,int,ncushort,NC_USHORT,unsigned short) |
---|
122 | ARM(ncint,NC_INT,int,ncint,NC_INT,int) |
---|
123 | ARM(ncint,NC_INT,int,ncuint,NC_UINT,unsigned int) |
---|
124 | ARM(ncint,NC_INT,int,ncint64,NC_INT64,long long) |
---|
125 | ARM(ncint,NC_INT,int,ncuint64,NC_UINT64,unsigned long long) |
---|
126 | ARM(ncint,NC_INT,int,ncfloat,NC_FLOAT,float) |
---|
127 | ARM(ncint,NC_INT,int,ncdouble,NC_DOUBLE,double) |
---|
128 | ARM(ncuint,NC_UINT,unsigned int,ncchar,NC_CHAR,char) |
---|
129 | ARM(ncuint,NC_UINT,unsigned int,ncbyte,NC_BYTE,signed char) |
---|
130 | ARM(ncuint,NC_UINT,unsigned int,ncubyte,NC_UBYTE,unsigned char) |
---|
131 | ARM(ncuint,NC_UINT,unsigned int,ncshort,NC_SHORT,short) |
---|
132 | ARM(ncuint,NC_UINT,unsigned int,ncushort,NC_USHORT,unsigned short) |
---|
133 | ARM(ncuint,NC_UINT,unsigned int,ncint,NC_INT,int) |
---|
134 | ARM(ncuint,NC_UINT,unsigned int,ncuint,NC_UINT,unsigned int) |
---|
135 | ARM(ncuint,NC_UINT,unsigned int,ncint64,NC_INT64,long long) |
---|
136 | ARM(ncuint,NC_UINT,unsigned int,ncuint64,NC_UINT64,unsigned long long) |
---|
137 | ARM(ncuint,NC_UINT,unsigned int,ncfloat,NC_FLOAT,float) |
---|
138 | ARM(ncuint,NC_UINT,unsigned int,ncdouble,NC_DOUBLE,double) |
---|
139 | ARM(ncint64,NC_INT64,long long,ncchar,NC_CHAR,char) |
---|
140 | ARM(ncint64,NC_INT64,long long,ncbyte,NC_BYTE,signed char) |
---|
141 | ARM(ncint64,NC_INT64,long long,ncubyte,NC_UBYTE,unsigned char) |
---|
142 | ARM(ncint64,NC_INT64,long long,ncshort,NC_SHORT,short) |
---|
143 | ARM(ncint64,NC_INT64,long long,ncushort,NC_USHORT,unsigned short) |
---|
144 | ARM(ncint64,NC_INT64,long long,ncint,NC_INT,int) |
---|
145 | ARM(ncint64,NC_INT64,long long,ncuint,NC_UINT,unsigned int) |
---|
146 | ARM(ncint64,NC_INT64,long long,ncint64,NC_INT64,long long) |
---|
147 | ARM(ncint64,NC_INT64,long long,ncuint64,NC_UINT64,unsigned long long) |
---|
148 | ARM(ncint64,NC_INT64,long long,ncfloat,NC_FLOAT,float) |
---|
149 | ARM(ncint64,NC_INT64,long long,ncdouble,NC_DOUBLE,double) |
---|
150 | ARM(ncuint64,NC_UINT64,unsigned long long,ncchar,NC_CHAR,char) |
---|
151 | ARM(ncuint64,NC_UINT64,unsigned long long,ncbyte,NC_BYTE,signed char) |
---|
152 | ARM(ncuint64,NC_UINT64,unsigned long long,ncubyte,NC_UBYTE,unsigned char) |
---|
153 | ARM(ncuint64,NC_UINT64,unsigned long long,ncshort,NC_SHORT,short) |
---|
154 | ARM(ncuint64,NC_UINT64,unsigned long long,ncushort,NC_USHORT,unsigned short) |
---|
155 | ARM(ncuint64,NC_UINT64,unsigned long long,ncint,NC_INT,int) |
---|
156 | ARM(ncuint64,NC_UINT64,unsigned long long,ncuint,NC_UINT,unsigned int) |
---|
157 | ARM(ncuint64,NC_UINT64,unsigned long long,ncint64,NC_INT64,long long) |
---|
158 | ARM(ncuint64,NC_UINT64,unsigned long long,ncuint64,NC_UINT64,unsigned long long) |
---|
159 | ARM(ncuint64,NC_UINT64,unsigned long long,ncfloat,NC_FLOAT,float) |
---|
160 | ARM(ncuint64,NC_UINT64,unsigned long long,ncdouble,NC_DOUBLE,double) |
---|
161 | ARM(ncfloat,NC_FLOAT,float,ncchar,NC_CHAR,char) |
---|
162 | ARM(ncfloat,NC_FLOAT,float,ncbyte,NC_BYTE,signed char) |
---|
163 | ARM(ncfloat,NC_FLOAT,float,ncubyte,NC_UBYTE,unsigned char) |
---|
164 | ARM(ncfloat,NC_FLOAT,float,ncshort,NC_SHORT,short) |
---|
165 | ARM(ncfloat,NC_FLOAT,float,ncushort,NC_USHORT,unsigned short) |
---|
166 | ARM(ncfloat,NC_FLOAT,float,ncint,NC_INT,int) |
---|
167 | ARM(ncfloat,NC_FLOAT,float,ncuint,NC_UINT,unsigned int) |
---|
168 | ARM(ncfloat,NC_FLOAT,float,ncint64,NC_INT64,long long) |
---|
169 | ARM(ncfloat,NC_FLOAT,float,ncuint64,NC_UINT64,unsigned long long) |
---|
170 | ARM(ncfloat,NC_FLOAT,float,ncfloat,NC_FLOAT,float) |
---|
171 | ARM(ncfloat,NC_FLOAT,float,ncdouble,NC_DOUBLE,double) |
---|
172 | ARM(ncdouble,NC_DOUBLE,double,ncchar,NC_CHAR,char) |
---|
173 | ARM(ncdouble,NC_DOUBLE,double,ncbyte,NC_BYTE,signed char) |
---|
174 | ARM(ncdouble,NC_DOUBLE,double,ncubyte,NC_UBYTE,unsigned char) |
---|
175 | ARM(ncdouble,NC_DOUBLE,double,ncshort,NC_SHORT,short) |
---|
176 | ARM(ncdouble,NC_DOUBLE,double,ncushort,NC_USHORT,unsigned short) |
---|
177 | ARM(ncdouble,NC_DOUBLE,double,ncint,NC_INT,int) |
---|
178 | ARM(ncdouble,NC_DOUBLE,double,ncuint,NC_UINT,unsigned int) |
---|
179 | ARM(ncdouble,NC_DOUBLE,double,ncint64,NC_INT64,long long) |
---|
180 | ARM(ncdouble,NC_DOUBLE,double,ncuint64,NC_UINT64,unsigned long long) |
---|
181 | ARM(ncdouble,NC_DOUBLE,double,ncfloat,NC_FLOAT,float) |
---|
182 | ARM(ncdouble,NC_DOUBLE,double,ncdouble,NC_DOUBLE,double) |
---|
183 | |
---|
184 | default: ncstat = NC_EINVAL; THROWCHK(ncstat); goto fail; |
---|
185 | } |
---|
186 | value += nctypesizeof(srctype); |
---|
187 | memory += nctypesizeof(dsttype); |
---|
188 | } |
---|
189 | |
---|
190 | fail: |
---|
191 | return THROW(ncstat); |
---|
192 | } |
---|
193 | |
---|
194 | NCerror |
---|
195 | dapcvtattrval3(nc_type etype, void* dst, NClist* src) |
---|
196 | { |
---|
197 | int i,ok; |
---|
198 | NCerror ncstat = NC_NOERR; |
---|
199 | unsigned int memsize = nctypesizeof(etype); |
---|
200 | unsigned int nvalues = nclistlength(src); |
---|
201 | char* dstmem = (char*)dst; |
---|
202 | |
---|
203 | for(i=0;i<nvalues;i++) { |
---|
204 | char* s = (char*)nclistget(src,i); |
---|
205 | ok = 0; |
---|
206 | switch (etype) { |
---|
207 | case NC_BYTE: { |
---|
208 | unsigned char* p = (unsigned char*)dstmem; |
---|
209 | ok = sscanf(s,"%hhu",p); |
---|
210 | } break; |
---|
211 | case NC_CHAR: { |
---|
212 | signed char* p = (signed char*)dstmem; |
---|
213 | ok = sscanf(s,"%c",p); |
---|
214 | } break; |
---|
215 | case NC_SHORT: { |
---|
216 | short* p = (short*)dstmem; |
---|
217 | ok = sscanf(s,"%hd",p); |
---|
218 | } break; |
---|
219 | case NC_INT: { |
---|
220 | int* p = (int*)dstmem; |
---|
221 | ok = sscanf(s,"%d",p); |
---|
222 | } break; |
---|
223 | case NC_FLOAT: { |
---|
224 | float* p = (float*)dstmem; |
---|
225 | ok = sscanf(s,"%g",p); |
---|
226 | } break; |
---|
227 | case NC_DOUBLE: { |
---|
228 | double* p = (double*)dstmem; |
---|
229 | ok = sscanf(s,"%lg",p); |
---|
230 | } break; |
---|
231 | case NC_UBYTE: { |
---|
232 | unsigned char* p = (unsigned char*)dstmem; |
---|
233 | ok = sscanf(s,"%hhu",p); |
---|
234 | } break; |
---|
235 | case NC_USHORT: { |
---|
236 | unsigned short* p = (unsigned short*)dstmem; |
---|
237 | ok = sscanf(s,"%hu",p); |
---|
238 | } break; |
---|
239 | case NC_UINT: { |
---|
240 | unsigned int* p = (unsigned int*)dstmem; |
---|
241 | ok = sscanf(s,"%u",p); |
---|
242 | } break; |
---|
243 | case NC_INT64: { |
---|
244 | long long* p = (long long*)dstmem; |
---|
245 | ok = sscanf(s,"%lld",p); |
---|
246 | } break; |
---|
247 | case NC_UINT64: { |
---|
248 | unsigned long long* p = (unsigned long long*)dstmem; |
---|
249 | ok = sscanf(s,"%llu",p); |
---|
250 | } break; |
---|
251 | case NC_STRING: case NC_URL: { |
---|
252 | char** p = (char**)dstmem; |
---|
253 | *p = nulldup(s); |
---|
254 | ok = 1; |
---|
255 | } break; |
---|
256 | default: |
---|
257 | PANIC1("unexpected nc_type: %d",(int)etype); |
---|
258 | } |
---|
259 | if(ok != 1) {ncstat = NC_EINVAL; goto done;} |
---|
260 | dstmem += memsize; |
---|
261 | } |
---|
262 | done: |
---|
263 | return THROW(ncstat); |
---|
264 | } |
---|
265 | |
---|