X-Git-Url: http://www.club.cc.cmu.edu/~cmccabe/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=random_word.c;fp=random-word.c;h=f29bc7d5188ec5544433fb0896b49cb1bf4e7c0a;hb=0199f6555377ad9d2bc9fc40f3c3df2c081d2f57;hp=d751d069ab21676fa2a89bf98e0c5f59a995dc34;hpb=afdd4bb342966fb97b2834b9b0b7833781c7a014;p=cmccabe-bin diff --git a/random-word.c b/random_word.c similarity index 69% rename from random-word.c rename to random_word.c index d751d06..f29bc7d 100644 --- a/random-word.c +++ b/random_word.c @@ -3,8 +3,9 @@ #include #include #include +#include -#define DICT "/usr/share/dict/linux.words" +#define DEFAULT_DICT_PATH "/usr/share/dict/linux.words" #define STARTING_SZ 8192 #define MAX_ARRAY_SZ 1073741824 @@ -86,21 +87,54 @@ static const char* choose_random_word(struct dict *dict) return dict->words[choice]; } -int main(void) +static void print_usage(char *program_name) +{ + printf("%s: prints a random word from a linebreak-delimited file.\n", + program_name); + printf("options:\n"); + printf("\t-d: the dictionary file to use. Default: %s.\n", + DEFAULT_DICT_PATH); + printf("\t-h: this help message.\n"); +} + +static void parse_args(char **argv, int argc, char **dict_path) +{ + char c; + *dict_path = DEFAULT_DICT_PATH; + opterr = 0; + while ((c = getopt(argc, argv, "d:h")) != -1) { + switch (c) { + case 'd': + *dict_path = optarg; + break; + case 'h': + print_usage(argv[0]); + exit(0); + break; + default: + fprintf (stderr, "Argument parsing error.\n"); + exit(1); + } + } +} + +int main(int argc, char **argv) { FILE *fp; + char *dict_path; const char *word; struct dict *dict; struct timeval tv; + parse_args(argv, argc, &dict_path); gettimeofday(&tv, NULL); srandom(tv.tv_usec * tv.tv_sec); - fp = fopen(DICT, "r"); + fp = fopen(dict_path, "r"); if (! fp) { int err = errno; fprintf(stderr, "failed to open %s: %s (%d).\n", - DICT, strerror(err), err); + dict_path, strerror(err), err); return 1; } dict = read_dict(fp);