Reveal solution functionality completed
[wordblah.git] / wordblox.h
index b657986..1925573 100644 (file)
@@ -69,6 +69,8 @@ typedef struct {
        char char_ans[MAX_PUZZLE_SIZE][MAX_PUZZLE_SIZE];
        int cur_row;
        int cur_col;
+       bool solution_revealed;
+       enum ORIENTATION current_movement;
 } MainPlayerData;
 
 /* compute the hash of a password */
@@ -101,6 +103,23 @@ err:
        exit (2);
 }
 
+/* convert the hashed binary password to hexadecimal representation and
+   free the hashed binary password */
+void to_hexadecimal (char *hex, unsigned char *binary_pwd, unsigned int len)
+{
+       char buf[3];
+       /* keep reference to beginning of the hashed password */
+       unsigned char *binary_pw_begin = binary_pwd;
+       for (int i = 0; i < len; i ++)
+       {
+               sprintf (buf, "%02x", (*binary_pwd)&0xff);
+               strcat (hex, buf);
+               binary_pwd ++;
+       }
+       /* free the hashed password */
+       OPENSSL_free (binary_pw_begin); 
+}
+
 /* get a number from the user */
 int get_num ()
 {
@@ -122,13 +141,12 @@ bool verify_password (Puzzle *p, const char* password)
        unsigned int len;
        digest_message ((const unsigned char *)password, strlen(password),
                                                &hashed_password, &len);
+       char hashed_hex_pwd[256] = { (char) NULL };
+       to_hexadecimal (hashed_hex_pwd, hashed_password, len);
        
-       if (strcmp (p->hashed_password, (const char*) hashed_password) == 0)
-       {
-               OPENSSL_free (hashed_password);
+       if (strcmp (p->hashed_password, hashed_hex_pwd) == 0)
                return true;
-       }
-       OPENSSL_free (hashed_password); 
+       
        return false;
 }
 
@@ -148,9 +166,14 @@ void set_puzzle_password (Puzzle *p, const char *password)
                unsigned int len;
                digest_message ((const unsigned char *)password, strlen(password),
                                                &hashedpwd, &len);
-               strcpy (p->hashed_password, (const char *)hashedpwd);
+               /* the hashedpwd contains binary data - we will convert it to 
+                  hexadecimal data and store in file */
+
+               to_hexadecimal (p->hashed_password, hashedpwd, len);
+               printf ("%s\n", p->hashed_password);
+               
                strcpy (p->salt, "\0");
-               OPENSSL_free (hashedpwd);
+
        }
 }
 
@@ -269,6 +292,46 @@ void reset_color () {
        printf ("\x1B[0m");
 }
 
+/* check if the prev row has a block or not */
+bool prev_row_block (Puzzle *p, int r, int c)
+{
+       if (r == 0)
+               return true;
+       if (p->chars[r-1][c] == '#')
+               return true;
+       return false;
+}
+
+/* check if the next row has a block or not */
+bool next_row_block (Puzzle *p, int r, int c)
+{
+       if (r == p->grid_size-1)
+               return true;
+       if (p->chars[r+1][c] == '#')
+               return true;
+       return false;
+}
+
+/* check if the prev col has a block or not */
+bool prev_col_block (Puzzle *p, int r, int c)
+{
+       if (c == 0)
+               return true;
+       if (p->chars[r][c-1] == '#')
+               return true;
+       return false;
+}
+
+/* check if the next col has a block or not */
+bool next_col_block (Puzzle *p, int r, int c)
+{
+       if (c == p->grid_size - 1)
+               return true;
+       if (p->chars[r][c+1] == '#')
+               return true;
+       return false;
+}
+
 /* check if previous row is blank or not */
 bool prev_row_blank (Puzzle *p, int r, int c) 
 {
@@ -298,6 +361,34 @@ bool next_col_blank (Puzzle *p, int r, int c)
        return false;
 }
 
+/* set the current row/col to the beginning of word index (across or down) */
+void set_selection_to_word_start (MainPlayerData *app_data,
+                                                                enum ORIENTATION orient, int word_index)
+{
+       for (int i = 0; i < app_data->puzzle.grid_size; i ++)
+       {
+               for (int j = 0; j < app_data->puzzle.grid_size; j ++)
+               {
+                       if (orient == ACROSS && 
+                               app_data->puzzle.start_across_word[i][j] == word_index)
+                       {
+                               app_data->current_movement = ACROSS;
+                               app_data->cur_row = i;
+                               app_data->cur_col = j;
+                               break;
+                       }
+                       else if (orient == DOWN && 
+                               app_data->puzzle.start_down_word[i][j] == word_index)
+                       {
+                               app_data->current_movement = DOWN;
+                               app_data->cur_row = i;
+                               app_data->cur_col = j;
+                               break;
+                       }
+               }
+       }
+}
+
 /* unfreeze the grid - make editing possible to change words */
 void unfreeze_puzzle (Puzzle *p)
 {
@@ -771,7 +862,7 @@ void print_menu (enum COLOR fg, enum COLOR bg, const char* title,
                reset_color (); printf ("\n");
 }
 
-/* reset the player data, from the new file */
+/* reset the player data, loading from the puzzle file */
 void reset_player_data (MainPlayerData *app_data, const char *filename)
 {
        app_data->puzzle = load_puzzle (filename);
@@ -779,6 +870,7 @@ void reset_player_data (MainPlayerData *app_data, const char *filename)
        app_data->is_loaded = app_data->puzzle.grid_frozen;
        app_data->cur_col = -1;
        app_data->cur_row = -1;
+       app_data->solution_revealed = false;
        strcpy (app_data->filename, filename);
        /* reset the answer keys */
        for (int i = 0; i < app_data->puzzle.grid_size; i ++)