? src/beaver Index: src/Makefile =================================================================== RCS file: /sources/beaver/beaver0_3_0_x/src/Makefile,v retrieving revision 1.2 diff -u -u -p -r1.2 Makefile --- src/Makefile 25 Jun 2008 20:27:56 -0000 1.2 +++ src/Makefile 21 Dec 2008 19:04:45 -0000 @@ -14,7 +14,7 @@ CP = cp DESTDIR = /usr/local IPATH = LPATH = -OPTI = -Wall -O3 -funroll-loops -fomit-frame-pointer #-DDEBUG_FCN +OPTI = -Wall -O3 -funroll-loops -fomit-frame-pointer -pipe #-DDEBUG_FCN DBUG = #-ggdb -pg -fbounds-check WARN = #-W -Wall #-pedantic -ansi Index: src/search.c =================================================================== RCS file: /sources/beaver/beaver0_3_0_x/src/search.c,v retrieving revision 1.1 diff -u -u -p -r1.1 search.c --- src/search.c 25 Jun 2008 14:00:42 -0000 1.1 +++ src/search.c 21 Dec 2008 19:04:45 -0000 @@ -33,7 +33,7 @@ #include "struct.h" #include "msgbar.h" #include "prefs.h" -#include "search.h" +#include "search.h" extern GArray *FileProperties; extern GtkWidget *MainNotebook; @@ -56,7 +56,7 @@ gint char_cmp (gboolean case_sen, if (!case_sen) { gint diff = 'A' - 'a'; - + if (isupper(char1) && islower(char2)) return (char2 + diff - char1); else if (isupper(char2) && islower(char1)) @@ -72,34 +72,87 @@ t_search_results *find (gint page, gboolean case_sen, gboolean reg_exp, gint start_pos, - const gchar *string) + const gchar *string) /* TODO: add more regex options */ { gchar *buffer; gint len, i, j, k = 1, line_nb = 1; t_search_results *res; + GRegex *regex; + GError *error = NULL; + guint options; + GtkTextIter *iter; + GMatchInfo *matchinf; - (void)reg_exp; /* regular expressions are not yet implemented */ res = g_malloc (sizeof(t_search_results)); len = strlen (string); - buffer = get_text (gtk_text_view_get_buffer + buffer = get_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW(FPROPS(page, Text)))); - for (i = 0; i < start_pos; i++) + + res[0].Line = 0; + + if (reg_exp) { - if (buffer[i] == '\n') - line_nb++; + options = G_REGEX_MULTILINE; + options += (case_sen ? G_REGEX_CASELESS : 0); + + regex = g_regex_new(string, options, 0, &error); + + if (error) + { + /* Show some message to the user, the line bellow is just for debugging*/ + g_print("g_regex_new() error: %s\n", error->message); + + g_free(regex); + g_free (buffer); + return (res); + } + + if (!g_regex_match(regex, buffer, 0, &matchinf)) + { + g_print("No match found\n"); + g_free(regex); + g_free (buffer); + return (res); + } + + k = 1; + iter = g_new(GtkTextIter, 1); + + while ( g_match_info_matches(matchinf) ) + { + res = g_realloc (res, (k + 1) * sizeof(t_search_results)); + g_match_info_fetch_pos(matchinf, 0, &res[k].Begin, &res[k].End); + + gtk_text_buffer_get_iter_at_offset(gtk_text_view_get_buffer(GTK_TEXT_VIEW(FPROPS(page, Text))), iter, res[k].Begin); + res[k].Line = gtk_text_iter_get_line(iter)+1; + + k++; + g_match_info_next(matchinf, NULL); + } + g_free(matchinf); + g_free(regex); } - for (i = start_pos; buffer[i+len-1] != '\0'; i++) + else { - if (buffer[i] == '\n') - line_nb++; - for (j = 0; (string[j] != '\0') && - !char_cmp(case_sen, buffer[i+j], string[j]); j++); - if (j == len) + + for (i = 0; i < start_pos; i++) { - res = g_realloc (res, (k + 1) * sizeof(t_search_results)); - res[k].Line = line_nb; - res[k].Begin = i; + if (buffer[i] == '\n') + line_nb++; + } + for (i = start_pos; buffer[i+len-1] != '\0'; i++) + { + if (buffer[i] == '\n') + line_nb++; + for (j = 0; (string[j] != '\0') && + !char_cmp(case_sen, buffer[i+j], string[j]); j++); + if (j == len) + { + res = g_realloc (res, (k + 1) * sizeof(t_search_results)); + res[k].Line = line_nb; + res[k].Begin = i; res[k++].End = i + len; + } } } res[0].Line = k - 1; @@ -122,9 +175,9 @@ gint replace_all (gint page, gint i, j, k, rep_nb = 0; GtkTextIter start, end; GtkTextBuffer *Buffer; - + (void)reg_exp; /* regular expressions are not yet implemented */ - buffer_in = get_text (gtk_text_view_get_buffer + buffer_in = get_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW(FPROPS(page, Text)))); len_in = strlen (buffer_in); len_out = strlen (buffer_in) + 10; @@ -195,14 +248,14 @@ void goto_search (GtkList *MyList, if (End <= length) { gchar *selection; - + gtk_text_buffer_get_iter_at_offset(EditorBuffer, &start, Begin); gtk_text_buffer_get_iter_at_offset(EditorBuffer, &end, End); gtk_text_buffer_move_mark_by_name(EditorBuffer, "insert", &start); - gtk_text_buffer_move_mark_by_name(EditorBuffer, + gtk_text_buffer_move_mark_by_name(EditorBuffer, "selection_bound", &end); - selection = gtk_text_buffer_get_text(EditorBuffer, + selection = gtk_text_buffer_get_text(EditorBuffer, &start, &end, FALSE); if (SearchPrefs -> CaseSen) { @@ -259,21 +312,21 @@ void refresh_search (GtkWidget *Widget, else SearchPrefs -> CaseSen = FALSE; } -/* TODO: implement the regexp feature */ -/* else if (!strcmp (Data, "reg_exp")) + + else if (!strcmp (Data, "reg_exp")) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(Widget))) SearchPrefs -> RegExp = TRUE; else SearchPrefs -> RegExp = FALSE; - } */ + } else if (!strcmp (Data, "search")) { gchar *msg; gint SearchBegin, i, CurrentPage; t_search_results *search_res; GtkWidget *ListItem; - + if (!OpenedFilesCnt) { print_msg ("Hey, you closed all the files!"); @@ -298,7 +351,7 @@ void refresh_search (GtkWidget *Widget, for (i = 1; i <= search_res[0].Line; i++) { gchar *str_temp; - + str_temp = g_strdup_printf ("%d. Line %d (%d-%d)", i, search_res[i].Line, search_res[i].Begin, @@ -365,7 +418,7 @@ void refresh_search (GtkWidget *Widget, return; } SearchPrefs -> StringToSearch = gtk_entry_get_text - (GTK_ENTRY(SearchEntry)); + (GTK_ENTRY(SearchEntry)); if (!strlen(SearchPrefs -> StringToSearch)) return; ReplaceString = gtk_entry_get_text (GTK_ENTRY(ReplaceEntry)); @@ -374,7 +427,7 @@ void refresh_search (GtkWidget *Widget, { GtkTextBuffer *EditorBuffer; GtkTextIter current; - + EditorBuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(FPROPS(CurrentPage, Text))); gtk_text_buffer_get_iter_at_mark (EditorBuffer, ¤t, @@ -438,10 +491,10 @@ void refresh_search (GtkWidget *Widget, print_msg (msg); g_free (msg); } - else + else { t_search_results *search_res; - + search_res = find (CurrentPage, SearchPrefs -> CaseSen, SearchPrefs -> RegExp, @@ -452,7 +505,7 @@ void refresh_search (GtkWidget *Widget, GtkTextBuffer *EditorBuffer; GtkTextIter start, end; gchar *buffer; - + EditorBuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(FPROPS(CurrentPage, Text))); buffer = get_selection (EditorBuffer); @@ -460,7 +513,7 @@ void refresh_search (GtkWidget *Widget, { replace_selection(FPROPS(CurrentPage, Buffer), ReplaceString); print_msg ("Selection replaced..."); - } + } else { gtk_text_buffer_get_iter_at_offset(EditorBuffer, @@ -479,7 +532,7 @@ void refresh_search (GtkWidget *Widget, if (BEEP) gdk_beep (); print_msg ("End of Search..."); } - g_free (search_res); + g_free (search_res); } gtk_entry_set_text (GTK_ENTRY(SearchEntry), SearchPrefs -> StringToSearch); @@ -549,15 +602,14 @@ void search (gboolean Replace) gtk_box_pack_start (GTK_BOX(VBox2), Button, FALSE, FALSE, 0); Button = gtk_check_button_new_with_mnemonic ("Case _sensitive"); g_signal_connect (G_OBJECT(Button), "toggled", - (GtkSignalFunc)refresh_search, "case_sen"); + (GtkSignalFunc)refresh_search, "case_sen"); gtk_box_pack_start (GTK_BOX(VBox2), Button, FALSE, FALSE, 0); - -/* TODO: implement the regexp feature */ -/* Button = gtk_check_button_new_with_label ("Regular expression search"); + + Button = gtk_check_button_new_with_label ("Regular expression search"); g_signal_connect (G_OBJECT(Button), "toggled", - (GtkSignalFunc)refresh_search, "reg_exp"); - gtk_box_pack_start (GTK_BOX(VBox2), Button, FALSE, FALSE, 0); */ - + (GtkSignalFunc)refresh_search, "reg_exp"); + gtk_box_pack_start (GTK_BOX(VBox2), Button, FALSE, FALSE, 0); + Button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); g_signal_connect_swapped (G_OBJECT(Button), "clicked", (GtkSignalFunc) gtk_widget_destroy, @@ -649,18 +701,18 @@ void set_line (GtkWidget *SpinButton) line_to_go = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(SpinButton)); CurrentPage = gtk_notebook_get_current_page (GTK_NOTEBOOK(MainNotebook)); EditorBuffer = FPROPS(CurrentPage, Buffer); - + gtk_text_buffer_get_iter_at_line (EditorBuffer, &start, line_to_go - 1); gtk_text_buffer_get_iter_at_line (EditorBuffer, &end, line_to_go); - + show_on_screen (GTK_TEXT_VIEW (FPROPS(CurrentPage, Text)), start); if (gtk_text_iter_equal (&start, &end)) /* not enough lines */ gtk_text_buffer_get_end_iter (EditorBuffer, &end); - + gtk_text_buffer_place_cursor (EditorBuffer, &start); gtk_text_buffer_move_mark_by_name (EditorBuffer, "selection_bound", &end); - + msg = g_strdup_printf ("Line %d selected...", gtk_text_iter_get_line (&start) + 1); print_msg (msg); g_free (msg); @@ -684,7 +736,7 @@ void goto_line (void) if (GotoLineIsVisible) return; GotoLineWindow = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW(GotoLineWindow), "Goto Line..."); + gtk_window_set_title (GTK_WINDOW(GotoLineWindow), "Goto Line..."); gtk_window_set_policy (GTK_WINDOW(GotoLineWindow), FALSE, FALSE, FALSE); g_signal_connect (G_OBJECT(GotoLineWindow), "delete_event", (GtkSignalFunc) goto_line_window_not_visible, NULL);