#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#if STDC_HEADERS
# include <string.h>
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");
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);
status = fclose(fp);
if (status != EXIT_SUCCESS)
log_fail("Error closing hex file");
+
+ if (valid == false) {
+ log_err("Error parsing hex file");
+ }
+
+ return valid;
}
#include "filemenu.h"
#include "viewmenu.h"
#include "helpmenu.h"
+#include "messagebox.h"
#include "regwin.h"
#include "pgmwin.h"
#include "memwin.h"
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();
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");
#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);
}