X-Git-Url: https://harishankar.org/repos/?p=wordblah.git;a=blobdiff_plain;f=wordblox.c;h=d840b6d40b2f10fa54e6ff2648e0d5a9e49e51f4;hp=174346d7145c237b444920dd7251383feee9f845;hb=762979409c32bd4902716911101a1d1071f11038;hpb=3657c15588e4b2607d9225659f66158d92a85262 diff --git a/wordblox.c b/wordblox.c index 174346d..d840b6d 100644 --- a/wordblox.c +++ b/wordblox.c @@ -8,67 +8,155 @@ #include "wordblox.h" #include "constantstrings.h" +/* export the clues to a text file */ +void do_export_clues (Puzzle *p) +{ + if (p->grid_frozen == false) + { + printf (UNFROZEN_GRID); + char ch = getchar (); + return; + } + char fname[256]; + printf (INPUT_FILE); + fgets (fname, 256, stdin); + if (strlen(fname) == 1) + return; + char *filename = strtok (fname, "\n"); + + export_clues (p, filename); + printf (FILE_SAVED); + char ch = getchar (); +} + +/* export the puzzle to a png file */ +void do_export_puzzle (Puzzle *p) +{ + if (p->grid_frozen == false) + { + printf (UNFROZEN_GRID); + char ch = getchar (); + return; + } + char fname[256]; + printf (INPUT_FILE); + fgets (fname, 256, stdin); + if (strlen (fname) == 1) + return; + char* filename = strtok (fname, "\n"); + + printf (INPUT_EXPORT_ANSWERS); + char ans[3]; + fgets (ans, 3, stdin); + bool solution; + solution = (toupper (ans[0]) == 'Y') ? true : false; + + export_grid_image (p, filename, solution); + printf (FILE_SAVED); + char ch = getchar (); +} + +/* reset the grid */ +void do_reset_puzzle (Puzzle *p) +{ + int grid_size = p->grid_size; + printf (INPUT_CONFIRM_RESET); + char conf[3]; + fgets (conf, 3, stdin); + if (toupper (conf[0]) == 'Y') + init_puzzle (p, grid_size); +} + +/* set clue for a word - only for frozen grid */ +void do_set_clue_word (Puzzle *p, enum ORIENTATION orient) +{ + print_puzzle (p); + if (p->grid_frozen == false) + { + printf (UNFROZEN_GRID); + char ch = getchar (); + return; + } + int index; + String clue; + printf (INPUT_INDEX); + index = get_num (); + printf (INPUT_CLUE); + fgets (clue, MAX_CLUE_LENGTH, stdin); + char* cl = strtok (clue, "\n"); + + bool res; + res = set_clue (p, cl, index, orient); + + if (res == false) + { + printf (NO_WORD_INDEX); + char ch = getchar (); + } +} + /* clear a cell in the grid */ -void clear_cell (Puzzle *p) +void do_clear_cell (Puzzle *p) { print_puzzle (p); + if (p->grid_frozen == true) + { + printf (FROZEN_GRID); + char ch = getchar (); + return; + } int row, col; printf (INPUT_ROW); - scanf ("%d", &row); + row = get_num (); printf (INPUT_COL); - scanf ("%d", &col); + col = get_num (); if (row >= p->grid_size || col >= p->grid_size) { printf (EXCEED_GRID_SIZE); char ch = getchar (); - ch = getchar (); return; } p->chars[row][col] = ' '; print_puzzle (p); char ch = getchar (); - ch = getchar (); } /* add a down word to the grid */ -void add_down_word (Puzzle *p) +void do_add_down_word (Puzzle *p) { print_puzzle (p); - if (p->grid_frozen) + if (p->grid_frozen == true) { printf (FROZEN_GRID); char ch = getchar (); - ch = getchar (); return; } - char word[MAX_PUZZLE_SIZE]; + char wd[MAX_PUZZLE_SIZE]; int row, col; printf (INPUT_WORD); - scanf ("%s", word); - if (! is_valid_word (word)) + fgets (wd, MAX_PUZZLE_SIZE, stdin); + char *word = is_valid_word (wd); + if (word == NULL) { printf (INVALID_WORD); char ch = getchar (); - ch = getchar (); return; } printf (INPUT_ROW); - scanf ("%d", &row); + row = get_num (); printf (INPUT_COL); - scanf ("%d", &col); + col = get_num (); if (row >= p->grid_size || col >= p->grid_size) { printf (EXCEED_GRID_SIZE); char ch = getchar (); - ch = getchar (); return; } if (strlen (word) > (p->grid_size - row)) { printf (WORD_TOO_LONG); char ch = getchar (); - ch = getchar (); return; } @@ -77,38 +165,37 @@ void add_down_word (Puzzle *p) print_puzzle (p); char ch = getchar (); - ch = getchar (); } /* add an across word to the grid */ -void add_across_word (Puzzle *p) +void do_add_across_word (Puzzle *p) { print_puzzle (p); - if (p->grid_frozen) + if (p->grid_frozen == true) { printf (FROZEN_GRID); + char ch = getchar (); return; } - char word[MAX_PUZZLE_SIZE]; + char wd[MAX_PUZZLE_SIZE]; int row, col; printf (INPUT_WORD); - scanf ("%s", word); - if (! is_valid_word (word)) + fgets (wd, MAX_PUZZLE_SIZE, stdin); + char *word = is_valid_word (wd); + if (word == NULL) { printf (INVALID_WORD); char ch = getchar (); - ch = getchar (); return; - } + } printf (INPUT_ROW); - scanf ("%d", &row); + row = get_num (); printf (INPUT_COL); - scanf ("%d", &col); + col = get_num (); if (row >= p->grid_size || col >= p->grid_size) { printf (EXCEED_GRID_SIZE); char ch = getchar (); - ch = getchar (); return; } @@ -116,7 +203,6 @@ void add_across_word (Puzzle *p) { printf (WORD_TOO_LONG); char ch = getchar (); - ch = getchar (); return; } @@ -125,65 +211,100 @@ void add_across_word (Puzzle *p) print_puzzle (p); char ch = getchar (); - ch = getchar (); } +/* confirm exit */ +bool do_confirm_exit () +{ + printf (INPUT_CONFIRM_EXIT); + char res[3]; + fgets (res, 3, stdin); + if (toupper(res[0]) == 'Y') + return true; + else + return false; +} +/* main loop for the puzzle editor */ void puzzle_editor_loop (Puzzle *p, const char *filename) { bool loop = true; while (loop) { - print_menu (WHITE, RED, PUZZLE_MENU_TITLE, PUZZLE_EDIT_MENU, 8, 50); + print_menu (WHITE, BLUE, PUZZLE_MENU_TITLE, PUZZLE_EDIT_MENU, 13, 50); printf (INPUT_CHOICE); - char ch = getchar (); + int ch = get_num (); switch (ch) { - case '1': print_puzzle (p); - char ch = getchar (); - ch = getchar (); - break; - case '2': add_across_word (p); - break; - case '3': add_down_word (p); - break; - case '4': clear_cell (p); - break; - case '7': save_puzzle (p, filename); - printf ("%s\n",FILE_SAVED); - ch = getchar (); - ch = getchar (); - break; - case '8': loop = false; - break; + case 1: print_puzzle (p); + char ch = getchar (); + break; + case 2: do_add_across_word (p); + break; + case 3: do_add_down_word (p); + break; + case 4: do_clear_cell (p); + break; + case 5: freeze_puzzle (p); + print_puzzle (p); + ch = getchar (); + break; + case 6: unfreeze_puzzle (p); + print_puzzle (p); + ch = getchar (); + break; + case 7: do_set_clue_word (p, ACROSS); + break; + case 8: do_set_clue_word (p, DOWN); + break; + case 9: save_puzzle (p, filename); + printf ("%s\n",FILE_SAVED); + ch = getchar (); + break; + case 10: do_reset_puzzle (p); + print_puzzle (p); + ch = getchar (); + break; + case 11: do_export_puzzle (p); + break; + case 12: do_export_clues (p); + break; + case 13: loop = ! do_confirm_exit (); + break; } } } /* open an existing puzzle */ -void open_puzzle () +void do_open_puzzle () { Puzzle p; printf (INPUT_FILE); - char filename[256]; - scanf("%s", filename); + char fname[256]; + fgets(fname, 256, stdin); + if (strlen (fname) == 1) + return; + char* filename = strtok (fname, "\n"); p = load_puzzle (filename); puzzle_editor_loop (&p, filename); } /* create a new blank puzzle */ -void new_puzzle () +void do_new_puzzle () { Puzzle p; printf (INPUT_FILE); - char filename[256]; - scanf ("%s", filename); + char fname[256]; + fgets (fname, 256, stdin); + if (strlen (fname) == 1) + return; + char* filename = strtok (fname, "\n"); printf (INPUT_GRID_SIZE); int size; - scanf ("%d", &size); + size = get_num (); if (size > MAX_PUZZLE_SIZE) { printf (EXCEED_MAX_GRID_SIZE); - char c = getchar (); c = getchar (); + char c = getchar (); } else { @@ -200,19 +321,40 @@ int main_loop () { print_menu (WHITE, BLUE, MAIN_MENU_TITLE, MAIN_MENU, 3, 50); printf (INPUT_CHOICE); - char ch = getchar (); + int ch = get_num (); switch (ch) { - case '1': new_puzzle (); - break; - case '2': open_puzzle (); - break; - case '3': exit (0); + case 1: do_new_puzzle (); + break; + case 2: do_open_puzzle (); + break; + case 3: exit (0); } } } int main (int argc, char* argv[]) -{ +{ + if (argc >= 2) + { + Puzzle p; + switch (argc) + { + case 2 : p = load_puzzle (argv[1]); + puzzle_editor_loop (&p, argv[1]); + break; + case 4 : if (strcmp (argv[2], "new") == 0) + { + int grid_size = atoi (argv[3]); + init_puzzle (&p, grid_size); + puzzle_editor_loop (&p, argv[1]); + break; + } + default: fprintf (stderr, USAGE_LINE_1, argv[0]); + fprintf (stderr, USAGE_LINE_2); + fprintf (stderr, USAGE_LINE_3); + exit (3); + } + } return (main_loop ()); }