Next version of JABA
[jabaws.git] / binaries / src / fasta34 / list_db.c
1 /* list_db.c - report values from map_db.c  */
2
3 /* copyright (c) 1999 William R. Pearson */
4
5 /* format of the index file:
6
7 1)  map_db version number ["MP"+2 bytes]
8 2)  number of sequences in database [4 bytes]
9 3)  total length of database        [8 bytes]
10 4)  longest sequence in database    [8 bytes]
11 5) list of offsets to definitions  [num_seq+1] int*8
12 6) list of offsets to sequences    [num_seq+1] int*8
13 7) list of flag characters for sequences [num_seq+1] bytes
14     (used for GCG binary to encode 2bit or 4 bit representation)
15
16     sequence files will be as defined by their format
17 */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22
23 #include "uascii.h"
24 #include "ncbl2_head.h"
25
26 void src_int4_write(FILE *, int);
27 void src_int4_read(FILE *, int *);
28 void src_long4_read(FILE *, long *);
29 void src_long8_write(FILE *, long);
30 void src_long8_read(FILE *, long *);
31
32 void newname(char *nname, char *oname, char *suff, int maxn);
33
34 main(int argc, char **argv)
35 {
36   FILE *libi;
37   char lname[256];
38   char iname[256];
39   char format[4];
40   char *bp;
41
42   int i;
43   int d_pos;    /* start of description */
44   int s_pos;    /* start of sequence */
45   int attr;     /* sequence attribute */
46   int lib_aa;   /* 0 => DNA, 1 => protein */
47   int nlib;     /* number of entries */
48   long f_size;
49   long max_len; /* longest sequence */
50   long tot_len; /* total sequence length */
51   int n1;
52   
53   int lib_size; /* current space available - may be realloc'ed */
54   int lib_inc;
55   int lib_type; /* 1 for protein, 0 for DNA */
56   int lib_dna;  /* dna=1; prot=0; */
57   long *d_pos_arr;      /* array of description pointers */
58   long *s_pos_arr;      /* array of description pointers */
59   char *attr_arr;       /* array of attribute chars */
60
61   int mm64_flag;
62
63   lib_type = 0;
64   lib_dna = 0;
65
66   /* open the database */
67   if (argc > 1) strncpy(lname, argv[1],sizeof(lname));
68   else {
69     fprintf(stderr," Entry library name: ");
70     fgets(lname,sizeof(lname),stdin);
71     if ((bp=strchr(lname,'\n'))!=NULL) *bp='\0';
72   }
73     
74   if ((bp=strchr(lname,' '))!=NULL) {
75     lib_type = atoi(bp+1);
76     *bp='\0';
77   }
78   else lib_type = 0;
79
80   newname(iname,lname,"xin",sizeof(iname));
81
82   if ((libi=fopen(iname,"r"))==NULL) {
83     fprintf(stderr," cannot open %s\n",iname);
84     exit(1);
85   }
86
87   fread(format,1,sizeof(format),libi);
88   printf("%c%c%d %d\n",format[0],format[1],format[2],format[3]);
89   mm64_flag = (format[2]==1);
90
91   src_int4_read(libi,&lib_aa);
92
93   if (mm64_flag) src_long8_read(libi,&f_size);
94   else src_long4_read(libi,&f_size);
95
96   src_int4_read(libi,&nlib);
97
98   if (mm64_flag) {
99     src_long8_read(libi,&tot_len);
100     src_long8_read(libi,&max_len);
101   }
102   else {
103     src_long4_read(libi,&tot_len);
104     src_long4_read(libi,&max_len);
105   }
106
107   printf(" %d entries; tot: %ld; max: %ld\n",nlib,tot_len,max_len);
108
109   /* allocate array of description pointers */
110   if ((d_pos_arr=(long *)calloc(nlib+1, sizeof(long)))==NULL) {
111     fprintf(stderr," cannot allocate %d for desc. array\n",nlib+1);
112     exit(1);
113   }
114   /* allocate array of sequence pointers */
115   if ((s_pos_arr=(long *)calloc(nlib+1, sizeof(long)))==NULL) {
116     fprintf(stderr," cannot allocate %d for seq. array\n",nlib+1);
117     exit(1);
118   }
119   if ((attr_arr=(char *)calloc(nlib+1, sizeof(char)))==NULL) {
120     fprintf(stderr," cannot allocate %d for attr. array\n",nlib+1);
121     exit(1);
122   }
123   
124   if (mm64_flag) {
125     for (i=0; i<=nlib; i++) src_long8_read(libi,&d_pos_arr[i]);
126     for (i=0; i<=nlib; i++) src_long8_read(libi,&s_pos_arr[i]);
127   }
128   else {
129     for (i=0; i<=nlib; i++) src_long4_read(libi,&d_pos_arr[i]);
130     for (i=0; i<=nlib; i++) src_long4_read(libi,&s_pos_arr[i]);
131   }
132
133   fread(attr_arr,nlib+1,sizeof(char),libi);
134   fclose(libi);
135
136   printf("header\tseq\n");
137
138   for (i=0; i<nlib; i++) printf("%ld\t%ld\n",d_pos_arr[i],s_pos_arr[i]);
139 }
140
141 void src_int4_read(FILE *fd,  int *val)
142 {
143   int tval;
144 #ifdef IS_BIG_ENDIAN
145   fread(&tval,(size_t)4,(size_t)1,fd);
146   *val = tval;
147 #else
148   unsigned char b[4];
149
150   fread((char *)&b[0],(size_t)1,(size_t)4,fd);
151   *val = 0;
152   *val = (int)((int)((int)(b[0]<<8)+(int)b[1]<<8)+(int)b[2]<<8)
153           +(int)b[3];
154 #endif
155 }
156
157 void src_long4_read(FILE *fd,  long *val)
158 {
159   int tval;
160 #ifdef IS_BIG_ENDIAN
161   fread(&tval,(size_t)4,(size_t)1,fd);
162   *val = tval;
163 #else
164   unsigned char b[4];
165
166   fread((char *)&b[0],(size_t)1,(size_t)4,fd);
167   *val = 0;
168   *val = (int)((int)((int)(b[0]<<8)+(int)b[1]<<8)+(int)b[2]<<8)
169           +(int)b[3];
170 #endif
171 }
172
173 void src_long8_read(FILE *fd,  long *val)
174 {
175 #ifdef IS_BIG_ENDIAN
176   fread((char *)val,(size_t)8,(size_t)1,fd);
177 #else
178   unsigned char b[8];
179
180   fread((char *)&b[0],(size_t)1,(size_t)8,fd);
181   *val = 0;
182   *val = (int)
183     ((((((((int)b[0]<<8)+(int)b[1]<<8)+(int)b[2]<<8)+(int)b[3]<<8)+
184                 (int)b[4]<<8)+(int)b[5]<<8)+(int)b[6]<<8)+(int)b[7];
185 #endif
186 }
187
188 void src_int4_write(FILE *fd,  int val)
189 {
190 #ifdef IS_BIG_ENDIAN
191   fwrite(&val,(size_t)4,(size_t)1,fd);
192 #else
193   unsigned char b[4];
194
195   b[3] = val & 255;
196   b[2] = (val=val>>8)&255;
197   b[1] = (val=val>>8)&255;
198   b[0] = (val=val>>8)&255;
199
200   fwrite(b,(size_t)1,(size_t)4,fd);
201 #endif
202 }
203
204 void
205 newname(char *nname, char *oname, char *suff, int maxn)
206 {
207   strncpy(nname,oname,maxn-1);
208   strncat(nname,".",1);
209   strncat(nname,suff,maxn-strlen(nname));
210 }