mkindex.c (1871B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "dict.h" 5 6 /* 7 * Use this to start making an index for a new dictionary. 8 * Get the dictionary-specific nextoff and printentry(_,'h') 9 * commands working, add a record to the dicts[] array below, 10 * and run this program to get a list of offset,headword 11 * pairs 12 */ 13 Biobuf boutbuf; 14 Biobuf *bdict; 15 Biobuf *bout = &boutbuf; 16 int linelen; 17 int breaklen = 2000; 18 int outinhibit; 19 int debug; 20 21 Dict *dict; /* current dictionary */ 22 23 Entry getentry(long); 24 25 void 26 main(int argc, char **argv) 27 { 28 int i; 29 long a, ae; 30 char *p; 31 Entry e; 32 33 Binit(&boutbuf, 1, OWRITE); 34 dict = &dicts[0]; 35 ARGBEGIN { 36 case 'd': 37 p = ARGF(); 38 dict = 0; 39 if(p) { 40 for(i=0; dicts[i].name; i++) 41 if(strcmp(p, dicts[i].name)==0) { 42 dict = &dicts[i]; 43 break; 44 } 45 } 46 if(!dict) { 47 err("unknown dictionary: %s", p); 48 exits("nodict"); 49 } 50 break; 51 case 'D': 52 debug++; 53 break; 54 ARGEND } 55 USED(argc,argv); 56 bdict = Bopen(dict->path, OREAD); 57 ae = Bseek(bdict, 0, 2); 58 if(!bdict) { 59 err("can't open dictionary %s", dict->path); 60 exits("nodict"); 61 } 62 for(a = 0; a < ae; a = (*dict->nextoff)(a+1)) { 63 linelen = 0; 64 e = getentry(a); 65 Bprint(bout, "%ld\t", a); 66 linelen = 4; /* only has to be approx right */ 67 (*dict->printentry)(e, 'h'); 68 } 69 exits(0); 70 } 71 72 Entry 73 getentry(long b) 74 { 75 long e, n, dtop; 76 static Entry ans; 77 static int anslen = 0; 78 79 e = (*dict->nextoff)(b+1); 80 ans.doff = b; 81 if(e < 0) { 82 dtop = Bseek(bdict, 0L, 2); 83 if(b < dtop) { 84 e = dtop; 85 } else { 86 err("couldn't seek to entry"); 87 ans.start = 0; 88 ans.end = 0; 89 } 90 } 91 n = e-b; 92 if(n) { 93 if(n > anslen) { 94 ans.start = realloc(ans.start, n); 95 if(!ans.start) { 96 err("out of memory"); 97 exits("nomem"); 98 } 99 anslen = n; 100 } 101 Bseek(bdict, b, 0); 102 n = Bread(bdict, ans.start, n); 103 ans.end = ans.start + n; 104 } 105 return ans; 106 }