51 #include "config_hdf.h"
68 #ifdef HAVE_SYS_PARAM_H
69 #include <sys/param.h>
79 #include "HDFUInt32.h"
80 #include "HDFUInt16.h"
81 #include "HDFFloat64.h"
82 #include "HDFFloat32.h"
87 #include "HDFSequence.h"
88 #include "HDFStructure.h"
97 #define SIGNED_BYTE_TO_INT32 1
99 BaseType *NewDAPVar(
const string &varname,
100 const string &dataset,
107 explicit fieldeq(
const string & s) {
111 bool operator() (
const hdf_field & f)
const {
112 return (f.name == _val);
124 if (!vd || vd.fields.size() == 0 || vd.name.empty())
131 for (
int i = 0; i < (int) vd.fields.size(); ++i) {
132 if (!vd.fields[i] || vd.fields[i].vals.size() < 1 ||
133 vd.fields[i].name.empty()) {
142 if (vd.fields[i].vals[0].number_type() == DFNT_CHAR8
143 || vd.fields[i].vals[0].number_type() == DFNT_UCHAR8) {
146 string subname = vd.fields[i].name +
"__0";
147 BaseType *bt =
new HDFStr(subname, dataset);
153 for (
int j = 0; j < (int) vd.fields[i].vals.size(); ++j) {
155 strm << vd.fields[i].name <<
"__" << j;
157 NewDAPVar(strm.str(), dataset,
158 vd.fields[i].vals[j].number_type());
178 sds_map &sdmap, vd_map &vdmap,
179 gr_map &grmap,
const string &dataset)
182 if (vg.name.length() == 0)
189 bool nonempty =
false;
195 for (
int i = 0; i < (int) vg.tags.size(); ++i) {
196 int32 tag = vg.tags[i];
197 int32 ref = vg.refs[i];
201 bt = NewSequenceFromVdata(vdmap[ref].vdata, dataset);
204 if (sdmap[ref].sds.has_scale()) {
205 bt = NewGridFromSDS(sdmap[ref].sds, dataset);
207 bt = NewArrayFromSDS(sdmap[ref].sds, dataset);
212 if (grmap.find(ref) != grmap.end()){
213 bt = NewArrayFromGR(grmap[ref].gri, dataset);
216 bt = NewStructureFromVgroup(vgmap[ref].vgroup, vgmap,
217 sdmap, vdmap, grmap, dataset);
247 if (sds.name.length() == 0)
249 if (sds.dims.size() == 0)
253 BaseType *bt = NewDAPVar(sds.name, dataset, sds.data.number_type());
259 ar =
new HDFArray(sds.name,dataset,bt);
263 for (
int i = 0; i < (int) sds.dims.size(); ++i)
264 ar->append_dim(sds.dims[i].count, sds.dims[i].name);
277 if (gr.name.length() == 0)
281 BaseType *bt = NewDAPVar(gr.name, dataset, gr.image.number_type());
288 ar =
new HDFArray(gr.name, dataset, bt);
295 ar->append_dim(gr.num_comp, gr.name +
"__comps");
296 ar->append_dim(gr.dims[1], gr.name +
"__Y");
297 ar->append_dim(gr.dims[0], gr.name +
"__X");
307 HDFGrid *NewGridFromSDS(
const hdf_sds & sds,
const string &dataset)
309 BESDEBUG(
"h4",
"NewGridFromSDS" << endl);
310 if (!sds.has_scale())
315 HDFArray *ar = NewArrayFromSDS(sds, dataset);
323 gr =
new HDFGrid(sds.name, dataset);
324 gr->add_var(ar, libdap::array);
330 for (
int i = 0; i < (int) sds.dims.size(); ++i) {
331 if (sds.dims[i].name.length() == 0) {
335 mapname = sds.dims[i].name;
336 if ((dsbt = NewDAPVar(mapname, dataset,
337 sds.dims[i].scale.number_type())) == 0) {
341 dmar =
new HDFArray(mapname, dataset, dsbt);
343 dmar->append_dim(sds.dims[i].count);
344 gr->add_var(dmar, maps);
360 BaseType *NewDAPVar(
const string &varname,
361 const string &dataset,
372 return new HDFInt16(varname, dataset);
374 #ifdef SIGNED_BYTE_TO_INT32
378 return new HDFInt32(varname, dataset);
388 #ifndef SIGNED_BYTE_TO_INT32
394 return new HDFByte(varname, dataset);
402 string DAPTypeName(int32 hdf_type)
406 return string(
"Float32");
409 return string(
"Float64");
412 return string(
"Int16");
414 #ifdef SIGNED_BYTE_TO_INT32
418 return string(
"Int32");
421 return string(
"UInt16");
424 return string(
"UInt32");
427 #ifndef SIGNED_BYTE_TO_INT32
431 return string(
"Byte");
436 return string(
"String");
446 #ifdef SIGNED_BYTE_TO_INT32
447 switch (sds.data.number_type()) {
449 char *data =
static_cast < char *
>(ExportDataForDODS(sds.data));
455 ar->val2buf(
const_cast < char *
>(sds.data.data()));
458 ar->val2buf(
const_cast < char *
>(sds.data.data()));
466 #ifdef SIGNED_BYTE_TO_INT32
467 switch (gr.image.number_type()) {
469 char *data =
static_cast < char *
>(ExportDataForDODS(gr.image));
476 ar->val2buf(
const_cast < char *
>(gr.image.data()));
479 ar->val2buf(
const_cast < char *
>(gr.image.data()));
492 if (primary_array.send_p()) {
493 LoadArrayFromSDS(&primary_array, sds);
494 primary_array.set_read_p(
true);
497 if (primary_array.dimensions() != sds.dims.size())
500 Grid::Map_iter p = gr->map_begin();
501 for (
unsigned int i = 0;
502 i < sds.dims.size() && p != gr->map_end(); ++i, ++p) {
503 if ((*p)->send_p()) {
504 #ifdef SIGNED_BYTE_TO_INT32
505 switch (sds.dims[i].scale.number_type()) {
507 char *data =
static_cast < char *
>(ExportDataForDODS(sds.dims[i].scale));
513 (*p)->val2buf(
const_cast < char *
>
514 (sds.dims[i].scale.data()));
517 (*p)->val2buf(
const_cast < char *
>(sds.dims[i].scale.data()));
519 (*p)->set_read_p(
true);
528 Constructor::Vars_iter p;
529 for (p = seq->var_begin(); p != seq->var_end(); ++p) {
533 vector < hdf_field >::iterator vf =
534 find_if(vd.fields.begin(), vd.fields.end(),
535 fieldeq(stru.name()));
536 if (vf == vd.fields.end())
542 LoadStructureFromField(&stru, *vf, row);
543 stru.set_read_p(
true);
552 if (row < 0 || f.vals.size() <= 0 || row > (
int) f.vals[0].size())
555 BaseType *firstp = *stru->var_begin();
556 if (firstp->type() == dods_str_c) {
561 for (
unsigned int i = 0; i < f.vals.size(); ++i) {
563 str += f.vals[i].elt_char8(row);
566 firstp->val2buf(
static_cast < void *
>(&str));
567 firstp->set_read_p(
true);
572 Constructor::Vars_iter q;
573 for (q = stru->var_begin(); q != stru->var_end(); ++q, ++i) {
574 char *val =
static_cast <char *
>(ExportDataForDODS(f.vals[i], row));
580 (*q)->set_read_p(
true);
589 const string & hdf_file)
593 Constructor::Vars_iter q;
594 for (q = str->var_begin(); err == 0 && q != str->var_end(); ++q, ++i) {
596 BESDEBUG(
"h4",
"Reading within LoadStructureFromVgroup: " << p->name()
597 <<
", send_p: " << p->send_p() <<
", vg.names[" << i <<
"]: "
598 << vg.vnames[i] << endl);
599 if (p && p->send_p() && p->name() == vg.vnames[i]) {
600 (
dynamic_cast < ReadTagRef &
>(*p)).read_tagref(vg.tags[i],