home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode:Text -*- */
- /*
- * tree.c - a tree style dictionary for user's personal words
- *
- * Pace Willisson, 1983
- */
-
- #include <stdio.h>
- #include <ctype.h>
- #include "ispell.h"
-
- char *getenv();
- char *upcase();
-
- static struct node *root = NULL;
- struct node *tinsert();
-
- static char personaldict[100];
- static FILE *dictf;
- static newwords = 0;
-
- treeinit ()
- {
- char *p;
- char buf[BUFSIZ];
-
- p = getenv ("HOME");
- if (p == NULL)
- #ifndef AMIGA
- return;
- #else
- p = LIBDIR;
- #endif
-
- strcpy (personaldict, p);
-
- #if USEDEVICES
- strcat (personaldict, "ispell.words");
- #else
- strcat (personaldict, "/ispell.words");
- #endif
-
- if ((dictf = fopen (personaldict, "r")) == NULL)
- return;
-
- while (fgets (buf, sizeof buf, dictf) != NULL) {
- int len = strlen (buf) - 1;
-
- if (buf [ len ] == '\n')
- buf [ len ] = 0;
- treeinsert (buf, 1);
- }
-
- fclose (dictf);
-
- newwords = 0;
-
- if (!lflag && !aflag && access (personaldict, 2) < 0)
- printf ("Warning: Cannot update personal dictionary (%s)\r\n", personaldict);
- }
-
- treeprint ()
- {
- printf ("(");
- tprint (root);
- printf (")");
- }
-
- static
- tprint (root)
- struct node *root;
- {
- if (root == NULL)
- return;
- printf ("%s ", root->word);
- tprint (root->left);
- tprint (root->right);
- }
-
-
- treeinsert (word, keep)
- char *word;
- {
- char nword[BUFSIZ];
- strcpy (nword, word);
- root = tinsert (upcase (nword), root, keep);
- newwords = 1;
- }
-
- static
- struct node *
- tinsert (word, root, keep)
- char *word;
- struct node *root;
- {
- int cmp;
-
- if (root == NULL) {
- root = (struct node *) calloc (1, sizeof (struct node));
- root->word = (char *) malloc (strlen (word) + 1);
- strcpy (root->word, word);
- root->keep = keep;
- return (root);
- }
-
- cmp = strcmp (word, root->word);
-
- if (cmp == 0)
- return (root);
-
- if (cmp < 0)
- root->left = tinsert (word, root->left, keep);
- else
- root->right = tinsert (word, root->right, keep);
-
- return (root);
- }
-
- treelookup (word)
- char *word;
- {
- char nword[BUFSIZ];
- strcpy (nword, word);
- if (tlookup (upcase (nword), root)) {
- return (1);
- }
- return (0);
- }
-
- static
- tlookup (word, root)
- char *word;
- struct node *root;
- {
- int cmp;
-
- if (root == NULL)
- return (0);
-
- cmp = strcmp (word, root->word);
-
- if (cmp == 0)
- return (1);
-
- if (cmp < 0)
- return (tlookup (word, root->left));
- else
- return (tlookup (word, root->right));
- }
-
- treeoutput ()
- {
- if (newwords == 0)
- return;
-
- if ((dictf = fopen (personaldict, "w")) == NULL) {
- fprintf (stderr, "Can't create %s\r\n", personaldict);
- return;
- }
-
- toutput1 (root);
-
- fclose (dictf);
- }
-
- static
- toutput1 (root)
- struct node *root;
- {
- if (root == NULL)
- return;
-
- if (root->keep)
- fprintf (dictf, "%s\n", root->word);
-
- toutput1 (root->left);
- toutput1 (root->right);
- }
-
- char *
- upcase (s)
- register char *s;
- {
- register char *os = s;
-
- while (*s) {
- if (islower (*s))
- *s = toupper (*s);
- s++;
- }
- return (os);
- }
-