| #include <u.h> | 
 | #include <libc.h> | 
 | #include <bio.h> | 
 | #include <ctype.h> | 
 | #include "dict.h" | 
 |  | 
 | /* Roget's Thesaurus from project Gutenberg */ | 
 |  | 
 | /* static long Last = 0; */ | 
 |  | 
 | void | 
 | rogetprintentry(Entry e, int cmd) | 
 | { | 
 | 	int spc; | 
 | 	char c, *p; | 
 |  | 
 | 	spc = 0; | 
 | 	p = e.start; | 
 |  | 
 | 	if(cmd == 'h'){ | 
 | 		while(!isspace((uchar)*p) && p < e.end) | 
 | 			p++; | 
 | 		while(strncmp(p, " -- ", 4) != 0 && p < e.end){ | 
 | 			while(isspace((uchar)*p) && p < e.end) | 
 | 				p++; | 
 | 			if (*p == '[' || *p == '{'){	 | 
 | 				c = (*p == '[')? ']': '}'; | 
 | 				while(*p != c && p < e.end) | 
 | 					p++; | 
 | 				p++; | 
 | 				continue; | 
 | 			} | 
 | 			if (isdigit((uchar)*p) || ispunct((uchar)*p)){ | 
 | 				while(!isspace((uchar)*p) && p < e.end) | 
 | 					p++; | 
 | 				continue; | 
 | 			} | 
 |  | 
 |  | 
 | 			if (isspace((uchar)*p)) | 
 | 				spc = 1; | 
 | 			else | 
 | 			if (spc){ | 
 | 				outchar(' '); | 
 | 				spc = 0; | 
 | 			} | 
 |  | 
 | 			while(!isspace((uchar)*p) && p < e.end) | 
 | 				outchar(*p++); | 
 | 		} | 
 | 		return; | 
 | 	}	 | 
 |  | 
 | 	while(p < e.end && !isspace((uchar)*p)) | 
 | 		p++; | 
 | 	while(p < e.end && isspace((uchar)*p)) | 
 | 		p++; | 
 |  | 
 | 	while (p < e.end){ | 
 | 		if (p < e.end -4 && strncmp(p, " -- ", 4) == 0){	/* first line */ | 
 | 			outnl(2); | 
 | 			p += 4; | 
 | 			spc = 0; | 
 | 		} | 
 | 			 | 
 | 		if (p < e.end -2 && strncmp(p, "[ ", 4) == 0){		/* twiddle layout */ | 
 | 			outchars(" ["); | 
 | 			continue; | 
 | 		} | 
 |  | 
 | 		if (p < e.end -4 && strncmp(p, "&c (", 4) == 0){	/* usefull xref */ | 
 | 			if (spc) | 
 | 				outchar(' '); | 
 | 			outchar('/'); | 
 | 			while(p < e.end && *p != '(') | 
 | 				p++; | 
 | 			p++; | 
 | 			while(p < e.end && *p != ')') | 
 | 				outchar(*p++); | 
 | 			p++; | 
 | 			while(p < e.end && isspace((uchar)*p)) | 
 | 				p++; | 
 | 			while(p < e.end && isdigit((uchar)*p)) | 
 | 				p++; | 
 | 			outchar('/'); | 
 | 			continue; | 
 | 		} | 
 |  | 
 | 		if (p < e.end -3 && strncmp(p, "&c ", 3) == 0){		/* less usefull xref */ | 
 | 			while(p < e.end && !isdigit((uchar)*p)) | 
 | 				p++; | 
 | 			while(p < e.end && isdigit((uchar)*p)) | 
 | 				p++; | 
 | 			continue; | 
 | 		} | 
 |  | 
 | 		if (*p == '\n' && p < (e.end -1)){			/* their newlines */ | 
 | 			spc = 0; | 
 | 			p++; | 
 | 			if (isspace((uchar)*p)){				/* their continuation line */ | 
 | 				while (isspace((uchar)*p)) | 
 | 					p++; | 
 | 				p--; | 
 | 			} | 
 | 			else{ | 
 | 				outnl(2); | 
 | 			} | 
 | 		} | 
 | 		if (spc && *p != ';' && *p != '.' && | 
 | 		    *p != ',' && !isspace((uchar)*p)){				/* drop spaces before punct */ | 
 | 			spc = 0; | 
 | 			outchar(' '); | 
 | 		} | 
 | 		if (isspace((uchar)*p)) | 
 | 			spc = 1; | 
 | 		else | 
 | 			outchar(*p); | 
 | 		p++; | 
 | 	} | 
 | 	outnl(0); | 
 | } | 
 |  | 
 | long | 
 | rogetnextoff(long fromoff) | 
 | { | 
 | 	int i; | 
 | 	vlong l; | 
 | 	char *p; | 
 |  | 
 | 	Bseek(bdict, fromoff, 0); | 
 | 	Brdline(bdict, '\n'); | 
 | 	while ((p = Brdline(bdict, '\n')) != nil){ | 
 | 		l = Blinelen(bdict); | 
 | 		if (!isdigit((uchar)*p)) | 
 | 			continue; | 
 | 		for (i = 0; i < l-4; i++) | 
 | 			if (strncmp(p+i, " -- ", 4) == 0) | 
 | 				return Boffset(bdict)-l; | 
 | 	} | 
 | 	return Boffset(bdict); | 
 | } | 
 |  | 
 | void | 
 | rogetprintkey(void) | 
 | { | 
 | 	Bprint(bout, "No pronunciation key.\n"); | 
 | } |