plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

roget.c (2627B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include <ctype.h>
      5 #include "dict.h"
      6 
      7 /* Roget's Thesaurus from project Gutenberg */
      8 
      9 /* static long Last = 0; */
     10 
     11 void
     12 rogetprintentry(Entry e, int cmd)
     13 {
     14 	int spc;
     15 	char c, *p;
     16 
     17 	spc = 0;
     18 	p = e.start;
     19 
     20 	if(cmd == 'h'){
     21 		while(!isspace((uchar)*p) && p < e.end)
     22 			p++;
     23 		while(strncmp(p, " -- ", 4) != 0 && p < e.end){
     24 			while(isspace((uchar)*p) && p < e.end)
     25 				p++;
     26 			if (*p == '[' || *p == '{'){
     27 				c = (*p == '[')? ']': '}';
     28 				while(*p != c && p < e.end)
     29 					p++;
     30 				p++;
     31 				continue;
     32 			}
     33 			if (isdigit((uchar)*p) || ispunct((uchar)*p)){
     34 				while(!isspace((uchar)*p) && p < e.end)
     35 					p++;
     36 				continue;
     37 			}
     38 
     39 
     40 			if (isspace((uchar)*p))
     41 				spc = 1;
     42 			else
     43 			if (spc){
     44 				outchar(' ');
     45 				spc = 0;
     46 			}
     47 
     48 			while(!isspace((uchar)*p) && p < e.end)
     49 				outchar(*p++);
     50 		}
     51 		return;
     52 	}
     53 
     54 	while(p < e.end && !isspace((uchar)*p))
     55 		p++;
     56 	while(p < e.end && isspace((uchar)*p))
     57 		p++;
     58 
     59 	while (p < e.end){
     60 		if (p < e.end -4 && strncmp(p, " -- ", 4) == 0){	/* first line */
     61 			outnl(2);
     62 			p += 4;
     63 			spc = 0;
     64 		}
     65 
     66 		if (p < e.end -2 && strncmp(p, "[ ", 4) == 0){		/* twiddle layout */
     67 			outchars(" [");
     68 			continue;
     69 		}
     70 
     71 		if (p < e.end -4 && strncmp(p, "&c (", 4) == 0){	/* usefull xref */
     72 			if (spc)
     73 				outchar(' ');
     74 			outchar('/');
     75 			while(p < e.end && *p != '(')
     76 				p++;
     77 			p++;
     78 			while(p < e.end && *p != ')')
     79 				outchar(*p++);
     80 			p++;
     81 			while(p < e.end && isspace((uchar)*p))
     82 				p++;
     83 			while(p < e.end && isdigit((uchar)*p))
     84 				p++;
     85 			outchar('/');
     86 			continue;
     87 		}
     88 
     89 		if (p < e.end -3 && strncmp(p, "&c ", 3) == 0){		/* less usefull xref */
     90 			while(p < e.end && !isdigit((uchar)*p))
     91 				p++;
     92 			while(p < e.end && isdigit((uchar)*p))
     93 				p++;
     94 			continue;
     95 		}
     96 
     97 		if (*p == '\n' && p < (e.end -1)){			/* their newlines */
     98 			spc = 0;
     99 			p++;
    100 			if (isspace((uchar)*p)){				/* their continuation line */
    101 				while (isspace((uchar)*p))
    102 					p++;
    103 				p--;
    104 			}
    105 			else{
    106 				outnl(2);
    107 			}
    108 		}
    109 		if (spc && *p != ';' && *p != '.' &&
    110 		    *p != ',' && !isspace((uchar)*p)){				/* drop spaces before punct */
    111 			spc = 0;
    112 			outchar(' ');
    113 		}
    114 		if (isspace((uchar)*p))
    115 			spc = 1;
    116 		else
    117 			outchar(*p);
    118 		p++;
    119 	}
    120 	outnl(0);
    121 }
    122 
    123 long
    124 rogetnextoff(long fromoff)
    125 {
    126 	int i;
    127 	vlong l;
    128 	char *p;
    129 
    130 	Bseek(bdict, fromoff, 0);
    131 	Brdline(bdict, '\n');
    132 	while ((p = Brdline(bdict, '\n')) != nil){
    133 		l = Blinelen(bdict);
    134 		if (!isdigit((uchar)*p))
    135 			continue;
    136 		for (i = 0; i < l-4; i++)
    137 			if (strncmp(p+i, " -- ", 4) == 0)
    138 				return Boffset(bdict)-l;
    139 	}
    140 	return Boffset(bdict);
    141 }
    142 
    143 void
    144 rogetprintkey(void)
    145 {
    146 	Bprint(bout, "No pronunciation key.\n");
    147 }