[409] | 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 | |
---|