]> git.sommitrealweird.co.uk Git - onak.git/blob - wordlist.c
a9e20a62e69a682fce1c51d2d134d2d463c79832
[onak.git] / wordlist.c
1 /*
2  * wordlist.c - Routines for manipulating word lists
3  *
4  * Jonathan McDowell <noodles@earth.li>
5  *
6  * Copyright 2004 Project Purple
7  */
8
9 #include <ctype.h>
10 #include <stdio.h>
11 #include <string.h>
12
13 #include "ll.h"
14 #include "decodekey.h"
15 #include "log.h"
16 #include "wordlist.h"
17
18 /**
19  *      makewordlist - Takes a string and splits it into a set of unique words.
20  *      @wordlist: The current word list.
21  *      @words: The string to split and add.
22  *
23  *      We take words and split it on non alpha numeric characters. These get
24  *      added to the word list if they're not already present. If the wordlist
25  *      is NULL then we start a new list, otherwise it's search for already
26  *      added words. Note that words is modified in the process of scanning.
27  *
28  *      Returns the new word list.
29  */
30 struct ll *makewordlist(struct ll *wordlist, char *word)
31 {
32         char *start = NULL;
33         char *end = NULL;
34
35         /*
36          * Walk through the words string, spliting on non alphanumerics and
37          * then checking if the word already exists in the list. If not then
38          * we add it.
39          */
40         end = word;
41         while (end != NULL && *end != 0) {
42                 start = end;
43                 while (*start != 0 && !isalnum(*start)) {
44                         start++;
45                 }
46                 end = start;
47                 while (*end != 0 && isalnum(*end)) {
48                         *end = tolower(*end);
49                         end++;
50                 }
51                 if (end - start > 1) {
52                         if (*end != 0) {
53                                 *end = 0;
54                                 end++;
55                         }
56
57                         if (llfind(wordlist, start, strcmp) == NULL) {
58                                 wordlist = lladd(wordlist, start);
59                         }
60                 }
61         }
62         return wordlist;
63 }
64
65 /**
66  *      makewordlistfromkey - Takes a public key and splits it into a set of 
67  *                     unique words.
68  *      @wordlist: The current word list.
69  *      @key: The key to return the words from.
70  *
71  *      We take words and split it on non alpha numeric characters. These get
72  *      added to the word list if they're not already present. If the wordlist
73  *      is NULL then we start a new list, otherwise it's search for already
74  *      added words. Note that words is modified in the process of scanning.
75  *
76  *      Returns the new word list.
77  */
78 struct ll *makewordlistfromkey(struct ll *wordlist,
79                                struct openpgp_publickey *key)
80 {
81         char      **uids;
82         int         i;
83         struct ll  *words = NULL;
84         struct ll  *wl = NULL;
85
86         uids = keyuids(key, NULL);
87         for (i = 0; uids[i] != NULL; ++i) {
88                 words = makewordlist(NULL, uids[i]);
89                 for (wl = words; wl != NULL; wl = wl->next) {
90                         if (llfind(wordlist, wl->object, strcmp) == NULL) {
91                                 wordlist = lladd(wordlist, strdup(wl->object));
92                         }
93                 }
94                 free(uids[i]);
95                 uids[i] = NULL;
96         }
97         free(uids);
98
99         return wordlist;
100 }