Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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;
}