diff options
-rw-r--r-- | epan/libethereal.def | 2 | ||||
-rw-r--r-- | epan/strutil.c | 110 | ||||
-rw-r--r-- | epan/strutil.h | 19 | ||||
-rw-r--r-- | gtk/find_dlg.c | 150 |
4 files changed, 153 insertions, 128 deletions
diff --git a/epan/libethereal.def b/epan/libethereal.def index cddb70eac3..e5ae1fd00c 100644 --- a/epan/libethereal.def +++ b/epan/libethereal.def @@ -71,6 +71,8 @@ conversation_delete_proto_data conversation_get_proto_data conversation_new conversation_set_dissector +convert_string_case +convert_string_to_hex copy_prefs crc16_ccitt_tvb create_dissector_handle diff --git a/epan/strutil.c b/epan/strutil.c index b9f068f406..7e78ba5233 100644 --- a/epan/strutil.c +++ b/epan/strutil.c @@ -476,3 +476,113 @@ epan_memmem(const guint8 *haystack, guint haystack_len, return NULL; } + +/* + * Scan the search string to make sure it's valid hex. Return the + * number of bytes in nbytes. + */ +guint8 * +convert_string_to_hex(const char *string, size_t *nbytes) +{ + size_t n_bytes; + const char *p; + guchar c; + guint8 *bytes, *q, byte_val; + + n_bytes = 0; + p = &string[0]; + for (;;) { + c = *p++; + if (c == '\0') + break; + if (isspace(c)) + continue; /* allow white space */ + if (c==':' || c=='.' || c=='-') + continue; /* skip any ':', '.', or '-' between bytes */ + if (!isxdigit(c)) { + /* Not a valid hex digit - fail */ + return NULL; + } + + /* + * We can only match bytes, not nibbles; we must have a valid + * hex digit immediately after that hex digit. + */ + c = *p++; + if (!isxdigit(c)) + return NULL; + + /* 2 hex digits = 1 byte */ + n_bytes++; + } + + /* + * Were we given any hex digits? + */ + if (n_bytes == 0) { + /* No. */ + return NULL; + } + + /* + * OK, it's valid, and it generates "n_bytes" bytes; generate the + * raw byte array. + */ + bytes = g_malloc(n_bytes); + p = &string[0]; + q = &bytes[0]; + for (;;) { + c = *p++; + if (c == '\0') + break; + if (isspace(c)) + continue; /* allow white space */ + if (c==':' || c=='.' || c=='-') + continue; /* skip any ':', '.', or '-' between bytes */ + /* From the loop above, we know this is a hex digit */ + if (isdigit(c)) + byte_val = c - '0'; + else if (c >= 'a') + byte_val = (c - 'a') + 10; + else + byte_val = (c - 'A') + 10; + byte_val <<= 4; + + /* We also know this is a hex digit */ + c = *p++; + if (isdigit(c)) + byte_val |= c - '0'; + else if (c >= 'a') + byte_val |= (c - 'a') + 10; + else if (c >= 'A') + byte_val |= (c - 'A') + 10; + + *q++ = byte_val; + } + *nbytes = n_bytes; + return bytes; +} + +/* + * Copy if if it's a case-sensitive search; uppercase it if it's + * a case-insensitive search. + */ +char * +convert_string_case(const char *string, gboolean case_insensitive) +{ + char *out_string; + const char *p; + char c; + char *q; + + if (case_insensitive) { + out_string = g_malloc(strlen(string) + 1); + for (p = &string[0], q = &out_string[0]; (c = *p) != '\0'; p++, q++) + *q = toupper((unsigned char)*p); + *q = '\0'; + } else + out_string = g_strdup(string); + return out_string; +} + + diff --git a/epan/strutil.h b/epan/strutil.h index 17136f3d72..beacb3b573 100644 --- a/epan/strutil.h +++ b/epan/strutil.h @@ -125,4 +125,23 @@ const guint8 * epan_memmem(const guint8 *haystack, guint haystack_len, #define _STRINGIFY(a) # a #define STRINGIFY(a) _STRINGIFY(a) +/** Scan a string to make sure it's valid hex. + * + * @param string The string to validate + * @param nbytes The length of the return buffer + * @return A pointer to a buffer containing the converted raw bytes. This + * buffer must be g_free()d by the caller. + */ +guint8 * convert_string_to_hex(const char *string, size_t *nbytes); + +/** Prep a string for case-sensitive vs case-insensitive searching. + * + * @param string The search string + * @param case_sensitive TRUE if case-sensitive, FALSE if not + * @return A direct copy of the string if it's a case-sensitive search and + * an uppercased version if not. In either case the string must be g_free()d + * by the caller. + */ +char * convert_string_case(const char *string, gboolean case_insensitive); + #endif /* __STRUTIL_H__ */ diff --git a/gtk/find_dlg.c b/gtk/find_dlg.c index b12ec75ee8..80810f7fd4 100644 --- a/gtk/find_dlg.c +++ b/gtk/find_dlg.c @@ -33,6 +33,7 @@ #include <epan/proto.h> #include <epan/dfilter/dfilter.h> +#include <epan/strutil.h> #include "globals.h" #include "ui_util.h" @@ -85,9 +86,6 @@ string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w); static void filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w); -static guint8 * -convert_string_to_hex(const char *string, size_t *nbytes); - /* * Keep a static pointer to the current "Find Packet" window, if any, so * that if somebody tries to do "Find Packet" while there's already a @@ -101,7 +99,7 @@ void find_frame_cb(GtkWidget *w _U_, gpointer d _U_) { GtkWidget *main_vb, *main_find_hb, *main_options_hb, - + *find_type_frame, *find_type_vb, *find_type_hb, *find_type_lb, *hex_rb, *string_rb, *filter_rb, *filter_hb, *filter_bt, @@ -113,7 +111,7 @@ find_frame_cb(GtkWidget *w _U_, gpointer d _U_) *hex_data_rb, *decode_data_rb, *summary_data_rb, *string_opt_frame, *string_opt_vb, - *case_cb, *combo_lb, *combo_cb, + *case_cb, *combo_lb, *combo_cb, *bbox, *ok_bt, *cancel_bt; GtkTooltips *tooltips; @@ -259,7 +257,7 @@ find_frame_cb(GtkWidget *w _U_, gpointer d _U_) gtk_widget_show(decode_data_rb); /* Packet bytes */ - hex_data_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(summary_data_rb, + hex_data_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(summary_data_rb, "Packet bytes", accel_group); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hex_data_rb), !decode_data && !summary_data); gtk_box_pack_start(GTK_BOX(data_vb), hex_data_rb, TRUE, TRUE, 0); @@ -288,7 +286,7 @@ find_frame_cb(GtkWidget *w _U_, gpointer d _U_) gtk_misc_set_alignment(GTK_MISC(combo_lb), 0.0, 0.5); gtk_widget_show(combo_lb); - /* String Type Selection Dropdown Box + /* String Type Selection Dropdown Box These only apply to the Hex Window search option */ /* Create Combo Box */ combo_cb = gtk_combo_new(); @@ -350,7 +348,7 @@ find_frame_cb(GtkWidget *w _U_, gpointer d _U_) OBJECT_SET_DATA(find_frame_w, E_SOURCE_DECODE_KEY, decode_data_rb); OBJECT_SET_DATA(find_frame_w, E_SOURCE_SUMMARY_KEY, summary_data_rb); OBJECT_SET_DATA(find_frame_w, E_FILT_TE_BUTTON_KEY, filter_bt); - + /* * Now that we've attached the pointers, connect the signals - if * we do so before we've attached the pointers, the signals may @@ -385,7 +383,7 @@ find_frame_cb(GtkWidget *w _U_, gpointer d _U_) } /* this function opens the find frame dialogue and sets the filter string */ -void +void find_frame_with_filter(char *filter) { find_frame_cb(NULL, NULL); @@ -412,7 +410,7 @@ find_filter_te_syntax_check_cb(GtkWidget *w, gpointer parent_w) */ strval = gtk_entry_get_text(GTK_ENTRY(w)); if (strval == NULL) { - /* XXX - can this happen? */ + /* XXX - can this happen? */ colorize_filter_te_as_invalid(w); } else { bytes = convert_string_to_hex(strval, &nbytes); @@ -429,7 +427,7 @@ find_filter_te_syntax_check_cb(GtkWidget *w, gpointer parent_w) */ strval = gtk_entry_get_text(GTK_ENTRY(w)); if (strval == NULL) { - /* XXX - can this happen? */ + /* XXX - can this happen? */ colorize_filter_te_as_invalid(w); } else { if (strcmp(strval, "") == 0) @@ -445,9 +443,9 @@ find_filter_te_syntax_check_cb(GtkWidget *w, gpointer parent_w) } } -/* +/* * This function will re-check the search text syntax. - */ + */ static void hex_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) { @@ -460,10 +458,10 @@ hex_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) return; } -/* +/* * This function will disable the string options until * the string search is selected. - */ + */ static void string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) { @@ -474,7 +472,7 @@ string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) hex_data_rb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_SOURCE_HEX_KEY); decode_data_rb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_SOURCE_DECODE_KEY); summary_data_rb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_SOURCE_SUMMARY_KEY); - + data_combo_lb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_FIND_STRINGTYPE_LABEL_KEY); data_combo_cb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_FIND_STRINGTYPE_KEY); data_case_cb = (GtkWidget *) OBJECT_GET_DATA(parent_w, E_CASE_SEARCH_KEY); @@ -500,10 +498,10 @@ string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) return; } -/* +/* * This function will disable the filter button until * the filter search is selected. - */ + */ static void filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) { @@ -511,7 +509,7 @@ filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) filter_bt = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_FILT_TE_BUTTON_KEY); filter_rb = (GtkWidget *)OBJECT_GET_DATA(parent_w, E_FIND_FILTERDATA_KEY); - + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filter_rb))) { gtk_widget_set_sensitive(GTK_WIDGET(filter_bt), TRUE); @@ -523,110 +521,6 @@ filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w) return; } -static guint8 * -convert_string_to_hex(const char *string, size_t *nbytes) -{ - size_t n_bytes; - const char *p; - guchar c; - guint8 *bytes, *q, byte_val; - - n_bytes = 0; - p = &string[0]; - for (;;) { - c = *p++; - if (c == '\0') - break; - if (isspace(c)) - continue; /* allow white space */ - if (c==':' || c=='.' || c=='-') - continue; /* skip any ':', '.', or '-' between bytes */ - if (!isxdigit(c)) { - /* Not a valid hex digit - fail */ - return NULL; - } - - /* - * We can only match bytes, not nibbles; we must have a valid - * hex digit immediately after that hex digit. - */ - c = *p++; - if (!isxdigit(c)) - return NULL; - - /* 2 hex digits = 1 byte */ - n_bytes++; - } - - /* - * Were we given any hex digits? - */ - if (n_bytes == 0) { - /* No. */ - return NULL; - } - - /* - * OK, it's valid, and it generates "n_bytes" bytes; generate the - * raw byte array. - */ - bytes = g_malloc(n_bytes); - p = &string[0]; - q = &bytes[0]; - for (;;) { - c = *p++; - if (c == '\0') - break; - if (isspace(c)) - continue; /* allow white space */ - if (c==':' || c=='.' || c=='-') - continue; /* skip any ':', '.', or '-' between bytes */ - /* From the loop above, we know this is a hex digit */ - if (isdigit(c)) - byte_val = c - '0'; - else if (c >= 'a') - byte_val = (c - 'a') + 10; - else - byte_val = (c - 'A') + 10; - byte_val <<= 4; - - /* We also know this is a hex digit */ - c = *p++; - if (isdigit(c)) - byte_val |= c - '0'; - else if (c >= 'a') - byte_val |= (c - 'a') + 10; - else if (c >= 'A') - byte_val |= (c - 'A') + 10; - - *q++ = byte_val; - } - *nbytes = n_bytes; - return bytes; -} - -static char * -convert_string_case(const char *string, gboolean case_insensitive) -{ - char *out_string; - const char *p; - char c; - char *q; - - /* - * Copy if if it's a case-sensitive search; uppercase it if it's - * a case-insensitive search. - */ - if (case_insensitive) { - out_string = g_malloc(strlen(string) + 1); - for (p = &string[0], q = &out_string[0]; (c = *p) != '\0'; p++, q++) - *q = toupper((unsigned char)*p); - *q = '\0'; - } else - out_string = g_strdup(string); - return out_string; -} - static void find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) { @@ -748,7 +642,7 @@ find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) g_free(string); if (!found_packet) { /* We didn't find the packet. */ - simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, + simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "%sFound no match!%s\n\n" "No packet contained that string in its dissected display.", simple_dialog_primary_start(), simple_dialog_primary_end()); @@ -760,7 +654,7 @@ find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) g_free(string); if (!found_packet) { /* We didn't find the packet. */ - simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, + simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "%sFound no match!%s\n\n" "No packet contained that string in its Info column.", simple_dialog_primary_start(), simple_dialog_primary_end()); @@ -772,7 +666,7 @@ find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) g_free(string); if (!found_packet) { /* We didn't find the packet. */ - simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, + simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "%sFound no match!%s\n\n" "No packet contained that string in its data.", simple_dialog_primary_start(), simple_dialog_primary_end()); @@ -784,7 +678,7 @@ find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) dfilter_free(sfcode); if (!found_packet) { /* We didn't find a packet */ - simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, + simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "%sFound no match!%s\n\n" "No packet matched that filter.", simple_dialog_primary_start(), simple_dialog_primary_end()); @@ -879,7 +773,7 @@ find_previous_cb(GtkWidget *w , gpointer d) } /* this function jumps to the next packet matching the filter */ -void +void find_previous_next_frame_with_filter(char *filter, gboolean backwards) { dfilter_t *sfcode; |