@@ -312,6 +312,28 @@ else if(var_type == NC_LONG)
312
312
GDLDelete (e->GetParGlobal (2 ));
313
313
e->GetParGlobal (2 ) = new DULongGDL ((uivar));
314
314
}
315
+ else if (var_type == NC_INT64)
316
+ {
317
+
318
+ int ivar;
319
+ status=nc_get_var1_int (cdfid,
320
+ varid,
321
+ index,
322
+ &ivar);
323
+ GDLDelete (e->GetParGlobal (2 ));
324
+ e->GetParGlobal (2 ) = new DLong64GDL ((ivar));
325
+ }
326
+ else if (var_type == NC_UINT64)
327
+ {
328
+
329
+ unsigned int uivar;
330
+ status=nc_get_var1_uint (cdfid,
331
+ varid,
332
+ index,
333
+ &uivar);
334
+ GDLDelete (e->GetParGlobal (2 ));
335
+ e->GetParGlobal (2 ) = new DULong64GDL ((uivar));
336
+ }
315
337
else if (var_type == NC_SHORT)
316
338
{
317
339
@@ -351,6 +373,13 @@ else if(var_type == NC_LONG)
351
373
GDLDelete (e->GetParGlobal (2 ));
352
374
e->GetParGlobal (2 ) = new DByteGDL ((bvar));
353
375
}
376
+ else if (var_type == NC_STRING) {
377
+ char *stemp;
378
+ status = nc_get_var1_string (cdfid, varid, index, &stemp);
379
+ GDLDelete (e->GetParGlobal (2 ));
380
+ e->GetParGlobal (2 )=new DStringGDL (stemp);
381
+ free (stemp);
382
+ }
354
383
355
384
ncdf_handle_error (e,status," NCDF_VARGET1" );
356
385
}
@@ -400,7 +429,6 @@ else if(var_type == NC_LONG)
400
429
transposed_dim_length[trans[i]] = dim_length[i];
401
430
ncdf_handle_error (e, status, " NCDF_VARGET" );
402
431
}
403
-
404
432
// for (int i = 0; i < var_ndims; ++i) index[i]=0;//defaults
405
433
406
434
/* Here we have the minimum required details for getting any kind of data
@@ -482,6 +510,22 @@ else if(var_type == NC_LONG)
482
510
GDLDelete (e->GetParGlobal (2 ));
483
511
e->GetParGlobal (2 )=temp;
484
512
}
513
+ else if (var_type == NC_INT64)
514
+ {
515
+ DLong64GDL* temp=new DLong64GDL (dim,BaseGDL::NOZERO);
516
+ status=nc_get_var_longlong (cdfid, varid,&(*temp)[0 ]);
517
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
518
+ GDLDelete (e->GetParGlobal (2 ));
519
+ e->GetParGlobal (2 )=temp;
520
+ }
521
+ else if (var_type == NC_UINT64)
522
+ {
523
+ DULong64GDL* temp=new DULong64GDL (dim,BaseGDL::NOZERO);
524
+ status=nc_get_var_ulonglong (cdfid, varid,&(*temp)[0 ]);
525
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
526
+ GDLDelete (e->GetParGlobal (2 ));
527
+ e->GetParGlobal (2 )=temp;
528
+ }
485
529
else if (var_type == NC_BYTE || var_type == NC_UBYTE )
486
530
{
487
531
DByteGDL* temp=new DByteGDL (dim,BaseGDL::NOZERO);
@@ -506,6 +550,24 @@ else if(var_type == NC_LONG)
506
550
GDLDelete (e->GetParGlobal (2 ));
507
551
e->GetParGlobal (2 ) = temp;
508
552
}
553
+ else if (var_type == NC_STRING)
554
+ {
555
+ // Read NC_STRING
556
+ // Below should read an array of strings into char** stmp
557
+ char **stemp = new char *[array_size];
558
+ status = nc_get_var_string (cdfid, varid, stemp);
559
+ ncdf_handle_error (e, status, " NCDF_VARGET" );
560
+ // Need to copy strings in stemp to the returned structure...
561
+ GDLDelete (e->GetParGlobal (2 ));
562
+ SizeT num_elems=array_size;
563
+ dimension flat_dim (&num_elems, 1 );
564
+ BaseGDL *str_arr = new DStringGDL (flat_dim);
565
+ // assign array pointers
566
+ for (size_t i=0 ; i<array_size; i++) (*(static_cast <DStringGDL*> (str_arr)))[i] = stemp[i];
567
+ // re-shape array & add as tag
568
+ (static_cast <BaseGDL*>(str_arr))->SetDim (dim);
569
+ e->GetParGlobal (2 )=str_arr;
570
+ }
509
571
// done read all.
510
572
}
511
573
else
@@ -628,6 +690,22 @@ else if(var_type == NC_LONG)
628
690
GDLDelete (e->GetParGlobal (2 ));
629
691
e->GetParGlobal (2 ) = temp;
630
692
}
693
+ else if (var_type == NC_INT64)
694
+ {
695
+ DLong64GDL *temp = new DLong64GDL (dim,BaseGDL::NOZERO);
696
+ status = nc_get_vara_longlong (cdfid, varid, off, cou, &(*temp)[0 ]);
697
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
698
+ GDLDelete (e->GetParGlobal (2 ));
699
+ e->GetParGlobal (2 ) = temp;
700
+ }
701
+ else if (var_type == NC_UINT64)
702
+ {
703
+ DULong64GDL *temp = new DULong64GDL (dim,BaseGDL::NOZERO);
704
+ status = nc_get_vara_ulonglong (cdfid, varid, off, cou, &(*temp)[0 ]);
705
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
706
+ GDLDelete (e->GetParGlobal (2 ));
707
+ e->GetParGlobal (2 ) = temp;
708
+ }
631
709
else if (var_type == NC_BYTE || var_type == NC_UBYTE )
632
710
{
633
711
DByteGDL *temp=new DByteGDL (dim,BaseGDL::NOZERO);
@@ -644,6 +722,24 @@ else if(var_type == NC_LONG)
644
722
GDLDelete (e->GetParGlobal (2 ));
645
723
e->GetParGlobal (2 ) = temp;
646
724
}
725
+ else if (var_type == NC_STRING)
726
+ {
727
+ // Read NC_STRING
728
+ // Below should read an array of strings into char** stmp
729
+ char **stemp = new char *[array_size];
730
+ status = nc_get_vara_string (cdfid, varid, off, cou, stemp);
731
+ ncdf_handle_error (e, status, " NCDF_VARGET" );
732
+ // Need to copy strings in stemp to the returned structure...
733
+ GDLDelete (e->GetParGlobal (2 ));
734
+ SizeT num_elems=array_size;
735
+ dimension flat_dim (&num_elems, 1 );
736
+ BaseGDL *str_arr = new DStringGDL (flat_dim);
737
+ // assign array pointers
738
+ for (size_t i=0 ; i<array_size; i++) (*(static_cast <DStringGDL*> (str_arr)))[i] = stemp[i];
739
+ // re-shape array & add as tag
740
+ (static_cast <BaseGDL*>(str_arr))->SetDim (dim);
741
+ e->GetParGlobal (2 )=str_arr;
742
+ }
647
743
}
648
744
else
649
745
{
@@ -747,6 +843,22 @@ else if(var_type == NC_LONG)
747
843
GDLDelete (e->GetParGlobal (2 ));
748
844
e->GetParGlobal (2 ) = temp;
749
845
}
846
+ else if (var_type == NC_INT64)
847
+ {
848
+ DLong64GDL *temp = new DLong64GDL (dim, BaseGDL::NOZERO);
849
+ status = nc_get_vars_longlong (cdfid, varid, off,cou, stri, &(*temp)[0 ]);
850
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
851
+ GDLDelete (e->GetParGlobal (2 ));
852
+ e->GetParGlobal (2 ) = temp;
853
+ }
854
+ else if (var_type == NC_UINT64)
855
+ {
856
+ DULong64GDL *temp = new DULong64GDL (dim, BaseGDL::NOZERO);
857
+ status = nc_get_vars_ulonglong (cdfid, varid, off,cou, stri, &(*temp)[0 ]);
858
+ ncdf_var_handle_error (e, status, " NCDF_VARGET" , temp);
859
+ GDLDelete (e->GetParGlobal (2 ));
860
+ e->GetParGlobal (2 ) = temp;
861
+ }
750
862
else if (var_type == NC_BYTE || var_type == NC_UBYTE )
751
863
{
752
864
DByteGDL *temp=new DByteGDL (dim, BaseGDL::NOZERO);
@@ -763,6 +875,24 @@ else if(var_type == NC_LONG)
763
875
GDLDelete (e->GetParGlobal (2 ));
764
876
e->GetParGlobal (2 ) = temp;
765
877
}
878
+ else if (var_type == NC_STRING)
879
+ {
880
+ // Read NC_STRING
881
+ // Below should read an array of strings into char** stmp
882
+ char **stemp = new char *[array_size];
883
+ status = nc_get_vars_string (cdfid, varid, off, cou, stri, stemp);
884
+ ncdf_handle_error (e, status, " NCDF_VARGET" );
885
+ // Need to copy strings in stemp to the returned structure...
886
+ GDLDelete (e->GetParGlobal (2 ));
887
+ SizeT num_elems=array_size;
888
+ dimension flat_dim (&num_elems, 1 );
889
+ BaseGDL *str_arr = new DStringGDL (flat_dim);
890
+ // assign array pointers
891
+ for (size_t i=0 ; i<array_size; i++) (*(static_cast <DStringGDL*> (str_arr)))[i] = stemp[i];
892
+ // re-shape array & add as tag
893
+ (static_cast <BaseGDL*>(str_arr))->SetDim (dim);
894
+ e->GetParGlobal (2 )=str_arr;
895
+ }
766
896
}
767
897
}
768
898
}
@@ -1076,56 +1206,46 @@ else if(var_type == NC_LONG)
1076
1206
status = nc_put_vars_short (cdfid, varid, offset, count, stride,
1077
1207
&((*static_cast <DIntGDL*>(v))[0 ]));
1078
1208
break ;
1209
+ case GDL_UINT :
1210
+ status = nc_put_vars_ushort (cdfid, varid, offset, count, stride,
1211
+ &((*static_cast <DUIntGDL*>(v))[0 ]));
1212
+ break ;
1079
1213
case GDL_LONG :
1080
1214
status = nc_put_vars_int (cdfid, varid, offset, count, stride,
1081
1215
&((*static_cast <DLongGDL*>(v))[0 ]));
1082
1216
break ;
1083
- case GDL_BYTE :
1084
- status = nc_put_vars_uchar (cdfid, varid, offset, count, stride,
1085
- &((*static_cast <DByteGDL*>(v))[0 ]));
1217
+ case GDL_ULONG :
1218
+ status = nc_put_vars_uint (cdfid, varid, offset, count, stride,
1219
+ &((*static_cast <DULongGDL*>(v))[0 ]));
1220
+ break ;
1221
+ case GDL_LONG64 :
1222
+ status = nc_put_vars_longlong (cdfid, varid, offset, count, stride,
1223
+ &((*static_cast <DLong64GDL*>(v))[0 ]));
1086
1224
break ;
1087
- // initially using GDL methods for data type convertion
1225
+ case GDL_ULONG64 :
1226
+ status = nc_put_vars_ulonglong (cdfid, varid, offset, count, stride,
1227
+ &((*static_cast <DULong64GDL*>(v))[0 ]));
1228
+ break ;
1229
+ case GDL_BYTE :
1088
1230
case GDL_COMPLEXDBL :
1089
1231
case GDL_COMPLEX :
1090
- case GDL_UINT :
1091
- case GDL_ULONG :
1092
- case GDL_LONG64:
1093
- case GDL_ULONG64 :
1094
1232
{
1095
1233
BaseGDL* val;
1096
1234
Guard<BaseGDL> val_guard;
1097
1235
switch (var_type)
1098
1236
{
1099
- case NC_BYTE : // 8-bit signed integer
1100
- case NC_SHORT : // 16-bit signed integer
1101
- val = v->Convert2 (GDL_INT, BaseGDL::COPY);
1102
- val_guard.Init (val);
1103
- status = nc_put_vars_short (cdfid, varid, offset, count, stride,
1104
- &((*static_cast <DIntGDL*>(val))[0 ]));
1105
- break ;
1237
+ case NC_UBYTE : // 8-bit unsigned integer
1106
1238
case NC_CHAR : // 8-bit unsigned integer
1107
1239
val = v->Convert2 (GDL_BYTE, BaseGDL::COPY);
1108
1240
val_guard.Init (val);
1109
1241
status = nc_put_vars_uchar (cdfid, varid, offset, count, stride,
1110
1242
&((*static_cast <DByteGDL*>(val))[0 ]));
1111
1243
break ;
1112
- case NC_INT : // 32-bit signed integer
1113
- val = v->Convert2 (GDL_LONG, BaseGDL::COPY);
1114
- val_guard.Init (val);
1115
- status = nc_put_vars_int (cdfid, varid, offset, count, stride,
1116
- &((*static_cast <DLongGDL*>(val))[0 ]));
1117
- break ;
1118
- case NC_FLOAT : // 32-bit floating point
1119
- val = v->Convert2 (GDL_FLOAT, BaseGDL::COPY);
1120
- val_guard.Init (val);
1121
- status = nc_put_vars_float (cdfid, varid, offset, count, stride,
1122
- &((*static_cast <DFloatGDL*>(val))[0 ]));
1123
- break ;
1124
- case NC_DOUBLE : // 64-bit floating point
1125
- val = v->Convert2 (GDL_DOUBLE, BaseGDL::COPY);
1244
+ case NC_BYTE : // 8-bit signed integer - IDL does not have one, but try to behave like IDL and write to the data type anyway...
1245
+ val = v->Convert2 (GDL_BYTE, BaseGDL::COPY);
1126
1246
val_guard.Init (val);
1127
- status = nc_put_vars_double (cdfid, varid, offset, count, stride,
1128
- &((*static_cast <DDoubleGDL *>(val))[0 ]));
1247
+ status = nc_put_vars_schar (cdfid, varid, offset, count, stride,
1248
+ ( signed char *) &((*static_cast <DByteGDL *>(val))[0 ]));
1129
1249
break ;
1130
1250
}
1131
1251
break ;
@@ -1162,6 +1282,7 @@ else if(var_type == NC_LONG)
1162
1282
e->Throw (" GDL internal error, please report!"
1163
1283
+ e->GetParString (2 ));
1164
1284
}
1285
+ if ( status == NC_ERANGE ) status = NC_NOERR; // Ignore data-type range errors (like IDL does)
1165
1286
ncdf_handle_error (e, status, " NCDF_VARPUT" );
1166
1287
}
1167
1288
0 commit comments