From 0dfd67ec89b005759fea0d986e47fd7173caaa49 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Mon, 10 Oct 2016 17:04:29 +0200 Subject: [PATCH] The endianness of binary taxonomy files is now correctly checked --- src/obidms_taxonomy.c | 73 +++++++++++++++++++++++++++---------------- src/obidms_taxonomy.h | 4 +++ 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/obidms_taxonomy.c b/src/obidms_taxonomy.c index 925dab2..91249e4 100644 --- a/src/obidms_taxonomy.c +++ b/src/obidms_taxonomy.c @@ -18,6 +18,7 @@ #include "obidms_taxonomy.h" #include "obidms.h" +#include "obilittlebigman.h" // TODO the function from this checking the endianness does not seem to work properly #include "obidebug.h" #include "obierrno.h" #include "utils.h" @@ -25,7 +26,23 @@ #define DEBUG_LEVEL 0 // TODO has to be defined somewhere else (cython compil flag?) -// TODO : the malloc aren't checked but won't exist for long because mapping instead +// TODO : the malloc aren't checked but shouldn't exist for long because mapping instead +// error checking and file closing in general aren't done properly yet +// The endianness eventually shouldn't need checking too, as the machine will write the taxonomy with its endianness. + + +int32_t is_big_endian() +{ + int32_t i=1; + + return (int32_t)((char*)&i)[0]; +} + + +int32_t swap_int32_t(int32_t i) +{ + return SWAPINT32(i); +} int compareRankLabel(const void *label1, const void *label2) @@ -61,22 +78,23 @@ void* read_ecorecord(FILE* f, int32_t* record_size) } read = fread(record_size, - 1, sizeof(int32_t), + 1, f); if (feof(f)) return NULL; - if (read != sizeof(int32_t)) + if (read != 1) { obi_set_errno(OBI_TAXONOMY_ERROR); obidebug(1, "\nError reading a taxonomy file: error reading record size"); return NULL; } -// if (is_big_endian()) // TODO -// *recordSize=swap_int32_t(*recordSize); +// if (!(obi_is_little_endian())) // TODO + if (is_big_endian()) + *record_size=swap_int32_t(*record_size); if (buffer_size < *record_size) { @@ -93,11 +111,11 @@ void* read_ecorecord(FILE* f, int32_t* record_size) } read = fread(buffer, - 1, *record_size, + 1, f); - if (read != *record_size) + if (read != 1) { obi_set_errno(OBI_TAXONOMY_ERROR); obidebug(1, "\nError reading a taxonomy file: error reading a record %d, %d", read, *record_size); @@ -118,13 +136,14 @@ ecotx_t* readnext_ecotaxon(FILE* f, ecotx_t* taxon) if (!raw) return NULL; -// if (is_big_endian()) // TODO -// { -// raw->namelength = swap_int32_t(raw->namelength); -// raw->parent = swap_int32_t(raw->parent); -// raw->rank = swap_int32_t(raw->rank); -// raw->taxid = swap_int32_t(raw->taxid); -// } +// if (!(obi_is_little_endian())) // TODO + if (is_big_endian()) + { + raw->name_length = swap_int32_t(raw->name_length); + raw->parent = swap_int32_t(raw->parent); + raw->rank = swap_int32_t(raw->rank); + raw->taxid = swap_int32_t(raw->taxid); + } taxon->parent = (ecotx_t*) ((size_t) raw->parent); taxon->taxid = raw->taxid; @@ -146,8 +165,6 @@ FILE* open_ecorecorddb(const char* file_name, FILE* f; int32_t read; - fprintf(stderr, "\n%s\n", file_name); - f = fopen(file_name, "rb"); if (!f) @@ -166,19 +183,20 @@ FILE* open_ecorecorddb(const char* file_name, } read = fread(count, - 1, sizeof(int32_t), + 1, f); - if (read != sizeof(int32_t)) + if (read != 1) { obi_set_errno(OBI_TAXONOMY_ERROR); obidebug(1, "\nError reading taxonomy record size"); return NULL; } -// if (!obi_is_little_endian()) // TODO -// *count = swap_int32_t(*count); +// if (!(obi_is_little_endian())) // TODO + if (is_big_endian()) + *count = swap_int32_t(*count); return f; } @@ -302,13 +320,14 @@ econame_t* readnext_econame(FILE* f, econame_t* name, OBIDMS_taxonomy_p taxonomy if (!raw) return NULL; -// if (is_big_endian()) // TODO -// { -// raw->is_scientificname = swap_int32_t(raw->is_scientificname); -// raw->namelength = swap_int32_t(raw->namelength); -// raw->classlength = swap_int32_t(raw->classlength); -// raw->taxid = swap_int32_t(raw->taxid); -// } +// if (!(obi_is_little_endian())) // TODO + if (is_big_endian()) + { + raw->is_scientific_name = swap_int32_t(raw->is_scientific_name); + raw->name_length = swap_int32_t(raw->name_length); + raw->class_length = swap_int32_t(raw->class_length); + raw->taxid = swap_int32_t(raw->taxid); + } name->is_scientific_name = raw->is_scientific_name; diff --git a/src/obidms_taxonomy.h b/src/obidms_taxonomy.h index fd8a510..ba63feb 100644 --- a/src/obidms_taxonomy.h +++ b/src/obidms_taxonomy.h @@ -17,6 +17,10 @@ #include "obidms.h" +#define SWAPINT32(x) ((((x) << 24) & 0xFF000000) | (((x) << 8) & 0xFF0000) | \ + (((x) >> 8) & 0xFF00) | (((x) >> 24) & 0xFF)) + + typedef struct { int32_t taxid; int32_t rank;