51#include "config_hdf.h"
61#include <libdap/debug.h>
66#ifdef HAVE_SYS_PARAM_H
74#include <libdap/escaping.h>
79#include "HDFFloat64.h"
80#include "HDFFloat32.h"
85#include "HDFSequence.h"
86#include "HDFStructure.h"
90#include <libdap/debug.h>
97#define SIGNED_BYTE_TO_INT32 1
99BaseType *NewDAPVar(
const string &varname,
100 const string &dataset,
107 explicit fieldeq(
const string & s):_val(s) {
110 bool operator() (
const hdf_field & f)
const {
111 return (f.name == _val);
123 if (!vd || vd.fields.empty() || vd.name.empty())
130 for (
const auto &vdf:vd.fields) {
131 if (!vdf || vdf.vals.size() < 1 ||
141 if (vdf.vals[0].number_type() == DFNT_CHAR8
142 || vdf.vals[0].number_type() == DFNT_UCHAR8) {
145 string subname = vdf.name +
"__0";
146 BaseType *bt =
new HDFStr(subname, dataset);
152 for (
int j = 0; j < (
int) vdf.vals.size(); ++j) {
154 strm << vdf.name <<
"__" << j;
156 NewDAPVar(strm.str(), dataset,
157 vdf.vals[j].number_type());
173 for (
int i = 0; i < (
int) vd.fields.size(); ++i) {
174 if (!vd.fields[i] || vd.fields[i].vals.size() < 1 ||
175 vd.fields[i].name.empty()) {
184 if (vd.fields[i].vals[0].number_type() == DFNT_CHAR8
185 || vd.fields[i].vals[0].number_type() == DFNT_UCHAR8) {
188 string subname = vd.fields[i].name +
"__0";
189 BaseType *bt =
new HDFStr(subname, dataset);
195 for (
int j = 0; j < (
int) vd.fields[i].vals.size(); ++j) {
197 strm << vd.fields[i].name <<
"__" << j;
199 NewDAPVar(strm.str(), dataset,
200 vd.fields[i].vals[j].number_type());
221 sds_map &sdmap, vd_map &vdmap,
222 gr_map &grmap,
const string &dataset)
225 if (vg.name.size() == 0)
232 bool nonempty =
false;
235 BaseType *bt =
nullptr;
238 for (
int i = 0; i < (
int) vg.tags.size(); ++i) {
239 int32 tag = vg.tags[i];
240 int32 ref = vg.refs[i];
244 bt = NewSequenceFromVdata(vdmap[ref].vdata, dataset);
247 if (sdmap[ref].sds.has_scale()) {
248 bt = NewGridFromSDS(sdmap[ref].sds, dataset);
250 bt = NewArrayFromSDS(sdmap[ref].sds, dataset);
255 if (grmap.find(ref) != grmap.end()){
256 bt = NewArrayFromGR(grmap[ref].gri, dataset);
259 bt = NewStructureFromVgroup(vgmap[ref].vgroup, vgmap,
260 sdmap, vdmap, grmap, dataset);
290 if (sds.name.size() == 0)
292 if (sds.dims.size() == 0)
296 BaseType *bt = NewDAPVar(sds.name, dataset, sds.data.number_type());
302 ar =
new HDFArray(sds.name,dataset,bt);
306 for (
const auto &sds_dim:sds.dims)
307 ar->append_dim(sds_dim.count, sds_dim.name);
320 if (gr.name.size() == 0)
324 BaseType *bt = NewDAPVar(gr.name, dataset, gr.image.number_type());
331 ar =
new HDFArray(gr.name, dataset, bt);
338 ar->append_dim(gr.num_comp, gr.name +
"__comps");
339 ar->append_dim(gr.dims[1], gr.name +
"__Y");
340 ar->append_dim(gr.dims[0], gr.name +
"__X");
350HDFGrid *NewGridFromSDS(
const hdf_sds & sds,
const string &dataset)
352 BESDEBUG(
"h4",
"NewGridFromSDS" << endl);
353 if (!sds.has_scale())
358 HDFArray *ar = NewArrayFromSDS(sds, dataset);
364 BaseType *dsbt =
nullptr;
366 gr =
new HDFGrid(sds.name, dataset);
367 gr->add_var(ar, libdap::array);
373 for (
const auto & sds_dim:sds.dims) {
374 if (sds_dim.name.size() == 0) {
378 mapname = sds_dim.name;
379 if ((dsbt = NewDAPVar(mapname, dataset,
380 sds_dim.scale.number_type())) ==
nullptr) {
384 dmar =
new HDFArray(mapname, dataset, dsbt);
386 dmar->append_dim(sds_dim.count);
387 gr->add_var(dmar, maps);
403BaseType *NewDAPVar(
const string &varname,
404 const string &dataset,
415 return new HDFInt16(varname, dataset);
417#ifdef SIGNED_BYTE_TO_INT32
421 return new HDFInt32(varname, dataset);
431#ifndef SIGNED_BYTE_TO_INT32
437 return new HDFByte(varname, dataset);
445string DAPTypeName(int32 hdf_type)
449 return string(
"Float32");
452 return string(
"Float64");
455 return string(
"Int16");
457#ifdef SIGNED_BYTE_TO_INT32
461 return string(
"Int32");
464 return string(
"UInt16");
467 return string(
"UInt32");
470#ifndef SIGNED_BYTE_TO_INT32
474 return string(
"Byte");
479 return string(
"String");
489#ifdef SIGNED_BYTE_TO_INT32
490 if (sds.data.number_type() == DFNT_INT8) {
491 char *data =
static_cast < char *
>(ExportDataForDODS(sds.data));
496 ar->val2buf(
const_cast < char *
>(sds.data.data()));
498 switch (sds.data.number_type()) {
500 char *data =
static_cast < char *
>(ExportDataForDODS(sds.data));
506 ar->val2buf(
const_cast < char *
>(sds.data.data()));
510 ar->val2buf(
const_cast < char *
>(sds.data.data()));
518#ifdef SIGNED_BYTE_TO_INT32
519 if (gr.image.number_type() == DFNT_INT8) {
520 char *data =
static_cast < char *
>(ExportDataForDODS(gr.image));
525 ar->val2buf(
const_cast < char *
>(gr.image.data()));
527 switch (gr.image.number_type()) {
529 char *data =
static_cast < char *
>(ExportDataForDODS(gr.image));
535 ar->val2buf(
const_cast < char *
>(gr.image.data()));
539 ar->val2buf(
const_cast < char *
>(gr.image.data()));
551 auto primary_array =
static_cast < HDFArray &
>(*gr->array_var());
552 if (primary_array.send_p()) {
553 LoadArrayFromSDS(&primary_array, sds);
554 primary_array.set_read_p(
true);
557 if (primary_array.dimensions() != sds.dims.size())
560 Grid::Map_iter p = gr->map_begin();
561 for (
unsigned int i = 0;
562 i < sds.dims.size() && p != gr->map_end(); ++i, ++p) {
563 if ((*p)->send_p()) {
564#ifdef SIGNED_BYTE_TO_INT32
566 switch (sds.dims[i].scale.number_type()) {
568 char *data =
static_cast < char *
>(ExportDataForDODS(sds.dims[i].scale));
574 (*p)->val2buf(
const_cast < char *
>
575 (sds.dims[i].scale.data()));
578 if (sds.dims[i].scale.number_type() == DFNT_INT8) {
579 char *data =
static_cast < char *
>(ExportDataForDODS(sds.dims[i].scale));
584 (*p)->val2buf(
const_cast<char *
>(sds.dims[i].scale.data()));
587 (*p)->val2buf(
const_cast < char *
>(sds.dims[i].scale.data()));
589 (*p)->set_read_p(
true);
598 for (Constructor::Vars_iter p = seq->var_begin(); p != seq->var_end(); ++p) {
602 vector < hdf_field >::iterator vf =
603 find_if(vd.fields.begin(), vd.fields.end(),
604 fieldeq(stru.name()));
605 if (vf == vd.fields.end())
611 LoadStructureFromField(&stru, *vf, row);
612 stru.set_read_p(
true);
621 if (row < 0 || f.vals.size() <= 0 || row > (
int) f.vals[0].size())
624 BaseType *firstp = *stru->var_begin();
625 if (firstp->type() == dods_str_c) {
631 for (
unsigned int i = 0; i < f.vals.size(); ++i) {
632 str += f.vals[i].elt_char8(row);
635 for (
const auto & fval:f.vals)
636 str += fval.elt_char8(row);
638 firstp->val2buf(
static_cast < void *
>(&str));
639 firstp->set_read_p(
true);
644 for (Constructor::Vars_iter q = stru->var_begin(); q != stru->var_end(); ++q, ++i) {
645 char *val =
static_cast <char *
>(ExportDataForDODS(f.vals[i], row));
651 (*q)->set_read_p(
true);
664 for (Constructor::Vars_iter q = str->var_begin(); err == 0 && q != str->var_end(); ++q, ++i) {
666 BESDEBUG(
"h4",
"Reading within LoadStructureFromVgroup: " << p->name()
667 <<
", send_p: " << p->send_p() <<
", vg.names[" << i <<
"]: "
668 << vg.vnames[i] << endl);
669 if (p && p->send_p() && p->name() == vg.vnames[i]) {
670 (
dynamic_cast < ReadTagRef &
>(*p)).read_tagref(vg.tags[i],