int decode_dset_name(char *dset_name, char *type, int *nels, int *strlen) { syslog(LOG_DEBUG, "create_dataset"); int status = -1; // assume failure char *saveptr; /* for(j = 1, str1 = dset_name; ; j++ str1 = NULL){ token = strtok_r(str1, ":", &saveptr); if(token == NULL) break: */ char *varname = strtok_r(dset_name, ":", &saveptr); if(varname == NULL || dset_name[0] == ':'){ syslog(LOG_ERR, "ERR: varname invalid: <%s>", dset_name); goto cleanup; } char *type_spec = strtok_r(NULL, "\0", &saveptr); if(type_spec==0){ error(0, -1, "type spec is NULL"); goto cleanup; } *type = type_spec[0]; type_spec++; //int nels, strlen; switch(*type) { case 'd': case 'D' : sscanf(type_spec, "%d", nels); break; case 's': case 'S' : sscanf(type_spec, "%dx%d", nels, strlen); break; default: error(0, -1, "Dataset type unsupported: <%c>", type_spec[0]); goto cleanup; } if(*nels == 0) GOOF("Cannot request 0-length array"); *type = tolower(*type); if(*type == 's' && *strlen ==0) GOOF("Cannot request 0-width string"); //printf("type_spec: <%s>\n", type_spec); status = 0; //success cleanup: return status; }
int create_dataset(hid_t loc_id, char *dset_name) { int status = -1; //assume failure char type; int nels, strlen; status = decode_dset_name(dset_name, &type, &nels, &strlen); if(status !=0) GOOF("create_dataset had problems decoding dataset spec"); //puts("TODO only handles double just now"); hsize_t dims[1] = {nels}; //dims[0] = ds.size(); hid_t dspace = H5Screate_simple(1, dims, NULL); // TODO fix goofy creation for : create5 sharelock.h5 go7:S100/10 hid_t dtype; switch(type){ case 'd': dtype = H5Tcopy(H5T_NATIVE_DOUBLE); break; case 's': dtype = H5Tcopy(H5T_C_S1); H5Tset_size(dtype, strlen); break; default: error(0, -1, "TODO unhandled type"); } hid_t dset = H5Dcreate2(loc_id, dset_name, dtype, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); //hid_t dset = H5Dcreate2(loc_id, dset_name, H5T_NATIVE_DOUBLE, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); //H5Dwrite(dset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ds[0]); H5Dclose(dset); H5Sclose(dspace); printf("varname: <%s>, type <%c>, nels %d, strlen %d\n", dset_name, type, nels, strlen); status = 0; cleanup: return status; }
rboolean CPPLIB( ts_equiv )( // TEST IF TYPE SIG.S ARE EQUIVALENT RT_TYPE_SIG tgt, // - target type signature RT_TYPE_SIG src, // - source type signature rboolean zero_thrown ) // - TRUE ==> zero was thrown { rboolean retn; // - TRUE ==> conversion possible if( tgt == NULL ) { retn = TRUE; } else { tgt = CPPLIB( ts_refed )( tgt ); retn = FALSE; if( zero_thrown ) { switch( tgt->hdr.type ) { case THROBJ_PTR_SCALAR : case THROBJ_VOID_STAR : case THROBJ_PTR_CLASS : retn = TRUE; break; } } if( ! retn ) { src = CPPLIB( ts_refed )( src ); if( src == tgt ) { retn = TRUE; } else if( tgt->hdr.type != src->hdr.type ) { retn = FALSE; } else switch( tgt->hdr.type ) { case THROBJ_VOID_STAR : case THROBJ_ANYTHING : retn = TRUE; break; case THROBJ_PTR_SCALAR : if( tgt->base.indirect != src->base.indirect ) { retn = FALSE; break; } // drops thru case THROBJ_PTR_CLASS : retn = CPPLIB( ts_equiv )( CPPLIB( ts_pnted )( tgt ) , CPPLIB( ts_pnted )( src ) , zero_thrown ); break; case THROBJ_CLASS : case THROBJ_CLASS_VIRT : if( tgt->clss.size == src->clss.size ) { if( 0 == strcmp( tgt->clss.name, src->clss.name ) ) { retn = TRUE; } else { retn = FALSE; } } else { retn = FALSE; } break; case THROBJ_PTR_FUN : case THROBJ_SCALAR : if( tgt->scalar.size == src->scalar.size ) { if( 0 == strcmp( tgt->scalar.name, src->scalar.name ) ) { retn = TRUE; } else { retn = FALSE; } } else { retn = FALSE; } break; default : GOOF( "TsEquiv -- bad THROBJ_..." ); } } } return retn; }