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 #include #include - +#include + +#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); }