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);
 }
 

Reply via email to