|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  | #include "dict.h" | 
|  |  | 
|  | /* | 
|  | * Use this to start making an index for a new dictionary. | 
|  | * Get the dictionary-specific nextoff and printentry(_,'h') | 
|  | * commands working, add a record to the dicts[] array below, | 
|  | * and run this program to get a list of offset,headword | 
|  | * pairs | 
|  | */ | 
|  | Biobuf	boutbuf; | 
|  | Biobuf	*bdict; | 
|  | Biobuf	*bout = &boutbuf; | 
|  | int	linelen; | 
|  | int	breaklen = 2000; | 
|  | int	outinhibit; | 
|  | int	debug; | 
|  |  | 
|  | Dict	*dict;	/* current dictionary */ | 
|  |  | 
|  | Entry	getentry(long); | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | int i; | 
|  | long a, ae; | 
|  | char *p; | 
|  | Entry e; | 
|  |  | 
|  | Binit(&boutbuf, 1, OWRITE); | 
|  | dict = &dicts[0]; | 
|  | ARGBEGIN { | 
|  | case 'd': | 
|  | p = ARGF(); | 
|  | dict = 0; | 
|  | if(p) { | 
|  | for(i=0; dicts[i].name; i++) | 
|  | if(strcmp(p, dicts[i].name)==0) { | 
|  | dict = &dicts[i]; | 
|  | break; | 
|  | } | 
|  | } | 
|  | if(!dict) { | 
|  | err("unknown dictionary: %s", p); | 
|  | exits("nodict"); | 
|  | } | 
|  | break; | 
|  | case 'D': | 
|  | debug++; | 
|  | break; | 
|  | ARGEND } | 
|  | USED(argc,argv); | 
|  | bdict = Bopen(dict->path, OREAD); | 
|  | ae = Bseek(bdict, 0, 2); | 
|  | if(!bdict) { | 
|  | err("can't open dictionary %s", dict->path); | 
|  | exits("nodict"); | 
|  | } | 
|  | for(a = 0; a < ae; a = (*dict->nextoff)(a+1)) { | 
|  | linelen = 0; | 
|  | e = getentry(a); | 
|  | Bprint(bout, "%ld\t", a); | 
|  | linelen = 4;	/* only has to be approx right */ | 
|  | (*dict->printentry)(e, 'h'); | 
|  | } | 
|  | exits(0); | 
|  | } | 
|  |  | 
|  | Entry | 
|  | getentry(long b) | 
|  | { | 
|  | long e, n, dtop; | 
|  | static Entry ans; | 
|  | static int anslen = 0; | 
|  |  | 
|  | e = (*dict->nextoff)(b+1); | 
|  | ans.doff = b; | 
|  | if(e < 0) { | 
|  | dtop = Bseek(bdict, 0L, 2); | 
|  | if(b < dtop) { | 
|  | e = dtop; | 
|  | } else { | 
|  | err("couldn't seek to entry"); | 
|  | ans.start = 0; | 
|  | ans.end = 0; | 
|  | } | 
|  | } | 
|  | n = e-b; | 
|  | if(n) { | 
|  | if(n > anslen) { | 
|  | ans.start = realloc(ans.start, n); | 
|  | if(!ans.start) { | 
|  | err("out of memory"); | 
|  | exits("nomem"); | 
|  | } | 
|  | anslen = n; | 
|  | } | 
|  | Bseek(bdict, b, 0); | 
|  | n = Bread(bdict, ans.start, n); | 
|  | ans.end = ans.start + n; | 
|  | } | 
|  | return ans; | 
|  | } |