Add better error checking when loading invalid hex files
authorHugo Villeneuve <hugo@hugovil.com>
Sun, 26 Jan 2014 23:23:11 +0000 (18:23 -0500)
committerHugo Villeneuve <hugo@hugovil.com>
Sun, 26 Jan 2014 23:23:11 +0000 (18:23 -0500)
Also replaced custom error message box with standard one.

src/cli/emuconsole.c
src/common/hexfile.c
src/common/hexfile.h
src/gtk/emugtk.c
src/gtk/messagebox.c
src/gtk/messagebox.h
src/gtk/viewmenu.c

index a68acb5..a249cf4 100644 (file)
@@ -21,6 +21,7 @@
 
 #define _GNU_SOURCE /* For getline() */
 #include <stdio.h>
+#include <stdbool.h>
 #include <string.h>
 #include <ctype.h> /* For isblank, toupper() */
 #include "config.h"
@@ -512,12 +513,17 @@ TooMuchParameters:
 int
 main(int argc, char **argv)
 {
+       int rc;
+
        parse_command_line_options(argc, argv);
 
        cpu8051_init();
 
-       if (options.filename != NULL)
-               LoadHexFile(options.filename);
+       if (options.filename != NULL) {
+               rc = LoadHexFile(options.filename);
+               if (rc == false)
+                       exit(1);
+       }
 
        console_main();
 
index a84c117..b15f0e8 100644 (file)
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
 
 #if STDC_HEADERS
 #  include <string.h>
@@ -95,13 +96,21 @@ Ascii2Hex(char *istring, int length)
        return result;
 }
 
-void
+/*
+ * Return value:
+ *   true:  success
+ *   false: failure
+ */
+int
 LoadHexFile(const char *filename)
 {
        int i, j, RecLength, LoadOffset, RecType, Data, Checksum;
        FILE *fp;
        int status;
        char line[HEXFILE_LINE_BUFFER_LEN];
+       int valid = false;
+
+       log_debug("LoadHexFile");
 
        if (filename == NULL)
                log_fail("No file specified");
@@ -165,6 +174,7 @@ LoadHexFile(const char *filename)
                        log_debug("hex record: data");
                } else if (RecType == 1) {
                        log_debug("hex record: End Of File");
+                       valid = true;
                        goto close_file;
                } else {
                        log_warn("hex record: Unsupported ($%02X)", RecType);
@@ -175,4 +185,10 @@ close_file:
        status = fclose(fp);
        if (status != EXIT_SUCCESS)
                log_fail("Error closing hex file");
+
+       if (valid == false) {
+               log_err("Error parsing hex file");
+       }
+
+       return valid;
 }
index 0f46527..4642ebc 100644 (file)
@@ -31,7 +31,7 @@ asciihex2int(char *str);
 unsigned int
 Ascii2Hex(char *istring, int length);
 
-void
+int
 LoadHexFile(const char *filename);
 
 #endif /* HEXFILE_H */
index 72b7ea5..3374d62 100644 (file)
@@ -41,6 +41,7 @@
 #include "filemenu.h"
 #include "viewmenu.h"
 #include "helpmenu.h"
+#include "messagebox.h"
 #include "regwin.h"
 #include "pgmwin.h"
 #include "memwin.h"
