aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/dict/roget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/dict/roget.c')
-rw-r--r--src/cmd/dict/roget.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/cmd/dict/roget.c b/src/cmd/dict/roget.c
new file mode 100644
index 00000000..16bfeae5
--- /dev/null
+++ b/src/cmd/dict/roget.c
@@ -0,0 +1,147 @@
+#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(*p) && p < e.end)
+ p++;
+ while(strncmp(p, " -- ", 4) != 0 && p < e.end){
+ while(isspace(*p) && p < e.end)
+ p++;
+ if (*p == '[' || *p == '{'){
+ c = (*p == '[')? ']': '}';
+ while(*p != c && p < e.end)
+ p++;
+ p++;
+ continue;
+ }
+ if (isdigit(*p) || ispunct(*p)){
+ while(!isspace(*p) && p < e.end)
+ p++;
+ continue;
+ }
+
+
+ if (isspace(*p))
+ spc = 1;
+ else
+ if (spc){
+ outchar(' ');
+ spc = 0;
+ }
+
+ while(!isspace(*p) && p < e.end)
+ outchar(*p++);
+ }
+ return;
+ }
+
+ while(p < e.end && !isspace(*p))
+ p++;
+ while(p < e.end && isspace(*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(*p))
+ p++;
+ while(p < e.end && isdigit(*p))
+ p++;
+ outchar('/');
+ continue;
+ }
+
+ if (p < e.end -3 && strncmp(p, "&c ", 3) == 0){ /* less usefull xref */
+ while(p < e.end && !isdigit(*p))
+ p++;
+ while(p < e.end && isdigit(*p))
+ p++;
+ continue;
+ }
+
+ if (*p == '\n' && p < (e.end -1)){ /* their newlines */
+ spc = 0;
+ p++;
+ if (isspace(*p)){ /* their continuation line */
+ while (isspace(*p))
+ p++;
+ p--;
+ }
+ else{
+ outnl(2);
+ }
+ }
+ if (spc && *p != ';' && *p != '.' &&
+ *p != ',' && !isspace(*p)){ /* drop spaces before punct */
+ spc = 0;
+ outchar(' ');
+ }
+ if (isspace(*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(*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");
+}