mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
107 lines
1.8 KiB
C
107 lines
1.8 KiB
C
|
#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;
|
||
|
}
|