@@ -577,19 +578,26 @@ AddMenuSeparator(GtkWidget *menu)
 void
 emugtk_new_file(char *file)
 {
-       emugtk_stop_running();
+       int rc;
 
-       LoadHexFile(file);
+       emugtk_stop_running();
 
-       if (cfg->clear_ram_on_file_load)
-               emugtk_Reset();
+       rc = LoadHexFile(file);
+       if (rc == false) {
+               message_show_error("Error parsing hex file");
+       } else {
+               if (cfg->clear_ram_on_file_load)
+                       emugtk_Reset();
 
-       emugtk_UpdateDisplay();
+               emugtk_UpdateDisplay();
+       }
 }
 
 int
 main(int argc, char **argv)
 {
+       int rc_load_hexfile = true;
+
        parse_command_line_options(argc, argv);
        app_config_load();
 
@@ -600,13 +608,17 @@ main(int argc, char **argv)
        gtk_init(&argc, &argv);
 
        if (options.filename != NULL)
-               LoadHexFile(options.filename);
+               rc_load_hexfile = LoadHexFile(options.filename);
 
        cpu8051_Reset();
 
        log_info("Init GUI");
        emugtk_window_init();
        emugtk_UpdateDisplay();
+
+       if (rc_load_hexfile == false)
+               message_show_error("Error parsing hex file");
+
        gtk_main();
 
        log_info("Terminate");
index c4d3723..98ec275 100644 (file)
 #include "common.h"
 #include "messagebox.h"
 
-#define MESSAGE_DIALOG_BORDER 25
-
-#define BUTTON_TEXT_BORDER 3
-
 extern GtkWidget *mainwin;
 
 void
-ShowMessage(gchar *title, gchar *message, int justification, int font_style)
+message_show_error(char *message)
 {
        GtkWidget *dialog;
-       GtkWidget *label;
-       GtkWidget *label_window;
-
-       /* Keep the dialog on top of the main window, and centered. */
-       dialog = gtk_dialog_new_with_buttons(
-               title, GTK_WINDOW(mainwin),
-               GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK,
-               GTK_RESPONSE_NONE, NULL);
-
-       /*
-        * The GtkLabel widget is one of a few GTK+ widgets that don't create
-        * their own window to render themselves into. Instead, they draw
-        * themselves directly onto their parents window. This means that in
-        * order to set a property for a GtkLabel widget, you need to change the
-        * property of its parent, i.e. the object that you pack it into.
-        * Another solution (short term workaround) is to put the label widget
-        * inside another widget that does get its own window, like the
-        * 'ViewPort' or 'EventBox' widget.
-        */
-
-       /*
-        * Using workaround described above to set the border width of 'label'
-        * widget.
-        */
-       label_window = gtk_event_box_new();
-
-       /* Creating our label. */
-       label = gtk_label_new(message);
-       gtk_label_set_justify(GTK_LABEL(label), justification);
-
-       if (font_style == MESSAGE_DIALOG_FIXED_FONT) {
-               PangoFontDescription *pango_font;
 
-               pango_font = pango_font_description_from_string(FIXED_FONT);
-               gtk_widget_modify_font(label, pango_font);
-       }
-
-       /* Adding label widget to label_window widget. */
-       gtk_container_add(GTK_CONTAINER(label_window), label);
-
-       /*
-        * Changing border width of the label widget by way of label_window
-        * widget.
-        */
-       gtk_container_set_border_width(GTK_CONTAINER(label_window),
-                                      MESSAGE_DIALOG_BORDER);
-
-       /* Ensure that the dialog box is destroyed when the user responds */
-       g_signal_connect_swapped(dialog, "response",
-                                G_CALLBACK(gtk_widget_destroy), dialog);
+       dialog = gtk_message_dialog_new(GTK_WINDOW(mainwin),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                                       GTK_MESSAGE_ERROR,
+                                       GTK_BUTTONS_CLOSE,
+                                       message, NULL);
+       gtk_dialog_run (GTK_DIALOG (dialog));
+       gtk_widget_destroy (dialog);
+}
 
-       /* Add the label_window to the dialog window. */
-       gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
-                         label_window);
+void
+message_show_information(char *message)
+{
+       GtkWidget *dialog;
 
-       /* Show everything we've added to the dialog. */
-       gtk_widget_show_all(dialog);
+       dialog = gtk_message_dialog_new(GTK_WINDOW(mainwin),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                                       GTK_MESSAGE_INFO,
+                                       GTK_BUTTONS_CLOSE,
+                                       message, NULL);
+       gtk_dialog_run (GTK_DIALOG (dialog));
+       gtk_widget_destroy (dialog);
 }
index 991e758..c78e003 100644 (file)
 
 #include <gtk/gtk.h>
 
-#define MESSAGE_DIALOG_NORMAL_FONT 0
-#define MESSAGE_DIALOG_FIXED_FONT  1
+void
+message_show_error(char *message);
 
 void
-ShowMessage(gchar *title, gchar *message, int justification, int font_style);
+message_show_information(char *message);
 
 #endif /* MESSAGEBOX_H */
index b4ce153..fa1fd14 100644 (file)
@@ -43,9 +43,8 @@ void toggle_layout(GtkWidget *widget, gpointer data)
                log_info("  Switching to layout %d", id);
                cfg->layout = id;
 
-               ShowMessage("Notice",
-                           "You must restart for the changes to take effect",
-                           GTK_JUSTIFY_LEFT, MESSAGE_DIALOG_NORMAL_FONT);
+               message_show_information(
+                       "You must restart for the changes to take effect");
        }
 }