qbits.c (2037B)
1 #include <u.h> 2 #include <libc.h> 3 #include <libg.h> 4 #include <bio.h> 5 #include "hdr.h" 6 7 /* quwei encoding for gb */ 8 9 Bitmap * 10 qreadbits(char *file, int n, long *chars, int size, uchar *bits, int **doneptr) 11 { 12 Bitmap *bm; 13 Biobuf *bf; 14 char *p; 15 long kmin, kmax; 16 int i, j, byt; 17 int nch; 18 long c; 19 uchar *b; 20 int *done; 21 uchar *nbits; 22 static int dig[256] = { 23 ['0'] 0, ['1'] 1, ['2'] 2, ['3'] 3, ['4'] 4, ['5'] 5, ['6'] 6, ['7'] 7, 24 ['8'] 8, ['9'] 9, ['a'] 10, ['b'] 11, ['c'] 12, ['d'] 13, ['e'] 14, ['f'] 15, 25 }; 26 27 bf = Bopen(file, OREAD); 28 if(bf == 0){ 29 fprint(2, "%s: %s: %r\n", argv0, file); 30 exits("bitfile open error"); 31 } 32 done = (int *)malloc(n*sizeof(done[0])); 33 if(done == 0){ 34 fprint(2, "%s: malloc error (%d bytes)\n", argv0, n); 35 exits("malloc error"); 36 } 37 *doneptr = done; 38 memset(done, 0, n*sizeof(done[0])); 39 kmin = 65536; 40 kmax = 0; 41 for(i = 0; i < n; i++){ 42 c = chars[i]; 43 if(kmin > c) 44 kmin = c; 45 if(kmax < c) 46 kmax = c; 47 } 48 nch = 0; 49 byt = size/8; 50 while(p = (char *)Brdline(bf, '\n')){ 51 c = (p[0]-'0')*1000 + (p[1]-'0')*100 + (p[2]-'0')*10 + (p[3]-'0'); 52 if((c < kmin) || (c > kmax)) 53 continue; 54 for(i = 0; i < n; i++) 55 if(c == chars[i]){ 56 nch++; 57 done[i] = 1; 58 p += 5; 59 b = bits + i*byt; 60 for(i = 0; i < size; i++){ /* rows */ 61 for(j = 0; j < byt; j++){ 62 *b++ = (dig[*p]<<4) | dig[p[1]]; 63 p += 2; 64 } 65 b += (n-1)*byt; 66 } 67 break; 68 } 69 } 70 nbits = (uchar *)malloc(nch*byt*size); 71 if(nbits == 0){ 72 fprint(2, "%s: malloc error (%d bytes)\n", argv0, nch*byt); 73 exits("malloc error"); 74 } 75 c = 0; 76 for(i = 0; i < n; i++) 77 if(done[i]){ 78 for(j = 0; j < size; j++) 79 memmove(nbits+c*byt+j*nch*byt, bits+i*byt+j*n*byt, byt); 80 c++; 81 } 82 bm = balloc((Rectangle){(Point){0, 0}, (Point){nch*size, size}}, 0); 83 if(bm == 0){ 84 fprint(2, "%s: balloc failure\n", argv0); 85 exits("balloc failure"); 86 } 87 wrbitmap(bm, 0, size, nbits); 88 for(i = 0; i < n; i++) 89 if(done[i] == 0){ 90 /*fprint(2, "char 0x%x (%d) not found\n", chars[i], chars[i]);/**/ 91 } 92 return(bm); 93 }