Blame


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