9 #include "constantstrings.h"
11 /* export the puzzle to a png file */
12 void export_puzzle (Puzzle
*p
)
14 if (p
->grid_frozen
== false)
16 printf (UNFROZEN_GRID
);
22 fgets (fname
, 256, stdin
);
23 char* filename
= strtok (fname
, "\n");
25 printf (INPUT_EXPORT_ANSWERS
);
27 fgets (ans
, 3, stdin
);
29 solution
= (toupper (ans
[0]) == 'Y') ? true : false;
31 export_grid_image (p
, filename
, solution
);
36 /* set clue for a word - only for frozen grid */
37 void set_clue_word (Puzzle
*p
, enum ORIENTATION orient
)
40 if (p
->grid_frozen
== false)
42 printf (UNFROZEN_GRID
);
51 fgets (clue
, MAX_CLUE_LENGTH
, stdin
);
52 char* cl
= strtok (clue
, "\n");
55 res
= set_clue (p
, cl
, index
, orient
);
59 printf (NO_WORD_INDEX
);
64 /* clear a cell in the grid */
65 void clear_cell (Puzzle
*p
)
68 if (p
->grid_frozen
== true)
79 if (row
>= p
->grid_size
|| col
>= p
->grid_size
)
81 printf (EXCEED_GRID_SIZE
);
85 p
->chars
[row
][col
] = ' ';
91 /* add a down word to the grid */
92 void add_down_word (Puzzle
*p
)
95 if (p
->grid_frozen
== true)
101 char wd
[MAX_PUZZLE_SIZE
];
104 fgets (wd
, MAX_PUZZLE_SIZE
, stdin
);
105 char *word
= strtok (wd
, "\n");
106 if (! is_valid_word (word
))
108 printf (INVALID_WORD
);
109 char ch
= getchar ();
116 if (row
>= p
->grid_size
|| col
>= p
->grid_size
)
118 printf (EXCEED_GRID_SIZE
);
119 char ch
= getchar ();
122 if (strlen (word
) > (p
->grid_size
- row
))
124 printf (WORD_TOO_LONG
);
125 char ch
= getchar ();
129 for (int i
= row
; i
< row
+ strlen(word
); i
++)
130 p
->chars
[i
][col
] = toupper(word
[i
- row
]);
133 char ch
= getchar ();
136 /* add an across word to the grid */
137 void add_across_word (Puzzle
*p
)
140 if (p
->grid_frozen
== true)
142 printf (FROZEN_GRID
);
143 char ch
= getchar ();
146 char wd
[MAX_PUZZLE_SIZE
];
149 fgets (wd
, MAX_PUZZLE_SIZE
, stdin
);
150 char *word
= strtok (wd
, "\n");
151 if (! is_valid_word (word
))
153 printf (INVALID_WORD
);
154 char ch
= getchar ();
161 if (row
>= p
->grid_size
|| col
>= p
->grid_size
)
163 printf (EXCEED_GRID_SIZE
);
164 char ch
= getchar ();
168 if (strlen (word
) > (p
->grid_size
- col
))
170 printf (WORD_TOO_LONG
);
171 char ch
= getchar ();
175 for (int i
= col
; i
< col
+strlen (word
); i
++)
176 p
->chars
[row
][i
] = toupper(word
[i
- col
]);
179 char ch
= getchar ();
184 printf (INPUT_CONFIRM_EXIT
);
186 fgets (res
, 3, stdin
);
187 if (toupper(res
[0]) == 'Y')
193 /* main loop for the puzzle editor */
194 void puzzle_editor_loop (Puzzle
*p
, const char *filename
)
199 print_menu (WHITE
, RED
, PUZZLE_MENU_TITLE
, PUZZLE_EDIT_MENU
, 11, 50);
200 printf (INPUT_CHOICE
);
204 case 1: print_puzzle (p
);
205 char ch
= getchar ();
207 case 2: add_across_word (p
);
209 case 3: add_down_word (p
);
211 case 4: clear_cell (p
);
213 case 5: freeze_puzzle (p
);
217 case 6: unfreeze_puzzle (p
);
221 case 7: set_clue_word (p
, ACROSS
);
223 case 8: set_clue_word (p
, DOWN
);
225 case 9: save_puzzle (p
, filename
);
226 printf ("%s\n",FILE_SAVED
);
229 case 10: export_puzzle (p
);
231 case 11: loop
= !confirm_exit ();
237 /* open an existing puzzle */
243 fgets(fname
, 256, stdin
);
244 char* filename
= strtok (fname
, "\n");
245 p
= load_puzzle (filename
);
246 puzzle_editor_loop (&p
, filename
);
249 /* create a new blank puzzle */
255 fgets (fname
, 256, stdin
);
256 char* filename
= strtok (fname
, "\n");
257 printf (INPUT_GRID_SIZE
);
260 if (size
> MAX_PUZZLE_SIZE
)
262 printf (EXCEED_MAX_GRID_SIZE
);
267 init_puzzle (&p
, size
);
268 puzzle_editor_loop (&p
, filename
);
272 /* The main loop of the program */
275 /* Print the main menu */
278 print_menu (WHITE
, BLUE
, MAIN_MENU_TITLE
, MAIN_MENU
, 3, 50);
279 printf (INPUT_CHOICE
);
283 case 1: new_puzzle ();
285 case 2: open_puzzle ();
292 int main (int argc
, char* argv
[])
299 case 2 : p
= load_puzzle (argv
[1]);
300 puzzle_editor_loop (&p
, argv
[1]);
302 case 4 : if (strcmp (argv
[2], "new") == 0)
304 int grid_size
= atoi (argv
[3]);
305 init_puzzle (&p
, grid_size
);
306 puzzle_editor_loop (&p
, argv
[1]);
309 default: fprintf (stderr
, USAGE_LINE_1
, argv
[0]);
310 fprintf (stderr
, USAGE_LINE_2
);
311 fprintf (stderr
, USAGE_LINE_3
);
315 return (main_loop ());