📄 buttons.c
字号:
/* SPIM S20 MIPS simulator. X interface to SPIM (Derived from an earlier work by Alan Siow.) Copyright (C) 1990-2000 by James Larus (larus@cs.wisc.edu). ALL RIGHTS RESERVED. SPIM is distributed under the following conditions: You may make copies of SPIM for your own use and modify those copies. All copies of SPIM must retain my name and copyright notice. You may not sell SPIM or distributed SPIM in conjunction with a commerical product or service without the expressed written consent of James Larus. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *//* $Header: /Software/SPIM/src/buttons.c 7 2/01/01 8:57p Larus $ */#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Shell.h>#include <X11/Xaw/Form.h>#include <X11/Xaw/AsciiText.h>#include <X11/Xaw/Command.h>#include <X11/Xaw/Dialog.h>#include <X11/Xaw/Label.h>#include <X11/Xaw/MenuButton.h>#include <X11/Xaw/SimpleMenu.h>#include <X11/Xaw/Sme.h>#include <X11/Xaw/SmeBSB.h>#include <X11/Xaw/Cardinals.h>#include <stdio.h>#include <setjmp.h>#include <ctype.h>#include "spim.h"#include "spim-utils.h"#include "xspim.h"#include "inst.h"#include "mem.h"#include "reg.h"#include "scanner.h"#include "sym-tbl.h"#include "buttons.h"/* Local functions: */#ifdef __STDC__static void add_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void add_clear_button (Widget parent);static void add_mode_button (Widget parent);static void add_reload_button (Widget parent);static void add_print_button (Widget parent);static void add_terminal_button (Widget parent);static void breakpoint_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void breakpoint_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void clear_program_state_action (Widget w, XtPointer client_data, XtPointer call_data);static void continue_action (Widget w, XtPointer client_data, XtPointer call_data);static void continue_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void delete_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void destroy_popup_prompt (Widget w, XtPointer client_data, XtPointer call_data);static void help_action (Widget w, XtPointer ignore, XtPointer ignored);static void init_stack (char *args);static void load_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void load_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void list_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void noop (void);static void parse_print_value (Widget w, XtPointer client_data, XtPointer call_data);static void parse_set_value (Widget w, XtPointer client_data, XtPointer call_data);static Widget popup_two_field_dialog (Widget button, String name, String field1_label, String field1_value, String field2_label, String field2_value, String action_name, void (*action) (/* ??? */), String action2_name, void (*action2) (/* ??? */), Widget *field1_text, Widget *field2_text);static void print_mem_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void print_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void print_symbol_action (Widget w, XtPointer client_data, XtPointer call_data);static void quit_action (Widget w, XtPointer client_data,XtPointer call_data);static void quit_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void quit_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void read_assm_file_action (Widget w, XtPointer client_data, XtPointer call_data);static void reload_action (Widget w, XtPointer client_data, XtPointer call_data);static void run_program_action (Widget w, XtPointer client_data, XtPointer call_data);static void run_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void run_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void select_mode_action (Widget w, XtPointer client_data, XtPointer call_data);static void set_value_action (char *location_str,char *value_str);static void set_value_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void set_value_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void step_continue_action (Widget w, XtPointer client_data, XtPointer call_data);static void step_program_action (Widget w, XtPointer client_data, XtPointer call_data);static void step_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void step_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void warp_to_second_dialog (Widget widget, XEvent *event, String *params, Cardinal *num_params);#elsestatic void add_breakpoint_action ();static void add_clear_button ();static void add_mode_button ();static void add_print_button ();static void add_reload_button ();static void add_terminal_button ();static void breakpoint_prompt ();static void breakpoint_prompt_destroyed ();static void clear_program_state_action ();static void continue_action ();static void continue_prompt_destroyed ();static void delete_breakpoint_action ();static void destroy_popup_prompt ();static void help_action ();static void init_stack ();static void load_prompt ();static void load_prompt_destroyed ();static void list_breakpoint_action ();static void noop ();static void parse_print_value ();static void parse_set_value ();static Widget popup_two_field_dialog ();static void print_mem_prompt ();static void print_prompt_destroyed ();static void print_symbol_action ();static void quit_action ();static void quit_prompt ();static void quit_prompt_destroyed ();static void read_assm_file_action ();static void reload_action ();static void run_program_action ();static void run_prompt ();static void run_prompt_destroyed ();static void select_mode_action ();static void set_value_action ();static void set_value_prompt ();static void set_value_destroyed ();static void step_continue_action ();static void step_program_action ();static void step_prompt ();static void step_prompt_destroyed ();static void warp_to_second_dialog ();#endif/* Local variables: */static Widget breakpointButton;static void (*confirmAction) () = noop;static int stack_initialized = 0;char *xspim_file_name = NULL; /* Retain last file's name. */#ifdef __STDC__voidrecord_file_name_for_prompt (char *name)#elsevoidrecord_file_name_for_prompt (name) char *name;#endif{ xspim_file_name = str_copy (name);}#ifdef __STDC__voidcreate_buttons (Widget parent)#elsevoidcreate_buttons (parent) Widget parent;#endif{ Widget button; Widget command; Arg args[10]; XtSetArg (args[0], XtNlabel, "quit"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("quitbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, quit_prompt, NULL); XtSetArg (args[0], XtNlabel, "load"); XtSetArg (args[1], XtNwidth, button_width); command = XtCreateManagedWidget ("loadbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (command, XtNcallback, load_prompt, NULL); add_reload_button (parent); XtSetArg (args[0], XtNlabel, "run"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("runbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, run_prompt, NULL); XtSetArg (args[0], XtNlabel, "step"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("stepbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, step_prompt, NULL); add_clear_button (parent); XtSetArg (args[0], XtNlabel, "set value"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("setvaluebutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, set_value_prompt, NULL); add_print_button (parent); XtSetArg (args[0], XtNlabel, "breakpoints"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("bkptbutton", commandWidgetClass, parent, args, TWO); breakpointButton = button; XtAddCallback (button, XtNcallback, breakpoint_prompt, NULL); XtSetArg (args[0], XtNlabel, "help"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("helpbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, help_action, NULL); add_terminal_button (parent); add_mode_button (parent);}/* *** Quit *** */static Widget quit_popup = NULL;#ifdef __STDC__static voidquit_prompt (Widget button, XtPointer client_data, XtPointer call_data)#elsestatic voidquit_prompt (button, client_data, call_data) Widget button; XtPointer client_data, call_data;#endif{ Widget parent, dialog; Arg args[10]; Position x, y; if (quit_popup == NULL) { parent = XtParent (button); XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); quit_popup = XtCreatePopupShell ("prompt", transientShellWidgetClass, parent, args, TWO); XtAddCallback (quit_popup, XtNdestroyCallback, quit_prompt_destroyed, (XtPointer) 0); XtSetArg (args[0], XtNlabel, "quit?"); dialog = XtCreateManagedWidget ("quit", dialogWidgetClass, quit_popup, args, ONE); XawDialogAddButton (dialog, "quit", quit_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); } confirmAction = quit_action; XtPopup (quit_popup, XtGrabNone);}#ifdef __STDC__static voidquit_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidquit_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget dialog = (Widget) client_data; destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL); XtDestroyApplicationContext (XtWidgetToApplicationContext (w)); exit (0);}#ifdef __STDC__static voidquit_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidquit_prompt_destroyed (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ quit_popup = NULL;}/* *** Load *** */static Widget load_popup = NULL;#ifdef __STDC__static voidload_prompt (Widget button, XtPointer client_data, XtPointer call_data)#elsestatic voidload_prompt (button, client_data, call_data) Widget button; XtPointer client_data, call_data;#endif{ Widget parent, dialog; Arg args[10]; Position x, y; if (load_popup == NULL) { parent = XtParent (button); XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); load_popup = XtCreatePopupShell ("popup", transientShellWidgetClass, parent, args, TWO); XtAddCallback (load_popup, XtNdestroyCallback, load_prompt_destroyed, (XtPointer) 0); if (xspim_file_name == NULL) xspim_file_name = str_copy (""); XtSetArg (args[0], XtNlabel, "input filename:"); XtSetArg (args[1], XtNvalue, xspim_file_name); dialog = XtCreateManagedWidget ("dialog", dialogWidgetClass, load_popup, args, TWO); XawDialogAddButton (dialog, "assembly file", read_assm_file_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); } confirmAction = read_assm_file_action; XtPopup (load_popup, XtGrabNone);}#ifdef __STDC__static voidread_assm_file_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidread_assm_file_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget dialog = (Widget) client_data; String value = XawDialogGetValueString (dialog); free (xspim_file_name); xspim_file_name = str_copy (value); read_file (value, 1); destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);}#ifdef __STDC__static voidload_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidload_prompt_destroyed (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ load_popup = NULL;}/* *** Run *** */static Widget run_popup = NULL;static Widget run_field1_text, run_field2_text;#ifdef __STDC__static voidrun_prompt (Widget button, XtPointer client_data, XtPointer call_data)#elsestatic voidrun_prompt (button, client_data, call_data) Widget button; XtPointer client_data, call_data;#endif{ char sa[20]; if (run_popup == NULL) { sprintf (sa, "0x%08x", starting_address ()); run_popup = popup_two_field_dialog (button, "run program", "starting address:", sa, "args:", xspim_file_name, "ok", run_program_action, NULL, NULL, &run_field1_text, &run_field2_text); XtAddCallback (run_popup, XtNdestroyCallback, run_prompt_destroyed, (XtPointer) 0); } confirmAction = run_program_action; XtPopup (run_popup, XtGrabNone);}#ifdef __STDC__static voidrun_program_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidrun_program_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Arg args[10]; String value1, value2; Widget form = XtParent (w); mem_addr addr; XtSetArg (args[0], XtNstring, &value1); XtGetValues (run_field1_text, args, ONE); XtSetArg (args[0], XtNstring, &value2); XtGetValues (run_field2_text, args, ONE); destroy_popup_prompt (NULL, (XtPointer) form, NULL); init_stack (value2); addr = strtoul (value1, NULL, 0); if (addr > 0) start_program (addr);}#ifdef __STDC__static voidinit_stack (char *args)#elsestatic voidinit_stack (args) char *args;#endif{ int argc = 0; char *argv[10000];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -