|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "cbt.h" ! 3: ! 4: /* like btbuild, but random access */ ! 5: char keybuf[NDSZ]; ! 6: char recbuf[32767]; ! 7: mbuf key = { keybuf, 0}; ! 8: mbuf rec = { recbuf, 0}; ! 9: bfile *bf; ! 10: int rflag; ! 11: ! 12: main(argc, argv) ! 13: char **argv; ! 14: { int n; ! 15: if(argv[1][0] == '-') { ! 16: rflag++; ! 17: argc--; ! 18: argv++; ! 19: } ! 20: if(argc != 2) { ! 21: fprintf(stderr, "usage: btlook bfile < recs\n"); ! 22: exit(1); ! 23: } ! 24: if((bf = bopen(argv[1], 0)) == NULL) { ! 25: perror(argv[1]); ! 26: exit(1); ! 27: } ! 28: for(;;) { ! 29: if(rflag) ! 30: getrkey(); ! 31: else ! 32: getakey(); ! 33: if(bseek(bf, key) != 1) { ! 34: fprintf(stderr, "not found:%s:\n",key.mdata); ! 35: continue; ! 36: } ! 37: if(bread(bf, 0, &rec) != 0) { ! 38: fprintf(stderr, "vanished:%s:\n", key.mdata); ! 39: abort(); ! 40: } ! 41: if(rec.mlen >= sizeof(recbuf)) { ! 42: fprintf(stderr, "rec len %ud: recompile btlook\n", ! 43: rec.mlen); ! 44: abort(); ! 45: } ! 46: rec.mdata[rec.mlen] = 0; ! 47: if(rflag) { ! 48: put(2, &key.mlen); ! 49: put(key.mlen, key.mdata); ! 50: put(2, &rec.mlen); ! 51: put(rec.mlen, rec.mdata); ! 52: } else ! 53: printf("%s %s\n", key.mdata, rec.mdata); ! 54: } ! 55: } ! 56: ! 57: get(n, s) ! 58: char *s; ! 59: { int m; ! 60: for(m = 0; n > 0; n -= m) { ! 61: m = read(0, s, n); ! 62: if(m == 0) { ! 63: bclose(bf); ! 64: exit(0); ! 65: } ! 66: if(m < 0) { ! 67: fprintf(stderr, "btlook: io error\n"); ! 68: abort(); ! 69: } ! 70: s += m; ! 71: } ! 72: } ! 73: ! 74: put(n, s) ! 75: char *s; ! 76: { ! 77: if(fwrite(s, 1, n, stdout) != n) { ! 78: fprintf(stderr, "btlook: io error\n"); ! 79: abort(); ! 80: } ! 81: } ! 82: ! 83: getrkey() ! 84: { ! 85: get(2, (char *)&key.mlen); ! 86: if(key.mlen >= sizeof(keybuf)) { ! 87: fprintf(stderr, "key too long\n"); ! 88: exit(1); ! 89: } ! 90: get(key.mlen, key.mdata); ! 91: key.mdata[key.mlen] = 0; ! 92: get(2, (char *)&rec.mlen); ! 93: if(rec.mlen >= sizeof(recbuf)) { ! 94: fprintf(stderr, "rec len %ud: recompile btlook\n", rec.mlen); ! 95: abort(); ! 96: } ! 97: get(rec.mlen, rec.mdata); ! 98: } ! 99: ! 100: getakey() ! 101: { ! 102: int c; ! 103: char *s; ! 104: for(s=key.mdata;;s++) { ! 105: c = getchar(); ! 106: switch(c) { ! 107: case EOF: ! 108: exit(0); ! 109: case '\t': ! 110: for(;;) { ! 111: switch(getchar()) { ! 112: case EOF: ! 113: exit(0); ! 114: case '\n': ! 115: goto out; ! 116: } ! 117: } ! 118: case '\n': ! 119: goto out; ! 120: default: ! 121: *s = c; ! 122: } ! 123: } ! 124: out: ! 125: *s = 0; ! 126: key.mlen = s - key.mdata; ! 127: if(key.mlen >= sizeof(keybuf)) { ! 128: fprintf(stderr, "key too long:%s:\n", key.mdata); ! 129: abort(); ! 130: } ! 131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.