Commit | Line | Data |
---|---|---|
eb9cdc7f | 1 | /* $OpenBSD: getword.c,v 1.8 2013/08/29 20:22:14 naddy Exp $ */ |
2 | /* $NetBSD: getword.c,v 1.4 1995/03/23 08:32:45 cgd Exp $ */ | |
3 | ||
4 | /* | |
984263bc MD |
5 | * Copyright (c) 1983, 1993 |
6 | * The Regents of the University of California. All rights reserved. | |
7 | * | |
8 | * Redistribution and use in source and binary forms, with or without | |
9 | * modification, are permitted provided that the following conditions | |
10 | * are met: | |
11 | * 1. Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in the | |
15 | * documentation and/or other materials provided with the distribution. | |
6693db17 | 16 | * 3. Neither the name of the University nor the names of its contributors |
984263bc MD |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. | |
19 | * | |
20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
30 | * SUCH DAMAGE. | |
31 | */ | |
32 | ||
984263bc | 33 | #include <stdlib.h> |
eb9cdc7f | 34 | #include "hangman.h" |
35 | #include "pathnames.h" | |
984263bc MD |
36 | |
37 | /* | |
38 | * getword: | |
39 | * Get a valid word out of the dictionary file | |
40 | */ | |
41 | void | |
9a362823 | 42 | getword(void) |
984263bc | 43 | { |
6693db17 SW |
44 | FILE *inf; |
45 | char *wp, *gp; | |
46 | long pos; | |
eb9cdc7f | 47 | int badwords, countwords; |
48 | size_t wordlen; | |
984263bc MD |
49 | |
50 | inf = Dict; | |
eb9cdc7f | 51 | badwords = 0; |
52 | /* Make sure the dictionary file is valid if it's not the default */ | |
53 | countwords = strcmp(Dict_name, _PATH_DICT); | |
54 | while (badwords < MAXBADWORDS) { | |
55 | if (countwords) | |
56 | badwords++; | |
57 | pos = arc4random_uniform(Dict_size); | |
6693db17 | 58 | fseek(inf, pos, SEEK_SET); |
984263bc MD |
59 | if (fgets(Word, BUFSIZ, inf) == NULL) |
60 | continue; | |
61 | if (fgets(Word, BUFSIZ, inf) == NULL) | |
62 | continue; | |
eb9cdc7f | 63 | wordlen = strlen(Word); |
64 | if (wordlen > 0 && Word[wordlen - 1] == '\n') | |
65 | Word[wordlen - 1] = '\0'; | |
66 | if (wordlen < MINLEN || wordlen > MAXLEN) | |
984263bc | 67 | continue; |
eb9cdc7f | 68 | for (wp = Word; *wp; wp++) |
984263bc | 69 | if (!islower(*wp)) |
eb9cdc7f | 70 | goto cont; |
984263bc | 71 | break; |
eb9cdc7f | 72 | cont: ; |
73 | } | |
74 | if (badwords >= MAXBADWORDS) { | |
75 | mvcur(0, COLS - 1, LINES - 1, 0); | |
76 | endwin(); | |
77 | errx(1, "file %s appears to be incorrectly formatted\n(Need one lower-case word per line)", | |
78 | Dict_name); | |
984263bc MD |
79 | } |
80 | gp = Known; | |
81 | wp = Word; | |
9a362823 | 82 | while (*wp != '\0') { |
984263bc MD |
83 | *gp++ = '-'; |
84 | wp++; | |
85 | } | |
86 | *gp = '\0'; | |
87 | } |