123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include "dict.h"
- /*
- * American Heritage Dictionary (encrypted)
- */
- static Rune intab[256] = {
- [0x82] L'é',
- [0x85] L'à',
- [0x89] L'ë',
- [0x8a] L'è',
- [0xa4] L'ñ',
- [0xf8] L'°',
- [0xf9] L'·',
- };
- static char tag[64];
- enum{
- Run, Openper, Openat, Closeat
- };
- void
- ahdprintentry(Entry e, int cmd)
- {
- static int inited;
- long addr;
- char *p, *t = tag;
- int obreaklen;
- int c, state = Run;
- if(!inited){
- for(c=0; c<256; c++)
- if(intab[c] == 0)
- intab[c] = c;
- inited = 1;
- }
- obreaklen = breaklen;
- breaklen = 80;
- addr = e.doff;
- for(p=e.start; p<e.end; p++){
- c = intab[(*p ^ (addr++>>1))&0xff];
- switch(state){
- case Run:
- if(c == '%'){
- t = tag;
- state = Openper;
- break;
- }
- Putchar:
- if(c == '\n')
- outnl(0);
- else if(c < Runeself)
- outchar(c);
- else
- outrune(c);
- break;
- case Openper:
- if(c == '@')
- state = Openat;
- else{
- outchar('%');
- state = Run;
- goto Putchar;
- }
- break;
- case Openat:
- if(c == '@')
- state = Closeat;
- else if(t < &tag[sizeof tag-1])
- *t++ = c;
- break;
- case Closeat:
- if(c == '%'){
- *t = 0;
- switch(cmd){
- case 'h':
- if(strcmp("EH", tag) == 0)
- goto out;
- break;
- case 'r':
- outprint("%%@%s@%%", tag);
- break;
- }
- state = Run;
- }else{
- if(t < &tag[sizeof tag-1])
- *t++ = '@';
- if(t < &tag[sizeof tag-1])
- *t++ = c;
- state = Openat;
- }
- break;
- }
- }
- out:
- outnl(0);
- breaklen = obreaklen;
- }
- long
- ahdnextoff(long fromoff)
- {
- static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
- int c, k = 0, state = 0;
- char *pat = patterns[0];
- long defoff = -1;
- if(Bseek(bdict, fromoff, 0) < 0)
- return -1;
- while((c = Bgetc(bdict)) >= 0){
- c ^= (fromoff++>>1)&0xff;
- if(c != pat[state]){
- state = 0;
- continue;
- }
- if(pat[++state])
- continue;
- if(pat = patterns[++k]){ /* assign = */
- state = 0;
- defoff = fromoff-6;
- continue;
- }
- return fromoff-5;
- }
- return defoff;
- }
- void
- ahdprintkey(void)
- {
- Bprint(bout, "No pronunciations.\n");
- }
|