gtk/gtksourceiter.c

Sat, 18 Nov 2006 05:30:57 +0000

author
Sadrul Habib Chowdhury <sadrul@pidgin.im>
date
Sat, 18 Nov 2006 05:30:57 +0000
changeset 15057
909e807e3070
parent 14253
b63ebf84c42b
child 20470
77693555855f
permissions
-rw-r--r--

[gaim-migrate @ 17774]
The data for "plugin_action" is set with a destructor function. So freeing it
twice would cause a crash. The reason it's not crashing is, the children of the
container are not the menuitems, but GtkAccelLabel (or some such thing). So all
we are doing is freeing null. Also, when the menu is destroyed, all the
menuitems are also destroyed anyway. So get rid of the unrequired loop.

Also, isdigit expects a character, not a string.

7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
2 * gtksourceiter.c
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
3 *
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7358
diff changeset
4 * Gaim is the legal property of its developers, whose names are too numerous
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7358
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7358
diff changeset
6 * source distribution.
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
7 *
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
8 * The following copyright notice applies to this file:
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
9 *
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
10 * Copyright (C) 2000 - 2005 Paolo Maggi
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
11 * Copyright (C) 2002, 2003 Jeroen Zwartepoorte
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
12 *
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
13 * This program is free software; you can redistribute it and/or modify
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
14 * it under the terms of the GNU Library General Public License as published by
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
16 * (at your option) any later version.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
17 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
18 * This program is distributed in the hope that it will be useful,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
21 * GNU Library General Public License for more details.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
22 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
23 * You should have received a copy of the GNU Library General Public License
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
24 * along with this program; if not, write to the Free Software
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
26 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
27
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
28 /*
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
29 * Parts of this file are copied from the gedit and glimmer project.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
30 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
31
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
32 #ifdef HAVE_CONFIG_H
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
33 #include <config.h>
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
34 #endif
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
35
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
36 #include <string.h>
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
37 #include "gtksourceiter.h"
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
38
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
39 #define GTK_TEXT_UNKNOWN_CHAR 0xFFFC
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
40
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
41 /* this function acts like g_utf8_offset_to_pointer() except that if it finds a
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
42 * decomposable character it consumes the decomposition length from the given
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
43 * offset. So it's useful when the offset was calculated for the normalized
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
44 * version of str, but we need a pointer to str itself. */
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
45 static const gchar *
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
46 pointer_from_offset_skipping_decomp (const gchar *str, gint offset)
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
47 {
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
48 gchar *casefold, *normal;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
49 const gchar *p, *q;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
50
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
51 p = str;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
52 while (offset > 0)
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
53 {
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
54 q = g_utf8_next_char (p);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
55 casefold = g_utf8_casefold (p, q - p);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
56 normal = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
57 offset -= g_utf8_strlen (normal, -1);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
58 g_free (casefold);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
59 g_free (normal);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
60 p = q;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
61 }
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
62 return p;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
63 }
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
64
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
65 static const gchar *
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
66 g_utf8_strcasestr (const gchar *haystack, const gchar *needle)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
67 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
68 gsize needle_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
69 gsize haystack_len;
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
70 const gchar *ret = NULL;
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
71 gchar *p;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
72 gchar *casefold;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
73 gchar *caseless_haystack;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
74 gint i;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
75
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
76 g_return_val_if_fail (haystack != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
77 g_return_val_if_fail (needle != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
78
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
79 casefold = g_utf8_casefold (haystack, -1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
80 caseless_haystack = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
81 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
82
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
83 needle_len = g_utf8_strlen (needle, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
84 haystack_len = g_utf8_strlen (caseless_haystack, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
85
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
86 if (needle_len == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
87 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
88 ret = (gchar *)haystack;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
89 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
90 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
91
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
92 if (haystack_len < needle_len)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
93 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
94 ret = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
95 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
96 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
97
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
98 p = (gchar*)caseless_haystack;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
99 needle_len = strlen (needle);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
100 i = 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
101
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
102 while (*p)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
103 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
104 if ((strncmp (p, needle, needle_len) == 0))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
105 {
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
106 ret = pointer_from_offset_skipping_decomp (haystack, i);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
107 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
108 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
109
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
110 p = g_utf8_next_char (p);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
111 i++;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
112 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
113
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
114 finally_1:
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
115 g_free (caseless_haystack);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
116
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
117 return ret;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
118 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
119
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
120 static const gchar *
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
121 g_utf8_strrcasestr (const gchar *haystack, const gchar *needle)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
122 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
123 gsize needle_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
124 gsize haystack_len;
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
125 const gchar *ret = NULL;
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
126 gchar *p;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
127 gchar *casefold;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
128 gchar *caseless_haystack;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
129 gint i;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
130
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
131 g_return_val_if_fail (haystack != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
132 g_return_val_if_fail (needle != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
133
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
134 casefold = g_utf8_casefold (haystack, -1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
135 caseless_haystack = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
136 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
137
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
138 needle_len = g_utf8_strlen (needle, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
139 haystack_len = g_utf8_strlen (caseless_haystack, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
140
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
141 if (needle_len == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
142 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
143 ret = (gchar *)haystack;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
144 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
145 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
146
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
147 if (haystack_len < needle_len)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
148 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
149 ret = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
150 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
151 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
152
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
153 i = haystack_len - needle_len;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
154 p = g_utf8_offset_to_pointer (caseless_haystack, i);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
155 needle_len = strlen (needle);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
156
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
157 while (p >= caseless_haystack)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
158 {
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
159 if (strncmp (p, needle, needle_len) == 0)
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
160 {
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
161 ret = pointer_from_offset_skipping_decomp (haystack, i);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
162 goto finally_1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
163 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
164
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
165 p = g_utf8_prev_char (p);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
166 i--;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
167 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
168
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
169 finally_1:
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170 g_free (caseless_haystack);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
171
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
172 return ret;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
173 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
174
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
175 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
176 g_utf8_caselessnmatch (const char *s1, const char *s2,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
177 gssize n1, gssize n2)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
178 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
179 gchar *casefold;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
180 gchar *normalized_s1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
181 gchar *normalized_s2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
182 gint len_s1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
183 gint len_s2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
184 gboolean ret = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
185
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
186 g_return_val_if_fail (s1 != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
187 g_return_val_if_fail (s2 != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
188 g_return_val_if_fail (n1 > 0, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
189 g_return_val_if_fail (n2 > 0, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
190
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
191 casefold = g_utf8_casefold (s1, n1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
192 normalized_s1 = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
193 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
194
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
195 casefold = g_utf8_casefold (s2, n2);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
196 normalized_s2 = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
197 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
198
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
199 len_s1 = strlen (normalized_s1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
200 len_s2 = strlen (normalized_s2);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
201
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
202 if (len_s1 < len_s2)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
203 goto finally_2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
204
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
205 ret = (strncmp (normalized_s1, normalized_s2, len_s2) == 0);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
206
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
207 finally_2:
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
208 g_free (normalized_s1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
209 g_free (normalized_s2);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
210
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
211 return ret;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
212 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
213
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
214 static void
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
215 forward_chars_with_skipping (GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
216 gint count,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
217 gboolean skip_invisible,
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
218 gboolean skip_nontext,
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
219 gboolean skip_decomp)
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
220 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
221 gint i;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
222
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
223 g_return_if_fail (count >= 0);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
224
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
225 i = count;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
226
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
227 while (i > 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
228 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
229 gboolean ignored = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
230
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
231 /* minimal workaround to avoid the infinite loop of bug #168247.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
232 * It doesn't fix the problemjust the symptom...
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
233 */
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
234 if (gtk_text_iter_is_end (iter))
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
235 return;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
236
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
237 if (skip_nontext && gtk_text_iter_get_char (iter) == GTK_TEXT_UNKNOWN_CHAR)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
238 ignored = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
239
12205
1b0471533cf5 [gaim-migrate @ 14507]
Richard Laager <rlaager@pidgin.im>
parents: 10297
diff changeset
240 #if 0
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
241 if (!ignored && skip_invisible &&
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
242 /* _gtk_text_btree_char_is_invisible (iter)*/ FALSE)
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
243 ignored = TRUE;
12205
1b0471533cf5 [gaim-migrate @ 14507]
Richard Laager <rlaager@pidgin.im>
parents: 10297
diff changeset
244 #endif
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
245
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
246 if (!ignored && skip_decomp)
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
247 {
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
248 /* being UTF8 correct sucks; this accounts for extra
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
249 offsets coming from canonical decompositions of
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
250 UTF8 characters (e.g. accented characters) which
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
251 g_utf8_normalize() performs */
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
252 gchar *normal;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
253 gchar buffer[6];
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
254 gint buffer_len;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
255
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
256 buffer_len = g_unichar_to_utf8 (gtk_text_iter_get_char (iter), buffer);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
257 normal = g_utf8_normalize (buffer, buffer_len, G_NORMALIZE_NFD);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
258 i -= (g_utf8_strlen (normal, -1) - 1);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
259 g_free (normal);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
260 }
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
261
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
262 gtk_text_iter_forward_char (iter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
263
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
264 if (!ignored)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
265 --i;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
266 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
267 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
268
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
269 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
270 lines_match (const GtkTextIter *start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
271 const gchar **lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
272 gboolean visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
273 gboolean slice,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
274 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
275 GtkTextIter *match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
276 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
277 GtkTextIter next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
278 gchar *line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
279 const gchar *found;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
280 gint offset;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
281
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
282 if (*lines == NULL || **lines == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
283 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
284 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
285 *match_start = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
286 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
287 *match_end = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
288 return TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
289 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
290
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
291 next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
292 gtk_text_iter_forward_line (&next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
293
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
294 /* No more text in buffer, but *lines is nonempty */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
295 if (gtk_text_iter_equal (start, &next))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
296 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
297
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
298 if (slice)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
299 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
300 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
301 line_text = gtk_text_iter_get_visible_slice (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
302 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
303 line_text = gtk_text_iter_get_slice (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
304 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
305 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
306 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
307 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
308 line_text = gtk_text_iter_get_visible_text (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
309 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
310 line_text = gtk_text_iter_get_text (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
311 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
312
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
313 if (match_start) /* if this is the first line we're matching */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
314 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
315 found = g_utf8_strcasestr (line_text, *lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
316 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
317 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
318 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
319 /* If it's not the first line, we have to match from the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
320 * start of the line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
321 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
322 if (g_utf8_caselessnmatch (line_text, *lines, strlen (line_text),
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
323 strlen (*lines)))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
324 found = line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
325 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
326 found = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
327 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
328
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
329 if (found == NULL)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
330 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
331 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
332 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
333 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
334
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
335 /* Get offset to start of search string */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
336 offset = g_utf8_strlen (line_text, found - line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
337
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
338 next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
339
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
340 /* If match start needs to be returned, set it to the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
341 * start of the search string.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
342 */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
343 forward_chars_with_skipping (&next, offset, visible_only, !slice, FALSE);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
344 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
345 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
346 *match_start = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
347 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
348
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
349 /* Go to end of search string */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
350 forward_chars_with_skipping (&next, g_utf8_strlen (*lines, -1), visible_only, !slice, TRUE);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
351
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
352 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
353
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
354 ++lines;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
355
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
356 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
357 *match_end = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
359 /* pass NULL for match_start, since we don't need to find the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
360 * start again.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
361 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
362 return lines_match (&next, lines, visible_only, slice, NULL, match_end);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
363 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
364
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
365 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
366 backward_lines_match (const GtkTextIter *start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
367 const gchar **lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
368 gboolean visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
369 gboolean slice,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
370 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
371 GtkTextIter *match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
372 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
373 GtkTextIter line, next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
374 gchar *line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
375 const gchar *found;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
376 gint offset;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
377
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
378 if (*lines == NULL || **lines == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
379 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
380 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
381 *match_start = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
382 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
383 *match_end = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
384 return TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
385 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
386
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
387 line = next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
388 if (gtk_text_iter_get_line_offset (&next) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
389 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
390 if (!gtk_text_iter_backward_line (&next))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
391 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
392 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
393 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
394 gtk_text_iter_set_line_offset (&next, 0);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
395
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
396 if (slice)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
397 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
398 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
399 line_text = gtk_text_iter_get_visible_slice (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
400 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
401 line_text = gtk_text_iter_get_slice (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
402 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
403 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
404 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
405 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
406 line_text = gtk_text_iter_get_visible_text (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
407 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
408 line_text = gtk_text_iter_get_text (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
409 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
410
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
411 if (match_start) /* if this is the first line we're matching */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
412 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
413 found = g_utf8_strrcasestr (line_text, *lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
414 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
415 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
416 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
417 /* If it's not the first line, we have to match from the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
418 * start of the line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
419 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
420 if (g_utf8_caselessnmatch (line_text, *lines, strlen (line_text),
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
421 strlen (*lines)))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
422 found = line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
423 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
424 found = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
425 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
426
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
427 if (found == NULL)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
428 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
429 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
430 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
431 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
432
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
433 /* Get offset to start of search string */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
434 offset = g_utf8_strlen (line_text, found - line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
435
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
436 forward_chars_with_skipping (&next, offset, visible_only, !slice, FALSE);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
437
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
438 /* If match start needs to be returned, set it to the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
439 * start of the search string.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
440 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
441 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
442 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
443 *match_start = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
444 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
445
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
446 /* Go to end of search string */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
447 forward_chars_with_skipping (&next, g_utf8_strlen (*lines, -1), visible_only, !slice, TRUE);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
448
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
449 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
450
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
451 ++lines;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
452
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
453 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
454 *match_end = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
455
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
456 /* try to match the rest of the lines forward, passing NULL
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
457 * for match_start so lines_match will try to match the entire
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
458 * line */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
459 return lines_match (&next, lines, visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
460 slice, NULL, match_end);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
461 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
462
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
463 /* strsplit () that retains the delimiter as part of the string. */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
464 static gchar **
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
465 strbreakup (const char *string,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
466 const char *delimiter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
467 gint max_tokens)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
468 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
469 GSList *string_list = NULL, *slist;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
470 gchar **str_array, *s, *casefold, *new_string;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
471 guint i, n = 1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
472
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
473 g_return_val_if_fail (string != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
474 g_return_val_if_fail (delimiter != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
475
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
476 if (max_tokens < 1)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
477 max_tokens = G_MAXINT;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
478
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
479 s = strstr (string, delimiter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
480 if (s)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
481 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
482 guint delimiter_len = strlen (delimiter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
483
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
484 do
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
485 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
486 guint len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
487
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
488 len = s - string + delimiter_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
489 new_string = g_new (gchar, len + 1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
490 strncpy (new_string, string, len);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
491 new_string[len] = 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
492 casefold = g_utf8_casefold (new_string, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
493 g_free (new_string);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
494 new_string = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
495 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
496 string_list = g_slist_prepend (string_list, new_string);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
497 n++;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
498 string = s + delimiter_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
499 s = strstr (string, delimiter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
500 } while (--max_tokens && s);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
501 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
502
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
503 if (*string)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
504 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
505 n++;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
506 casefold = g_utf8_casefold (string, -1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
507 new_string = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
508 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
509 string_list = g_slist_prepend (string_list, new_string);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
510 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
511
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
512 str_array = g_new (gchar*, n);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
513
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
514 i = n - 1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
515
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
516 str_array[i--] = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
517 for (slist = string_list; slist; slist = slist->next)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
518 str_array[i--] = slist->data;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
519
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
520 g_slist_free (string_list);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
521
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
522 return str_array;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
523 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
524
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
525 /**
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
526 * gtk_source_iter_forward_search:
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
527 * @iter: start of search.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
528 * @str: a search string.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
529 * @flags: flags affecting how the search is done.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
530 * @match_start: return location for start of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
531 * @match_end: return location for end of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
532 * @limit: bound for the search, or %%NULL for the end of the buffer.
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
533 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
534 * Searches forward for @str. Any match is returned by setting
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
535 * @match_start to the first character of the match and @match_end to the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
536 * first character after the match. The search will not continue past
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
537 * @limit. Note that a search is a linear or O(n) operation, so you
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
538 * may wish to use @limit to avoid locking up your UI on large
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
539 * buffers.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
540 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
541 * If the #GTK_SOURCE_SEARCH_VISIBLE_ONLY flag is present, the match may
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
542 * have invisible text interspersed in @str. i.e. @str will be a
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
543 * possibly-noncontiguous subsequence of the matched range. similarly,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
544 * if you specify #GTK_SOURCE_SEARCH_TEXT_ONLY, the match may have
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
545 * pixbufs or child widgets mixed inside the matched range. If these
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
546 * flags are not given, the match must be exact; the special 0xFFFC
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
547 * character in @str will match embedded pixbufs or child widgets.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
548 * If you specify the #GTK_SOURCE_SEARCH_CASE_INSENSITIVE flag, the text will
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
549 * be matched regardless of what case it is in.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
550 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
551 * Same as gtk_text_iter_forward_search(), but supports case insensitive
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
552 * searching.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
553 *
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
554 * Return value: whether a match was found.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
555 **/
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
556 gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
557 gtk_source_iter_forward_search (const GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
558 const gchar *str,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
559 GtkSourceSearchFlags flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
560 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
561 GtkTextIter *match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
562 const GtkTextIter *limit)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
563 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
564 gchar **lines = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
565 GtkTextIter match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
566 gboolean retval = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
567 GtkTextIter search;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
568 gboolean visible_only;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
569 gboolean slice;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
570
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
571 g_return_val_if_fail (iter != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
572 g_return_val_if_fail (str != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
573
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
574 if ((flags & GTK_SOURCE_SEARCH_CASE_INSENSITIVE) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
575 return gtk_text_iter_forward_search (iter, str, flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
576 match_start, match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
577 limit);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
578
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
579 if (limit && gtk_text_iter_compare (iter, limit) >= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
580 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
581
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
582 if (*str == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
583 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
584 /* If we can move one char, return the empty string there */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
585 match = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
586
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
587 if (gtk_text_iter_forward_char (&match))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
588 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
589 if (limit && gtk_text_iter_equal (&match, limit))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
590 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
591
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
592 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
593 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
594 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
595 *match_end = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
596 return TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
597 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
598 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
599 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
600 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
601 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
602 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
603
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
604 visible_only = (flags & GTK_SOURCE_SEARCH_VISIBLE_ONLY) != 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
605 slice = (flags & GTK_SOURCE_SEARCH_TEXT_ONLY) == 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
606
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
607 /* locate all lines */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
608 lines = strbreakup (str, "\n", -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
609
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
610 search = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
611
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
612 do
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
613 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
614 /* This loop has an inefficient worst-case, where
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
615 * gtk_text_iter_get_text () is called repeatedly on
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
616 * a single line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
617 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
618 GtkTextIter end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
619
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
620 if (limit && gtk_text_iter_compare (&search, limit) >= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
621 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
622
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
623 if (lines_match (&search, (const gchar**)lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
624 visible_only, slice, &match, &end))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
625 {
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
626 if (limit == NULL ||
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
627 (limit && gtk_text_iter_compare (&end, limit) <= 0))
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
628 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
629 retval = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
630
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
631 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
632 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
633 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
634 *match_end = end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
635 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
636 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
637 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
638 } while (gtk_text_iter_forward_line (&search));
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
639
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
640 g_strfreev ((gchar**)lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
641
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
642 return retval;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
643 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
644
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
645 /**
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
646 * gtk_source_iter_backward_search:
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
647 * @iter: a #GtkTextIter where the search begins.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
648 * @str: search string.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
649 * @flags: bitmask of flags affecting the search.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
650 * @match_start: return location for start of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
651 * @match_end: return location for end of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
652 * @limit: location of last possible @match_start, or %%NULL for start of buffer.
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
653 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
654 * Same as gtk_text_iter_backward_search(), but supports case insensitive
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
655 * searching.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
656 *
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
657 * Return value: whether a match was found.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
658 **/
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
659 gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
660 gtk_source_iter_backward_search (const GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
661 const gchar *str,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
662 GtkSourceSearchFlags flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
663 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
664 GtkTextIter *match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
665 const GtkTextIter *limit)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
666 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
667 gchar **lines = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
668 GtkTextIter match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
669 gboolean retval = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
670 GtkTextIter search;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
671 gboolean visible_only;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
672 gboolean slice;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
673
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
674 g_return_val_if_fail (iter != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
675 g_return_val_if_fail (str != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
676
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
677 if ((flags & GTK_SOURCE_SEARCH_CASE_INSENSITIVE) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
678 return gtk_text_iter_backward_search (iter, str, flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
679 match_start, match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
680 limit);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
681
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
682 if (limit && gtk_text_iter_compare (iter, limit) <= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
683 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
684
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
685 if (*str == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
686 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
687 /* If we can move one char, return the empty string there */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
688 match = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
689
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
690 if (gtk_text_iter_backward_char (&match))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
691 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
692 if (limit && gtk_text_iter_equal (&match, limit))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
693 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
694
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
695 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
696 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
697 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
698 *match_end = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
699 return TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
700 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
701 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
702 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
703 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
704 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
705 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
706
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
707 visible_only = (flags & GTK_SOURCE_SEARCH_VISIBLE_ONLY) != 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
708 slice = (flags & GTK_SOURCE_SEARCH_TEXT_ONLY) == 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
709
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
710 /* locate all lines */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
711 lines = strbreakup (str, "\n", -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
712
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
713 search = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
714
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
715 while (TRUE)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
716 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
717 /* This loop has an inefficient worst-case, where
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
718 * gtk_text_iter_get_text () is called repeatedly on
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
719 * a single line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
720 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
721 GtkTextIter end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
722
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
723 if (limit && gtk_text_iter_compare (&search, limit) <= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
724 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
725
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
726 if (backward_lines_match (&search, (const gchar**)lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
727 visible_only, slice, &match, &end))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
728 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
729 if (limit == NULL || (limit &&
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
730 gtk_text_iter_compare (&end, limit) > 0))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
731 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
732 retval = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
733
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
734 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
735 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
736 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
737 *match_end = end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
738 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
739 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
740 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
741
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
742 if (gtk_text_iter_get_line_offset (&search) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
743 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
744 if (!gtk_text_iter_backward_line (&search))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
745 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
746 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
747 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
748 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
749 gtk_text_iter_set_line_offset (&search, 0);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
750 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
751 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
752
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
753 g_strfreev ((gchar**)lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
754
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
755 return retval;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
756 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
757
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
758 /*
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
759 * gtk_source_iter_find_matching_bracket is implemented in gtksourcebuffer.c
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
760 */

mercurial