aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/hdf5-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/hdf5-file.c')
-rw-r--r--libcrystfel/src/hdf5-file.c68
1 files changed, 49 insertions, 19 deletions
diff --git a/libcrystfel/src/hdf5-file.c b/libcrystfel/src/hdf5-file.c
index 837670b9..b159327e 100644
--- a/libcrystfel/src/hdf5-file.c
+++ b/libcrystfel/src/hdf5-file.c
@@ -3,11 +3,11 @@
*
* Read/write HDF5 data files
*
- * Copyright © 2012 Deutsches Elektronen-Synchrotron DESY,
- * a research centre of the Helmholtz Association.
+ * Copyright © 2012-2015 Deutsches Elektronen-Synchrotron DESY,
+ * a research centre of the Helmholtz Association.
*
* Authors:
- * 2009-2012 Thomas White <taw@physics.org>
+ * 2009-2015 Thomas White <taw@physics.org>
* 2014 Valerio Mariani
*
* This file is part of CrystFEL.
@@ -727,18 +727,18 @@ static struct hdf5_write_location *make_location_list(struct detector *det,
for ( pi=0; pi<det->n_panels; pi++ ) {
- struct panel p;
+ struct panel *p;
const char *p_location;
- p = det->panels[pi];
+ p = &det->panels[pi];
- if ( p.data == NULL ) {
+ if ( p->data == NULL ) {
p_location = def_location;
} else {
- p_location = p.data;
+ p_location = p->data;
}
- add_panel_location(&p, p_location, pi,
+ add_panel_location(p, p_location, pi,
&locations, &num_locations);
}
@@ -1968,7 +1968,10 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
}
dh = H5Dopen2(f->fh, subst_name, H5P_DEFAULT);
- if ( dh < 0 ) return NULL;
+ if ( dh < 0 ) {
+ free(subst_name);
+ return NULL;
+ }
type = H5Dget_type(dh);
class = H5Tget_class(type);
@@ -1980,6 +1983,8 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
v = H5Tis_variable_str(type);
if ( v < 0 ) {
+ H5Tclose(type);
+ free(subst_name);
return "WTF?";
}
@@ -1988,9 +1993,13 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
r = H5Dread(dh, type, H5S_ALL, H5S_ALL,
H5P_DEFAULT, &tmp);
if ( r < 0 ) {
- tmp = NULL;
+ H5Tclose(type);
+ free(subst_name);
+ return NULL;
}
+ return tmp;
+
} else {
size = H5Tget_size(type);
@@ -1999,9 +2008,11 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
sh = H5Screate(H5S_SCALAR);
r = H5Dread(dh, type, sh, sh, H5P_DEFAULT, tmp);
+ H5Sclose(sh);
if ( r < 0 ) {
free(tmp);
- tmp = NULL;
+ free(subst_name);
+ return NULL;
} else {
/* Two possibilities:
@@ -2010,17 +2021,20 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
* Make sure things are done properly... */
tmp[size] = '\0';
chomp(tmp);
+ H5Dclose(dh);
+ free(subst_name);
+ return tmp;
}
- H5Sclose(sh);
-
}
-
} else {
int r;
+ H5Dclose(dh);
+ H5Tclose(type);
+
switch ( class ) {
case H5T_FLOAT :
@@ -2028,7 +2042,15 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
H5T_NATIVE_DOUBLE);
if ( r == 0 ) {
tmp = malloc(256);
+ if ( tmp == NULL ) {
+ ERROR("Failed to allocate float\n");
+ return NULL;
+ }
snprintf(tmp, 255, "%f", buf_f);
+ return tmp;
+ } else {
+ ERROR("Failed to read value\n");
+ return NULL;
}
break;
@@ -2037,17 +2059,25 @@ char *hdfile_get_string_value(struct hdfile *f, const char *name,
H5T_NATIVE_INT);
if ( r == 0 ) {
tmp = malloc(256);
+ if ( tmp == NULL ) {
+ ERROR("Failed to allocate int buf!\n");
+ return NULL;
+ }
snprintf(tmp, 255, "%d", buf_i);
+ return tmp;
+
+ } else {
+ ERROR("Failed to read value\n");
+ return NULL;
}
break;
+
+ default :
+ ERROR("Don't know what to do!\n");
+ return NULL;
}
}
-
- H5Tclose(type);
- H5Dclose(dh);
- free(subst_name);
- return tmp;
}