xref: /plan9/sys/src/cmd/dict/mkindex.c (revision 39734e7ed1eb944f5e7b41936007d0d38b560d7f)
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