diff options
Diffstat (limited to 'src/H5Tdbg.c')
-rw-r--r-- | src/H5Tdbg.c | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/src/H5Tdbg.c b/src/H5Tdbg.c new file mode 100644 index 0000000..88e084d --- /dev/null +++ b/src/H5Tdbg.c @@ -0,0 +1,407 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Module Info: This module contains most of the "core" functionality of + * the H5T interface, including the API initialization code, etc. + * Many routines that are infrequently used, or are specialized for + * one particular datatype class are in another module. + */ + +/*------------------------------------------------------------------------- + * + * Created: H5Tdbg.c + * Jul 19 2007 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: Dump debugging information about a datatype + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + +#define H5T_PACKAGE /*suppress error about including H5Tpkg */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Tpkg.h" /* Datatypes */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + + +/*------------------------------------------------------------------------- + * Function: H5T_print_stats + * + * Purpose: Print statistics about a conversion path. Statistics are + * printed only if all the following conditions are true: + * + * 1. The library was compiled with H5T_DEBUG defined. + * 2. Data type debugging is turned on at run time. + * 3. The path was called at least one time. + * + * The optional NPRINT argument keeps track of the number of + * conversions paths for which statistics have been shown. If + * its value is zero then table headers are printed before the + * first line of output. + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Robb Matzke + * Monday, December 14, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5T_print_stats(H5T_path_t UNUSED * path, int UNUSED * nprint/*in,out*/) +{ +#ifdef H5T_DEBUG + hsize_t nbytes; + char bandwidth[32]; +#endif + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5T_print_stats) + +#ifdef H5T_DEBUG + if(H5DEBUG(T) && path->stats.ncalls > 0) { + if(nprint && 0 == (*nprint)++) { + HDfprintf(H5DEBUG(T), "H5T: type conversion statistics:\n"); + HDfprintf(H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s %10s\n", + "Conversion", "Elmts", "Calls", "User", + "System", "Elapsed", "Bandwidth"); + HDfprintf(H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s %10s\n", + "----------", "-----", "-----", "----", + "------", "-------", "---------"); + } + if(path->src && path->dst) + nbytes = MAX(H5T_get_size(path->src), H5T_get_size(path->dst)); + else if(path->src) + nbytes = H5T_get_size(path->src); + else if(path->dst) + nbytes = H5T_get_size(path->dst); + else + nbytes = 0; + nbytes *= path->stats.nelmts; + H5_bandwidth(bandwidth, (double)nbytes, path->stats.timer.etime); + HDfprintf(H5DEBUG(T), " %-16s %10Hd %10d %8.2f %8.2f %8.2f %10s\n", + path->name, + path->stats.nelmts, + path->stats.ncalls, + path->stats.timer.utime, + path->stats.timer.stime, + path->stats.timer.etime, + bandwidth); + } +#endif + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5T_print_stats() */ + + +/*------------------------------------------------------------------------- + * Function: H5T_debug + * + * Purpose: Prints information about a data type. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5T_debug(const H5T_t *dt, FILE *stream) +{ + const char *s1 = "", *s2 = ""; + unsigned i; + + FUNC_ENTER_NOAPI_NOFUNC(H5T_debug) + + /* Check args */ + HDassert(dt); + HDassert(stream); + + switch(dt->shared->type) { + case H5T_INTEGER: + s1 = "int"; + break; + + case H5T_FLOAT: + s1 = "float"; + break; + + case H5T_TIME: + s1 = "time"; + break; + + case H5T_STRING: + s1 = "str"; + break; + + case H5T_BITFIELD: + s1 = "bits"; + break; + + case H5T_OPAQUE: + s1 = "opaque"; + break; + + case H5T_COMPOUND: + s1 = "struct"; + break; + + case H5T_ENUM: + s1 = "enum"; + break; + + case H5T_VLEN: + if(H5T_IS_VL_STRING(dt->shared)) + s1 = "str"; + else + s1 = "vlen"; + break; + + default: + s1 = ""; + break; + } /* end switch */ + + switch(dt->shared->state) { + case H5T_STATE_TRANSIENT: + s2 = "[transient]"; + break; + + case H5T_STATE_RDONLY: + s2 = "[constant]"; + break; + + case H5T_STATE_IMMUTABLE: + s2 = "[predefined]"; + break; + + case H5T_STATE_NAMED: + s2 = "[named,closed]"; + break; + + case H5T_STATE_OPEN: + s2 = "[named,open]"; + break; + } /* end switch */ + + fprintf(stream, "%s%s {nbytes=%lu", s1, s2, (unsigned long)(dt->shared->size)); + + if(H5T_IS_ATOMIC(dt->shared)) { + uint64_t tmp; + + switch(dt->shared->u.atomic.order) { + case H5T_ORDER_BE: + s1 = "BE"; + break; + + case H5T_ORDER_LE: + s1 = "LE"; + break; + + case H5T_ORDER_VAX: + s1 = "VAX"; + break; + + case H5T_ORDER_NONE: + s1 = "NONE"; + break; + + default: + s1 = "order?"; + break; + } /* end switch */ + + fprintf(stream, ", %s", s1); + + if(dt->shared->u.atomic.offset) + fprintf(stream, ", offset=%lu", + (unsigned long) (dt->shared->u.atomic.offset)); + if(dt->shared->u.atomic.prec != 8 * dt->shared->size) + fprintf(stream, ", prec=%lu", + (unsigned long) (dt->shared->u.atomic.prec)); + switch(dt->shared->type) { + case H5T_INTEGER: + switch(dt->shared->u.atomic.u.i.sign) { + case H5T_SGN_NONE: + s1 = "unsigned"; + break; + + case H5T_SGN_2: + s1 = NULL; + break; + + default: + s1 = "sign?"; + break; + + } /* end switch */ + if(s1) + fprintf(stream, ", %s", s1); + break; + + case H5T_FLOAT: + switch(dt->shared->u.atomic.u.f.norm) { + case H5T_NORM_IMPLIED: + s1 = "implied"; + break; + + case H5T_NORM_MSBSET: + s1 = "msbset"; + break; + + case H5T_NORM_NONE: + s1 = "no-norm"; + break; + + default: + s1 = "norm?"; + break; + } /* end switch */ + + fprintf(stream, ", sign=%lu+1", + (unsigned long)(dt->shared->u.atomic.u.f.sign)); + fprintf(stream, ", mant=%lu+%lu (%s)", + (unsigned long)(dt->shared->u.atomic.u.f.mpos), + (unsigned long)(dt->shared->u.atomic.u.f.msize), s1); + fprintf(stream, ", exp=%lu+%lu", + (unsigned long)(dt->shared->u.atomic.u.f.epos), + (unsigned long)(dt->shared->u.atomic.u.f.esize)); + tmp = dt->shared->u.atomic.u.f.ebias >> 32; + if(tmp) { + size_t hi = (size_t)tmp; + size_t lo = (size_t)(dt->shared->u.atomic.u.f.ebias & 0xffffffff); + fprintf(stream, " bias=0x%08lx%08lx", + (unsigned long)hi, (unsigned long)lo); + } else { + size_t lo = (size_t)(dt->shared->u.atomic.u.f.ebias & 0xffffffff); + fprintf(stream, " bias=0x%08lx", (unsigned long)lo); + } + break; + + default: + /* No additional info */ + break; + } /* end switch */ + } else if(H5T_COMPOUND == dt->shared->type) { + /* Compound data type */ + for(i = 0; i < dt->shared->u.compnd.nmembs; i++) { + fprintf(stream, "\n\"%s\" @%lu", + dt->shared->u.compnd.memb[i].name, + (unsigned long)(dt->shared->u.compnd.memb[i].offset)); + fprintf(stream, " "); + H5T_debug(dt->shared->u.compnd.memb[i].type, stream); + } /* end for */ + fprintf(stream, "\n"); + } else if(H5T_VLEN == dt->shared->type) { + switch(dt->shared->u.vlen.loc) { + case H5T_LOC_MEMORY: + fprintf(stream, ", loc=memory"); + break; + + case H5T_LOC_DISK: + fprintf(stream, ", loc=disk"); + break; + + default: + fprintf(stream, ", loc=UNKNOWN"); + break; + } /* end switch */ + + if(H5T_IS_VL_STRING(dt->shared)) + /* Variable length string datatype */ + fprintf(stream, ", variable-length"); + else { + /* Variable length sequence datatype */ + fprintf(stream, " VLEN "); + H5T_debug(dt->shared->parent, stream); + fprintf(stream, "\n"); + } /* end else */ + } else if(H5T_ENUM == dt->shared->type) { + size_t base_size; + + /* Enumeration data type */ + fprintf(stream, " "); + H5T_debug(dt->shared->parent, stream); + base_size = dt->shared->parent->shared->size; + for(i = 0; i < dt->shared->u.enumer.nmembs; i++) { + size_t k; + + fprintf(stream, "\n\"%s\" = 0x", dt->shared->u.enumer.name[i]); + for(k = 0; k < base_size; k++) + fprintf(stream, "%02lx", + (unsigned long)(dt->shared->u.enumer.value + (i * base_size) + k)); + } /* end for */ + fprintf(stream, "\n"); + } else if(H5T_OPAQUE == dt->shared->type) { + fprintf(stream, ", tag=\"%s\"", dt->shared->u.opaque.tag); + } else { + /* Unknown */ + fprintf(stream, "unknown class %d\n", (int)(dt->shared->type)); + } + fprintf(stream, "}"); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5T_debug() */ + |