/* * Copyright © 1998 NCSA * All rights reserved. * * Programmer: Robb Matzke * Thursday, November 19, 1998 * * Purpose: Provides support functions for most of the hdf5 tests cases. * */ #undef NDEBUG /*override -DNDEBUG */ #include /* * Define these environment variables or constants to influence functions in * this test support library. The environment variable is used in preference * to the cpp constant. If neither is defined then use some default value. * * HDF5_PREFIX: A string to add to the beginning of all file names. * This can be used to tell MPIO what driver to use * (e.g., "gfs:", "ufs:", or "nfs:") or to use a * different file system (e.g., "/tmp" or "/usr/tmp"). * The prefix will be separated from the base file name * by a slash. See h5_fixname() for details. * * HDF5_DRIVER: This string describes what low level file driver to * use for HDF5 file access. The first word in the * value is the name of the driver and subsequent data * is interpreted according to the driver. See * h5_fileaccess() for details. * */ /* * These are the letters that are appended to the file name when generating * names for the split and multi drivers. They are: * * m: All meta data when using the split driver. * s: The userblock, superblock, and driver info block * b: B-tree nodes * r: Dataset raw data * g: Global heap * l: local heap (object names) * o: object headers */ static const char *multi_letters = "msbrglo"; /*------------------------------------------------------------------------- * Function: h5_errors * * Purpose: Displays the error stack after printing "*FAILED*". * * Return: Success: 0 * * Failure: -1 * * Programmer: Robb Matzke * Wednesday, March 4, 1998 * * Modifications: * *------------------------------------------------------------------------- */ herr_t h5_errors(void UNUSED *client_data) { FAILED(); H5Eprint (stdout); return 0; } /*------------------------------------------------------------------------- * Function: h5_cleanup * * Purpose: Cleanup temporary test files. The list of test files is in * `extern const char *FILENAMES[]' -- these are only the base * names. The file access property list is also closed. * * Return: Non-zero if cleanup actions were performed; zero otherwise. * * Programmer: Albert Cheng * May 28, 1998 * * Modifications: * *------------------------------------------------------------------------- */ int h5_cleanup(hid_t fapl) { char filename[1024]; char temp[2048]; int i, j; int retval=0; hid_t driver; if (!getenv("HDF5_NOCLEANUP")) { for (i=0; FILENAME[i]; i++) { if (NULL==h5_fixname(FILENAME[i], fapl, filename, sizeof filename)) { continue; } driver = H5Pget_driver(fapl); if (H5FD_FAMILY==driver) { for (j=0; /*void*/; j++) { HDsnprintf(temp, sizeof temp, filename, j); if (access(temp, F_OK)<0) break; remove(temp); } } else if (H5FD_CORE==driver) { /*void*/ } else if (H5FD_MULTI==driver) { H5FD_mem_t mt; assert(strlen(multi_letters)==H5FD_MEM_NTYPES); for (mt=0; mt=size) { return NULL; /*buffer is too small*/ } else { strcpy(fullname, base_name); } /* Append a suffix */ if ((driver=H5Pget_driver(fapl))<0) return NULL; if (H5FD_FAMILY==driver) { suffix = "%05d.h5"; } else if (H5FD_CORE==driver || H5FD_MULTI==driver) { suffix = NULL; } else { suffix = ".h5"; } if (suffix) { if (strlen(fullname)+strlen(suffix)>=size) return NULL; strcat(fullname, suffix); } return fullname; } /*------------------------------------------------------------------------- * Function: h5_fileaccess * * Purpose: Returns a file access template which is the default template * but with a file driver set according to the constant or * environment variable HDF5_DRIVER * * Return: Success: A file access property list * * Failure: -1 * * Programmer: Robb Matzke * Thursday, November 19, 1998 * * Modifications: * *------------------------------------------------------------------------- */ hid_t h5_fileaccess(void) { const char *val = NULL; const char *name; char s[1024]; hid_t fapl = -1; hsize_t fam_size = 100*1024*1024; /*100 MB*/ H5FD_mem_t mt; /* First use the environment variable, then the constant */ val = getenv("HDF5_DRIVER"); #ifdef HDF5_DRIVER if (!val) val = HDF5_DRIVER; #endif if ((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) return -1; if (!val || !*val) return fapl; /*use default*/ strncpy(s, val, sizeof s); s[sizeof(s)-1] = '\0'; if (NULL==(name=strtok(s, " \t\n\r"))) return fapl; if (!strcmp(name, "sec2")) { /* Unix read() and write() system calls */ if (H5Pset_fapl_sec2(fapl)<0) return -1; } else if (!strcmp(name, "stdio")) { /* Standard C fread() and fwrite() system calls */ if (H5Pset_fapl_stdio(fapl)<0) return -1; } else if (!strcmp(name, "core")) { /* In-core temporary file with 1MB increment */ if (H5Pset_fapl_core(fapl, 1024*1024, FALSE)<0) return -1; } else if (!strcmp(name, "split")) { /* Split meta data and raw data each using default driver */ if (H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT)<0) return -1; } else if (!strcmp(name, "multi")) { /* Multi-file driver, general case of the split driver */ H5FD_mem_t memb_map[H5FD_MEM_NTYPES]; hid_t memb_fapl[H5FD_MEM_NTYPES]; const char *memb_name[H5FD_MEM_NTYPES]; char sv[H5FD_MEM_NTYPES][1024]; haddr_t memb_addr[H5FD_MEM_NTYPES]; memset(memb_map, 0, sizeof memb_map); memset(memb_fapl, 0, sizeof memb_fapl); memset(memb_name, 0, sizeof memb_name); memset(memb_addr, 0, sizeof memb_addr); assert(strlen(multi_letters)==H5FD_MEM_NTYPES); for (mt=0; mt