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