⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prefs.c

📁 给予GTK开发的调试工具
💻 C
字号:
//	bfe2 - preferences//	Copyright (c) 1999-2003 Brand Huntsman and Lee Salzman//#include "common.h"#include "functions.h"//////////////////////////////////////////////////////////////////////////// globaluint h_maxlen, stack_above, stack_below, tracing, steplock_time, nextlock_time;uint reload_breakpoints, reload_watchpoints;// localGtkWidget *hislen_text, *stackabove_text, *stackbelow_text, *steplock_text, *nextlock_text;GtkWidget *trace_button;s_bgroup *page_tab;char *tab_titles[] = { " Bottom ", " Top ", " Left ", " Right " };//////////////////////////////////////////////////////////////////////////uint find_char( char *buffer, uint *i, char m ){	char c;	do {		c = buffer[*i];		if(buffer[*i] == m) return(1);		(*i)++;	} while(c != '\0');	return(0);}uint get_structure( char *buffer, uint *i, uint type ){	s_structwin *s;	s_field *field;	char *word;	if((s = (s_structwin *)malloc(sizeof(s_structwin))) == NULL)		return(0);	if(get_word(buffer, i, &word) == 0) return(0);	if(strlen(word) >= LEN_STRUCT_NAME) return(0);	strcpy(s->name, word);						// STRUCT: name	if(get_word(buffer, i, &word) == 0) return(0);	if(sscanf(word, "%x", &s->base) != 1) return(0);		// STRUCT: base	if(type){		s->nr_elts = 1;						// STRUCT: nr_elts	} else {		if(get_word(buffer, i, &word) == 0) return(0);		if(sscanf(word, "%u", &s->nr_elts) != 1) return(0);	// LIST: nr_elts	}	s->nr_fields = 0;	s->fields_head = s->fields_tail = NULL;	for(;;){		if(get_word(buffer, i, &word) == 0) return(0);		if(strlen(word) >= LEN_FIELD_NAME) return(0);		if(word[0] == '}' && word[1] == '\0') break;		if((field = (s_field *)malloc(sizeof(s_field))) == NULL)			return(0);		strcpy(field->name, word);				// FIELD: name		if(get_word(buffer, i, &word) == 0) return(0);		if(sscanf(word, "%u", &field->size) != 1) return(0);	// FIELD: size		// add field to list		field->next = NULL;		if(s->fields_head == NULL){			s->fields_head = field;		} else {			field->prev = s->fields_tail;			s->fields_tail->next = field;		}		s->fields_tail = field;		s->nr_fields++;	}	s->window = NULL;	// add structure to list	s->next = NULL;	if(structwin_head == NULL){		structwin_head = s;	} else {		s->prev = structwin_tail;		structwin_tail->next = s;	}	structwin_tail = s;	return(1);}void load_prefs( ){	FILE *file;	struct stat stat_buffer;	char *buffer, *word;	uint i, tabs;	if((file = fopen(RC_PATH, "r")) == NULL){		g_print("BFE: %s file not found, using defaults\n", RC_PATH);		return;	}	stat(RC_PATH, &stat_buffer);	if((buffer = (char *)malloc(stat_buffer.st_size + 1)) == NULL){		g_print("BFE: Couldn't process %s file, using defaults\n", RC_PATH);		return;	}	i = 0;	while(!feof(file)){		buffer[i] = getc(file);		i++;	}	buffer[i-1] = '\0';	fclose(file);	i = 0;	for(;;){		// find beginning of a block		if(!find_char(buffer, &i, '{')) return;		i++;		if(get_word(buffer, &i, &word) == 0) return;		if(string_compare(word, "history")){			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &h_maxlen) != 1) return;		// HISTORY: max length		} else if(string_compare(word, "stack")){			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &stack_above) != 1) return;	// STACK: above			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &stack_below) != 1) return;	// STACK: below		} else if(string_compare(word, "tabs")){			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &tabs) != 1) return;		// TABS: position			set_bgroup(page_tab, tabs);		} else if(string_compare(word, "reload")){			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &reload_breakpoints) != 1) return;	// RELOAD: breakpoints			if(get_word(buffer, &i, &word) == 0) return;			if(sscanf(word, "%u", &reload_watchpoints) != 1) return;	// RELOAD: watchpoints		} else if(string_compare(word, "struct")){			if(get_structure(buffer, &i, 1) == 0) return;		} else if(string_compare(word, "list")){			if(get_structure(buffer, &i, 0) == 0) return;		} else {			g_print("BFE: Unknown block type '%s' in %s\n", word, RC_PATH);			return;		}	}}void toggle_tracing( GtkWidget *widget, gpointer data ){	if(tracing){		tracing = 0;		historyWrite("--- TRACE DISABLED ---");		fprintf(writepipe, "trace-off\n");		prompt_read();	} else {		tracing = 1;		historyRepeat();		historyReset();		historyWrite("--- TRACE ENABLED ---");		fprintf(writepipe, "trace-on\n");		prompt_read();	}}void toggle_bp( GtkWidget *widget, gpointer data ){	if(reload_breakpoints) reload_breakpoints = 0;	else reload_breakpoints = 1;}void toggle_wp( GtkWidget *widget, gpointer data ){	if(reload_watchpoints) reload_watchpoints = 0;	else reload_watchpoints = 1;}void update_text( GtkWidget *text, uint value ){	char n[LEN_NUMBER];	snprintf(n, LEN_NUMBER, "%u", value);	gtk_entry_set_text(GTK_ENTRY(text), n);}void set_cfg_hislen( GtkWidget *widget, gpointer data ){	h_maxlen = atoi(gtk_entry_get_text(GTK_ENTRY(hislen_text)));	if(h_maxlen < 1) h_maxlen = 1;	historyClip();	update_text(widget, h_maxlen);}void set_cfg_stackabove( GtkWidget *widget, gpointer data ){	stack_above = atoi(gtk_entry_get_text(GTK_ENTRY(stackabove_text)));	if(stack_above < 0) stack_above = 0;	stateUpdateStack();	update_text(widget, stack_above);}void set_cfg_stackbelow( GtkWidget *widget, gpointer data ){	stack_below = atoi(gtk_entry_get_text(GTK_ENTRY(stackbelow_text)));	if(stack_below < 0) stack_below = 0;	stateUpdateStack();	update_text(widget, stack_below);}void set_cfg_steplock( GtkWidget *widget, gpointer data ){	steplock_time = atoi(gtk_entry_get_text(GTK_ENTRY(steplock_text)));	if(steplock_time < 1) steplock_time = 1;	update_text(widget, steplock_time);}void set_cfg_nextlock( GtkWidget *widget, gpointer data ){	nextlock_time = atoi(gtk_entry_get_text(GTK_ENTRY(nextlock_text)));	if(nextlock_time < 1) nextlock_time = 1;	update_text(widget, nextlock_time);}void toggle_page_tabs( s_bgroup *group ){	switch(group->current){	case 0:		gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_BOTTOM);		break;	case 1:		gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);		break;	case 2:		gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_LEFT);		break;	case 3:		gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_RIGHT);		break;	}}static GtkWidget *new_entry_and_label( GtkWidget *box, char *name, uint maxlen, void (*callback)(), uint width ){	GtkWidget *hbox, *text;	hbox = new_hbox(box, FALSE);	text = new_text_entry(hbox, FALSE, width);	gtk_entry_set_max_length(GTK_ENTRY(text), maxlen);	gtk_entry_set_editable(GTK_ENTRY(text), TRUE);	gtk_signal_connect(GTK_OBJECT(text), "activate", GTK_SIGNAL_FUNC(callback), NULL);//	gtk_signal_connect(GTK_OBJECT(text), "changed", GTK_SIGNAL_FUNC(callback), NULL);	new_label(hbox, FALSE, name, FALSE);	return(text);}//////////////////////////////////////////////////////////////////////////void prefsInit( GtkWidget *vbox ){	GtkWidget *hbox, *vbox2, *button, *rbp_button, *rwp_button;	char n[LEN_NUMBER];	hbox = new_hbox(vbox, FALSE);	vbox2 = new_vbox(hbox, FALSE);	hislen_text = new_entry_and_label(vbox2, "Instruction History Length", 5, set_cfg_hislen, 75);	stackabove_text = new_entry_and_label(vbox2, "Stack values above ESP", 4, set_cfg_stackabove, 75);	stackbelow_text = new_entry_and_label(vbox2, "Stack values below ESP", 4, set_cfg_stackbelow, 75);	steplock_text = new_entry_and_label(vbox2, "Step-Lock Time (seconds)", 3, set_cfg_steplock, 75);	nextlock_text = new_entry_and_label(vbox2, "Next-Lock Time (seconds)", 3, set_cfg_nextlock, 75);	/////////////////////////////////////////////	new_separator(hbox, FALSE, VERTICAL);	/////////////////////////////////////////////	vbox2 = new_vbox(hbox, FALSE);	button = new_button(vbox2, FALSE, "Clear History");	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(historyClear), NULL);	trace_button = new_check_button(vbox2, FALSE, "Enable instruction tracing", FALSE);	gtk_signal_connect(GTK_OBJECT(trace_button), "clicked", GTK_SIGNAL_FUNC(toggle_tracing), NULL);	rbp_button = new_check_button(vbox2, FALSE, "Reload breakpoints when restarting Bochs", TRUE);	gtk_signal_connect(GTK_OBJECT(rbp_button), "clicked", GTK_SIGNAL_FUNC(toggle_bp), NULL);	rwp_button = new_check_button(vbox2, FALSE, "Reload watchpoints when restarting Bochs", TRUE);	gtk_signal_connect(GTK_OBJECT(rwp_button), "clicked", GTK_SIGNAL_FUNC(toggle_wp), NULL);	hbox = new_hbox(vbox2, FALSE);	new_label(hbox, FALSE, "Page tabs", FALSE);	page_tab = new_button_group(hbox, FALSE, HORIZONTAL, 4, tab_titles);	page_tab->callback = toggle_page_tabs;	/////////////////////////////////////////////	// defaults settings	h_maxlen = DEF_HISLEN;	stack_above = DEF_STACKABOVE;	stack_below = DEF_STACKBELOW;	steplock_time = DEF_STEPLOCK;	nextlock_time = DEF_NEXTLOCK;	tracing = 0;	reload_breakpoints = DEF_RELOAD_BP;	reload_watchpoints = DEF_RELOAD_WP;	set_bgroup(page_tab, DEF_PAGE_TAB);	structwin_head = structwin_tail = NULL;	load_prefs();	snprintf(n, LEN_NUMBER, "%u", h_maxlen);	gtk_entry_set_text(GTK_ENTRY(hislen_text), n);	snprintf(n, LEN_NUMBER, "%u", stack_above);	gtk_entry_set_text(GTK_ENTRY(stackabove_text), n);	snprintf(n, LEN_NUMBER, "%u", stack_below);	gtk_entry_set_text(GTK_ENTRY(stackbelow_text), n);	snprintf(n, LEN_NUMBER, "%u", steplock_time);	gtk_entry_set_text(GTK_ENTRY(steplock_text), n);	snprintf(n, LEN_NUMBER, "%u", nextlock_time);	gtk_entry_set_text(GTK_ENTRY(nextlock_text), n);	if(reload_breakpoints){		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rbp_button), TRUE);		reload_breakpoints = 1;	} else {		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rbp_button), FALSE);		reload_breakpoints = 0;	}	if(reload_watchpoints){		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rwp_button), TRUE);		reload_watchpoints = 1;	} else {		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rwp_button), FALSE);		reload_watchpoints = 0;	}}void prefsEnablePage( gboolean v ){	gtk_widget_set_sensitive(trace_button, v);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -