diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-08-21 23:27:11 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-08-21 23:27:11 (GMT) |
commit | 5fe34046c00065fdc10eb1b6b04309aaaf110331 (patch) | |
tree | 94a62100b7a8499c511430f0e8bda33434f8bee2 | |
parent | 6bbe1283673ab7b151d751cb2df409f5babb47b4 (diff) | |
download | hdf5-5fe34046c00065fdc10eb1b6b04309aaaf110331.zip hdf5-5fe34046c00065fdc10eb1b6b04309aaaf110331.tar.gz hdf5-5fe34046c00065fdc10eb1b6b04309aaaf110331.tar.bz2 |
[svn-r12605] Description:
Break out a bunch of the misc. routines that were in src/H5.c into more
specific modules.
Add optimized fletcher32 checksum routine, for checksumming metadata as
well as raw data.
Tested On:
Linux/32 2.6 (chicago)
Linux/64 2.6 (chicago2)
Will test further after checkin...
-rw-r--r-- | MANIFEST | 5 | ||||
-rw-r--r-- | src/H5.c | 2523 | ||||
-rw-r--r-- | src/H5checksum.c | 145 | ||||
-rw-r--r-- | src/H5private.h | 3 | ||||
-rw-r--r-- | src/H5system.c | 578 | ||||
-rw-r--r-- | src/H5timer.c | 248 | ||||
-rw-r--r-- | src/H5trace.c | 1868 | ||||
-rwxr-xr-x | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/Makefile.in | 8 | ||||
-rw-r--r-- | test/Makefile.am | 7 | ||||
-rw-r--r-- | test/Makefile.in | 5 | ||||
-rw-r--r-- | test/tchecksum.c | 194 | ||||
-rw-r--r-- | test/testhdf5.c | 3 | ||||
-rw-r--r-- | test/testhdf5.h | 3 | ||||
-rw-r--r-- | test/tmeta.c | 4 |
15 files changed, 3103 insertions, 2494 deletions
@@ -385,6 +385,7 @@ ./src/hdf5-win.lnt _DO_NOT_DISTRIBUTE_ ./src/hdf5-lin.lnt _DO_NOT_DISTRIBUTE_ ./src/H5.c +./src/H5checksum.c ./src/H5dbg.c ./src/H5api_adpt.h ./src/H5err.txt @@ -392,6 +393,9 @@ ./src/H5detect.c ./src/H5private.h ./src/H5public.h +./src/H5system.c +./src/H5timer.c +./src/H5trace.c ./src/H5A.c ./src/H5Apkg.h ./src/H5Aprivate.h @@ -726,6 +730,7 @@ ./test/tarrold.h5 ./test/tattr.c ./test/tbogus.h5 +./test/tchecksum.c ./test/tconfig.c ./test/testframe.c ./test/testhdf5.c @@ -12,33 +12,52 @@ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#define H5I_PACKAGE /*suppress error about including H5Ipkg */ +/****************/ +/* Module Setup */ +/****************/ +/***********/ +/* Headers */ +/***********/ #include "H5private.h" /* Generic Functions */ -#include "H5Bprivate.h" /* B-link trees */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FLprivate.h" /* Free lists */ -#include "H5Ipkg.h" /* IDs */ #include "H5Lprivate.h" /* Links */ -#include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ -#include "H5Rpublic.h" /* References */ -#include "H5Sprivate.h" /* Dataspaces */ #include "H5Tprivate.h" /* Datatypes */ -#include "H5Zprivate.h" /* I/O pipeline filters */ -#ifdef H5_HAVE_PARALLEL -/* datatypes of predefined drivers needed by H5_trace() */ -#include "H5FDmpio.h" -#endif /* H5_HAVE_PARALLEL */ -/* we need this for the struct rusage declaration */ -#if defined(H5_HAVE_GETRUSAGE) && defined(H5_HAVE_SYS_RESOURCE_H) -# include <sys/resource.h> -#endif +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ +static void H5_debug_mask(const char*); + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ /* statically initialize block for pthread_once call used in initializing */ /* the first global mutex */ @@ -55,7 +74,12 @@ hbool_t H5_MPEinit_g = FALSE; /* MPE Library hasn't been initialized */ char H5_lib_vers_info_g[] = H5_VERS_INFO; static hbool_t H5_dont_atexit_g = FALSE; H5_debug_t H5_debug_g; /*debugging info */ -static void H5_debug_mask(const char*); + + +/*******************/ +/* Local Variables */ +/*******************/ + /*-------------------------------------------------------------------------- * NAME @@ -736,2468 +760,3 @@ H5close(void) FUNC_LEAVE_API_NOFS(SUCCEED) } /* end H5close() */ - -/*------------------------------------------------------------------------- - * Function: HDfprintf - * - * Purpose: Prints the optional arguments under the control of the format - * string FMT to the stream STREAM. This function takes the - * same format as fprintf(3c) with a few added features: - * - * The conversion modifier `H' refers to the size of an - * `hsize_t' or `hssize_t' type. For instance, "0x%018Hx" - * prints an `hsize_t' value as a hex number right justified and - * zero filled in an 18-character field. - * - * The conversion `a' refers to an `haddr_t' type. - * - * Return: Success: Number of characters printed - * - * Failure: -1 - * - * Programmer: Robb Matzke - * Thursday, April 9, 1998 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The `%a' format refers to an argument of `haddr_t' type - * instead of `haddr_t*' and the return value is correct. - *------------------------------------------------------------------------- - */ -int -HDfprintf(FILE *stream, const char *fmt, ...) -{ - int n=0, nout = 0; - int fwidth, prec; - int zerofill; - int leftjust; - int plussign; - int ldspace; - int prefix; - char modifier[8]; - int conv; - char *rest, format_templ[128]; - const char *s; - va_list ap; - - assert (stream); - assert (fmt); - - va_start (ap, fmt); - while (*fmt) { - fwidth = prec = 0; - zerofill = 0; - leftjust = 0; - plussign = 0; - prefix = 0; - ldspace = 0; - modifier[0] = '\0'; - - if ('%'==fmt[0] && '%'==fmt[1]) { - HDputc ('%', stream); - fmt += 2; - nout++; - } else if ('%'==fmt[0]) { - s = fmt + 1; - - /* Flags */ - while (HDstrchr ("-+ #", *s)) { - switch (*s) { - case '-': - leftjust = 1; - break; - case '+': - plussign = 1; - break; - case ' ': - ldspace = 1; - break; - case '#': - prefix = 1; - break; - } /*lint !e744 Switch statement doesn't _need_ default */ - s++; - } - - /* Field width */ - if (HDisdigit (*s)) { - zerofill = ('0'==*s); - fwidth = (int)HDstrtol (s, &rest, 10); - s = rest; - } else if ('*'==*s) { - fwidth = va_arg (ap, int); - if (fwidth<0) { - leftjust = 1; - fwidth = -fwidth; - } - s++; - } - - /* Precision */ - if ('.'==*s) { - s++; - if (HDisdigit (*s)) { - prec = (int)HDstrtol (s, &rest, 10); - s = rest; - } else if ('*'==*s) { - prec = va_arg (ap, int); - s++; - } - if (prec<1) prec = 1; - } - - /* Extra type modifiers */ - if (HDstrchr ("ZHhlqLI", *s)) { - switch (*s) { - /*lint --e{506} Don't issue warnings about constant value booleans */ - /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */ - case 'H': - if (sizeof(hsize_t)<sizeof(long)) { - modifier[0] = '\0'; - } else if (sizeof(hsize_t)==sizeof(long)) { - HDstrcpy (modifier, "l"); - } else { - HDstrcpy (modifier, H5_PRINTF_LL_WIDTH); - } - break; - case 'Z': - if (sizeof(size_t)<sizeof(long)) { - modifier[0] = '\0'; - } else if (sizeof(size_t)==sizeof(long)) { - HDstrcpy (modifier, "l"); - } else { - HDstrcpy (modifier, H5_PRINTF_LL_WIDTH); - } - break; - default: - /* Handle 'I64' modifier for Microsoft's "__int64" type */ - if(*s=='I' && *(s+1)=='6' && *(s+2)=='4') { - modifier[0] = *s; - modifier[1] = *(s+1); - modifier[2] = *(s+2); - modifier[3] = '\0'; - s+=2; /* Increment over 'I6', the '4' is taken care of below */ - } /* end if */ - else { - /* Handle 'll' for long long types */ - if(*s=='l' && *(s+1)=='l') { - modifier[0] = *s; - modifier[1] = *s; - modifier[2] = '\0'; - s++; /* Increment over first 'l', second is taken care of below */ - } /* end if */ - else { - modifier[0] = *s; - modifier[1] = '\0'; - } /* end else */ - } /* end else */ - break; - } - s++; - } - - /* Conversion */ - conv = *s++; - - /* Create the format template */ - sprintf (format_templ, "%%%s%s%s%s%s", - leftjust?"-":"", plussign?"+":"", - ldspace?" ":"", prefix?"#":"", zerofill?"0":""); - if (fwidth>0) - sprintf (format_templ+HDstrlen(format_templ), "%d", fwidth); - if (prec>0) - sprintf (format_templ+HDstrlen(format_templ), ".%d", prec); - if (*modifier) - sprintf (format_templ+HDstrlen(format_templ), "%s", modifier); - sprintf (format_templ+HDstrlen(format_templ), "%c", conv); - - - /* Conversion */ - switch (conv) { - case 'd': - case 'i': - if (!HDstrcmp(modifier, "h")) { - short x = (short)va_arg (ap, int); - n = fprintf (stream, format_templ, x); - } else if (!*modifier) { - int x = va_arg (ap, int); - n = fprintf (stream, format_templ, x); - } else if (!HDstrcmp (modifier, "l")) { - long x = va_arg (ap, long); - n = fprintf (stream, format_templ, x); - } else { - int64_t x = va_arg(ap, int64_t); - n = fprintf (stream, format_templ, x); - } - break; - - case 'o': - case 'u': - case 'x': - case 'X': - if (!HDstrcmp (modifier, "h")) { - unsigned short x = (unsigned short)va_arg (ap, unsigned int); - n = fprintf (stream, format_templ, x); - } else if (!*modifier) { - unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */ - n = fprintf (stream, format_templ, x); - } else if (!HDstrcmp (modifier, "l")) { - unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */ - n = fprintf (stream, format_templ, x); - } else { - uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */ - n = fprintf (stream, format_templ, x); - } - break; - - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - if (!HDstrcmp (modifier, "h")) { - float x = (float) va_arg (ap, double); - n = fprintf (stream, format_templ, x); - } else if (!*modifier || !HDstrcmp (modifier, "l")) { - double x = va_arg (ap, double); - n = fprintf (stream, format_templ, x); - } else { - /* - * Some compilers complain when `long double' and - * `double' are the same thing. - */ -#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE - long double x = va_arg (ap, long double); - n = fprintf (stream, format_templ, x); -#else - double x = va_arg (ap, double); - n = fprintf (stream, format_templ, x); -#endif - } - break; - - case 'a': - { - haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */ - if (H5F_addr_defined(x)) { - sprintf(format_templ, "%%%s%s%s%s%s", - leftjust?"-":"", plussign?"+":"", - ldspace?" ":"", prefix?"#":"", - zerofill?"0":""); - if (fwidth>0) - sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth); - - /*lint --e{506} Don't issue warnings about constant value booleans */ - /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */ - if (sizeof(x)==H5_SIZEOF_INT) { - HDstrcat(format_templ, "u"); - } else if (sizeof(x)==H5_SIZEOF_LONG) { - HDstrcat(format_templ, "lu"); - } else if (sizeof(x)==H5_SIZEOF_LONG_LONG) { - HDstrcat(format_templ, H5_PRINTF_LL_WIDTH); - HDstrcat(format_templ, "u"); - } - n = fprintf(stream, format_templ, x); - } else { - HDstrcpy(format_templ, "%"); - if (leftjust) - HDstrcat(format_templ, "-"); - if (fwidth) - sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth); - HDstrcat(format_templ, "s"); - fprintf(stream, format_templ, "UNDEF"); - } - } - break; - - case 'c': - { - char x = (char)va_arg (ap, int); - n = fprintf (stream, format_templ, x); - } - break; - - case 's': - case 'p': - { - char *x = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */ - n = fprintf (stream, format_templ, x); - } - break; - - case 'n': - format_templ[HDstrlen(format_templ)-1] = 'u'; - n = fprintf (stream, format_templ, nout); - break; - - case 't': - { - htri_t tri_var = va_arg (ap, htri_t); - if (tri_var > 0) fprintf (stream, "TRUE"); - else if (!tri_var) fprintf (stream, "FALSE"); - else fprintf (stream, "FAIL(%d)", (int)tri_var); - } - break; - - default: - HDfputs (format_templ, stream); - n = (int)HDstrlen (format_templ); - break; - } - nout += n; - fmt = s; - } else { - HDputc (*fmt, stream); - fmt++; - nout++; - } - } - va_end (ap); - return nout; -} /* end HDfprintf() */ - - -/*------------------------------------------------------------------------- - * Function: HDstrtoll - * - * Purpose: Converts the string S to an int64_t value according to the - * given BASE, which must be between 2 and 36 inclusive, or be - * the special value zero. - * - * The string must begin with an arbitrary amount of white space - * (as determined by isspace(3c)) followed by a single optional - * `+' or `-' sign. If BASE is zero or 16 the string may then - * include a `0x' or `0X' prefix, and the number will be read in - * base 16; otherwise a zero BASE is taken as 10 (decimal) - * unless the next character is a `0', in which case it is taken - * as 8 (octal). - * - * The remainder of the string is converted to an int64_t in the - * obvious manner, stopping at the first character which is not - * a valid digit in the given base. (In bases above 10, the - * letter `A' in either upper or lower case represetns 10, `B' - * represents 11, and so forth, with `Z' representing 35.) - * - * If REST is not null, the address of the first invalid - * character in S is stored in *REST. If there were no digits - * at all, the original value of S is stored in *REST. Thus, if - * *S is not `\0' but **REST is `\0' on return the entire string - * was valid. - * - * Return: Success: The result. - * - * Failure: If the input string does not contain any - * digits then zero is returned and REST points - * to the original value of S. If an overflow - * or underflow occurs then the maximum or - * minimum possible value is returned and the - * global `errno' is set to ERANGE. If BASE is - * incorrect then zero is returned. - * - * Programmer: Robb Matzke - * Thursday, April 9, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int64_t -HDstrtoll(const char *s, const char **rest, int base) -{ - int64_t sign=1, acc=0; - hbool_t overflow = FALSE; - - errno = 0; - if (!s || (base && (base<2 || base>36))) { - if (rest) *rest = s; - return 0; - } - - /* Skip white space */ - while (HDisspace (*s)) s++; - - /* Optional minus or plus sign */ - if ('+'==*s) { - s++; - } else if ('-'==*s) { - sign = -1; - s++; - } - - /* Zero base prefix */ - if (0==base && '0'==*s && ('x'==s[1] || 'X'==s[1])) { - base = 16; - s += 2; - } else if (0==base && '0'==*s) { - base = 8; - s++; - } else if (0==base) { - base = 10; - } - - /* Digits */ - while ((base<=10 && *s>='0' && *s<'0'+base) || - (base>10 && ((*s>='0' && *s<='9') || - (*s>='a' && *s<'a'+base-10) || - (*s>='A' && *s<'A'+base-10)))) { - if (!overflow) { - int64_t digit = 0; - if (*s>='0' && *s<='9') digit = *s - '0'; - else if (*s>='a' && *s<='z') digit = (*s-'a')+10; - else digit = (*s-'A')+10; - - if (acc*base+digit < acc) { - overflow = TRUE; - } else { - acc = acc*base + digit; - } - } - s++; - } - - /* Overflow */ - if (overflow) { - if (sign>0) { - acc = ((uint64_t)1<<(8*sizeof(int64_t)-1))-1; - } else { - acc = (uint64_t)1<<(8*sizeof(int64_t)-1); - } - errno = ERANGE; - } - - /* Return values */ - acc *= sign; - if (rest) *rest = s; - return acc; -} /* end HDstrtoll() */ - - -/*------------------------------------------------------------------------- - * Function: H5_timer_reset - * - * Purpose: Resets the timer struct to zero. Use this to reset a timer - * that's being used as an accumulator for summing times. - * - * Return: void - * - * Programmer: Robb Matzke - * Thursday, April 16, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -void -H5_timer_reset (H5_timer_t *timer) -{ - assert (timer); - HDmemset (timer, 0, sizeof *timer); -} /* end H5_timer_reset() */ - - -/*------------------------------------------------------------------------- - * Function: H5_timer_begin - * - * Purpose: Initialize a timer to time something. - * - * Return: void - * - * Programmer: Robb Matzke - * Thursday, April 16, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -void -H5_timer_begin (H5_timer_t *timer) -{ -#ifdef H5_HAVE_GETRUSAGE - struct rusage rusage; -#endif -#ifdef H5_HAVE_GETTIMEOFDAY - struct timeval etime; -#endif - - assert (timer); - -#ifdef H5_HAVE_GETRUSAGE - HDgetrusage (RUSAGE_SELF, &rusage); - timer->utime = (double)rusage.ru_utime.tv_sec + - ((double)rusage.ru_utime.tv_usec/1e6); - timer->stime = (double)rusage.ru_stime.tv_sec + - ((double)rusage.ru_stime.tv_usec/1e6); -#else - timer->utime = 0.0; - timer->stime = 0.0; -#endif -#ifdef H5_HAVE_GETTIMEOFDAY - HDgettimeofday (&etime, NULL); - timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec/1e6); -#else - timer->etime = 0.0; -#endif -} /* end H5_timer_begin() */ - - -/*------------------------------------------------------------------------- - * Function: H5_timer_end - * - * Purpose: This function should be called at the end of a timed region. - * The SUM is an optional pointer which will accumulate times. - * TMS is the same struct that was passed to H5_timer_start(). - * On return, TMS will contain total times for the timed region. - * - * Return: void - * - * Programmer: Robb Matzke - * Thursday, April 16, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -void -H5_timer_end (H5_timer_t *sum/*in,out*/, H5_timer_t *timer/*in,out*/) -{ - H5_timer_t now; - - assert (timer); - H5_timer_begin (&now); - - timer->utime = MAX(0.0, now.utime - timer->utime); - timer->stime = MAX(0.0, now.stime - timer->stime); - timer->etime = MAX(0.0, now.etime - timer->etime); - - if (sum) { - sum->utime += timer->utime; - sum->stime += timer->stime; - sum->etime += timer->etime; - } -} /* end H5_timer_end() */ - - -/*------------------------------------------------------------------------- - * Function: H5_bandwidth - * - * Purpose: Prints the bandwidth (bytes per second) in a field 10 - * characters wide widh four digits of precision like this: - * - * NaN If <=0 seconds - * 1234. TB/s - * 123.4 TB/s - * 12.34 GB/s - * 1.234 MB/s - * 4.000 kB/s - * 1.000 B/s - * 0.000 B/s If NBYTES==0 - * 1.2345e-10 For bandwidth less than 1 - * 6.7893e+94 For exceptionally large values - * 6.678e+106 For really big values - * - * Return: void - * - * Programmer: Robb Matzke - * Wednesday, August 5, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -void -H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds) -{ - double bw; - - if (nseconds<=0.0) { - HDstrcpy(buf, " NaN"); - } else { - bw = nbytes/nseconds; - if (fabs(bw) < 0.0000000001) { - /* That is == 0.0, but direct comparison between floats is bad */ - HDstrcpy(buf, "0.000 B/s"); - } else if (bw<1.0) { - sprintf(buf, "%10.4e", bw); - } else if (bw<1024.0) { - sprintf(buf, "%05.4f", bw); - HDstrcpy(buf+5, " B/s"); - } else if (bw<1024.0*1024.0) { - sprintf(buf, "%05.4f", bw/1024.0); - HDstrcpy(buf+5, " kB/s"); - } else if (bw<1024.0*1024.0*1024.0) { - sprintf(buf, "%05.4f", bw/(1024.0*1024.0)); - HDstrcpy(buf+5, " MB/s"); - } else if (bw<1024.0*1024.0*1024.0*1024.0) { - sprintf(buf, "%05.4f", - bw/(1024.0*1024.0*1024.0)); - HDstrcpy(buf+5, " GB/s"); - } else if (bw<1024.0*1024.0*1024.0*1024.0*1024.0) { - sprintf(buf, "%05.4f", - bw/(1024.0*1024.0*1024.0*1024.0)); - HDstrcpy(buf+5, " TB/s"); - } else { - sprintf(buf, "%10.4e", bw); - if (HDstrlen(buf)>10) { - sprintf(buf, "%10.3e", bw); - } - } - } -} /* end H5_bandwidth() */ - - -/*------------------------------------------------------------------------- - * Function: H5_trace - * - * Purpose: This function is called whenever an API function is called - * and tracing is turned on. If RETURNING is non-zero then - * the caller is about to return and RETURNING points to the - * time for the corresponding function call event. Otherwise - * we print the function name and the arguments. - * - * The TYPE argument is a string which gives the type of each of - * the following argument pairs. Each type is zero or more - * asterisks (one for each level of indirection, although some - * types have one level of indirection already implied) followed - * by either one letter (lower case) or two letters (first one - * uppercase). - * - * The variable argument list consists of pairs of values. Each - * pair is a string which is the formal argument name in the - * calling function, followed by the argument value. The type - * of the argument value is given by the TYPE string. - * - * Note: The TYPE string is meant to be terse and is generated by a - * separate perl script. - * - * WARNING: DO NOT CALL ANY HDF5 FUNCTION THAT CALLS FUNC_ENTER(). DOING - * SO MAY CAUSE H5_trace() TO BE INVOKED RECURSIVELY OR MAY - * CAUSE LIBRARY INITIALIZATIONS THAT ARE NOT DESIRED. - * - * Return: void - * - * Programmer: Robb Matzke - * Tuesday, June 16, 1998 - * - * Modifications: - * Robb Matzke, 1999-08-02 - * Added the `a' type letter for haddr_t arguments and `Mt' for - * H5FD_mem_t arguments. - * - * Robb Matzke, 1999-10-25 - * The `Ej' and `En' types are H5E_major_t and H5E_minor_t error - * types. We only print the integer value here. - * - * Robb Matzke, 2002-08-08 - * Better output for nested calls. Show only top-level calls - * if so desired. Show event times if so desired. - *------------------------------------------------------------------------- - */ -double -H5_trace (const double *returning, const char *func, const char *type, ...) -{ - va_list ap; - char buf[64], *rest; - const char *argname; - int argno=0, ptr, asize_idx; - hssize_t asize[16]; - hssize_t i; - void *vp = NULL; - FILE *out = H5_debug_g.trace; - H5_timer_t event_time; - static H5_timer_t first_time = {0.0, 0.0, 0.0}; - static int current_depth=0; - static int last_call_depth=0; - - /* FUNC_ENTER() should not be called */ - - if (!out) return 0.0; /*tracing is off*/ - va_start (ap, type); - - if (H5_debug_g.ttop) { - if (returning) { - if (current_depth>1) { - --current_depth; - return 0.0; - } - } else { - if (current_depth>0) { - /*do not update last_call_depth*/ - current_depth++; - return 0.0; - } - } - } - - /* Get tim for event */ - if (fabs(first_time.etime) < 0.0000000001) - /* That is == 0.0, but direct comparison between floats is bad */ - H5_timer_begin(&first_time); - if (H5_debug_g.ttimes) { - H5_timer_begin(&event_time); - } else { - HDmemset(&event_time, 0, sizeof event_time); - } - - /* Print the first part of the line. This is the indication of the - * nesting depth followed by the function name and either start of - * argument list or start of return value. If this call is for a - * function return and no other calls have been made to H5_trace() - * since the one for the function call, then we're continuing - * the same line. */ - if (returning) { - assert(current_depth>0); - --current_depth; - if (current_depth<last_call_depth) { - /* We are at the beginning of a line */ - if (H5_debug_g.ttimes) { - char tmp[128]; - sprintf(tmp, "%.6f", event_time.etime-first_time.etime); - fprintf(out, " %*s ", (int)strlen(tmp), ""); - } - for (i=0; i<current_depth; i++) - fputc('+', out); - fprintf(out, "%*s%s = ", 2*current_depth, "", func); - } else { - /* Continue current line with return value */ - fprintf(out, " = "); - } - } else { - if (current_depth>last_call_depth) - fputs(" = <delayed>\n", out); - if (H5_debug_g.ttimes) - fprintf(out, "@%.6f ", event_time.etime-first_time.etime); - for (i=0; i<current_depth; i++) - fputc('+', out); - fprintf(out, "%*s%s(", 2*current_depth, "", func); - } - - /* Clear array sizes */ - for (i=0; i<(hssize_t)NELMTS(asize); i++) asize[i] = -1; - - /* Parse the argument types */ - for (argno=0; *type; argno++, type+=HDisupper(*type)?2:1) { - /* Count levels of indirection */ - for (ptr=0; '*'==*type; type++) ptr++; - if ('['==*type) { - if ('a'==type[1]) { - asize_idx = (int)HDstrtol(type+2, &rest, 10); - assert(']'==*rest); - type = rest+1; - } else { - rest = (char *)HDstrchr(type, ']'); - assert(rest); - type = rest+1; - asize_idx = -1; - } - } else { - asize_idx = -1; - } - - /* - * The argument name. Leave off the `_id' part. If the argument - * name is the null pointer then don't print the argument or the - * following `='. This is used for return values. - */ - argname = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */ - if (argname) { - unsigned n = (unsigned)MAX (0, (int)HDstrlen(argname)-3); /*lint !e666 Allow expression with side effects */ - if (!HDstrcmp (argname+n, "_id")) { - HDstrncpy (buf, argname, (size_t)MIN ((int)sizeof(buf)-1, n)); - buf[MIN((int)sizeof(buf)-1, n)] = '\0'; - argname = buf; - } - fprintf (out, "%s%s=", argno?", ":"", argname); - } else { - argname = ""; - } - - /* The value */ - if (ptr) vp = va_arg (ap, void*); /*lint !e64 Type mismatch not really occuring */ - switch (type[0]) { - case 'a': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - haddr_t addr = va_arg(ap, haddr_t); /*lint !e732 Loss of sign not really occuring */ - HDfprintf(out, "%a", addr); - } - break; - - case 'b': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - hbool_t bool_var = va_arg (ap, hbool_t); /*lint !e732 Loss of sign not really occuring */ - if (TRUE==bool_var) fprintf (out, "TRUE"); - else if (!bool_var) fprintf (out, "FALSE"); - else fprintf (out, "TRUE(%u)", (unsigned)bool_var); - } - break; - - case 'd': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - double dbl = va_arg (ap, double); - fprintf (out, "%g", dbl); - } - break; - - case 'D': - switch (type[1]) { - case 'a': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5D_alloc_time_t alloc_time = va_arg (ap, H5D_alloc_time_t); /*lint !e64 Type mismatch not really occuring */ - switch (alloc_time) { - case H5D_ALLOC_TIME_ERROR: - fprintf (out, "H5D_ALLOC_TIME_ERROR"); - break; - case H5D_ALLOC_TIME_DEFAULT: - fprintf (out, "H5D_ALLOC_TIME_DEFAULT"); - break; - case H5D_ALLOC_TIME_EARLY: - fprintf (out, "H5D_ALLOC_TIME_EARLY"); - break; - case H5D_ALLOC_TIME_LATE: - fprintf (out, "H5D_ALLOC_TIME_LATE"); - break; - case H5D_ALLOC_TIME_INCR: - fprintf (out, "H5D_ALLOC_TIME_INCR"); - break; - } - } - break; - - case 'f': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5D_fill_time_t fill_time = va_arg (ap, H5D_fill_time_t); /*lint !e64 Type mismatch not really occuring */ - switch (fill_time) { - case H5D_FILL_TIME_ERROR: - fprintf (out, "H5D_FILL_TIME_ERROR"); - break; - case H5D_FILL_TIME_ALLOC: - fprintf (out, "H5D_FILL_TIME_ALLOC"); - break; - case H5D_FILL_TIME_NEVER: - fprintf (out, "H5D_FILL_TIME_NEVER"); - break; - case H5D_FILL_TIME_IFSET: - fprintf (out, "H5D_FILL_TIME_IFSET"); - break; - } - } - break; - - case 'F': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5D_fill_value_t fill_value = va_arg (ap, H5D_fill_value_t); /*lint !e64 Type mismatch not really occuring */ - switch (fill_value) { - case H5D_FILL_VALUE_ERROR: - fprintf (out, "H5D_FILL_VALUE_ERROR"); - break; - case H5D_FILL_VALUE_UNDEFINED: - fprintf (out, "H5D_FILL_VALUE_UNDEFINED"); - break; - case H5D_FILL_VALUE_DEFAULT: - fprintf (out, "H5D_FILL_VALUE_DEFAULT"); - break; - case H5D_FILL_VALUE_USER_DEFINED: - fprintf (out, "H5D_FILL_VALUE_USER_DEFINED"); - break; - } - } - break; - - case 'l': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5D_layout_t layout = va_arg (ap, H5D_layout_t); /*lint !e64 Type mismatch not really occuring */ - switch (layout) { - case H5D_LAYOUT_ERROR: - fprintf (out, "H5D_LAYOUT_ERROR"); - break; - case H5D_COMPACT: - fprintf (out, "H5D_COMPACT"); - break; - case H5D_CONTIGUOUS: - fprintf (out, "H5D_CONTIGUOUS"); - break; - case H5D_CHUNKED: - fprintf (out, "H5D_CHUNKED"); - break; - case H5D_NLAYOUTS: - fprintf (out, "H5D_NLAYOUTS"); - break; - default: - fprintf (out, "%ld", (long)layout); - break; - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5D_space_status_t space_status = va_arg(ap, H5D_space_status_t); /*lint !e64 Type mismatch not really occuring */ - switch (space_status) { - case H5D_SPACE_STATUS_NOT_ALLOCATED: - fprintf (out, "H5D_SPACE_STATUS_NOT_ALLOCATED"); - break; - case H5D_SPACE_STATUS_PART_ALLOCATED: - fprintf (out, "H5D_SPACE_STATUS_PART_ALLOCATED"); - break; - case H5D_SPACE_STATUS_ALLOCATED: - fprintf (out, "H5D_SPACE_STATUS_ALLOCATED"); - break; - case H5D_SPACE_STATUS_ERROR: - fprintf (out, "H5D_SPACE_STATUS_ERROR"); - break; - default: - fprintf (out, "%ld", (long)space_status); - break; - } - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5FD_mpio_xfer_t transfer = va_arg(ap, H5FD_mpio_xfer_t); /*lint !e64 Type mismatch not really occuring */ - switch (transfer) { - case H5FD_MPIO_INDEPENDENT: - fprintf (out, "H5FD_MPIO_INDEPENDENT"); - break; - case H5FD_MPIO_COLLECTIVE: - fprintf (out, "H5FD_MPIO_COLLECTIVE"); - break; - default: - fprintf (out, "%ld", (long)transfer); - break; - } - } - break; - - default: - fprintf (out, "BADTYPE(D%c)", type[1]); - goto error; - } - break; - - case 'e': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - herr_t status = va_arg (ap, herr_t); - if (status>=0) fprintf (out, "SUCCEED"); - else fprintf (out, "FAIL"); - } - break; - - case 'E': - switch (type[1]) { - case 'd': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5E_direction_t direction = va_arg (ap, H5E_direction_t); /*lint !e64 Type mismatch not really occuring */ - switch (direction) { - case H5E_WALK_UPWARD: - fprintf (out, "H5E_WALK_UPWARD"); - break; - case H5E_WALK_DOWNWARD: - fprintf (out, "H5E_WALK_DOWNWARD"); - break; - default: - fprintf (out, "%ld", (long)direction); - break; - } - } - break; - - case 'e': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5E_error_stack_t *error = va_arg (ap, H5E_error_stack_t*); /*lint !e64 Type mismatch not really occuring */ - fprintf (out, "0x%lx", (unsigned long)error); - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5E_type_t etype = va_arg (ap, H5E_type_t); /*lint !e64 Type mismatch not really occuring */ - switch (etype) { - case H5E_MAJOR: - fprintf (out, "H5E_MAJOR"); - break; - case H5E_MINOR: - fprintf (out, "H5E_MINOR"); - break; - default: - fprintf (out, "%ld", (long)etype); - break; - } - } - break; - - default: - fprintf (out, "BADTYPE(E%c)", type[1]); - goto error; - } - break; - - case 'F': - switch (type[1]) { - case 'd': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5F_close_degree_t degree = va_arg(ap, H5F_close_degree_t); /*lint !e64 Type mismatch not really occuring */ - switch (degree) { - case H5F_CLOSE_DEFAULT: - fprintf(out, "H5F_CLOSE_DEFAULT"); - break; - case H5F_CLOSE_WEAK: - fprintf(out, "H5F_CLOSE_WEAK"); - break; - case H5F_CLOSE_SEMI: - fprintf(out, "H5F_CLOSE_SEMI"); - break; - case H5F_CLOSE_STRONG: - fprintf(out, "H5F_CLOSE_STRONG"); - break; - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5F_scope_t scope = va_arg(ap, H5F_scope_t); /*lint !e64 Type mismatch not really occuring */ - switch (scope) { - case H5F_SCOPE_LOCAL: - fprintf(out, "H5F_SCOPE_LOCAL"); - break; - case H5F_SCOPE_GLOBAL: - fprintf(out, "H5F_SCOPE_GLOBAL"); - break; - case H5F_SCOPE_DOWN: - fprintf(out, "H5F_SCOPE_DOWN " - "/*FOR INTERNAL USE ONLY!*/"); - break; - } - } - break; - - default: - fprintf(out, "BADTYPE(F%c)", type[1]); - goto error; - } - break; - - case 'G': - switch (type[1]) { - case 'l': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5L_link_t link_type = va_arg (ap, H5L_link_t); /*lint !e64 Type mismatch not really occuring */ - switch (link_type) { - case H5L_LINK_ERROR: - fprintf (out, "H5L_LINK_ERROR"); - break; - case H5L_LINK_HARD: - fprintf (out, "H5L_LINK_HARD"); - break; - case H5L_LINK_SOFT: - fprintf (out, "H5L_LINK_SOFT"); - break; - default: - fprintf (out, "%ld", (long)link_type); - break; - } - } - break; - - case 'o': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5G_obj_t obj_type = va_arg (ap, H5G_obj_t); /*lint !e64 Type mismatch not really occuring */ - switch (obj_type) { - case H5G_UNKNOWN: - fprintf (out, "H5G_UNKNOWN"); - break; - case H5G_LINK: - fprintf (out, "H5G_LINK"); - break; - case H5G_UDLINK: - fprintf (out, "H5G_UDLINK"); - break; - case H5G_GROUP: - fprintf (out, "H5G_GROUP"); - break; - case H5G_DATASET: - fprintf (out, "H5G_DATASET"); - break; - case H5G_TYPE: - fprintf (out, "H5G_TYPE"); - break; - case H5G_RESERVED_5: - case H5G_RESERVED_6: - case H5G_RESERVED_7: - fprintf (out, "H5G_RESERVED(%ld)",(long)obj_type); - break; - default: - fprintf (out, "%ld", (long)obj_type); - break; - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5G_stat_t *statbuf = va_arg (ap, H5G_stat_t*); /*lint !e64 Type mismatch not really occuring */ - fprintf (out, "0x%lx", (unsigned long)statbuf); - } - break; - - default: - fprintf (out, "BADTYPE(G%c)", type[1]); - goto error; - } - break; - - case 'h': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - hsize_t *p = (hsize_t*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - if (H5S_UNLIMITED==p[i]) { - HDfprintf(out, "%sH5S_UNLIMITED", i?", ":""); - } else { - HDfprintf(out, "%s%Hu", i?", ":"", p[i]); - } - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - hsize_t hsize = va_arg (ap, hsize_t); /*lint !e732 Loss of sign not really occuring */ - if (H5S_UNLIMITED==hsize) { - HDfprintf(out, "H5S_UNLIMITED"); - } else { - HDfprintf (out, "%Hu", hsize); - asize[argno] = (hssize_t)hsize; - } - } - break; - - case 'H': - switch (type[1]) { - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - hssize_t *p = (hssize_t*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - HDfprintf(out, "%s%Hd", i?", ":"", p[i]); - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - hssize_t hssize = va_arg (ap, hssize_t); - HDfprintf (out, "%Hd", hssize); - asize[argno] = (hssize_t)hssize; - } - break; - - default: - fprintf (out, "BADTYPE(H%c)", type[1]); - goto error; - } - break; - - case 'i': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - hid_t obj = va_arg (ap, hid_t); - if (H5P_DEFAULT == obj) { - fprintf (out, "H5P_DEFAULT"); - } else if (obj<0) { - fprintf (out, "FAIL"); - } else { - switch (H5I_TYPE(obj)) { /* Use internal H5I macro instead of function call */ - case H5I_UNINIT: - fprintf (out, "%ld (uninit - error)", (long)obj); - break; - case H5I_BADID: - fprintf (out, "%ld (error)", (long)obj); - break; - case H5I_FILE: - fprintf(out, "%ld (file)", (long)obj); - break; - case H5I_GROUP: - fprintf(out, "%ld (group)", (long)obj); - break; - case H5I_DATATYPE: - if (obj==H5T_NATIVE_SCHAR_g) { - fprintf(out, "H5T_NATIVE_SCHAR"); - } else if (obj==H5T_NATIVE_UCHAR_g) { - fprintf(out, "H5T_NATIVE_UCHAR"); - } else if (obj==H5T_NATIVE_SHORT_g) { - fprintf(out, "H5T_NATIVE_SHORT"); - } else if (obj==H5T_NATIVE_USHORT_g) { - fprintf(out, "H5T_NATIVE_USHORT"); - } else if (obj==H5T_NATIVE_INT_g) { - fprintf(out, "H5T_NATIVE_INT"); - } else if (obj==H5T_NATIVE_UINT_g) { - fprintf(out, "H5T_NATIVE_UINT"); - } else if (obj==H5T_NATIVE_LONG_g) { - fprintf(out, "H5T_NATIVE_LONG"); - } else if (obj==H5T_NATIVE_ULONG_g) { - fprintf(out, "H5T_NATIVE_ULONG"); - } else if (obj==H5T_NATIVE_LLONG_g) { - fprintf(out, "H5T_NATIVE_LLONG"); - } else if (obj==H5T_NATIVE_ULLONG_g) { - fprintf(out, "H5T_NATIVE_ULLONG"); - } else if (obj==H5T_NATIVE_FLOAT_g) { - fprintf(out, "H5T_NATIVE_FLOAT"); - } else if (obj==H5T_NATIVE_DOUBLE_g) { - fprintf(out, "H5T_NATIVE_DOUBLE"); -#if H5_SIZEOF_LONG_DOUBLE !=0 - } else if (obj==H5T_NATIVE_LDOUBLE_g) { - fprintf(out, "H5T_NATIVE_LDOUBLE"); -#endif - } else if (obj==H5T_IEEE_F32BE_g) { - fprintf(out, "H5T_IEEE_F32BE"); - } else if (obj==H5T_IEEE_F32LE_g) { - fprintf(out, "H5T_IEEE_F32LE"); - } else if (obj==H5T_IEEE_F64BE_g) { - fprintf(out, "H5T_IEEE_F64BE"); - } else if (obj==H5T_IEEE_F64LE_g) { - fprintf(out, "H5T_IEEE_F64LE"); - } else if (obj==H5T_STD_I8BE_g) { - fprintf(out, "H5T_STD_I8BE"); - } else if (obj==H5T_STD_I8LE_g) { - fprintf(out, "H5T_STD_I8LE"); - } else if (obj==H5T_STD_I16BE_g) { - fprintf(out, "H5T_STD_I16BE"); - } else if (obj==H5T_STD_I16LE_g) { - fprintf(out, "H5T_STD_I16LE"); - } else if (obj==H5T_STD_I32BE_g) { - fprintf(out, "H5T_STD_I32BE"); - } else if (obj==H5T_STD_I32LE_g) { - fprintf(out, "H5T_STD_I32LE"); - } else if (obj==H5T_STD_I64BE_g) { - fprintf(out, "H5T_STD_I64BE"); - } else if (obj==H5T_STD_I64LE_g) { - fprintf(out, "H5T_STD_I64LE"); - } else if (obj==H5T_STD_U8BE_g) { - fprintf(out, "H5T_STD_U8BE"); - } else if (obj==H5T_STD_U8LE_g) { - fprintf(out, "H5T_STD_U8LE"); - } else if (obj==H5T_STD_U16BE_g) { - fprintf(out, "H5T_STD_U16BE"); - } else if (obj==H5T_STD_U16LE_g) { - fprintf(out, "H5T_STD_U16LE"); - } else if (obj==H5T_STD_U32BE_g) { - fprintf(out, "H5T_STD_U32BE"); - } else if (obj==H5T_STD_U32LE_g) { - fprintf(out, "H5T_STD_U32LE"); - } else if (obj==H5T_STD_U64BE_g) { - fprintf(out, "H5T_STD_U64BE"); - } else if (obj==H5T_STD_U64LE_g) { - fprintf(out, "H5T_STD_U64LE"); - } else if (obj==H5T_STD_B8BE_g) { - fprintf(out, "H5T_STD_B8BE"); - } else if (obj==H5T_STD_B8LE_g) { - fprintf(out, "H5T_STD_B8LE"); - } else if (obj==H5T_STD_B16BE_g) { - fprintf(out, "H5T_STD_B16BE"); - } else if (obj==H5T_STD_B16LE_g) { - fprintf(out, "H5T_STD_B16LE"); - } else if (obj==H5T_STD_B32BE_g) { - fprintf(out, "H5T_STD_B32BE"); - } else if (obj==H5T_STD_B32LE_g) { - fprintf(out, "H5T_STD_B32LE"); - } else if (obj==H5T_STD_B64BE_g) { - fprintf(out, "H5T_STD_B64BE"); - } else if (obj==H5T_STD_B64LE_g) { - fprintf(out, "H5T_STD_B64LE"); - } else if (obj==H5T_C_S1_g) { - fprintf(out, "H5T_C_S1"); - } else if (obj==H5T_FORTRAN_S1_g) { - fprintf(out, "H5T_FORTRAN_S1"); - } else { - fprintf(out, "%ld (dtype)", (long)obj); - } - break; - case H5I_DATASPACE: - fprintf(out, "%ld (dspace)", (long)obj); - /* Save the rank of simple data spaces for arrays */ - /* This may generate recursive call to the library... -QAK */ - { - H5S_t *space = H5I_object(obj); - if (H5S_SIMPLE==H5S_GET_EXTENT_TYPE(space)) { - asize[argno] = H5S_GET_EXTENT_NDIMS(space); - } - } - break; - case H5I_DATASET: - fprintf(out, "%ld (dset)", (long)obj); - break; - case H5I_ATTR: - fprintf(out, "%ld (attr)", (long)obj); - break; - case H5I_REFERENCE: - fprintf(out, "%ld (reference)", (long)obj); - break; - case H5I_VFL: - fprintf(out, "%ld (file driver)", (long)obj); - break; - case H5I_GENPROP_CLS: - fprintf(out, "%ld (genprop class)", (long)obj); - break; - case H5I_GENPROP_LST: - fprintf(out, "%ld (genprop list)", (long)obj); - break; - case H5I_ERROR_CLASS: - fprintf(out, "%ld (err class)", (long)obj); - break; - case H5I_ERROR_MSG: - fprintf(out, "%ld (err msg)", (long)obj); - break; - case H5I_ERROR_STACK: - fprintf(out, "%ld (err stack)", (long)obj); - break; - case H5I_NTYPES: - fprintf (out, "%ld (ntypes - error)", (long)obj); - break; - default: - fprintf(out, "%ld (unknown class)", (long)obj); - break; - } - } - } - break; - - case 'I': - switch (type[1]) { - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - int *p = (int*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - fprintf(out, "%s%d", i?", ":"", p[i]); - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - int is = va_arg (ap, int); - fprintf (out, "%d", is); - asize[argno] = is; - } - break; - - case 'u': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - unsigned *p = (unsigned*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - HDfprintf(out, "%s%u", i?", ":"", p[i]); - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - unsigned iu = va_arg (ap, unsigned); /*lint !e732 Loss of sign not really occuring */ - fprintf (out, "%u", iu); - asize[argno] = iu; - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5I_type_t id_type = va_arg (ap, H5I_type_t); /*lint !e64 Type mismatch not really occuring */ - switch (id_type) { - case H5I_UNINIT: - fprintf (out, "H5I_UNINIT"); - break; - case H5I_BADID: - fprintf (out, "H5I_BADID"); - break; - case H5I_FILE: - fprintf (out, "H5I_FILE"); - break; - case H5I_GROUP: - fprintf (out, "H5I_GROUP"); - break; - case H5I_DATATYPE: - fprintf (out, "H5I_DATATYPE"); - break; - case H5I_DATASPACE: - fprintf (out, "H5I_DATASPACE"); - break; - case H5I_DATASET: - fprintf (out, "H5I_DATASET"); - break; - case H5I_ATTR: - fprintf (out, "H5I_ATTR"); - break; - case H5I_REFERENCE: - fprintf (out, "H5I_REFERENCE"); - break; - case H5I_VFL: - fprintf (out, "H5I_VFL"); - break; - case H5I_GENPROP_CLS: - fprintf (out, "H5I_GENPROP_CLS"); - break; - case H5I_GENPROP_LST: - fprintf (out, "H5I_GENPROP_LST"); - break; - case H5I_ERROR_CLASS: - fprintf (out, "H5I_ERROR_CLASS"); - break; - case H5I_ERROR_MSG: - fprintf (out, "H5I_ERROR_MSG"); - break; - case H5I_ERROR_STACK: - fprintf (out, "H5I_ERROR_STACK"); - break; - case H5I_NTYPES: - fprintf (out, "H5I_NTYPES"); - break; - default: - fprintf (out, "%ld", (long)id_type); - break; - } - } - break; - - default: - fprintf (out, "BADTYPE(I%c)", type[1]); - goto error; - } - break; - - case 'M': - switch (type[1]) { - case 'c': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { -#ifdef H5_HAVE_PARALLEL - MPI_Comm comm = va_arg (ap, MPI_Comm); - fprintf (out, "%ld", (long)comm); -#endif - } - break; - case 'i': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { -#ifdef H5_HAVE_PARALLEL - MPI_Info info = va_arg (ap, MPI_Info); - fprintf (out, "%ld", (long)info); -#endif - } - break; - case 't': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5FD_mem_t mt = va_arg(ap, H5FD_mem_t); /*lint !e64 Type mismatch not really occuring */ - switch (mt) { - case H5FD_MEM_NOLIST: - fprintf(out, "H5FD_MEM_NOLIST"); - break; - case H5FD_MEM_DEFAULT: - fprintf(out, "H5FD_MEM_DEFAULT"); - break; - case H5FD_MEM_SUPER: - fprintf(out, "H5FD_MEM_SUPER"); - break; - case H5FD_MEM_BTREE: - fprintf(out, "H5FD_MEM_BTREE"); - break; - case H5FD_MEM_DRAW: - fprintf(out, "H5FD_MEM_DRAW"); - break; - case H5FD_MEM_GHEAP: - fprintf(out, "H5FD_MEM_GHEAP"); - break; - case H5FD_MEM_LHEAP: - fprintf(out, "H5FD_MEM_LHEAP"); - break; - case H5FD_MEM_OHDR: - fprintf(out, "H5FD_MEM_OHDR"); - break; - case H5FD_MEM_NTYPES: - fprintf(out, "H5FD_MEM_NTYPES"); - break; - default: - fprintf(out, "%ld", (long)mt); - break; - } - } - break; - - default: - goto error; - } - break; - - case 'o': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - off_t offset = va_arg (ap, off_t); - fprintf (out, "%ld", (long)offset); - } - break; - - case 'p': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - hid_t pclass_id = va_arg (ap, hid_t); - char *class_name=NULL; - H5P_genclass_t *pclass; - - /* Get the class name and print it */ - /* This may generate recursive call to the library... -QAK */ - if(NULL != (pclass = H5I_object(pclass_id)) && - (class_name=H5P_get_class_name(pclass))!=NULL) { - fprintf (out, class_name); - H5MM_xfree(class_name); - } /* end if */ - else { - fprintf (out, "%ld", (long)pclass_id); - } /* end else */ - } - break; - - case 'r': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - hobj_ref_t ref = va_arg (ap, hobj_ref_t); /*lint !e732 Loss of sign not really occuring */ - HDfprintf(out, "Reference Object=%a", ref); - } - break; - - case 'R': - switch (type[1]) { - case 't': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5R_type_t reftype = va_arg(ap, H5R_type_t); /*lint !e64 Type mismatch not really occuring */ - switch (reftype) { - case H5R_BADTYPE: - fprintf(out, "H5R_BADTYPE"); - break; - case H5R_OBJECT: - fprintf(out, "H5R_OBJECT"); - break; - case H5R_DATASET_REGION: - fprintf(out, "H5R_DATASET_REGION"); - break; - case H5R_INTERNAL: - fprintf(out, "H5R_INTERNAL"); - break; - case H5R_MAXTYPE: - fprintf(out, "H5R_MAXTYPE"); - break; - default: - fprintf(out, "BADTYPE(%ld)", (long)reftype); - break; - } - } - break; - - default: - fprintf(out, "BADTYPE(S%c)", type[1]); - goto error; - } - break; - - case 'S': - switch (type[1]) { - case 'c': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5S_class_t cls = va_arg(ap, H5S_class_t); /*lint !e64 Type mismatch not really occuring */ - switch (cls) { - case H5S_NO_CLASS: - fprintf(out, "H5S_NO_CLASS"); - break; - case H5S_SCALAR: - fprintf(out, "H5S_SCALAR"); - break; - case H5S_SIMPLE: - fprintf(out, "H5S_SIMPLE"); - break; - case H5S_NULL: - fprintf(out, "H5S_NULL"); - break; - default: - fprintf(out, "%ld", (long)cls); - break; - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5S_seloper_t so = va_arg(ap, H5S_seloper_t); /*lint !e64 Type mismatch not really occuring */ - switch (so) { - case H5S_SELECT_NOOP: - fprintf(out, "H5S_NOOP"); - break; - case H5S_SELECT_SET: - fprintf(out, "H5S_SELECT_SET"); - break; - case H5S_SELECT_OR: - fprintf(out, "H5S_SELECT_OR"); - break; - case H5S_SELECT_AND: - fprintf(out, "H5S_SELECT_AND"); - break; - case H5S_SELECT_XOR: - fprintf(out, "H5S_SELECT_XOR"); - break; - case H5S_SELECT_NOTB: - fprintf(out, "H5S_SELECT_NOTB"); - break; - case H5S_SELECT_NOTA: - fprintf(out, "H5S_SELECT_NOTA"); - break; - case H5S_SELECT_APPEND: - fprintf(out, "H5S_SELECT_APPEND"); - break; - case H5S_SELECT_PREPEND: - fprintf(out, "H5S_SELECT_PREPEND"); - break; - case H5S_SELECT_INVALID: - fprintf(out, "H5S_SELECT_INVALID"); - break; - default: - fprintf(out, "%ld", (long)so); - break; - } - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5S_sel_type st = va_arg(ap, H5S_sel_type); /*lint !e64 Type mismatch not really occuring */ - switch (st) { - case H5S_SEL_ERROR: - fprintf(out, "H5S_SEL_ERROR"); - break; - case H5S_SEL_NONE: - fprintf(out, "H5S_SEL_NONE"); - break; - case H5S_SEL_POINTS: - fprintf(out, "H5S_SEL_POINTS"); - break; - case H5S_SEL_HYPERSLABS: - fprintf(out, "H5S_SEL_HYPERSLABS"); - break; - case H5S_SEL_ALL: - fprintf(out, "H5S_SEL_ALL"); - break; - case H5S_SEL_N: - fprintf(out, "H5S_SEL_N"); - break; - default: - fprintf(out, "%ld", (long)st); - break; - } - } - break; - - default: - fprintf(out, "BADTYPE(S%c)", type[1]); - goto error; - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - const char *str = va_arg (ap, const char*); /*lint !e64 Type mismatch not really occuring */ - fprintf (out, "\"%s\"", str); - } - break; - - case 'T': - switch (type[1]) { - case 'c': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_cset_t cset = va_arg (ap, H5T_cset_t); /*lint !e64 Type mismatch not really occuring */ - switch (cset) { - case H5T_CSET_ERROR: - fprintf (out, "H5T_CSET_ERROR"); - break; - case H5T_CSET_ASCII: - fprintf (out, "H5T_CSET_ASCII"); - break; - case H5T_CSET_UTF8: - fprintf (out, "H5T_CSET_UTF8"); - break; - case H5T_CSET_RESERVED_2: - case H5T_CSET_RESERVED_3: - case H5T_CSET_RESERVED_4: - case H5T_CSET_RESERVED_5: - case H5T_CSET_RESERVED_6: - case H5T_CSET_RESERVED_7: - case H5T_CSET_RESERVED_8: - case H5T_CSET_RESERVED_9: - case H5T_CSET_RESERVED_10: - case H5T_CSET_RESERVED_11: - case H5T_CSET_RESERVED_12: - case H5T_CSET_RESERVED_13: - case H5T_CSET_RESERVED_14: - case H5T_CSET_RESERVED_15: - fprintf (out, "H5T_CSET_RESERVED(%ld)",(long)cset); - break; - default: - fprintf (out, "%ld", (long)cset); - break; - } - } - break; - - case 'd': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_direction_t direct = va_arg (ap, H5T_direction_t); /*lint !e64 Type mismatch not really occuring */ - switch (direct) { - case H5T_DIR_DEFAULT: - fprintf (out, "H5T_DIR_DEFAULT"); - break; - case H5T_DIR_ASCEND: - fprintf (out, "H5T_DIR_ASCEND"); - break; - case H5T_DIR_DESCEND: - fprintf (out, "H5T_DIR_DESCEND"); - break; - default: - fprintf (out, "%ld", (long)direct); - break; - } - } - break; - - case 'e': - if (ptr) { - if (vp) { - fprintf(out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_pers_t pers = va_arg(ap, H5T_pers_t); /*lint !e64 Type mismatch not really occuring */ - switch (pers) { - case H5T_PERS_DONTCARE: - fprintf(out, "H5T_PERS_DONTCARE"); - break; - case H5T_PERS_SOFT: - fprintf(out, "H5T_PERS_SOFT"); - break; - case H5T_PERS_HARD: - fprintf(out, "H5T_PERS_HARD"); - break; - default: - fprintf(out, "%ld", (long)pers); - break; - } - } - break; - - case 'n': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_norm_t norm = va_arg (ap, H5T_norm_t); /*lint !e64 Type mismatch not really occuring */ - switch (norm) { - case H5T_NORM_ERROR: - fprintf (out, "H5T_NORM_ERROR"); - break; - case H5T_NORM_IMPLIED: - fprintf (out, "H5T_NORM_IMPLIED"); - break; - case H5T_NORM_MSBSET: - fprintf (out, "H5T_NORM_MSBSET"); - break; - case H5T_NORM_NONE: - fprintf (out, "H5T_NORM_NONE"); - break; - default: - fprintf (out, "%ld", (long)norm); - break; - } - } - break; - - case 'o': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_order_t order = va_arg (ap, H5T_order_t); /*lint !e64 Type mismatch not really occuring */ - switch (order) { - case H5T_ORDER_ERROR: - fprintf (out, "H5T_ORDER_ERROR"); - break; - case H5T_ORDER_LE: - fprintf (out, "H5T_ORDER_LE"); - break; - case H5T_ORDER_BE: - fprintf (out, "H5T_ORDER_BE"); - break; - case H5T_ORDER_VAX: - fprintf (out, "H5T_ORDER_VAX"); - break; - case H5T_ORDER_NONE: - fprintf (out, "H5T_ORDER_NONE"); - break; - default: - fprintf (out, "%ld", (long)order); - break; - } - } - break; - - case 'p': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_pad_t pad = va_arg (ap, H5T_pad_t); /*lint !e64 Type mismatch not really occuring */ - switch (pad) { - case H5T_PAD_ERROR: - fprintf (out, "H5T_PAD_ERROR"); - break; - case H5T_PAD_ZERO: - fprintf (out, "H5T_PAD_ZERO"); - break; - case H5T_PAD_ONE: - fprintf (out, "H5T_PAD_ONE"); - break; - case H5T_PAD_BACKGROUND: - fprintf (out, "H5T_PAD_BACKGROUND"); - break; - case H5T_NPAD: - fprintf (out, "H5T_NPAD"); - break; - default: - fprintf (out, "%ld", (long)pad); - break; - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_sign_t sign = va_arg (ap, H5T_sign_t); /*lint !e64 Type mismatch not really occuring */ - switch (sign) { - case H5T_SGN_ERROR: - fprintf (out, "H5T_SGN_ERROR"); - break; - case H5T_SGN_NONE: - fprintf (out, "H5T_SGN_NONE"); - break; - case H5T_SGN_2: - fprintf (out, "H5T_SGN_2"); - break; - case H5T_NSGN: - fprintf (out, "H5T_NSGN"); - break; - default: - fprintf (out, "%ld", (long)sign); - break; - } - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_class_t type_class = va_arg(ap, H5T_class_t); /*lint !e64 Type mismatch not really occuring */ - switch (type_class) { - case H5T_NO_CLASS: - fprintf(out, "H5T_NO_CLASS"); - break; - case H5T_INTEGER: - fprintf(out, "H5T_INTEGER"); - break; - case H5T_FLOAT: - fprintf(out, "H5T_FLOAT"); - break; - case H5T_TIME: - fprintf(out, "H5T_TIME"); - break; - case H5T_STRING: - fprintf(out, "H5T_STRING"); - break; - case H5T_BITFIELD: - fprintf(out, "H5T_BITFIELD"); - break; - case H5T_OPAQUE: - fprintf(out, "H5T_OPAQUE"); - break; - case H5T_COMPOUND: - fprintf(out, "H5T_COMPOUND"); - break; - case H5T_REFERENCE: - fprintf(out, "H5T_REFERENCE"); - break; - case H5T_ENUM: - fprintf(out, "H5T_ENUM"); - break; - case H5T_VLEN: - fprintf(out, "H5T_VLEN"); - break; - case H5T_ARRAY: - fprintf(out, "H5T_ARRAY"); - break; - case H5T_NCLASSES: - fprintf(out, "H5T_NCLASSES"); - break; - default: - fprintf(out, "%ld", (long)type_class); - break; - } - } - break; - - case 'z': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5T_str_t str = va_arg(ap, H5T_str_t); /*lint !e64 Type mismatch not really occuring */ - switch (str) { - case H5T_STR_ERROR: - fprintf(out, "H5T_STR_ERROR"); - break; - case H5T_STR_NULLTERM: - fprintf(out, "H5T_STR_NULLTERM"); - break; - case H5T_STR_NULLPAD: - fprintf(out, "H5T_STR_NULLPAD"); - break; - case H5T_STR_SPACEPAD: - fprintf(out, "H5T_STR_SPACEPAD"); - break; - case H5T_STR_RESERVED_3: - case H5T_STR_RESERVED_4: - case H5T_STR_RESERVED_5: - case H5T_STR_RESERVED_6: - case H5T_STR_RESERVED_7: - case H5T_STR_RESERVED_8: - case H5T_STR_RESERVED_9: - case H5T_STR_RESERVED_10: - case H5T_STR_RESERVED_11: - case H5T_STR_RESERVED_12: - case H5T_STR_RESERVED_13: - case H5T_STR_RESERVED_14: - case H5T_STR_RESERVED_15: - fprintf(out, "H5T_STR_RESERVED(%ld)",(long)str); - break; - default: - fprintf(out, "%ld", (long)str); - break; - } - } - break; - - default: - fprintf (out, "BADTYPE(T%c)", type[1]); - goto error; - } - break; - - case 't': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - htri_t tri_var = va_arg (ap, htri_t); - if (tri_var>0) fprintf (out, "TRUE"); - else if (!tri_var) fprintf (out, "FALSE"); - else fprintf (out, "FAIL(%d)", (int)tri_var); - } - break; - - case 'x': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - void **p = (void**)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - if (p[i]) { - fprintf(out, "%s0x%lx", i?", ":"", - (unsigned long)(p[i])); - } else { - fprintf(out, "%sNULL", i?", ":""); - } - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - vp = va_arg (ap, void*); /*lint !e64 Type mismatch not really occuring */ - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } - break; - - case 'z': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - size_t *p = (size_t*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - HDfprintf(out, "%s%Zu", i?", ":"", p[i]); - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - size_t size = va_arg (ap, size_t); /*lint !e732 Loss of sign not really occuring */ - - HDfprintf (out, "%Zu", size); - asize[argno] = (hssize_t)size; - } - break; - - case 'Z': - switch (type[1]) { - case 'a': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5Z_SO_scale_type_t scale_type = va_arg (ap, H5Z_SO_scale_type_t); /*lint !e64 Type mismatch not really occuring */ - switch(scale_type) { - case H5Z_SO_FLOAT_DSCALE: - fprintf(out, "H5Z_SO_FLOAT_DSCALE"); - break; - case H5Z_SO_FLOAT_ESCALE: - fprintf(out, "H5Z_SO_FLOAT_ESCALE"); - break; - case H5Z_SO_INT: - fprintf(out, "H5Z_SO_INT"); - break; - default: - fprintf(out, "%ld", (long)scale_type); - break; - } - } - break; - case 'c': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5Z_class_t *filter = va_arg (ap, H5Z_class_t*); /*lint !e64 Type mismatch not really occuring */ - fprintf (out, "0x%lx", (unsigned long)filter); - } - break; - - case 'e': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5Z_EDC_t edc = va_arg (ap, H5Z_EDC_t); /*lint !e64 Type mismatch not really occuring */ - - if (H5Z_DISABLE_EDC==edc) { - fprintf (out, "H5Z_DISABLE_EDC"); - } else if (H5Z_ENABLE_EDC==edc) { - fprintf (out, "H5Z_ENABLE_EDC"); - } else { - fprintf (out, "%ld", (long)edc); - } - } - break; - - case 'f': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - } else { - fprintf(out, "NULL"); - } - } else { - H5Z_filter_t id = va_arg (ap, H5Z_filter_t); - - if (H5Z_FILTER_DEFLATE==id) { - fprintf (out, "H5Z_FILTER_DEFLATE"); - } else { - fprintf (out, "%ld", (long)id); - } - } - break; - - case 's': - if (ptr) { - if (vp) { - fprintf (out, "0x%lx", (unsigned long)vp); - if (asize_idx>=0 && asize[asize_idx]>=0) { - ssize_t *p = (ssize_t*)vp; - fprintf(out, " {"); - for (i=0; i<asize[asize_idx]; i++) { - HDfprintf(out, "%s%Zd", i?", ":"", p[i]); - } - fprintf(out, "}"); - } - } else { - fprintf(out, "NULL"); - } - } else { - ssize_t ssize = va_arg (ap, ssize_t); - - HDfprintf (out, "%Zd", ssize); - asize[argno] = (hssize_t)ssize; - } - break; - - default: - fprintf (out, "BADTYPE(Z%c)", type[1]); - goto error; - } - break; - - default: - if (HDisupper (type[0])) { - fprintf (out, "BADTYPE(%c%c)", type[0], type[1]); - } else { - fprintf (out, "BADTYPE(%c)", type[0]); - } - goto error; - } - } - - - /* Display event time for return */ - if (returning && H5_debug_g.ttimes) - fprintf(out, " @%.6f [dt=%.6f]", - event_time.etime - first_time.etime, - event_time.etime - *returning); - - error: - va_end (ap); - if (returning) { - fprintf (out, ";\n"); - } else { - last_call_depth = current_depth++; - fprintf (out, ")"); - } - HDfflush (out); - return event_time.etime; -} /* end H5_trace() */ - - -/*------------------------------------------------------------------------- - * Function: HDrand/HDsrand - * - * Purpose: Wrapper function for rand. If rand_r exists on this system, - * use it. - * - * Wrapper function for srand. If rand_r is available, it will keep - * track of the seed locally instead of using srand() which modifies - * global state and can break other programs. - * - * Return: Success: Random number from 0 to RAND_MAX - * - * Failure: Cannot fail. - * - * Programmer: Leon Arber - * March 6, 2006. - * - *------------------------------------------------------------------------- - */ -#ifdef H5_HAVE_RAND_R - -static unsigned int g_seed = 42; - -int HDrand(void) -{ - return rand_r(&g_seed); -} - -void HDsrand(unsigned int seed) -{ - g_seed = seed; -} -#endif - - -/*------------------------------------------------------------------------- - * Function: HDremove_all - * - * Purpose: Wrapper function for remove on VMS systems - * - * This function deletes all versions of a file - * - * Return: Success: 0; - * - * Failure: -1 - * - * Programmer: Elena Pourmal - * March 22, 2006 - * - *------------------------------------------------------------------------- - */ -#ifdef H5_VMS -int -HDremove_all(char *fname) -{ - int ret_value = -1; - char *_fname; - - _fname = H5MM_malloc(HDstrlen(fname) + 3); /* to accomodate ;* and null */ - if(_fname) { - HDstrcpy(_fname, fname); - HDstrcat(_fname,";*"); - HDremove(_fname); - H5MM_xfree(_fname); - ret_value = 0; - } - return ret_value; -} -#endif - diff --git a/src/H5checksum.c b/src/H5checksum.c new file mode 100644 index 0000000..f4d702b --- /dev/null +++ b/src/H5checksum.c @@ -0,0 +1,145 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5checksum.c + * Aug 21 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: Internal code for computing fletcher32 checksums + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + + +/*------------------------------------------------------------------------- + * Function: H5_fletcher32 + * + * Purpose: This routine provides a generic, fast checksum algorithm for + * use in the library. + * + * Note: See the Wikipedia page for Fletcher's checksum: + * http://en.wikipedia.org/wiki/Fletcher%27s_checksum + * for more details, etc. + * + * Return: 32-bit fletcher checksum of input buffer (can't fail) + * + * Programmer: Quincey Koziol + * Monday, August 21, 2006 + * + *------------------------------------------------------------------------- + */ +uint32_t +H5_fletcher32(const void *_data, size_t _len) +{ + const uint16_t *data = (const uint16_t *)_data; /* Pointer to the data to be summed */ + size_t len = _len / 2; /* Length in 16-bit words */ + uint32_t sum1 = 0xffff, sum2 = 0xffff; + uint32_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5_fletcher32) + + /* Sanity check */ + HDassert(_data); + HDassert(_len > 0); + + /* Compute checksum for pairs of bytes */ + /* The magic "360" value is is the largest number of sums that can be + * performed without numeric overflow. See the Wikipedia page for + * Fletcher's checksum: http://en.wikipedia.org/wiki/Fletcher%27s_checksum + * for more details, etc. + */ + while (len) { + unsigned tlen = len > 360 ? 360 : len; + len -= tlen; + do { + sum1 += *data++; + sum2 += sum1; + } while (--tlen); + sum1 = (sum1 & 0xffff) + (sum1 >> 16); + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + } + + /* Check for odd # of bytes */ + if(_len % 2) { + sum1 += *(const uint8_t *)data; + sum2 += sum1; + sum1 = (sum1 & 0xffff) + (sum1 >> 16); + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + } /* end if */ + + /* Second reduction step to reduce sums to 16 bits */ + sum1 = (sum1 & 0xffff) + (sum1 >> 16); + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + +/* Byteswap result on little-endian platforms */ +#ifdef H5_WORDS_BIGENDIAN + ret_value = sum2 << 16 | sum1; +#else /* H5_WORDS_BIGENDIAN */ + ret_value = (sum2 << 8) & 0x00ff0000; + ret_value |= (sum2 << 24) & 0xff000000; + ret_value |= (sum1 << 8) & 0x0000ff00; + ret_value |= (sum1 >> 8) & 0x000000ff; +#endif /* H5_WORDS_BIGENDIAN */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5_fletcher32() */ + diff --git a/src/H5private.h b/src/H5private.h index 9dd989d..f3bae08 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -1446,6 +1446,9 @@ H5_DLL int H5S_term_interface(void); H5_DLL int H5T_term_interface(void); H5_DLL int H5Z_term_interface(void); +/* Checksum functions */ +H5_DLL uint32_t H5_fletcher32(const void *data, size_t len); + /* Functions for debugging */ H5_DLL herr_t H5_buffer_dump(FILE *stream, int indent, uint8_t *buf, uint8_t *marker, size_t buf_offset, size_t buf_size); diff --git a/src/H5system.c b/src/H5system.c new file mode 100644 index 0000000..decef38 --- /dev/null +++ b/src/H5system.c @@ -0,0 +1,578 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5system.c + * Aug 21 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: System call wrapper implementations. + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Fprivate.h" /* File access */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + +/*------------------------------------------------------------------------- + * Function: HDfprintf + * + * Purpose: Prints the optional arguments under the control of the format + * string FMT to the stream STREAM. This function takes the + * same format as fprintf(3c) with a few added features: + * + * The conversion modifier `H' refers to the size of an + * `hsize_t' or `hssize_t' type. For instance, "0x%018Hx" + * prints an `hsize_t' value as a hex number right justified and + * zero filled in an 18-character field. + * + * The conversion `a' refers to an `haddr_t' type. + * + * Return: Success: Number of characters printed + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Thursday, April 9, 1998 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The `%a' format refers to an argument of `haddr_t' type + * instead of `haddr_t*' and the return value is correct. + *------------------------------------------------------------------------- + */ +int +HDfprintf(FILE *stream, const char *fmt, ...) +{ + int n=0, nout = 0; + int fwidth, prec; + int zerofill; + int leftjust; + int plussign; + int ldspace; + int prefix; + char modifier[8]; + int conv; + char *rest, format_templ[128]; + const char *s; + va_list ap; + + assert (stream); + assert (fmt); + + va_start (ap, fmt); + while (*fmt) { + fwidth = prec = 0; + zerofill = 0; + leftjust = 0; + plussign = 0; + prefix = 0; + ldspace = 0; + modifier[0] = '\0'; + + if ('%'==fmt[0] && '%'==fmt[1]) { + HDputc ('%', stream); + fmt += 2; + nout++; + } else if ('%'==fmt[0]) { + s = fmt + 1; + + /* Flags */ + while (HDstrchr ("-+ #", *s)) { + switch (*s) { + case '-': + leftjust = 1; + break; + case '+': + plussign = 1; + break; + case ' ': + ldspace = 1; + break; + case '#': + prefix = 1; + break; + } /*lint !e744 Switch statement doesn't _need_ default */ + s++; + } + + /* Field width */ + if (HDisdigit (*s)) { + zerofill = ('0'==*s); + fwidth = (int)HDstrtol (s, &rest, 10); + s = rest; + } else if ('*'==*s) { + fwidth = va_arg (ap, int); + if (fwidth<0) { + leftjust = 1; + fwidth = -fwidth; + } + s++; + } + + /* Precision */ + if ('.'==*s) { + s++; + if (HDisdigit (*s)) { + prec = (int)HDstrtol (s, &rest, 10); + s = rest; + } else if ('*'==*s) { + prec = va_arg (ap, int); + s++; + } + if (prec<1) prec = 1; + } + + /* Extra type modifiers */ + if (HDstrchr ("ZHhlqLI", *s)) { + switch (*s) { + /*lint --e{506} Don't issue warnings about constant value booleans */ + /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */ + case 'H': + if (sizeof(hsize_t)<sizeof(long)) { + modifier[0] = '\0'; + } else if (sizeof(hsize_t)==sizeof(long)) { + HDstrcpy (modifier, "l"); + } else { + HDstrcpy (modifier, H5_PRINTF_LL_WIDTH); + } + break; + case 'Z': + if (sizeof(size_t)<sizeof(long)) { + modifier[0] = '\0'; + } else if (sizeof(size_t)==sizeof(long)) { + HDstrcpy (modifier, "l"); + } else { + HDstrcpy (modifier, H5_PRINTF_LL_WIDTH); + } + break; + default: + /* Handle 'I64' modifier for Microsoft's "__int64" type */ + if(*s=='I' && *(s+1)=='6' && *(s+2)=='4') { + modifier[0] = *s; + modifier[1] = *(s+1); + modifier[2] = *(s+2); + modifier[3] = '\0'; + s+=2; /* Increment over 'I6', the '4' is taken care of below */ + } /* end if */ + else { + /* Handle 'll' for long long types */ + if(*s=='l' && *(s+1)=='l') { + modifier[0] = *s; + modifier[1] = *s; + modifier[2] = '\0'; + s++; /* Increment over first 'l', second is taken care of below */ + } /* end if */ + else { + modifier[0] = *s; + modifier[1] = '\0'; + } /* end else */ + } /* end else */ + break; + } + s++; + } + + /* Conversion */ + conv = *s++; + + /* Create the format template */ + sprintf (format_templ, "%%%s%s%s%s%s", + leftjust?"-":"", plussign?"+":"", + ldspace?" ":"", prefix?"#":"", zerofill?"0":""); + if (fwidth>0) + sprintf (format_templ+HDstrlen(format_templ), "%d", fwidth); + if (prec>0) + sprintf (format_templ+HDstrlen(format_templ), ".%d", prec); + if (*modifier) + sprintf (format_templ+HDstrlen(format_templ), "%s", modifier); + sprintf (format_templ+HDstrlen(format_templ), "%c", conv); + + + /* Conversion */ + switch (conv) { + case 'd': + case 'i': + if (!HDstrcmp(modifier, "h")) { + short x = (short)va_arg (ap, int); + n = fprintf (stream, format_templ, x); + } else if (!*modifier) { + int x = va_arg (ap, int); + n = fprintf (stream, format_templ, x); + } else if (!HDstrcmp (modifier, "l")) { + long x = va_arg (ap, long); + n = fprintf (stream, format_templ, x); + } else { + int64_t x = va_arg(ap, int64_t); + n = fprintf (stream, format_templ, x); + } + break; + + case 'o': + case 'u': + case 'x': + case 'X': + if (!HDstrcmp (modifier, "h")) { + unsigned short x = (unsigned short)va_arg (ap, unsigned int); + n = fprintf (stream, format_templ, x); + } else if (!*modifier) { + unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */ + n = fprintf (stream, format_templ, x); + } else if (!HDstrcmp (modifier, "l")) { + unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */ + n = fprintf (stream, format_templ, x); + } else { + uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */ + n = fprintf (stream, format_templ, x); + } + break; + + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + if (!HDstrcmp (modifier, "h")) { + float x = (float) va_arg (ap, double); + n = fprintf (stream, format_templ, x); + } else if (!*modifier || !HDstrcmp (modifier, "l")) { + double x = va_arg (ap, double); + n = fprintf (stream, format_templ, x); + } else { + /* + * Some compilers complain when `long double' and + * `double' are the same thing. + */ +#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE + long double x = va_arg (ap, long double); + n = fprintf (stream, format_templ, x); +#else + double x = va_arg (ap, double); + n = fprintf (stream, format_templ, x); +#endif + } + break; + + case 'a': + { + haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */ + if (H5F_addr_defined(x)) { + sprintf(format_templ, "%%%s%s%s%s%s", + leftjust?"-":"", plussign?"+":"", + ldspace?" ":"", prefix?"#":"", + zerofill?"0":""); + if (fwidth>0) + sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth); + + /*lint --e{506} Don't issue warnings about constant value booleans */ + /*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */ + if (sizeof(x)==H5_SIZEOF_INT) { + HDstrcat(format_templ, "u"); + } else if (sizeof(x)==H5_SIZEOF_LONG) { + HDstrcat(format_templ, "lu"); + } else if (sizeof(x)==H5_SIZEOF_LONG_LONG) { + HDstrcat(format_templ, H5_PRINTF_LL_WIDTH); + HDstrcat(format_templ, "u"); + } + n = fprintf(stream, format_templ, x); + } else { + HDstrcpy(format_templ, "%"); + if (leftjust) + HDstrcat(format_templ, "-"); + if (fwidth) + sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth); + HDstrcat(format_templ, "s"); + fprintf(stream, format_templ, "UNDEF"); + } + } + break; + + case 'c': + { + char x = (char)va_arg (ap, int); + n = fprintf (stream, format_templ, x); + } + break; + + case 's': + case 'p': + { + char *x = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */ + n = fprintf (stream, format_templ, x); + } + break; + + case 'n': + format_templ[HDstrlen(format_templ)-1] = 'u'; + n = fprintf (stream, format_templ, nout); + break; + + case 't': + { + htri_t tri_var = va_arg (ap, htri_t); + if (tri_var > 0) fprintf (stream, "TRUE"); + else if (!tri_var) fprintf (stream, "FALSE"); + else fprintf (stream, "FAIL(%d)", (int)tri_var); + } + break; + + default: + HDfputs (format_templ, stream); + n = (int)HDstrlen (format_templ); + break; + } + nout += n; + fmt = s; + } else { + HDputc (*fmt, stream); + fmt++; + nout++; + } + } + va_end (ap); + return nout; +} /* end HDfprintf() */ + + +/*------------------------------------------------------------------------- + * Function: HDstrtoll + * + * Purpose: Converts the string S to an int64_t value according to the + * given BASE, which must be between 2 and 36 inclusive, or be + * the special value zero. + * + * The string must begin with an arbitrary amount of white space + * (as determined by isspace(3c)) followed by a single optional + * `+' or `-' sign. If BASE is zero or 16 the string may then + * include a `0x' or `0X' prefix, and the number will be read in + * base 16; otherwise a zero BASE is taken as 10 (decimal) + * unless the next character is a `0', in which case it is taken + * as 8 (octal). + * + * The remainder of the string is converted to an int64_t in the + * obvious manner, stopping at the first character which is not + * a valid digit in the given base. (In bases above 10, the + * letter `A' in either upper or lower case represetns 10, `B' + * represents 11, and so forth, with `Z' representing 35.) + * + * If REST is not null, the address of the first invalid + * character in S is stored in *REST. If there were no digits + * at all, the original value of S is stored in *REST. Thus, if + * *S is not `\0' but **REST is `\0' on return the entire string + * was valid. + * + * Return: Success: The result. + * + * Failure: If the input string does not contain any + * digits then zero is returned and REST points + * to the original value of S. If an overflow + * or underflow occurs then the maximum or + * minimum possible value is returned and the + * global `errno' is set to ERANGE. If BASE is + * incorrect then zero is returned. + * + * Programmer: Robb Matzke + * Thursday, April 9, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int64_t +HDstrtoll(const char *s, const char **rest, int base) +{ + int64_t sign=1, acc=0; + hbool_t overflow = FALSE; + + errno = 0; + if (!s || (base && (base<2 || base>36))) { + if (rest) *rest = s; + return 0; + } + + /* Skip white space */ + while (HDisspace (*s)) s++; + + /* Optional minus or plus sign */ + if ('+'==*s) { + s++; + } else if ('-'==*s) { + sign = -1; + s++; + } + + /* Zero base prefix */ + if (0==base && '0'==*s && ('x'==s[1] || 'X'==s[1])) { + base = 16; + s += 2; + } else if (0==base && '0'==*s) { + base = 8; + s++; + } else if (0==base) { + base = 10; + } + + /* Digits */ + while ((base<=10 && *s>='0' && *s<'0'+base) || + (base>10 && ((*s>='0' && *s<='9') || + (*s>='a' && *s<'a'+base-10) || + (*s>='A' && *s<'A'+base-10)))) { + if (!overflow) { + int64_t digit = 0; + if (*s>='0' && *s<='9') digit = *s - '0'; + else if (*s>='a' && *s<='z') digit = (*s-'a')+10; + else digit = (*s-'A')+10; + + if (acc*base+digit < acc) { + overflow = TRUE; + } else { + acc = acc*base + digit; + } + } + s++; + } + + /* Overflow */ + if (overflow) { + if (sign>0) { + acc = ((uint64_t)1<<(8*sizeof(int64_t)-1))-1; + } else { + acc = (uint64_t)1<<(8*sizeof(int64_t)-1); + } + errno = ERANGE; + } + + /* Return values */ + acc *= sign; + if (rest) *rest = s; + return acc; +} /* end HDstrtoll() */ + + +/*------------------------------------------------------------------------- + * Function: HDrand/HDsrand + * + * Purpose: Wrapper function for rand. If rand_r exists on this system, + * use it. + * + * Wrapper function for srand. If rand_r is available, it will keep + * track of the seed locally instead of using srand() which modifies + * global state and can break other programs. + * + * Return: Success: Random number from 0 to RAND_MAX + * + * Failure: Cannot fail. + * + * Programmer: Leon Arber + * March 6, 2006. + * + *------------------------------------------------------------------------- + */ +#ifdef H5_HAVE_RAND_R + +static unsigned int g_seed = 42; + +int HDrand(void) +{ + return rand_r(&g_seed); +} + +void HDsrand(unsigned int seed) +{ + g_seed = seed; +} +#endif + + +/*------------------------------------------------------------------------- + * Function: HDremove_all + * + * Purpose: Wrapper function for remove on VMS systems + * + * This function deletes all versions of a file + * + * Return: Success: 0; + * + * Failure: -1 + * + * Programmer: Elena Pourmal + * March 22, 2006 + * + *------------------------------------------------------------------------- + */ +#ifdef H5_VMS +int +HDremove_all(char *fname) +{ + int ret_value = -1; + char *_fname; + + _fname = H5MM_malloc(HDstrlen(fname) + 3); /* to accomodate ;* and null */ + if(_fname) { + HDstrcpy(_fname, fname); + HDstrcat(_fname,";*"); + HDremove(_fname); + H5MM_xfree(_fname); + ret_value = 0; + } + return ret_value; +} +#endif + + diff --git a/src/H5timer.c b/src/H5timer.c new file mode 100644 index 0000000..128c03f --- /dev/null +++ b/src/H5timer.c @@ -0,0 +1,248 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5timer.c + * Aug 21 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: Internal 'timer' routines & support routines. + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ + +/* We need this for the struct rusage declaration */ +#if defined(H5_HAVE_GETRUSAGE) && defined(H5_HAVE_SYS_RESOURCE_H) +# include <sys/resource.h> +#endif + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + +/*------------------------------------------------------------------------- + * Function: H5_timer_reset + * + * Purpose: Resets the timer struct to zero. Use this to reset a timer + * that's being used as an accumulator for summing times. + * + * Return: void + * + * Programmer: Robb Matzke + * Thursday, April 16, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +H5_timer_reset (H5_timer_t *timer) +{ + assert (timer); + HDmemset (timer, 0, sizeof *timer); +} /* end H5_timer_reset() */ + + +/*------------------------------------------------------------------------- + * Function: H5_timer_begin + * + * Purpose: Initialize a timer to time something. + * + * Return: void + * + * Programmer: Robb Matzke + * Thursday, April 16, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +H5_timer_begin (H5_timer_t *timer) +{ +#ifdef H5_HAVE_GETRUSAGE + struct rusage rusage; +#endif +#ifdef H5_HAVE_GETTIMEOFDAY + struct timeval etime; +#endif + + assert (timer); + +#ifdef H5_HAVE_GETRUSAGE + HDgetrusage (RUSAGE_SELF, &rusage); + timer->utime = (double)rusage.ru_utime.tv_sec + + ((double)rusage.ru_utime.tv_usec/1e6); + timer->stime = (double)rusage.ru_stime.tv_sec + + ((double)rusage.ru_stime.tv_usec/1e6); +#else + timer->utime = 0.0; + timer->stime = 0.0; +#endif +#ifdef H5_HAVE_GETTIMEOFDAY + HDgettimeofday (&etime, NULL); + timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec/1e6); +#else + timer->etime = 0.0; +#endif +} /* end H5_timer_begin() */ + + +/*------------------------------------------------------------------------- + * Function: H5_timer_end + * + * Purpose: This function should be called at the end of a timed region. + * The SUM is an optional pointer which will accumulate times. + * TMS is the same struct that was passed to H5_timer_start(). + * On return, TMS will contain total times for the timed region. + * + * Return: void + * + * Programmer: Robb Matzke + * Thursday, April 16, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +H5_timer_end (H5_timer_t *sum/*in,out*/, H5_timer_t *timer/*in,out*/) +{ + H5_timer_t now; + + assert (timer); + H5_timer_begin (&now); + + timer->utime = MAX(0.0, now.utime - timer->utime); + timer->stime = MAX(0.0, now.stime - timer->stime); + timer->etime = MAX(0.0, now.etime - timer->etime); + + if (sum) { + sum->utime += timer->utime; + sum->stime += timer->stime; + sum->etime += timer->etime; + } +} /* end H5_timer_end() */ + + +/*------------------------------------------------------------------------- + * Function: H5_bandwidth + * + * Purpose: Prints the bandwidth (bytes per second) in a field 10 + * characters wide widh four digits of precision like this: + * + * NaN If <=0 seconds + * 1234. TB/s + * 123.4 TB/s + * 12.34 GB/s + * 1.234 MB/s + * 4.000 kB/s + * 1.000 B/s + * 0.000 B/s If NBYTES==0 + * 1.2345e-10 For bandwidth less than 1 + * 6.7893e+94 For exceptionally large values + * 6.678e+106 For really big values + * + * Return: void + * + * Programmer: Robb Matzke + * Wednesday, August 5, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds) +{ + double bw; + + if (nseconds<=0.0) { + HDstrcpy(buf, " NaN"); + } else { + bw = nbytes/nseconds; + if (fabs(bw) < 0.0000000001) { + /* That is == 0.0, but direct comparison between floats is bad */ + HDstrcpy(buf, "0.000 B/s"); + } else if (bw<1.0) { + sprintf(buf, "%10.4e", bw); + } else if (bw<1024.0) { + sprintf(buf, "%05.4f", bw); + HDstrcpy(buf+5, " B/s"); + } else if (bw<1024.0*1024.0) { + sprintf(buf, "%05.4f", bw/1024.0); + HDstrcpy(buf+5, " kB/s"); + } else if (bw<1024.0*1024.0*1024.0) { + sprintf(buf, "%05.4f", bw/(1024.0*1024.0)); + HDstrcpy(buf+5, " MB/s"); + } else if (bw<1024.0*1024.0*1024.0*1024.0) { + sprintf(buf, "%05.4f", + bw/(1024.0*1024.0*1024.0)); + HDstrcpy(buf+5, " GB/s"); + } else if (bw<1024.0*1024.0*1024.0*1024.0*1024.0) { + sprintf(buf, "%05.4f", + bw/(1024.0*1024.0*1024.0*1024.0)); + HDstrcpy(buf+5, " TB/s"); + } else { + sprintf(buf, "%10.4e", bw); + if (HDstrlen(buf)>10) { + sprintf(buf, "%10.3e", bw); + } + } + } +} /* end H5_bandwidth() */ + diff --git a/src/H5trace.c b/src/H5trace.c new file mode 100644 index 0000000..f53c2eb --- /dev/null +++ b/src/H5trace.c @@ -0,0 +1,1868 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5trace.c + * Aug 21 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: Internal code for tracing API calls + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ +#define H5I_PACKAGE /*suppress error about including H5Ipkg */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Dprivate.h" /* Datasets */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5Ipkg.h" /* IDs */ +#include "H5MMprivate.h" /* Memory management */ + +#ifdef H5_HAVE_PARALLEL +/* datatypes of predefined drivers needed by H5_trace() */ +#include "H5FDmpio.h" +#endif /* H5_HAVE_PARALLEL */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + + +/*------------------------------------------------------------------------- + * Function: H5_trace + * + * Purpose: This function is called whenever an API function is called + * and tracing is turned on. If RETURNING is non-zero then + * the caller is about to return and RETURNING points to the + * time for the corresponding function call event. Otherwise + * we print the function name and the arguments. + * + * The TYPE argument is a string which gives the type of each of + * the following argument pairs. Each type is zero or more + * asterisks (one for each level of indirection, although some + * types have one level of indirection already implied) followed + * by either one letter (lower case) or two letters (first one + * uppercase). + * + * The variable argument list consists of pairs of values. Each + * pair is a string which is the formal argument name in the + * calling function, followed by the argument value. The type + * of the argument value is given by the TYPE string. + * + * Note: The TYPE string is meant to be terse and is generated by a + * separate perl script. + * + * WARNING: DO NOT CALL ANY HDF5 FUNCTION THAT CALLS FUNC_ENTER(). DOING + * SO MAY CAUSE H5_trace() TO BE INVOKED RECURSIVELY OR MAY + * CAUSE LIBRARY INITIALIZATIONS THAT ARE NOT DESIRED. + * + * Return: void + * + * Programmer: Robb Matzke + * Tuesday, June 16, 1998 + * + * Modifications: + * Robb Matzke, 1999-08-02 + * Added the `a' type letter for haddr_t arguments and `Mt' for + * H5FD_mem_t arguments. + * + * Robb Matzke, 1999-10-25 + * The `Ej' and `En' types are H5E_major_t and H5E_minor_t error + * types. We only print the integer value here. + * + * Robb Matzke, 2002-08-08 + * Better output for nested calls. Show only top-level calls + * if so desired. Show event times if so desired. + *------------------------------------------------------------------------- + */ +double +H5_trace (const double *returning, const char *func, const char *type, ...) +{ + va_list ap; + char buf[64], *rest; + const char *argname; + int argno=0, ptr, asize_idx; + hssize_t asize[16]; + hssize_t i; + void *vp = NULL; + FILE *out = H5_debug_g.trace; + H5_timer_t event_time; + static H5_timer_t first_time = {0.0, 0.0, 0.0}; + static int current_depth=0; + static int last_call_depth=0; + + /* FUNC_ENTER() should not be called */ + + if (!out) return 0.0; /*tracing is off*/ + va_start (ap, type); + + if (H5_debug_g.ttop) { + if (returning) { + if (current_depth>1) { + --current_depth; + return 0.0; + } + } else { + if (current_depth>0) { + /*do not update last_call_depth*/ + current_depth++; + return 0.0; + } + } + } + + /* Get tim for event */ + if (fabs(first_time.etime) < 0.0000000001) + /* That is == 0.0, but direct comparison between floats is bad */ + H5_timer_begin(&first_time); + if (H5_debug_g.ttimes) { + H5_timer_begin(&event_time); + } else { + HDmemset(&event_time, 0, sizeof event_time); + } + + /* Print the first part of the line. This is the indication of the + * nesting depth followed by the function name and either start of + * argument list or start of return value. If this call is for a + * function return and no other calls have been made to H5_trace() + * since the one for the function call, then we're continuing + * the same line. */ + if (returning) { + assert(current_depth>0); + --current_depth; + if (current_depth<last_call_depth) { + /* We are at the beginning of a line */ + if (H5_debug_g.ttimes) { + char tmp[128]; + sprintf(tmp, "%.6f", event_time.etime-first_time.etime); + fprintf(out, " %*s ", (int)strlen(tmp), ""); + } + for (i=0; i<current_depth; i++) + fputc('+', out); + fprintf(out, "%*s%s = ", 2*current_depth, "", func); + } else { + /* Continue current line with return value */ + fprintf(out, " = "); + } + } else { + if (current_depth>last_call_depth) + fputs(" = <delayed>\n", out); + if (H5_debug_g.ttimes) + fprintf(out, "@%.6f ", event_time.etime-first_time.etime); + for (i=0; i<current_depth; i++) + fputc('+', out); + fprintf(out, "%*s%s(", 2*current_depth, "", func); + } + + /* Clear array sizes */ + for (i=0; i<(hssize_t)NELMTS(asize); i++) asize[i] = -1; + + /* Parse the argument types */ + for (argno=0; *type; argno++, type+=HDisupper(*type)?2:1) { + /* Count levels of indirection */ + for (ptr=0; '*'==*type; type++) ptr++; + if ('['==*type) { + if ('a'==type[1]) { + asize_idx = (int)HDstrtol(type+2, &rest, 10); + assert(']'==*rest); + type = rest+1; + } else { + rest = (char *)HDstrchr(type, ']'); + assert(rest); + type = rest+1; + asize_idx = -1; + } + } else { + asize_idx = -1; + } + + /* + * The argument name. Leave off the `_id' part. If the argument + * name is the null pointer then don't print the argument or the + * following `='. This is used for return values. + */ + argname = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */ + if (argname) { + unsigned n = (unsigned)MAX (0, (int)HDstrlen(argname)-3); /*lint !e666 Allow expression with side effects */ + if (!HDstrcmp (argname+n, "_id")) { + HDstrncpy (buf, argname, (size_t)MIN ((int)sizeof(buf)-1, n)); + buf[MIN((int)sizeof(buf)-1, n)] = '\0'; + argname = buf; + } + fprintf (out, "%s%s=", argno?", ":"", argname); + } else { + argname = ""; + } + + /* The value */ + if (ptr) vp = va_arg (ap, void*); /*lint !e64 Type mismatch not really occuring */ + switch (type[0]) { + case 'a': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + haddr_t addr = va_arg(ap, haddr_t); /*lint !e732 Loss of sign not really occuring */ + HDfprintf(out, "%a", addr); + } + break; + + case 'b': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + hbool_t bool_var = va_arg (ap, hbool_t); /*lint !e732 Loss of sign not really occuring */ + if (TRUE==bool_var) fprintf (out, "TRUE"); + else if (!bool_var) fprintf (out, "FALSE"); + else fprintf (out, "TRUE(%u)", (unsigned)bool_var); + } + break; + + case 'd': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + double dbl = va_arg (ap, double); + fprintf (out, "%g", dbl); + } + break; + + case 'D': + switch (type[1]) { + case 'a': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5D_alloc_time_t alloc_time = va_arg (ap, H5D_alloc_time_t); /*lint !e64 Type mismatch not really occuring */ + switch (alloc_time) { + case H5D_ALLOC_TIME_ERROR: + fprintf (out, "H5D_ALLOC_TIME_ERROR"); + break; + case H5D_ALLOC_TIME_DEFAULT: + fprintf (out, "H5D_ALLOC_TIME_DEFAULT"); + break; + case H5D_ALLOC_TIME_EARLY: + fprintf (out, "H5D_ALLOC_TIME_EARLY"); + break; + case H5D_ALLOC_TIME_LATE: + fprintf (out, "H5D_ALLOC_TIME_LATE"); + break; + case H5D_ALLOC_TIME_INCR: + fprintf (out, "H5D_ALLOC_TIME_INCR"); + break; + } + } + break; + + case 'f': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5D_fill_time_t fill_time = va_arg (ap, H5D_fill_time_t); /*lint !e64 Type mismatch not really occuring */ + switch (fill_time) { + case H5D_FILL_TIME_ERROR: + fprintf (out, "H5D_FILL_TIME_ERROR"); + break; + case H5D_FILL_TIME_ALLOC: + fprintf (out, "H5D_FILL_TIME_ALLOC"); + break; + case H5D_FILL_TIME_NEVER: + fprintf (out, "H5D_FILL_TIME_NEVER"); + break; + case H5D_FILL_TIME_IFSET: + fprintf (out, "H5D_FILL_TIME_IFSET"); + break; + } + } + break; + + case 'F': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5D_fill_value_t fill_value = va_arg (ap, H5D_fill_value_t); /*lint !e64 Type mismatch not really occuring */ + switch (fill_value) { + case H5D_FILL_VALUE_ERROR: + fprintf (out, "H5D_FILL_VALUE_ERROR"); + break; + case H5D_FILL_VALUE_UNDEFINED: + fprintf (out, "H5D_FILL_VALUE_UNDEFINED"); + break; + case H5D_FILL_VALUE_DEFAULT: + fprintf (out, "H5D_FILL_VALUE_DEFAULT"); + break; + case H5D_FILL_VALUE_USER_DEFINED: + fprintf (out, "H5D_FILL_VALUE_USER_DEFINED"); + break; + } + } + break; + + case 'l': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5D_layout_t layout = va_arg (ap, H5D_layout_t); /*lint !e64 Type mismatch not really occuring */ + switch (layout) { + case H5D_LAYOUT_ERROR: + fprintf (out, "H5D_LAYOUT_ERROR"); + break; + case H5D_COMPACT: + fprintf (out, "H5D_COMPACT"); + break; + case H5D_CONTIGUOUS: + fprintf (out, "H5D_CONTIGUOUS"); + break; + case H5D_CHUNKED: + fprintf (out, "H5D_CHUNKED"); + break; + case H5D_NLAYOUTS: + fprintf (out, "H5D_NLAYOUTS"); + break; + default: + fprintf (out, "%ld", (long)layout); + break; + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5D_space_status_t space_status = va_arg(ap, H5D_space_status_t); /*lint !e64 Type mismatch not really occuring */ + switch (space_status) { + case H5D_SPACE_STATUS_NOT_ALLOCATED: + fprintf (out, "H5D_SPACE_STATUS_NOT_ALLOCATED"); + break; + case H5D_SPACE_STATUS_PART_ALLOCATED: + fprintf (out, "H5D_SPACE_STATUS_PART_ALLOCATED"); + break; + case H5D_SPACE_STATUS_ALLOCATED: + fprintf (out, "H5D_SPACE_STATUS_ALLOCATED"); + break; + case H5D_SPACE_STATUS_ERROR: + fprintf (out, "H5D_SPACE_STATUS_ERROR"); + break; + default: + fprintf (out, "%ld", (long)space_status); + break; + } + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5FD_mpio_xfer_t transfer = va_arg(ap, H5FD_mpio_xfer_t); /*lint !e64 Type mismatch not really occuring */ + switch (transfer) { + case H5FD_MPIO_INDEPENDENT: + fprintf (out, "H5FD_MPIO_INDEPENDENT"); + break; + case H5FD_MPIO_COLLECTIVE: + fprintf (out, "H5FD_MPIO_COLLECTIVE"); + break; + default: + fprintf (out, "%ld", (long)transfer); + break; + } + } + break; + + default: + fprintf (out, "BADTYPE(D%c)", type[1]); + goto error; + } + break; + + case 'e': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + herr_t status = va_arg (ap, herr_t); + if (status>=0) fprintf (out, "SUCCEED"); + else fprintf (out, "FAIL"); + } + break; + + case 'E': + switch (type[1]) { + case 'd': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5E_direction_t direction = va_arg (ap, H5E_direction_t); /*lint !e64 Type mismatch not really occuring */ + switch (direction) { + case H5E_WALK_UPWARD: + fprintf (out, "H5E_WALK_UPWARD"); + break; + case H5E_WALK_DOWNWARD: + fprintf (out, "H5E_WALK_DOWNWARD"); + break; + default: + fprintf (out, "%ld", (long)direction); + break; + } + } + break; + + case 'e': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5E_error_stack_t *error = va_arg (ap, H5E_error_stack_t*); /*lint !e64 Type mismatch not really occuring */ + fprintf (out, "0x%lx", (unsigned long)error); + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5E_type_t etype = va_arg (ap, H5E_type_t); /*lint !e64 Type mismatch not really occuring */ + switch (etype) { + case H5E_MAJOR: + fprintf (out, "H5E_MAJOR"); + break; + case H5E_MINOR: + fprintf (out, "H5E_MINOR"); + break; + default: + fprintf (out, "%ld", (long)etype); + break; + } + } + break; + + default: + fprintf (out, "BADTYPE(E%c)", type[1]); + goto error; + } + break; + + case 'F': + switch (type[1]) { + case 'd': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5F_close_degree_t degree = va_arg(ap, H5F_close_degree_t); /*lint !e64 Type mismatch not really occuring */ + switch (degree) { + case H5F_CLOSE_DEFAULT: + fprintf(out, "H5F_CLOSE_DEFAULT"); + break; + case H5F_CLOSE_WEAK: + fprintf(out, "H5F_CLOSE_WEAK"); + break; + case H5F_CLOSE_SEMI: + fprintf(out, "H5F_CLOSE_SEMI"); + break; + case H5F_CLOSE_STRONG: + fprintf(out, "H5F_CLOSE_STRONG"); + break; + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5F_scope_t scope = va_arg(ap, H5F_scope_t); /*lint !e64 Type mismatch not really occuring */ + switch (scope) { + case H5F_SCOPE_LOCAL: + fprintf(out, "H5F_SCOPE_LOCAL"); + break; + case H5F_SCOPE_GLOBAL: + fprintf(out, "H5F_SCOPE_GLOBAL"); + break; + case H5F_SCOPE_DOWN: + fprintf(out, "H5F_SCOPE_DOWN " + "/*FOR INTERNAL USE ONLY!*/"); + break; + } + } + break; + + default: + fprintf(out, "BADTYPE(F%c)", type[1]); + goto error; + } + break; + + case 'G': + switch (type[1]) { + case 'l': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5L_link_t link_type = va_arg (ap, H5L_link_t); /*lint !e64 Type mismatch not really occuring */ + switch (link_type) { + case H5L_LINK_ERROR: + fprintf (out, "H5L_LINK_ERROR"); + break; + case H5L_LINK_HARD: + fprintf (out, "H5L_LINK_HARD"); + break; + case H5L_LINK_SOFT: + fprintf (out, "H5L_LINK_SOFT"); + break; + default: + fprintf (out, "%ld", (long)link_type); + break; + } + } + break; + + case 'o': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5G_obj_t obj_type = va_arg (ap, H5G_obj_t); /*lint !e64 Type mismatch not really occuring */ + switch (obj_type) { + case H5G_UNKNOWN: + fprintf (out, "H5G_UNKNOWN"); + break; + case H5G_LINK: + fprintf (out, "H5G_LINK"); + break; + case H5G_UDLINK: + fprintf (out, "H5G_UDLINK"); + break; + case H5G_GROUP: + fprintf (out, "H5G_GROUP"); + break; + case H5G_DATASET: + fprintf (out, "H5G_DATASET"); + break; + case H5G_TYPE: + fprintf (out, "H5G_TYPE"); + break; + case H5G_RESERVED_5: + case H5G_RESERVED_6: + case H5G_RESERVED_7: + fprintf (out, "H5G_RESERVED(%ld)",(long)obj_type); + break; + default: + fprintf (out, "%ld", (long)obj_type); + break; + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5G_stat_t *statbuf = va_arg (ap, H5G_stat_t*); /*lint !e64 Type mismatch not really occuring */ + fprintf (out, "0x%lx", (unsigned long)statbuf); + } + break; + + default: + fprintf (out, "BADTYPE(G%c)", type[1]); + goto error; + } + break; + + case 'h': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + hsize_t *p = (hsize_t*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + if (H5S_UNLIMITED==p[i]) { + HDfprintf(out, "%sH5S_UNLIMITED", i?", ":""); + } else { + HDfprintf(out, "%s%Hu", i?", ":"", p[i]); + } + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + hsize_t hsize = va_arg (ap, hsize_t); /*lint !e732 Loss of sign not really occuring */ + if (H5S_UNLIMITED==hsize) { + HDfprintf(out, "H5S_UNLIMITED"); + } else { + HDfprintf (out, "%Hu", hsize); + asize[argno] = (hssize_t)hsize; + } + } + break; + + case 'H': + switch (type[1]) { + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + hssize_t *p = (hssize_t*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + HDfprintf(out, "%s%Hd", i?", ":"", p[i]); + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + hssize_t hssize = va_arg (ap, hssize_t); + HDfprintf (out, "%Hd", hssize); + asize[argno] = (hssize_t)hssize; + } + break; + + default: + fprintf (out, "BADTYPE(H%c)", type[1]); + goto error; + } + break; + + case 'i': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + hid_t obj = va_arg (ap, hid_t); + if (H5P_DEFAULT == obj) { + fprintf (out, "H5P_DEFAULT"); + } else if (obj<0) { + fprintf (out, "FAIL"); + } else { + switch (H5I_TYPE(obj)) { /* Use internal H5I macro instead of function call */ + case H5I_UNINIT: + fprintf (out, "%ld (uninit - error)", (long)obj); + break; + case H5I_BADID: + fprintf (out, "%ld (error)", (long)obj); + break; + case H5I_FILE: + fprintf(out, "%ld (file)", (long)obj); + break; + case H5I_GROUP: + fprintf(out, "%ld (group)", (long)obj); + break; + case H5I_DATATYPE: + if (obj==H5T_NATIVE_SCHAR_g) { + fprintf(out, "H5T_NATIVE_SCHAR"); + } else if (obj==H5T_NATIVE_UCHAR_g) { + fprintf(out, "H5T_NATIVE_UCHAR"); + } else if (obj==H5T_NATIVE_SHORT_g) { + fprintf(out, "H5T_NATIVE_SHORT"); + } else if (obj==H5T_NATIVE_USHORT_g) { + fprintf(out, "H5T_NATIVE_USHORT"); + } else if (obj==H5T_NATIVE_INT_g) { + fprintf(out, "H5T_NATIVE_INT"); + } else if (obj==H5T_NATIVE_UINT_g) { + fprintf(out, "H5T_NATIVE_UINT"); + } else if (obj==H5T_NATIVE_LONG_g) { + fprintf(out, "H5T_NATIVE_LONG"); + } else if (obj==H5T_NATIVE_ULONG_g) { + fprintf(out, "H5T_NATIVE_ULONG"); + } else if (obj==H5T_NATIVE_LLONG_g) { + fprintf(out, "H5T_NATIVE_LLONG"); + } else if (obj==H5T_NATIVE_ULLONG_g) { + fprintf(out, "H5T_NATIVE_ULLONG"); + } else if (obj==H5T_NATIVE_FLOAT_g) { + fprintf(out, "H5T_NATIVE_FLOAT"); + } else if (obj==H5T_NATIVE_DOUBLE_g) { + fprintf(out, "H5T_NATIVE_DOUBLE"); +#if H5_SIZEOF_LONG_DOUBLE !=0 + } else if (obj==H5T_NATIVE_LDOUBLE_g) { + fprintf(out, "H5T_NATIVE_LDOUBLE"); +#endif + } else if (obj==H5T_IEEE_F32BE_g) { + fprintf(out, "H5T_IEEE_F32BE"); + } else if (obj==H5T_IEEE_F32LE_g) { + fprintf(out, "H5T_IEEE_F32LE"); + } else if (obj==H5T_IEEE_F64BE_g) { + fprintf(out, "H5T_IEEE_F64BE"); + } else if (obj==H5T_IEEE_F64LE_g) { + fprintf(out, "H5T_IEEE_F64LE"); + } else if (obj==H5T_STD_I8BE_g) { + fprintf(out, "H5T_STD_I8BE"); + } else if (obj==H5T_STD_I8LE_g) { + fprintf(out, "H5T_STD_I8LE"); + } else if (obj==H5T_STD_I16BE_g) { + fprintf(out, "H5T_STD_I16BE"); + } else if (obj==H5T_STD_I16LE_g) { + fprintf(out, "H5T_STD_I16LE"); + } else if (obj==H5T_STD_I32BE_g) { + fprintf(out, "H5T_STD_I32BE"); + } else if (obj==H5T_STD_I32LE_g) { + fprintf(out, "H5T_STD_I32LE"); + } else if (obj==H5T_STD_I64BE_g) { + fprintf(out, "H5T_STD_I64BE"); + } else if (obj==H5T_STD_I64LE_g) { + fprintf(out, "H5T_STD_I64LE"); + } else if (obj==H5T_STD_U8BE_g) { + fprintf(out, "H5T_STD_U8BE"); + } else if (obj==H5T_STD_U8LE_g) { + fprintf(out, "H5T_STD_U8LE"); + } else if (obj==H5T_STD_U16BE_g) { + fprintf(out, "H5T_STD_U16BE"); + } else if (obj==H5T_STD_U16LE_g) { + fprintf(out, "H5T_STD_U16LE"); + } else if (obj==H5T_STD_U32BE_g) { + fprintf(out, "H5T_STD_U32BE"); + } else if (obj==H5T_STD_U32LE_g) { + fprintf(out, "H5T_STD_U32LE"); + } else if (obj==H5T_STD_U64BE_g) { + fprintf(out, "H5T_STD_U64BE"); + } else if (obj==H5T_STD_U64LE_g) { + fprintf(out, "H5T_STD_U64LE"); + } else if (obj==H5T_STD_B8BE_g) { + fprintf(out, "H5T_STD_B8BE"); + } else if (obj==H5T_STD_B8LE_g) { + fprintf(out, "H5T_STD_B8LE"); + } else if (obj==H5T_STD_B16BE_g) { + fprintf(out, "H5T_STD_B16BE"); + } else if (obj==H5T_STD_B16LE_g) { + fprintf(out, "H5T_STD_B16LE"); + } else if (obj==H5T_STD_B32BE_g) { + fprintf(out, "H5T_STD_B32BE"); + } else if (obj==H5T_STD_B32LE_g) { + fprintf(out, "H5T_STD_B32LE"); + } else if (obj==H5T_STD_B64BE_g) { + fprintf(out, "H5T_STD_B64BE"); + } else if (obj==H5T_STD_B64LE_g) { + fprintf(out, "H5T_STD_B64LE"); + } else if (obj==H5T_C_S1_g) { + fprintf(out, "H5T_C_S1"); + } else if (obj==H5T_FORTRAN_S1_g) { + fprintf(out, "H5T_FORTRAN_S1"); + } else { + fprintf(out, "%ld (dtype)", (long)obj); + } + break; + case H5I_DATASPACE: + fprintf(out, "%ld (dspace)", (long)obj); + /* Save the rank of simple data spaces for arrays */ + /* This may generate recursive call to the library... -QAK */ + { + H5S_t *space = H5I_object(obj); + if (H5S_SIMPLE==H5S_GET_EXTENT_TYPE(space)) { + asize[argno] = H5S_GET_EXTENT_NDIMS(space); + } + } + break; + case H5I_DATASET: + fprintf(out, "%ld (dset)", (long)obj); + break; + case H5I_ATTR: + fprintf(out, "%ld (attr)", (long)obj); + break; + case H5I_REFERENCE: + fprintf(out, "%ld (reference)", (long)obj); + break; + case H5I_VFL: + fprintf(out, "%ld (file driver)", (long)obj); + break; + case H5I_GENPROP_CLS: + fprintf(out, "%ld (genprop class)", (long)obj); + break; + case H5I_GENPROP_LST: + fprintf(out, "%ld (genprop list)", (long)obj); + break; + case H5I_ERROR_CLASS: + fprintf(out, "%ld (err class)", (long)obj); + break; + case H5I_ERROR_MSG: + fprintf(out, "%ld (err msg)", (long)obj); + break; + case H5I_ERROR_STACK: + fprintf(out, "%ld (err stack)", (long)obj); + break; + case H5I_NTYPES: + fprintf (out, "%ld (ntypes - error)", (long)obj); + break; + default: + fprintf(out, "%ld (unknown class)", (long)obj); + break; + } + } + } + break; + + case 'I': + switch (type[1]) { + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + int *p = (int*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + fprintf(out, "%s%d", i?", ":"", p[i]); + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + int is = va_arg (ap, int); + fprintf (out, "%d", is); + asize[argno] = is; + } + break; + + case 'u': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + unsigned *p = (unsigned*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + HDfprintf(out, "%s%u", i?", ":"", p[i]); + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + unsigned iu = va_arg (ap, unsigned); /*lint !e732 Loss of sign not really occuring */ + fprintf (out, "%u", iu); + asize[argno] = iu; + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5I_type_t id_type = va_arg (ap, H5I_type_t); /*lint !e64 Type mismatch not really occuring */ + switch (id_type) { + case H5I_UNINIT: + fprintf (out, "H5I_UNINIT"); + break; + case H5I_BADID: + fprintf (out, "H5I_BADID"); + break; + case H5I_FILE: + fprintf (out, "H5I_FILE"); + break; + case H5I_GROUP: + fprintf (out, "H5I_GROUP"); + break; + case H5I_DATATYPE: + fprintf (out, "H5I_DATATYPE"); + break; + case H5I_DATASPACE: + fprintf (out, "H5I_DATASPACE"); + break; + case H5I_DATASET: + fprintf (out, "H5I_DATASET"); + break; + case H5I_ATTR: + fprintf (out, "H5I_ATTR"); + break; + case H5I_REFERENCE: + fprintf (out, "H5I_REFERENCE"); + break; + case H5I_VFL: + fprintf (out, "H5I_VFL"); + break; + case H5I_GENPROP_CLS: + fprintf (out, "H5I_GENPROP_CLS"); + break; + case H5I_GENPROP_LST: + fprintf (out, "H5I_GENPROP_LST"); + break; + case H5I_ERROR_CLASS: + fprintf (out, "H5I_ERROR_CLASS"); + break; + case H5I_ERROR_MSG: + fprintf (out, "H5I_ERROR_MSG"); + break; + case H5I_ERROR_STACK: + fprintf (out, "H5I_ERROR_STACK"); + break; + case H5I_NTYPES: + fprintf (out, "H5I_NTYPES"); + break; + default: + fprintf (out, "%ld", (long)id_type); + break; + } + } + break; + + default: + fprintf (out, "BADTYPE(I%c)", type[1]); + goto error; + } + break; + + case 'M': + switch (type[1]) { + case 'c': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { +#ifdef H5_HAVE_PARALLEL + MPI_Comm comm = va_arg (ap, MPI_Comm); + fprintf (out, "%ld", (long)comm); +#endif + } + break; + case 'i': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { +#ifdef H5_HAVE_PARALLEL + MPI_Info info = va_arg (ap, MPI_Info); + fprintf (out, "%ld", (long)info); +#endif + } + break; + case 't': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5FD_mem_t mt = va_arg(ap, H5FD_mem_t); /*lint !e64 Type mismatch not really occuring */ + switch (mt) { + case H5FD_MEM_NOLIST: + fprintf(out, "H5FD_MEM_NOLIST"); + break; + case H5FD_MEM_DEFAULT: + fprintf(out, "H5FD_MEM_DEFAULT"); + break; + case H5FD_MEM_SUPER: + fprintf(out, "H5FD_MEM_SUPER"); + break; + case H5FD_MEM_BTREE: + fprintf(out, "H5FD_MEM_BTREE"); + break; + case H5FD_MEM_DRAW: + fprintf(out, "H5FD_MEM_DRAW"); + break; + case H5FD_MEM_GHEAP: + fprintf(out, "H5FD_MEM_GHEAP"); + break; + case H5FD_MEM_LHEAP: + fprintf(out, "H5FD_MEM_LHEAP"); + break; + case H5FD_MEM_OHDR: + fprintf(out, "H5FD_MEM_OHDR"); + break; + case H5FD_MEM_NTYPES: + fprintf(out, "H5FD_MEM_NTYPES"); + break; + default: + fprintf(out, "%ld", (long)mt); + break; + } + } + break; + + default: + goto error; + } + break; + + case 'o': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + off_t offset = va_arg (ap, off_t); + fprintf (out, "%ld", (long)offset); + } + break; + + case 'p': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + hid_t pclass_id = va_arg (ap, hid_t); + char *class_name=NULL; + H5P_genclass_t *pclass; + + /* Get the class name and print it */ + /* This may generate recursive call to the library... -QAK */ + if(NULL != (pclass = H5I_object(pclass_id)) && + (class_name=H5P_get_class_name(pclass))!=NULL) { + fprintf (out, class_name); + H5MM_xfree(class_name); + } /* end if */ + else { + fprintf (out, "%ld", (long)pclass_id); + } /* end else */ + } + break; + + case 'r': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + hobj_ref_t ref = va_arg (ap, hobj_ref_t); /*lint !e732 Loss of sign not really occuring */ + HDfprintf(out, "Reference Object=%a", ref); + } + break; + + case 'R': + switch (type[1]) { + case 't': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5R_type_t reftype = va_arg(ap, H5R_type_t); /*lint !e64 Type mismatch not really occuring */ + switch (reftype) { + case H5R_BADTYPE: + fprintf(out, "H5R_BADTYPE"); + break; + case H5R_OBJECT: + fprintf(out, "H5R_OBJECT"); + break; + case H5R_DATASET_REGION: + fprintf(out, "H5R_DATASET_REGION"); + break; + case H5R_INTERNAL: + fprintf(out, "H5R_INTERNAL"); + break; + case H5R_MAXTYPE: + fprintf(out, "H5R_MAXTYPE"); + break; + default: + fprintf(out, "BADTYPE(%ld)", (long)reftype); + break; + } + } + break; + + default: + fprintf(out, "BADTYPE(S%c)", type[1]); + goto error; + } + break; + + case 'S': + switch (type[1]) { + case 'c': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5S_class_t cls = va_arg(ap, H5S_class_t); /*lint !e64 Type mismatch not really occuring */ + switch (cls) { + case H5S_NO_CLASS: + fprintf(out, "H5S_NO_CLASS"); + break; + case H5S_SCALAR: + fprintf(out, "H5S_SCALAR"); + break; + case H5S_SIMPLE: + fprintf(out, "H5S_SIMPLE"); + break; + case H5S_NULL: + fprintf(out, "H5S_NULL"); + break; + default: + fprintf(out, "%ld", (long)cls); + break; + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5S_seloper_t so = va_arg(ap, H5S_seloper_t); /*lint !e64 Type mismatch not really occuring */ + switch (so) { + case H5S_SELECT_NOOP: + fprintf(out, "H5S_NOOP"); + break; + case H5S_SELECT_SET: + fprintf(out, "H5S_SELECT_SET"); + break; + case H5S_SELECT_OR: + fprintf(out, "H5S_SELECT_OR"); + break; + case H5S_SELECT_AND: + fprintf(out, "H5S_SELECT_AND"); + break; + case H5S_SELECT_XOR: + fprintf(out, "H5S_SELECT_XOR"); + break; + case H5S_SELECT_NOTB: + fprintf(out, "H5S_SELECT_NOTB"); + break; + case H5S_SELECT_NOTA: + fprintf(out, "H5S_SELECT_NOTA"); + break; + case H5S_SELECT_APPEND: + fprintf(out, "H5S_SELECT_APPEND"); + break; + case H5S_SELECT_PREPEND: + fprintf(out, "H5S_SELECT_PREPEND"); + break; + case H5S_SELECT_INVALID: + fprintf(out, "H5S_SELECT_INVALID"); + break; + default: + fprintf(out, "%ld", (long)so); + break; + } + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5S_sel_type st = va_arg(ap, H5S_sel_type); /*lint !e64 Type mismatch not really occuring */ + switch (st) { + case H5S_SEL_ERROR: + fprintf(out, "H5S_SEL_ERROR"); + break; + case H5S_SEL_NONE: + fprintf(out, "H5S_SEL_NONE"); + break; + case H5S_SEL_POINTS: + fprintf(out, "H5S_SEL_POINTS"); + break; + case H5S_SEL_HYPERSLABS: + fprintf(out, "H5S_SEL_HYPERSLABS"); + break; + case H5S_SEL_ALL: + fprintf(out, "H5S_SEL_ALL"); + break; + case H5S_SEL_N: + fprintf(out, "H5S_SEL_N"); + break; + default: + fprintf(out, "%ld", (long)st); + break; + } + } + break; + + default: + fprintf(out, "BADTYPE(S%c)", type[1]); + goto error; + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + const char *str = va_arg (ap, const char*); /*lint !e64 Type mismatch not really occuring */ + fprintf (out, "\"%s\"", str); + } + break; + + case 'T': + switch (type[1]) { + case 'c': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_cset_t cset = va_arg (ap, H5T_cset_t); /*lint !e64 Type mismatch not really occuring */ + switch (cset) { + case H5T_CSET_ERROR: + fprintf (out, "H5T_CSET_ERROR"); + break; + case H5T_CSET_ASCII: + fprintf (out, "H5T_CSET_ASCII"); + break; + case H5T_CSET_UTF8: + fprintf (out, "H5T_CSET_UTF8"); + break; + case H5T_CSET_RESERVED_2: + case H5T_CSET_RESERVED_3: + case H5T_CSET_RESERVED_4: + case H5T_CSET_RESERVED_5: + case H5T_CSET_RESERVED_6: + case H5T_CSET_RESERVED_7: + case H5T_CSET_RESERVED_8: + case H5T_CSET_RESERVED_9: + case H5T_CSET_RESERVED_10: + case H5T_CSET_RESERVED_11: + case H5T_CSET_RESERVED_12: + case H5T_CSET_RESERVED_13: + case H5T_CSET_RESERVED_14: + case H5T_CSET_RESERVED_15: + fprintf (out, "H5T_CSET_RESERVED(%ld)",(long)cset); + break; + default: + fprintf (out, "%ld", (long)cset); + break; + } + } + break; + + case 'd': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_direction_t direct = va_arg (ap, H5T_direction_t); /*lint !e64 Type mismatch not really occuring */ + switch (direct) { + case H5T_DIR_DEFAULT: + fprintf (out, "H5T_DIR_DEFAULT"); + break; + case H5T_DIR_ASCEND: + fprintf (out, "H5T_DIR_ASCEND"); + break; + case H5T_DIR_DESCEND: + fprintf (out, "H5T_DIR_DESCEND"); + break; + default: + fprintf (out, "%ld", (long)direct); + break; + } + } + break; + + case 'e': + if (ptr) { + if (vp) { + fprintf(out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_pers_t pers = va_arg(ap, H5T_pers_t); /*lint !e64 Type mismatch not really occuring */ + switch (pers) { + case H5T_PERS_DONTCARE: + fprintf(out, "H5T_PERS_DONTCARE"); + break; + case H5T_PERS_SOFT: + fprintf(out, "H5T_PERS_SOFT"); + break; + case H5T_PERS_HARD: + fprintf(out, "H5T_PERS_HARD"); + break; + default: + fprintf(out, "%ld", (long)pers); + break; + } + } + break; + + case 'n': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_norm_t norm = va_arg (ap, H5T_norm_t); /*lint !e64 Type mismatch not really occuring */ + switch (norm) { + case H5T_NORM_ERROR: + fprintf (out, "H5T_NORM_ERROR"); + break; + case H5T_NORM_IMPLIED: + fprintf (out, "H5T_NORM_IMPLIED"); + break; + case H5T_NORM_MSBSET: + fprintf (out, "H5T_NORM_MSBSET"); + break; + case H5T_NORM_NONE: + fprintf (out, "H5T_NORM_NONE"); + break; + default: + fprintf (out, "%ld", (long)norm); + break; + } + } + break; + + case 'o': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_order_t order = va_arg (ap, H5T_order_t); /*lint !e64 Type mismatch not really occuring */ + switch (order) { + case H5T_ORDER_ERROR: + fprintf (out, "H5T_ORDER_ERROR"); + break; + case H5T_ORDER_LE: + fprintf (out, "H5T_ORDER_LE"); + break; + case H5T_ORDER_BE: + fprintf (out, "H5T_ORDER_BE"); + break; + case H5T_ORDER_VAX: + fprintf (out, "H5T_ORDER_VAX"); + break; + case H5T_ORDER_NONE: + fprintf (out, "H5T_ORDER_NONE"); + break; + default: + fprintf (out, "%ld", (long)order); + break; + } + } + break; + + case 'p': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_pad_t pad = va_arg (ap, H5T_pad_t); /*lint !e64 Type mismatch not really occuring */ + switch (pad) { + case H5T_PAD_ERROR: + fprintf (out, "H5T_PAD_ERROR"); + break; + case H5T_PAD_ZERO: + fprintf (out, "H5T_PAD_ZERO"); + break; + case H5T_PAD_ONE: + fprintf (out, "H5T_PAD_ONE"); + break; + case H5T_PAD_BACKGROUND: + fprintf (out, "H5T_PAD_BACKGROUND"); + break; + case H5T_NPAD: + fprintf (out, "H5T_NPAD"); + break; + default: + fprintf (out, "%ld", (long)pad); + break; + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_sign_t sign = va_arg (ap, H5T_sign_t); /*lint !e64 Type mismatch not really occuring */ + switch (sign) { + case H5T_SGN_ERROR: + fprintf (out, "H5T_SGN_ERROR"); + break; + case H5T_SGN_NONE: + fprintf (out, "H5T_SGN_NONE"); + break; + case H5T_SGN_2: + fprintf (out, "H5T_SGN_2"); + break; + case H5T_NSGN: + fprintf (out, "H5T_NSGN"); + break; + default: + fprintf (out, "%ld", (long)sign); + break; + } + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_class_t type_class = va_arg(ap, H5T_class_t); /*lint !e64 Type mismatch not really occuring */ + switch (type_class) { + case H5T_NO_CLASS: + fprintf(out, "H5T_NO_CLASS"); + break; + case H5T_INTEGER: + fprintf(out, "H5T_INTEGER"); + break; + case H5T_FLOAT: + fprintf(out, "H5T_FLOAT"); + break; + case H5T_TIME: + fprintf(out, "H5T_TIME"); + break; + case H5T_STRING: + fprintf(out, "H5T_STRING"); + break; + case H5T_BITFIELD: + fprintf(out, "H5T_BITFIELD"); + break; + case H5T_OPAQUE: + fprintf(out, "H5T_OPAQUE"); + break; + case H5T_COMPOUND: + fprintf(out, "H5T_COMPOUND"); + break; + case H5T_REFERENCE: + fprintf(out, "H5T_REFERENCE"); + break; + case H5T_ENUM: + fprintf(out, "H5T_ENUM"); + break; + case H5T_VLEN: + fprintf(out, "H5T_VLEN"); + break; + case H5T_ARRAY: + fprintf(out, "H5T_ARRAY"); + break; + case H5T_NCLASSES: + fprintf(out, "H5T_NCLASSES"); + break; + default: + fprintf(out, "%ld", (long)type_class); + break; + } + } + break; + + case 'z': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5T_str_t str = va_arg(ap, H5T_str_t); /*lint !e64 Type mismatch not really occuring */ + switch (str) { + case H5T_STR_ERROR: + fprintf(out, "H5T_STR_ERROR"); + break; + case H5T_STR_NULLTERM: + fprintf(out, "H5T_STR_NULLTERM"); + break; + case H5T_STR_NULLPAD: + fprintf(out, "H5T_STR_NULLPAD"); + break; + case H5T_STR_SPACEPAD: + fprintf(out, "H5T_STR_SPACEPAD"); + break; + case H5T_STR_RESERVED_3: + case H5T_STR_RESERVED_4: + case H5T_STR_RESERVED_5: + case H5T_STR_RESERVED_6: + case H5T_STR_RESERVED_7: + case H5T_STR_RESERVED_8: + case H5T_STR_RESERVED_9: + case H5T_STR_RESERVED_10: + case H5T_STR_RESERVED_11: + case H5T_STR_RESERVED_12: + case H5T_STR_RESERVED_13: + case H5T_STR_RESERVED_14: + case H5T_STR_RESERVED_15: + fprintf(out, "H5T_STR_RESERVED(%ld)",(long)str); + break; + default: + fprintf(out, "%ld", (long)str); + break; + } + } + break; + + default: + fprintf (out, "BADTYPE(T%c)", type[1]); + goto error; + } + break; + + case 't': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + htri_t tri_var = va_arg (ap, htri_t); + if (tri_var>0) fprintf (out, "TRUE"); + else if (!tri_var) fprintf (out, "FALSE"); + else fprintf (out, "FAIL(%d)", (int)tri_var); + } + break; + + case 'x': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + void **p = (void**)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + if (p[i]) { + fprintf(out, "%s0x%lx", i?", ":"", + (unsigned long)(p[i])); + } else { + fprintf(out, "%sNULL", i?", ":""); + } + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + vp = va_arg (ap, void*); /*lint !e64 Type mismatch not really occuring */ + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } + break; + + case 'z': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + size_t *p = (size_t*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + HDfprintf(out, "%s%Zu", i?", ":"", p[i]); + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + size_t size = va_arg (ap, size_t); /*lint !e732 Loss of sign not really occuring */ + + HDfprintf (out, "%Zu", size); + asize[argno] = (hssize_t)size; + } + break; + + case 'Z': + switch (type[1]) { + case 'a': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5Z_SO_scale_type_t scale_type = va_arg (ap, H5Z_SO_scale_type_t); /*lint !e64 Type mismatch not really occuring */ + switch(scale_type) { + case H5Z_SO_FLOAT_DSCALE: + fprintf(out, "H5Z_SO_FLOAT_DSCALE"); + break; + case H5Z_SO_FLOAT_ESCALE: + fprintf(out, "H5Z_SO_FLOAT_ESCALE"); + break; + case H5Z_SO_INT: + fprintf(out, "H5Z_SO_INT"); + break; + default: + fprintf(out, "%ld", (long)scale_type); + break; + } + } + break; + case 'c': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5Z_class_t *filter = va_arg (ap, H5Z_class_t*); /*lint !e64 Type mismatch not really occuring */ + fprintf (out, "0x%lx", (unsigned long)filter); + } + break; + + case 'e': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5Z_EDC_t edc = va_arg (ap, H5Z_EDC_t); /*lint !e64 Type mismatch not really occuring */ + + if (H5Z_DISABLE_EDC==edc) { + fprintf (out, "H5Z_DISABLE_EDC"); + } else if (H5Z_ENABLE_EDC==edc) { + fprintf (out, "H5Z_ENABLE_EDC"); + } else { + fprintf (out, "%ld", (long)edc); + } + } + break; + + case 'f': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + } else { + fprintf(out, "NULL"); + } + } else { + H5Z_filter_t id = va_arg (ap, H5Z_filter_t); + + if (H5Z_FILTER_DEFLATE==id) { + fprintf (out, "H5Z_FILTER_DEFLATE"); + } else { + fprintf (out, "%ld", (long)id); + } + } + break; + + case 's': + if (ptr) { + if (vp) { + fprintf (out, "0x%lx", (unsigned long)vp); + if (asize_idx>=0 && asize[asize_idx]>=0) { + ssize_t *p = (ssize_t*)vp; + fprintf(out, " {"); + for (i=0; i<asize[asize_idx]; i++) { + HDfprintf(out, "%s%Zd", i?", ":"", p[i]); + } + fprintf(out, "}"); + } + } else { + fprintf(out, "NULL"); + } + } else { + ssize_t ssize = va_arg (ap, ssize_t); + + HDfprintf (out, "%Zd", ssize); + asize[argno] = (hssize_t)ssize; + } + break; + + default: + fprintf (out, "BADTYPE(Z%c)", type[1]); + goto error; + } + break; + + default: + if (HDisupper (type[0])) { + fprintf (out, "BADTYPE(%c%c)", type[0], type[1]); + } else { + fprintf (out, "BADTYPE(%c)", type[0]); + } + goto error; + } + } + + + /* Display event time for return */ + if (returning && H5_debug_g.ttimes) + fprintf(out, " @%.6f [dt=%.6f]", + event_time.etime - first_time.etime, + event_time.etime - *returning); + + error: + va_end (ap); + if (returning) { + fprintf (out, ";\n"); + } else { + last_call_depth = current_depth++; + fprintf (out, ")"); + } + HDfflush (out); + return event_time.etime; +} /* end H5_trace() */ + diff --git a/src/Makefile.am b/src/Makefile.am index 86ce039..b11a52e 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -40,7 +40,8 @@ MOSTLYCLEANFILES=H5Tinit.c DISTCLEANFILES=H5pubconf.h # library sources -libhdf5_la_SOURCES= H5.c H5dbg.c H5A.c H5AC.c H5B.c H5Bcache.c \ +libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ + H5A.c H5AC.c H5B.c H5Bcache.c \ H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \ H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \ H5Defl.c H5Dio.c H5Distore.c H5Dmpio.c H5Doh.c H5Dselect.c H5Dtest.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 6b5d981..1def45f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -82,7 +82,7 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(settingsdir)" \ libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libhdf5_la_LIBADD = -am_libhdf5_la_OBJECTS = H5.lo H5dbg.lo H5A.lo H5AC.lo H5B.lo \ +am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo H5timer.lo H5trace.lo H5A.lo H5AC.lo H5B.lo \ H5Bcache.lo H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2int.lo \ H5B2stat.lo H5B2test.lo H5C.lo H5CS.lo H5D.lo H5Dcompact.lo \ H5Dcontig.lo H5Defl.lo H5Dio.lo H5Distore.lo H5Dmpio.lo \ @@ -389,7 +389,7 @@ MOSTLYCLEANFILES = H5Tinit.c DISTCLEANFILES = H5pubconf.h # library sources -libhdf5_la_SOURCES = H5.c H5dbg.c H5A.c H5AC.c H5B.c H5Bcache.c \ +libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c H5A.c H5AC.c H5B.c H5Bcache.c \ H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \ H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \ H5Defl.c H5Dio.c H5Distore.c H5Dmpio.c H5Doh.c H5Dselect.c H5Dtest.c \ @@ -552,6 +552,10 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5system.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5timer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5trace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5A.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5AC.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B.Plo@am__quote@ diff --git a/test/Makefile.am b/test/Makefile.am index 4e7818b..1dd037f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -115,8 +115,9 @@ CHECK_CLEANFILES+=cmpd_dset.h5 compact_dataset.h5 dataset.h5 extend.h5 istore.h5 objcopy_src.h5 objcopy_dst.h5 objcopy_ext.dat # Sources for testhdf5 executable -testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tconfig.c tfile.c tgenprop.c \ - th5o.c th5s.c theap.c tid.c titerate.c tmeta.c tmisc.c ttime.c trefer.c trefstr.c \ - tselect.c tskiplist.c ttst.c tunicode.c tvltypes.c tvlstr.c +testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \ + tgenprop.c th5o.c th5s.c theap.c tid.c titerate.c tmeta.c tmisc.c ttime.c \ + trefer.c trefstr.c tselect.c tskiplist.c ttst.c tunicode.c tvltypes.c \ + tvlstr.c include $(top_srcdir)/config/conclude.am diff --git a/test/Makefile.in b/test/Makefile.in index 0d491be..58ccf99 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -290,7 +290,7 @@ stream_test_OBJECTS = stream_test.$(OBJEXT) stream_test_LDADD = $(LDADD) stream_test_DEPENDENCIES = libh5test.la $(am__DEPENDENCIES_1) am_testhdf5_OBJECTS = testhdf5.$(OBJEXT) tarray.$(OBJEXT) \ - tattr.$(OBJEXT) tconfig.$(OBJEXT) tfile.$(OBJEXT) \ + tattr.$(OBJEXT) tchecksum.$(OBJEXT) tconfig.$(OBJEXT) tfile.$(OBJEXT) \ tgenprop.$(OBJEXT) th5o.$(OBJEXT) th5s.$(OBJEXT) \ theap.$(OBJEXT) tid.$(OBJEXT) titerate.$(OBJEXT) \ tmeta.$(OBJEXT) tmisc.$(OBJEXT) ttime.$(OBJEXT) \ @@ -657,7 +657,7 @@ ttsafe_SOURCES = ttsafe.c ttsafe_dcreate.c ttsafe_error.c ttsafe_cancel.c VFD_LIST = sec2 stdio core split multi family # Sources for testhdf5 executable -testhdf5_SOURCES = testhdf5.c tarray.c tattr.c tconfig.c tfile.c tgenprop.c \ +testhdf5_SOURCES = testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c tgenprop.c \ th5o.c th5s.c theap.c tid.c titerate.c tmeta.c tmisc.c ttime.c trefer.c trefstr.c \ tselect.c tskiplist.c ttst.c tunicode.c tvltypes.c tvlstr.c @@ -958,6 +958,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tarray.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tattr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tchecksum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tconfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testframe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testhdf5.Po@am__quote@ diff --git a/test/tchecksum.c b/test/tchecksum.c new file mode 100644 index 0000000..ff49294 --- /dev/null +++ b/test/tchecksum.c @@ -0,0 +1,194 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: tchecksum.c + * Aug 21 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: Test internal checksum routine(s) + * + *------------------------------------------------------------------------- + */ + +/***********/ +/* Headers */ +/***********/ +#include "testhdf5.h" + +/**********/ +/* Macros */ +/**********/ +#define BUF_LEN 3093 /* No particular value */ + +/*******************/ +/* Local variables */ +/*******************/ +uint8_t large_buf[BUF_LEN]; + + +/**************************************************************** +** +** test_chksum_size_one(): Checksum 1 byte buffer +** +****************************************************************/ +static void +test_chksum_size_one(void) +{ + uint8_t buf[1] = {23}; /* Buffer to checksum */ + uint32_t chksum; /* Checksum value */ + + /* Buffer w/real data */ + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0x17001700, "H5_fletcher32"); + + /* Buffer w/zero(s) for data */ + HDmemset(buf, 0, sizeof(buf)); + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0xffffffff, "H5_fletcher32"); +} /* test_chksum_size_one() */ + + +/**************************************************************** +** +** test_chksum_size_two(): Checksum 2 byte buffer +** +****************************************************************/ +static void +test_chksum_size_two(void) +{ + uint8_t buf[2] = {23, 187}; /* Buffer to checksum */ + uint32_t chksum; /* Checksum value */ + + /* Buffer w/real data */ + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0x17bb17bb, "H5_fletcher32"); + + /* Buffer w/zero(s) for data */ + HDmemset(buf, 0, sizeof(buf)); + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0xffffffff, "H5_fletcher32"); +} /* test_chksum_size_two() */ + + +/**************************************************************** +** +** test_chksum_size_three(): Checksum 3 byte buffer +** +****************************************************************/ +static void +test_chksum_size_three(void) +{ + uint8_t buf[3] = {23, 187, 98}; /* Buffer to checksum */ + uint32_t chksum; /* Checksum value */ + + /* Buffer w/real data */ + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0x917679bb, "H5_fletcher32"); + + /* Buffer w/zero(s) for data */ + HDmemset(buf, 0, sizeof(buf)); + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0xffffffff, "H5_fletcher32"); +} /* test_chksum_size_three() */ + + +/**************************************************************** +** +** test_chksum_size_four(): Checksum 4 byte buffer +** +****************************************************************/ +static void +test_chksum_size_four(void) +{ + uint8_t buf[4] = {23, 187, 98, 217};/* Buffer to checksum */ + uint32_t chksum; /* Checksum value */ + + /* Buffer w/real data */ + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0x924f7a94, "H5_fletcher32"); + + /* Buffer w/zero(s) for data */ + HDmemset(buf, 0, sizeof(buf)); + chksum = H5_fletcher32(buf, sizeof(buf)); + VERIFY(chksum, 0xffffffff, "H5_fletcher32"); +} /* test_chksum_size_four() */ + + +/**************************************************************** +** +** test_chksum_large(): Checksum larger buffer +** +****************************************************************/ +static void +test_chksum_large(void) +{ + uint32_t chksum; /* Checksum value */ + size_t u; /* Local index variable */ + + /* Initialize buffer w/known data */ + for(u = 0; u < BUF_LEN; u++) + large_buf[u] = u * 3; + + /* Buffer w/real data */ + chksum = H5_fletcher32(large_buf, sizeof(large_buf)); + VERIFY(chksum, 0x85b4e2a, "H5_fletcher32"); + + /* Buffer w/zero(s) for data */ + HDmemset(large_buf, 0, sizeof(large_buf)); + chksum = H5_fletcher32(large_buf, sizeof(large_buf)); + VERIFY(chksum, 0xffffffff, "H5_fletcher32"); +} /* test_chksum_large() */ + + +/**************************************************************** +** +** test_checksum(): Main checksum testing routine. +** +****************************************************************/ +void +test_checksum(void) +{ + /* Output message about test being performed */ + MESSAGE(5, ("Testing checksum algorithm\n")); + + /* Various checks for fletcher32 checksum algorithm */ + test_chksum_size_one(); /* Test buffer w/only 1 byte */ + test_chksum_size_two(); /* Test buffer w/only 2 bytes */ + test_chksum_size_three(); /* Test buffer w/only 3 bytes */ + test_chksum_size_four(); /* Test buffer w/only 4 bytes */ + test_chksum_large(); /* Test buffer w/larger # of bytes */ + +} /* test_checksum() */ + + +/*------------------------------------------------------------------------- + * Function: cleanup_checksum + * + * Purpose: Cleanup temporary test files + * + * Return: none + * + * Programmer: Quincey Koziol + * August 21, 2006 + * + *------------------------------------------------------------------------- + */ +void +cleanup_checksum(void) +{ + /* no file to clean */ +} + diff --git a/test/testhdf5.c b/test/testhdf5.c index eadc2bd..1d5cb64 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -44,7 +44,8 @@ main(int argc, char *argv[]) /* Tests are generally arranged from least to most complexity... */ AddTest("config", test_configure, cleanup_configure, "Configure definitions", NULL); - AddTest("metadata", test_metadata, cleanup_metadata, "Encode/decode metadata code", NULL); + AddTest("metadata", test_metadata, cleanup_metadata, "Encoding/decoding metadata", NULL); + AddTest("checksum", test_checksum, cleanup_checksum, "Checksum algorithm", NULL); AddTest("tst", test_tst, NULL, "Ternary Search Trees", NULL); AddTest("heap", test_heap, NULL, "Memory Heaps", NULL); AddTest("skiplist", test_skiplist, NULL, "Skip Lists", NULL); diff --git a/test/testhdf5.h b/test/testhdf5.h index b4f1342..c085b5a 100644 --- a/test/testhdf5.h +++ b/test/testhdf5.h @@ -123,6 +123,7 @@ extern "C" { /* Prototypes for the test routines */ void test_metadata(void); +void test_checksum(void); void test_tst(void); void test_heap(void); void test_refstr(void); @@ -148,6 +149,7 @@ void test_unicode(void); /* Prototypes for the cleanup routines */ void cleanup_metadata(void); +void cleanup_checksum(void); void cleanup_file(void); void cleanup_h5o(void); void cleanup_h5s(void); @@ -168,3 +170,4 @@ void cleanup_unicode(void); } #endif #endif /* TESTHDF5_H */ + diff --git a/test/tmeta.c b/test/tmeta.c index 886ded2..ce5d65c 100644 --- a/test/tmeta.c +++ b/test/tmeta.c @@ -21,8 +21,6 @@ *************************************************************/ #include "testhdf5.h" - -#include "H5private.h" #include "H5Fprivate.h" #define TEST_INT16_VALUE -7641 @@ -65,7 +63,7 @@ test_metadata(void) uint8_t *p; /* pointer into the buffer being en/de-coded */ /* Output message about test being performed */ - MESSAGE(5, ("Testing Metadata encode/decode code\n")); + MESSAGE(5, ("Testing Metadata Encoding/decoding\n")); /* Start by encoding the values above */ p = encode_buffer; |