structure
This commit is contained in:
parent
9760f41d4f
commit
e6be9d5b52
12897
share/wordle/dictionary.txt
Normal file
12897
share/wordle/dictionary.txt
Normal file
File diff suppressed because it is too large
Load Diff
2315
share/wordle/solutions.txt
Normal file
2315
share/wordle/solutions.txt
Normal file
File diff suppressed because it is too large
Load Diff
115
src/wordle.c
Normal file
115
src/wordle.c
Normal file
@ -0,0 +1,115 @@
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
/* TODO: sysexits.h */
|
||||
|
||||
#define PROGRAM_NAME "wordle"
|
||||
#define DEFAULT_DICTIONARY_FILENAME "/usr/share/" PROGRAM_NAME "/dictionary.txt"
|
||||
#define DEFAULT_SOLUTIONS_FILENAME "/usr/share/" PROGRAM_NAME "/solutions.txt"
|
||||
#define WORD_LENGTH 5
|
||||
#define GUESSES 6
|
||||
|
||||
int
|
||||
dictionary_has(char *s, int fd){
|
||||
char buf[WORD_LENGTH + 2];
|
||||
if(lseek(fd, 0, SEEK_SET) != 0){
|
||||
fprintf(stderr, "%s: Could not seek to the start of the"
|
||||
" dictionary (errno %d).\n", PROGRAM_NAME, errno
|
||||
);
|
||||
close(fd);
|
||||
exit(1);
|
||||
}
|
||||
/* unused, but just in case */
|
||||
buf[WORD_LENGTH + 1] = '\0';
|
||||
|
||||
if(read(fd, buf, WORD_LENGTH + 1) < WORD_LENGTH)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
strisuint(char *s){
|
||||
while(*s != '\0')
|
||||
if(!isdigit(*(s++)))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
usage(char *name){
|
||||
fprintf(stderr, "Usage: %s [index] (-d [dictionary file])"
|
||||
" (-s [solutions file])\n", name
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
int c;
|
||||
int dictionary_fd;
|
||||
size_t i;
|
||||
size_t index;
|
||||
size_t j;
|
||||
FILE *solutions_file;
|
||||
char word[WORD_LENGTH + 1];
|
||||
|
||||
/* arg parse */
|
||||
if(argc < 2)
|
||||
usage(argv[0] != NULL ? argv[0] : PROGRAM_NAME);
|
||||
while((c = getopt(argc, argv, "d:hs:")) != -1)
|
||||
switch(c){
|
||||
case 'd':
|
||||
dictionary_filename = optarg;
|
||||
break;
|
||||
case 's':
|
||||
solutions_filename = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
usage(argv[0] != NULL ? argv[0] : PROGRAM_NAME);
|
||||
}
|
||||
if(!strisuint(argv[optind])){
|
||||
fprintf(stderr, "%s: index must be a number.\n",
|
||||
argv[0] != NULL ? argv[0] : PROGRAM_NAME
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
index = (size_t)atoi(argv[optind]);
|
||||
|
||||
/* get word */
|
||||
if((solutions_file = fopen(solutions_filename, "rb")) == NULL){
|
||||
fprintf(stderr, "%s: %s: Error opening solutions file.\n",
|
||||
argv[0] != NULL ? argv[0] : PROGRAM_NAME, solutions_filename
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
i = j = 0;
|
||||
while((c = getc(solutions_file)) != EOF)
|
||||
if(i == index){
|
||||
if(j == WORD_LENGTH){
|
||||
word[WORD_LENGTH] = '\0';
|
||||
j = 0;
|
||||
break;
|
||||
}else
|
||||
word[j++] = c;
|
||||
}else
|
||||
i += c == '\n';
|
||||
if(j != '\0'){
|
||||
word[j] = '\0';
|
||||
fprintf(stderr, "%s: %s: Word is too few characters.\n",
|
||||
argv[0] != NULL ? argv[0] : PROGRAM_NAME, word
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
fclose(solutions_file);
|
||||
|
||||
if(dictionary_fd = open(dictionary_filename, O_RDONLY) == NULL){
|
||||
fprintf(stderr, "%s: %s: Error opening dictionary file.\n",
|
||||
argv[0] != NULL ? argv[0] : PROGRAM_NAME, dictionary_filename
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
close(dictionary_fd);
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user