Hi Andreas,
I am extremely sorry. Looks like my patch breaks little-endian.
The check I added to test for BIG_ENDIAN was evaluating to true on
little-endian machines as well.
I have modified the patch (with some additional changes which I missed
in the previous patch). Can you please review this? I have only tested this
with gcc. This patch is tested on both s390x and x86 by running sbuild
Thanks,
Pranav
diff --git a/w9/dbidx.c b/w9/dbidx.c
index b7785ea..a453bf5 100644
--- a/w9/dbidx.c
+++ b/w9/dbidx.c
@@ -41,14 +41,24 @@
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
-
+#include <stdint.h>
+
+#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) /* GCC, Clang, Open XL */
+# define HOST_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#elif defined(__BIG_ENDIAN__) /* IBM XL C */
+# define HOST_BIG_ENDIAN 1
+#elif defined(_MSC_VER) || defined(__LITTLE_ENDIAN__) /* MSVC targets are little-endian */
+# define HOST_BIG_ENDIAN 0
+#else
+# error "Cannot determine host byte order: define HOST_BIG_ENDIAN to 0 or 1"
+#endif
#define MAXLINE 1024
/* Global variables */
char dbsource[32]="";
-int Reversebytes = 1;
+int Reversebytes = !HOST_BIG_ENDIAN;
int search = 0;
int display_head = 0;
int fasta = 0;
@@ -86,7 +96,6 @@ void strcpy_noCR(char *dest, char *src)
if ((int)src[i] != 13) dest[j++] = src[i];
}
-
/* REVERSEBYTES changes order of n bytes at location ptr
max capacity 256 bytes
*/
@@ -119,14 +128,21 @@ Header *readheader(FILE *idx)
}
rewind(idx);
- if (fread(&head->file_size, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&head->file_size, 4);
- if (fread(&head->nrecords, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&head->nrecords, 4);
+ uint32_t tmp_file_size;
+ if (fread(&tmp_file_size, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_file_size, 4);
+ head->file_size = tmp_file_size;
+
+ uint32_t tmp_nrecords;
+ if (fread(&tmp_nrecords, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_nrecords, 4);
+ head->nrecords = tmp_nrecords;
- if (fread(&head->record_size, 2, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&head->record_size, 2);
+ uint16_t tmp_rec_size;
+ if (fread(&tmp_rec_size, 2, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_rec_size, 2);
+ head->record_size = tmp_rec_size;
head->entry_name_size = head->record_size - 10;
/* Each record has 10 bytes in use (ver. 1.4)*/
@@ -172,11 +188,15 @@ Acnum *readActrg(FILE *idx, Header *head, int pos)
fseek(idx, 300 + head->record_size*pos, 0);
- if (fread(&rec.nhits, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.nhits, 4);
+ uint32_t tmp_nhits;
+ if (fread(&tmp_nhits, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_nhits, 4);
+ rec.nhits = tmp_nhits;
- if (fread(&rec.hit_rec_num, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.hit_rec_num, 4);
+ uint32_t tmp_hit_rec_num;
+ if (fread(&tmp_hit_rec_num, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_hit_rec_num, 4);
+ rec.hit_rec_num = tmp_hit_rec_num;
if (fread(rec.acnum, name_size, 1, idx) != 1) return NULL;
rec.acnum[name_size] = '\0';
@@ -198,14 +218,20 @@ Entrynam *readEntrynam(FILE *idx, Header *head, int pos)
if( space = (char *)strchr(rec.entry_name, ' ') ) *space = '\0';
- if (fread(&rec.ann_offset, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.ann_offset, 4);
+ uint32_t tmp_ann_offset;
+ if (fread(&tmp_ann_offset, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_ann_offset, 4);
+ rec.ann_offset = tmp_ann_offset;
- if (fread(&rec.seq_offset, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.seq_offset, 4);
+ uint32_t tmp_seq_offset;
+ if (fread(&tmp_seq_offset, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_seq_offset, 4);
+ rec.seq_offset = tmp_seq_offset;
- if (fread(&rec.div_code, 2, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.div_code, 2);
+ uint16_t tmp_div_code;
+ if (fread(&tmp_div_code, 2, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_div_code, 2);
+ rec.div_code = tmp_div_code;
return &rec;
}
@@ -219,14 +245,20 @@ Entrynam *readnextEntrynam(FILE *idx, Header *head)
if (fread(rec.entry_name, name_size, 1, idx) != 1) return NULL;
rec.entry_name[name_size] = '\0';
- if (fread(&rec.ann_offset, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.ann_offset, 4);
+ uint32_t tmp_ann_offset;
+ if (fread(&tmp_ann_offset, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_ann_offset, 4);
+ rec.ann_offset = tmp_ann_offset;
- if (fread(&rec.seq_offset, 4, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.seq_offset, 4);
+ uint32_t tmp_seq_offset;
+ if (fread(&tmp_seq_offset, 4, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_seq_offset, 4);
+ rec.seq_offset = tmp_seq_offset;
- if (fread(&rec.div_code, 2, 1, idx) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&rec.div_code, 2);
+ uint16_t tmp_div_code;
+ if (fread(&tmp_div_code, 2, 1, idx) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_div_code, 2);
+ rec.div_code = tmp_div_code;
return &rec;
}
@@ -612,8 +644,10 @@ char *getdbfile(int div_code, char *divfile)
for (i=0; i < divhead->nrecords; i++)
{
- if (fread(&code, 2, 1, div) != 1) return NULL;
- if (Reversebytes) reversebytes((char *)&code, 2);
+ uint16_t tmp_code;
+ if (fread(&tmp_code, 2, 1, div) != 1) return NULL;
+ if (Reversebytes) reversebytes((char *)&tmp_code, 2);
+ code = tmp_code;
if (fread(name, name_size, 1, div) != 1) return NULL;
@@ -739,12 +773,14 @@ int getAcentry_rec_num(FILE *achit, Header *achithead, int offset)
offset);
exit(1);
}
- if (fread(&entry_rec_num, 4, 1, achit) != 1) {
+ uint32_t tmp;
+ if (fread(&tmp, 4, 1, achit) != 1) {
fprintf(stderr, "\nError reading ACNUM.HIT at offset %d\n", offset);
exit(1);
}
- if (Reversebytes) reversebytes((char *)&entry_rec_num, 4);
- if (display_head) printf("Entry record number: %u\n%", entry_rec_num);
+ if (Reversebytes) reversebytes((char *)&tmp, 4);
+ entry_rec_num = tmp;
+ if (display_head) printf("Entry record number: %u\n", entry_rec_num);
return (int)(entry_rec_num - 1);
}