1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include "dict.h"
5219b2ee8SDavid du Colombier
6219b2ee8SDavid du Colombier /*
7219b2ee8SDavid du Colombier * Use this to start making an index for a new dictionary.
8219b2ee8SDavid du Colombier * Get the dictionary-specific nextoff and printentry(_,'h')
9219b2ee8SDavid du Colombier * commands working, add a record to the dicts[] array below,
10219b2ee8SDavid du Colombier * and run this program to get a list of offset,headword
11219b2ee8SDavid du Colombier * pairs
12219b2ee8SDavid du Colombier */
13219b2ee8SDavid du Colombier Biobuf boutbuf;
14219b2ee8SDavid du Colombier Biobuf *bdict;
15219b2ee8SDavid du Colombier Biobuf *bout = &boutbuf;
16219b2ee8SDavid du Colombier int linelen;
17219b2ee8SDavid du Colombier int breaklen = 2000;
18219b2ee8SDavid du Colombier int outinhibit;
19219b2ee8SDavid du Colombier int debug;
20219b2ee8SDavid du Colombier
21219b2ee8SDavid du Colombier Dict *dict; /* current dictionary */
22219b2ee8SDavid du Colombier
23219b2ee8SDavid du Colombier Entry getentry(long);
24219b2ee8SDavid du Colombier
25219b2ee8SDavid du Colombier void
main(int argc,char ** argv)26219b2ee8SDavid du Colombier main(int argc, char **argv)
27219b2ee8SDavid du Colombier {
28219b2ee8SDavid du Colombier int i;
29*39734e7eSDavid du Colombier long a, ae;
30219b2ee8SDavid du Colombier char *p;
31219b2ee8SDavid du Colombier Entry e;
32219b2ee8SDavid du Colombier
33219b2ee8SDavid du Colombier Binit(&boutbuf, 1, OWRITE);
34219b2ee8SDavid du Colombier dict = &dicts[0];
35219b2ee8SDavid du Colombier ARGBEGIN {
36219b2ee8SDavid du Colombier case 'd':
37219b2ee8SDavid du Colombier p = ARGF();
38219b2ee8SDavid du Colombier dict = 0;
39219b2ee8SDavid du Colombier if(p) {
40219b2ee8SDavid du Colombier for(i=0; dicts[i].name; i++)
41219b2ee8SDavid du Colombier if(strcmp(p, dicts[i].name)==0) {
42219b2ee8SDavid du Colombier dict = &dicts[i];
43219b2ee8SDavid du Colombier break;
44219b2ee8SDavid du Colombier }
45219b2ee8SDavid du Colombier }
46219b2ee8SDavid du Colombier if(!dict) {
47219b2ee8SDavid du Colombier err("unknown dictionary: %s", p);
48219b2ee8SDavid du Colombier exits("nodict");
49219b2ee8SDavid du Colombier }
50219b2ee8SDavid du Colombier break;
51219b2ee8SDavid du Colombier case 'D':
52219b2ee8SDavid du Colombier debug++;
53219b2ee8SDavid du Colombier break;
54219b2ee8SDavid du Colombier ARGEND }
55219b2ee8SDavid du Colombier USED(argc,argv);
56219b2ee8SDavid du Colombier bdict = Bopen(dict->path, OREAD);
57*39734e7eSDavid du Colombier ae = Bseek(bdict, 0, 2);
58219b2ee8SDavid du Colombier if(!bdict) {
59219b2ee8SDavid du Colombier err("can't open dictionary %s", dict->path);
60219b2ee8SDavid du Colombier exits("nodict");
61219b2ee8SDavid du Colombier }
62*39734e7eSDavid du Colombier for(a = 0; a < ae; a = (*dict->nextoff)(a+1)) {
63219b2ee8SDavid du Colombier linelen = 0;
64219b2ee8SDavid du Colombier e = getentry(a);
65219b2ee8SDavid du Colombier Bprint(bout, "%ld\t", a);
66219b2ee8SDavid du Colombier linelen = 4; /* only has to be approx right */
67219b2ee8SDavid du Colombier (*dict->printentry)(e, 'h');
68219b2ee8SDavid du Colombier }
69219b2ee8SDavid du Colombier exits(0);
70219b2ee8SDavid du Colombier }
71219b2ee8SDavid du Colombier
72219b2ee8SDavid du Colombier Entry
getentry(long b)73219b2ee8SDavid du Colombier getentry(long b)
74219b2ee8SDavid du Colombier {
75219b2ee8SDavid du Colombier long e, n, dtop;
76219b2ee8SDavid du Colombier static Entry ans;
77219b2ee8SDavid du Colombier static int anslen = 0;
78219b2ee8SDavid du Colombier
79219b2ee8SDavid du Colombier e = (*dict->nextoff)(b+1);
80219b2ee8SDavid du Colombier ans.doff = b;
81219b2ee8SDavid du Colombier if(e < 0) {
82219b2ee8SDavid du Colombier dtop = Bseek(bdict, 0L, 2);
83219b2ee8SDavid du Colombier if(b < dtop) {
84219b2ee8SDavid du Colombier e = dtop;
85219b2ee8SDavid du Colombier } else {
86219b2ee8SDavid du Colombier err("couldn't seek to entry");
87219b2ee8SDavid du Colombier ans.start = 0;
88219b2ee8SDavid du Colombier ans.end = 0;
89219b2ee8SDavid du Colombier }
90219b2ee8SDavid du Colombier }
91219b2ee8SDavid du Colombier n = e-b;
92219b2ee8SDavid du Colombier if(n) {
93219b2ee8SDavid du Colombier if(n > anslen) {
94219b2ee8SDavid du Colombier ans.start = realloc(ans.start, n);
95219b2ee8SDavid du Colombier if(!ans.start) {
96219b2ee8SDavid du Colombier err("out of memory");
97219b2ee8SDavid du Colombier exits("nomem");
98219b2ee8SDavid du Colombier }
99219b2ee8SDavid du Colombier anslen = n;
100219b2ee8SDavid du Colombier }
101219b2ee8SDavid du Colombier Bseek(bdict, b, 0);
102219b2ee8SDavid du Colombier n = Bread(bdict, ans.start, n);
103219b2ee8SDavid du Colombier ans.end = ans.start + n;
104219b2ee8SDavid du Colombier }
105219b2ee8SDavid du Colombier return ans;
106219b2ee8SDavid du Colombier }
107