source: XIOS/trunk/extern/src_netcdf4/dapcvt.c @ 409

Last change on this file since 409 was 409, checked in by ymipsl, 11 years ago

Add improved nectdf internal library src

YM

  • Property svn:eol-style set to native
File size: 10.5 KB
Line 
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
10NCerror
11dapconvert3(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) \
52case 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)) {
62ARM(ncchar,NC_CHAR,char,ncchar,NC_CHAR,char)
63ARM(ncchar,NC_CHAR,char,ncbyte,NC_BYTE,signed char)
64ARM(ncchar,NC_CHAR,char,ncubyte,NC_UBYTE,unsigned char)
65ARM(ncchar,NC_CHAR,char,ncshort,NC_SHORT,short)
66ARM(ncchar,NC_CHAR,char,ncushort,NC_USHORT,unsigned short)
67ARM(ncchar,NC_CHAR,char,ncint,NC_INT,int)
68ARM(ncchar,NC_CHAR,char,ncuint,NC_UINT,unsigned int)
69ARM(ncchar,NC_CHAR,char,ncint64,NC_INT64,long long)
70ARM(ncchar,NC_CHAR,char,ncuint64,NC_UINT64,unsigned long long)
71ARM(ncchar,NC_CHAR,char,ncfloat,NC_FLOAT,float)
72ARM(ncchar,NC_CHAR,char,ncdouble,NC_DOUBLE,double)
73ARM(ncbyte,NC_BYTE,signed char,ncchar,NC_CHAR,char)
74ARM(ncbyte,NC_BYTE,signed char,ncbyte,NC_BYTE,signed char)
75ARM(ncbyte,NC_BYTE,signed char,ncubyte,NC_UBYTE,unsigned char)
76ARM(ncbyte,NC_BYTE,signed char,ncshort,NC_SHORT,short)
77ARM(ncbyte,NC_BYTE,signed char,ncushort,NC_USHORT,unsigned short)
78ARM(ncbyte,NC_BYTE,signed char,ncint,NC_INT,int)
79ARM(ncbyte,NC_BYTE,signed char,ncuint,NC_UINT,unsigned int)
80ARM(ncbyte,NC_BYTE,signed char,ncint64,NC_INT64,long long)
81ARM(ncbyte,NC_BYTE,signed char,ncuint64,NC_UINT64,unsigned long long)
82ARM(ncbyte,NC_BYTE,signed char,ncfloat,NC_FLOAT,float)
83ARM(ncbyte,NC_BYTE,signed char,ncdouble,NC_DOUBLE,double)
84ARM(ncubyte,NC_UBYTE,unsigned char,ncchar,NC_CHAR,char)
85ARM(ncubyte,NC_UBYTE,unsigned char,ncbyte,NC_BYTE,signed char)
86ARM(ncubyte,NC_UBYTE,unsigned char,ncubyte,NC_UBYTE,unsigned char)
87ARM(ncubyte,NC_UBYTE,unsigned char,ncshort,NC_SHORT,short)
88ARM(ncubyte,NC_UBYTE,unsigned char,ncushort,NC_USHORT,unsigned short)
89ARM(ncubyte,NC_UBYTE,unsigned char,ncint,NC_INT,int)
90ARM(ncubyte,NC_UBYTE,unsigned char,ncuint,NC_UINT,unsigned int)
91ARM(ncubyte,NC_UBYTE,unsigned char,ncint64,NC_INT64,long long)
92ARM(ncubyte,NC_UBYTE,unsigned char,ncuint64,NC_UINT64,unsigned long long)
93ARM(ncubyte,NC_UBYTE,unsigned char,ncfloat,NC_FLOAT,float)
94ARM(ncubyte,NC_UBYTE,unsigned char,ncdouble,NC_DOUBLE,double)
95ARM(ncshort,NC_SHORT,short,ncchar,NC_CHAR,char)
96ARM(ncshort,NC_SHORT,short,ncbyte,NC_BYTE,signed char)
97ARM(ncshort,NC_SHORT,short,ncubyte,NC_UBYTE,unsigned char)
98ARM(ncshort,NC_SHORT,short,ncshort,NC_SHORT,short)
99ARM(ncshort,NC_SHORT,short,ncushort,NC_USHORT,unsigned short)
100ARM(ncshort,NC_SHORT,short,ncint,NC_INT,int)
101ARM(ncshort,NC_SHORT,short,ncuint,NC_UINT,unsigned int)
102ARM(ncshort,NC_SHORT,short,ncint64,NC_INT64,long long)
103ARM(ncshort,NC_SHORT,short,ncuint64,NC_UINT64,unsigned long long)
104ARM(ncshort,NC_SHORT,short,ncfloat,NC_FLOAT,float)
105ARM(ncshort,NC_SHORT,short,ncdouble,NC_DOUBLE,double)
106ARM(ncushort,NC_USHORT,unsigned short,ncchar,NC_CHAR,char)
107ARM(ncushort,NC_USHORT,unsigned short,ncbyte,NC_BYTE,signed char)
108ARM(ncushort,NC_USHORT,unsigned short,ncubyte,NC_UBYTE,unsigned char)
109ARM(ncushort,NC_USHORT,unsigned short,ncshort,NC_SHORT,short)
110ARM(ncushort,NC_USHORT,unsigned short,ncushort,NC_USHORT,unsigned short)
111ARM(ncushort,NC_USHORT,unsigned short,ncint,NC_INT,int)
112ARM(ncushort,NC_USHORT,unsigned short,ncuint,NC_UINT,unsigned int)
113ARM(ncushort,NC_USHORT,unsigned short,ncint64,NC_INT64,long long)
114ARM(ncushort,NC_USHORT,unsigned short,ncuint64,NC_UINT64,unsigned long long)
115ARM(ncushort,NC_USHORT,unsigned short,ncfloat,NC_FLOAT,float)
116ARM(ncushort,NC_USHORT,unsigned short,ncdouble,NC_DOUBLE,double)
117ARM(ncint,NC_INT,int,ncchar,NC_CHAR,char)
118ARM(ncint,NC_INT,int,ncbyte,NC_BYTE,signed char)
119ARM(ncint,NC_INT,int,ncubyte,NC_UBYTE,unsigned char)
120ARM(ncint,NC_INT,int,ncshort,NC_SHORT,short)
121ARM(ncint,NC_INT,int,ncushort,NC_USHORT,unsigned short)
122ARM(ncint,NC_INT,int,ncint,NC_INT,int)
123ARM(ncint,NC_INT,int,ncuint,NC_UINT,unsigned int)
124ARM(ncint,NC_INT,int,ncint64,NC_INT64,long long)
125ARM(ncint,NC_INT,int,ncuint64,NC_UINT64,unsigned long long)
126ARM(ncint,NC_INT,int,ncfloat,NC_FLOAT,float)
127ARM(ncint,NC_INT,int,ncdouble,NC_DOUBLE,double)
128ARM(ncuint,NC_UINT,unsigned int,ncchar,NC_CHAR,char)
129ARM(ncuint,NC_UINT,unsigned int,ncbyte,NC_BYTE,signed char)
130ARM(ncuint,NC_UINT,unsigned int,ncubyte,NC_UBYTE,unsigned char)
131ARM(ncuint,NC_UINT,unsigned int,ncshort,NC_SHORT,short)
132ARM(ncuint,NC_UINT,unsigned int,ncushort,NC_USHORT,unsigned short)
133ARM(ncuint,NC_UINT,unsigned int,ncint,NC_INT,int)
134ARM(ncuint,NC_UINT,unsigned int,ncuint,NC_UINT,unsigned int)
135ARM(ncuint,NC_UINT,unsigned int,ncint64,NC_INT64,long long)
136ARM(ncuint,NC_UINT,unsigned int,ncuint64,NC_UINT64,unsigned long long)
137ARM(ncuint,NC_UINT,unsigned int,ncfloat,NC_FLOAT,float)
138ARM(ncuint,NC_UINT,unsigned int,ncdouble,NC_DOUBLE,double)
139ARM(ncint64,NC_INT64,long long,ncchar,NC_CHAR,char)
140ARM(ncint64,NC_INT64,long long,ncbyte,NC_BYTE,signed char)
141ARM(ncint64,NC_INT64,long long,ncubyte,NC_UBYTE,unsigned char)
142ARM(ncint64,NC_INT64,long long,ncshort,NC_SHORT,short)
143ARM(ncint64,NC_INT64,long long,ncushort,NC_USHORT,unsigned short)
144ARM(ncint64,NC_INT64,long long,ncint,NC_INT,int)
145ARM(ncint64,NC_INT64,long long,ncuint,NC_UINT,unsigned int)
146ARM(ncint64,NC_INT64,long long,ncint64,NC_INT64,long long)
147ARM(ncint64,NC_INT64,long long,ncuint64,NC_UINT64,unsigned long long)
148ARM(ncint64,NC_INT64,long long,ncfloat,NC_FLOAT,float)
149ARM(ncint64,NC_INT64,long long,ncdouble,NC_DOUBLE,double)
150ARM(ncuint64,NC_UINT64,unsigned long long,ncchar,NC_CHAR,char)
151ARM(ncuint64,NC_UINT64,unsigned long long,ncbyte,NC_BYTE,signed char)
152ARM(ncuint64,NC_UINT64,unsigned long long,ncubyte,NC_UBYTE,unsigned char)
153ARM(ncuint64,NC_UINT64,unsigned long long,ncshort,NC_SHORT,short)
154ARM(ncuint64,NC_UINT64,unsigned long long,ncushort,NC_USHORT,unsigned short)
155ARM(ncuint64,NC_UINT64,unsigned long long,ncint,NC_INT,int)
156ARM(ncuint64,NC_UINT64,unsigned long long,ncuint,NC_UINT,unsigned int)
157ARM(ncuint64,NC_UINT64,unsigned long long,ncint64,NC_INT64,long long)
158ARM(ncuint64,NC_UINT64,unsigned long long,ncuint64,NC_UINT64,unsigned long long)
159ARM(ncuint64,NC_UINT64,unsigned long long,ncfloat,NC_FLOAT,float)
160ARM(ncuint64,NC_UINT64,unsigned long long,ncdouble,NC_DOUBLE,double)
161ARM(ncfloat,NC_FLOAT,float,ncchar,NC_CHAR,char)
162ARM(ncfloat,NC_FLOAT,float,ncbyte,NC_BYTE,signed char)
163ARM(ncfloat,NC_FLOAT,float,ncubyte,NC_UBYTE,unsigned char)
164ARM(ncfloat,NC_FLOAT,float,ncshort,NC_SHORT,short)
165ARM(ncfloat,NC_FLOAT,float,ncushort,NC_USHORT,unsigned short)
166ARM(ncfloat,NC_FLOAT,float,ncint,NC_INT,int)
167ARM(ncfloat,NC_FLOAT,float,ncuint,NC_UINT,unsigned int)
168ARM(ncfloat,NC_FLOAT,float,ncint64,NC_INT64,long long)
169ARM(ncfloat,NC_FLOAT,float,ncuint64,NC_UINT64,unsigned long long)
170ARM(ncfloat,NC_FLOAT,float,ncfloat,NC_FLOAT,float)
171ARM(ncfloat,NC_FLOAT,float,ncdouble,NC_DOUBLE,double)
172ARM(ncdouble,NC_DOUBLE,double,ncchar,NC_CHAR,char)
173ARM(ncdouble,NC_DOUBLE,double,ncbyte,NC_BYTE,signed char)
174ARM(ncdouble,NC_DOUBLE,double,ncubyte,NC_UBYTE,unsigned char)
175ARM(ncdouble,NC_DOUBLE,double,ncshort,NC_SHORT,short)
176ARM(ncdouble,NC_DOUBLE,double,ncushort,NC_USHORT,unsigned short)
177ARM(ncdouble,NC_DOUBLE,double,ncint,NC_INT,int)
178ARM(ncdouble,NC_DOUBLE,double,ncuint,NC_UINT,unsigned int)
179ARM(ncdouble,NC_DOUBLE,double,ncint64,NC_INT64,long long)
180ARM(ncdouble,NC_DOUBLE,double,ncuint64,NC_UINT64,unsigned long long)
181ARM(ncdouble,NC_DOUBLE,double,ncfloat,NC_FLOAT,float)
182ARM(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
190fail:
191    return THROW(ncstat);
192}
193
194NCerror
195dapcvtattrval3(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    }
262done:
263    return THROW(ncstat);
264}
265
Note: See TracBrowser for help on using the repository browser.