+ utf8str = gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE);
+ if (!utf8str) return FALSE;
+
+ if ((gint) g_utf8_strlen(utf8str, -1) != len) {
+ g_free(utf8str);
+ return FALSE;
+ }
+
+ for (; match_count < len; pos++, match_count++) {
+ gchar *ptr = g_utf8_offset_to_pointer(utf8str, match_count);
+ gunichar ch;
+
+ if (!ptr) break;
+ ch = g_utf8_get_char(ptr);
+
+ if (case_sens) {
+ if (ch != wcs[match_count])
+ break;
+ } else {
+ if (g_unichar_tolower(ch) !=
+ g_unichar_tolower(wcs[match_count]))
+ break;
+ }
+ }
+
+ g_free(utf8str);
+
+ if (match_count == len)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+guint gtkut_text_buffer_str_compare_n(GtkTextBuffer *textbuf,
+ guint pos1, guint pos2,
+ guint len, guint text_len)
+{
+ guint i;
+
+ for (i = 0; i < len && pos1 + i < text_len && pos2 + i < text_len; i++) {
+ GtkTextIter start_iter, end_iter;
+ gchar *utf8str1, *utf8str2;
+
+ gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter,
+ pos1 + i);
+ gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
+ pos1 + i + 1);
+ utf8str1 = gtk_text_buffer_get_text(textbuf,
+ &start_iter,
+ &end_iter,
+ FALSE);
+
+ gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter,
+ pos2 + i);
+ gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
+ pos2 + i + 1);
+ utf8str2 = gtk_text_buffer_get_text(textbuf,
+ &start_iter,
+ &end_iter,
+ FALSE);
+
+ if (!utf8str1 || !utf8str2 || strcmp(utf8str1, utf8str2)) {
+ g_free(utf8str1);
+ g_free(utf8str2);
+ break;
+ }
+
+ g_free(utf8str1);
+ g_free(utf8str2);
+ }
+
+ return i;
+}
+
+guint gtkut_text_buffer_str_compare(GtkTextBuffer *textbuf,
+ guint start_pos, guint text_len,
+ const gchar *str)
+{
+ gunichar *wcs;
+ guint len = 0;
+ glong items_read = 0, items_written = 0;
+ gboolean result;
+ GError *error = NULL;
+
+ if (!str) return 0;
+
+ wcs = g_utf8_to_ucs4(str, -1, &items_read, &items_written, &error);
+ if (error != NULL) {
+ g_warning("An error occured while converting a string from UTF-8 to UCS-4: %s\n",
+ error->message);
+ g_error_free(error);
+ }
+ if (!wcs || items_written <= 0) return 0;
+ len = (guint) items_written;
+
+ if (len > text_len - start_pos)
+ result = FALSE;
+ else
+ result = gtkut_text_buffer_match_string(textbuf, start_pos,
+ wcs, len,
+ TRUE);
+
+ g_free(wcs);
+
+ return result ? len : 0;
+}
+
+gboolean gtkut_text_buffer_is_uri_string(GtkTextBuffer *textbuf,
+ guint start_pos, guint text_len)
+{
+ if (gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "http://") ||
+ gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "ftp://") ||
+ gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "https://") ||
+ gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "www."))
+ return TRUE;
+
+ return FALSE;
+}
+
+gchar *gtkut_text_view_get_selection(GtkTextView *textview)
+{
+ GtkTextBuffer *buffer;
+ GtkTextIter start_iter, end_iter;
+ gboolean found;
+
+ g_return_val_if_fail(GTK_IS_TEXT_VIEW(textview), NULL);
+
+ buffer = gtk_text_view_get_buffer(textview);
+ found = gtk_text_buffer_get_selection_bounds(buffer,
+ &start_iter,
+ &end_iter);
+ if (found)
+ return gtk_text_buffer_get_text(buffer, &start_iter, &end_iter,
+ FALSE);
+ else
+ return NULL;
+}
+#endif /* FIXME_GTK2 */