2 * wordlist.c - Routines for manipulating word lists
4 * Copyright 2004 Jonathan McDowell <noodles@earth.li>
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program. If not, see <https://www.gnu.org/licenses/>.
25 #include "decodekey.h"
26 #include "keystructs.h"
30 * makewordlist - Takes a string and splits it into a set of unique words.
31 * @wordlist: The current word list.
32 * @words: The string to split and add.
34 * We take words and split it on non alpha numeric characters. These get
35 * added to the word list if they're not already present. If the wordlist
36 * is NULL then we start a new list, otherwise it's search for already
37 * added words. Note that words is modified in the process of scanning.
39 * Returns the new word list.
41 struct ll *makewordlist(struct ll *wordlist, char *word)
47 * Walk through the words string, spliting on non alphanumerics and
48 * then checking if the word already exists in the list. If not then
52 while (end != NULL && *end != 0) {
54 while (*start != 0 && (ispunct(*start) || isspace (*start))) {
58 while (*end != 0 && (!ispunct(*end) && !isspace (*end))) {
62 if (end - start > 1) {
68 if (llfind(wordlist, start,
69 (int (*)(const void *, const void *)) strcmp
71 wordlist = lladdend(wordlist, start);
79 * makewordlistfromkey - Takes a public key and splits it into a set of
81 * @wordlist: The current word list.
82 * @key: The key to return the words from.
84 * We take words and split it on non alpha numeric characters. These get
85 * added to the word list if they're not already present. If the wordlist
86 * is NULL then we start a new list, otherwise it's search for already
87 * added words. Note that words is modified in the process of scanning.
89 * Returns the new word list.
91 struct ll *makewordlistfromkey(struct ll *wordlist,
92 struct openpgp_publickey *key)
96 struct ll *words = NULL;
99 uids = keyuids(key, NULL);
100 for (i = 0; uids != NULL && uids[i] != NULL; ++i) {
101 words = makewordlist(NULL, uids[i]);
102 for (wl = words; wl != NULL; wl = wl->next) {
103 if (llfind(wordlist, wl->object,
104 (int (*)(const void *, const void *)) strcmp
106 wordlist = lladd(wordlist, strdup(wl->object));