pidgin/gtksourceiter.c

Tue, 07 May 2013 05:04:46 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Tue, 07 May 2013 05:04:46 -0400
changeset 33923
0fcc5635daba
parent 31306
f316b0972e0f
child 34459
f269ff3e4830
child 35980
b44c08754471
permissions
-rw-r--r--

Rewrite debug window filter in JS.

Note, this does cause a couple regressions, but they are probably not
that big a deal. First, the JS regular expression syntax is slightly
different. Second, the JS regex API lacks a way to reliably determine
the location of matched groups, so we can't highlight just the groups
and must highlight the entire expression.

I suspect that none of our users ever had to use any fancy regex in the
debug window, and that most of our developers didn't even know it could
be done. So I doubt these regressions will cause much pain.

25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
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 *
15931
716b5fac1895 Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
4 * Pidgin is the legal property of its developers, whose names are too numerous
8046
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 *
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
10 * Copyright (C) 2000 - 2005 Paolo Maggi
12465
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
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 15931
diff changeset
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.
7358
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
31306
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
157 while (1)
7358
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
31306
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
165 if (p > caseless_haystack)
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
166 p = g_utf8_prev_char (p);
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
167 else
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
168 goto finally_1;
f316b0972e0f gtksourceiter: Fix a few memory leaks in our bundled copy of this widget. Refs #13162.
Nader Morshed <morshed.nader@gmail.com>
parents: 25888
diff changeset
169
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170 i--;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
173 finally_1:
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
174 g_free (caseless_haystack);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
175
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
176 return ret;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
177 }
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 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
180 g_utf8_caselessnmatch (const char *s1, const char *s2,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
181 gssize n1, gssize n2)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
182 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
183 gchar *casefold;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
184 gchar *normalized_s1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
185 gchar *normalized_s2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
186 gint len_s1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
187 gint len_s2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
188 gboolean ret = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
189
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
190 g_return_val_if_fail (s1 != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
191 g_return_val_if_fail (s2 != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
192 g_return_val_if_fail (n1 > 0, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
193 g_return_val_if_fail (n2 > 0, FALSE);
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 (s1, n1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
196 normalized_s1 = 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 casefold = g_utf8_casefold (s2, n2);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
200 normalized_s2 = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
201 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
202
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
203 len_s1 = strlen (normalized_s1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
204 len_s2 = strlen (normalized_s2);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
205
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
206 if (len_s1 < len_s2)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
207 goto finally_2;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
208
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
209 ret = (strncmp (normalized_s1, normalized_s2, len_s2) == 0);
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 finally_2:
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
212 g_free (normalized_s1);
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
213 g_free (normalized_s2);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
214
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
215 return ret;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
216 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
217
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
218 static void
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
219 forward_chars_with_skipping (GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
220 gint count,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
221 gboolean skip_invisible,
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
222 gboolean skip_nontext,
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
223 gboolean skip_decomp)
7358
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 gint i;
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 g_return_if_fail (count >= 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 i = count;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
230
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
231 while (i > 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
232 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
233 gboolean ignored = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
234
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
235 /* minimal workaround to avoid the infinite loop of bug #168247.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
236 * It doesn't fix the problemjust the symptom...
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
237 */
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
238 if (gtk_text_iter_is_end (iter))
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
239 return;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
240
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
241 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
242 ignored = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
243
12205
1b0471533cf5 [gaim-migrate @ 14507]
Richard Laager <rlaager@pidgin.im>
parents: 10297
diff changeset
244 #if 0
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
245 if (!ignored && skip_invisible &&
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
246 /* _gtk_text_btree_char_is_invisible (iter)*/ FALSE)
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
247 ignored = TRUE;
12205
1b0471533cf5 [gaim-migrate @ 14507]
Richard Laager <rlaager@pidgin.im>
parents: 10297
diff changeset
248 #endif
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
249
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
250 if (!ignored && skip_decomp)
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
251 {
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
252 /* being UTF8 correct sucks; this accounts for extra
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
253 offsets coming from canonical decompositions of
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
254 UTF8 characters (e.g. accented characters) which
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
255 g_utf8_normalize() performs */
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
256 gchar *normal;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
257 gchar buffer[6];
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
258 gint buffer_len;
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
259
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
260 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
261 normal = g_utf8_normalize (buffer, buffer_len, G_NORMALIZE_NFD);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
262 i -= (g_utf8_strlen (normal, -1) - 1);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
263 g_free (normal);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
264 }
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
265
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
266 gtk_text_iter_forward_char (iter);
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 if (!ignored)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
269 --i;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
270 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
271 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
272
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
273 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
274 lines_match (const GtkTextIter *start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
275 const gchar **lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
276 gboolean visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
277 gboolean slice,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
278 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
279 GtkTextIter *match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
280 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
281 GtkTextIter next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
282 gchar *line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
283 const gchar *found;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
284 gint offset;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
285
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
286 if (*lines == NULL || **lines == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
287 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
288 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
289 *match_start = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
290 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
291 *match_end = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
292 return TRUE;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
295 next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
296 gtk_text_iter_forward_line (&next);
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 /* No more text in buffer, but *lines is nonempty */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
299 if (gtk_text_iter_equal (start, &next))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
300 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
301
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
302 if (slice)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
303 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
304 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
305 line_text = gtk_text_iter_get_visible_slice (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
306 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
307 line_text = gtk_text_iter_get_slice (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
308 }
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 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
311 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
312 line_text = gtk_text_iter_get_visible_text (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
313 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
314 line_text = gtk_text_iter_get_text (start, &next);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
315 }
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 if (match_start) /* if this is the first line we're matching */
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 found = g_utf8_strcasestr (line_text, *lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
320 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
321 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
322 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
323 /* 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
324 * start of the line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
325 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
326 if (g_utf8_caselessnmatch (line_text, *lines, strlen (line_text),
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
327 strlen (*lines)))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
328 found = line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
329 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
330 found = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
331 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
332
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
333 if (found == NULL)
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 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
336 return FALSE;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
339 /* Get offset to start of search string */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
340 offset = g_utf8_strlen (line_text, found - line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
341
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
342 next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
343
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
344 /* If match start needs to be returned, set it to the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
345 * start of the search string.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
346 */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
347 forward_chars_with_skipping (&next, offset, visible_only, !slice, FALSE);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
348 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
349 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
350 *match_start = next;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
353 /* Go to end of search string */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
354 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
355
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
356 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
357
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
358 ++lines;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
359
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
360 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
361 *match_end = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
362
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
363 /* 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
364 * start again.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
365 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
366 return lines_match (&next, lines, visible_only, slice, NULL, match_end);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
367 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
368
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
369 static gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
370 backward_lines_match (const GtkTextIter *start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
371 const gchar **lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
372 gboolean visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
373 gboolean slice,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
374 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
375 GtkTextIter *match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
376 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
377 GtkTextIter line, next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
378 gchar *line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
379 const gchar *found;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
380 gint offset;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
381
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
382 if (*lines == NULL || **lines == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
383 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
384 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
385 *match_start = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
386 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
387 *match_end = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
388 return TRUE;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
391 line = next = *start;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
392 if (gtk_text_iter_get_line_offset (&next) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
393 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
394 if (!gtk_text_iter_backward_line (&next))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
395 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
396 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
397 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
398 gtk_text_iter_set_line_offset (&next, 0);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
399
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
400 if (slice)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
401 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
402 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
403 line_text = gtk_text_iter_get_visible_slice (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
404 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
405 line_text = gtk_text_iter_get_slice (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
406 }
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 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
409 if (visible_only)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
410 line_text = gtk_text_iter_get_visible_text (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
411 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
412 line_text = gtk_text_iter_get_text (&next, &line);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
413 }
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 if (match_start) /* if this is the first line we're matching */
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 found = g_utf8_strrcasestr (line_text, *lines);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
418 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
419 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
420 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
421 /* 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
422 * start of the line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
423 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
424 if (g_utf8_caselessnmatch (line_text, *lines, strlen (line_text),
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
425 strlen (*lines)))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
426 found = line_text;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
427 else
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
428 found = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
429 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
430
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
431 if (found == NULL)
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 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
434 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
435 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
436
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
437 /* Get offset to start of search string */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
438 offset = g_utf8_strlen (line_text, found - line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
439
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
440 forward_chars_with_skipping (&next, offset, visible_only, !slice, FALSE);
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
441
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
442 /* If match start needs to be returned, set it to the
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
443 * start of the search string.
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 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
446 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
447 *match_start = next;
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
450 /* Go to end of search string */
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
451 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
452
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
453 g_free (line_text);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
454
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
455 ++lines;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
456
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
457 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
458 *match_end = next;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
459
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
460 /* try to match the rest of the lines forward, passing NULL
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
461 * for match_start so lines_match will try to match the entire
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
462 * line */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
463 return lines_match (&next, lines, visible_only,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
464 slice, NULL, match_end);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
465 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
466
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
467 /* strsplit () that retains the delimiter as part of the string. */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
468 static gchar **
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
469 strbreakup (const char *string,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
470 const char *delimiter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
471 gint max_tokens)
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 GSList *string_list = NULL, *slist;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
474 gchar **str_array, *s, *casefold, *new_string;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
475 guint i, n = 1;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
476
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
477 g_return_val_if_fail (string != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
478 g_return_val_if_fail (delimiter != NULL, NULL);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
479
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
480 if (max_tokens < 1)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
481 max_tokens = G_MAXINT;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
482
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
483 s = strstr (string, delimiter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
484 if (s)
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 delimiter_len = strlen (delimiter);
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 do
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
489 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
490 guint len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
491
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
492 len = s - string + delimiter_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
493 new_string = g_new (gchar, len + 1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
494 strncpy (new_string, string, len);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
495 new_string[len] = 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
496 casefold = g_utf8_casefold (new_string, -1);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
497 g_free (new_string);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
498 new_string = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
499 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
500 string_list = g_slist_prepend (string_list, new_string);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
501 n++;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
502 string = s + delimiter_len;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
503 s = strstr (string, delimiter);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
504 } while (--max_tokens && s);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
505 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
506
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
507 if (*string)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
508 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
509 n++;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
510 casefold = g_utf8_casefold (string, -1);
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
511 new_string = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFD);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
512 g_free (casefold);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
513 string_list = g_slist_prepend (string_list, new_string);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
514 }
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 = g_new (gchar*, n);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
517
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
518 i = n - 1;
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 str_array[i--] = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
521 for (slist = string_list; slist; slist = slist->next)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
522 str_array[i--] = slist->data;
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 g_slist_free (string_list);
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 return str_array;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
527 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
528
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
529 /**
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
530 * gtk_source_iter_forward_search:
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
531 * @iter: start of search.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
532 * @str: a search string.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
533 * @flags: flags affecting how the search is done.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
534 * @match_start: return location for start of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
535 * @match_end: return location for end of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
536 * @limit: bound for the search, or %%NULL for the end of the buffer.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
537 *
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
538 * Searches forward for @str. Any match is returned by setting
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
539 * @match_start to the first character of the match and @match_end to the
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
540 * first character after the match. The search will not continue past
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
541 * @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
542 * 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
543 * buffers.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
544 *
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
545 * 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
546 * have invisible text interspersed in @str. i.e. @str will be a
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
547 * possibly-noncontiguous subsequence of the matched range. similarly,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
548 * if you specify #GTK_SOURCE_SEARCH_TEXT_ONLY, the match may have
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
549 * pixbufs or child widgets mixed inside the matched range. If these
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
550 * flags are not given, the match must be exact; the special 0xFFFC
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
551 * character in @str will match embedded pixbufs or child widgets.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
552 * 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
553 * be matched regardless of what case it is in.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
554 *
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
555 * Same as gtk_text_iter_forward_search(), but supports case insensitive
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
556 * searching.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
557 *
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
558 * Return value: whether a match was found.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
559 **/
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
560 gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
561 gtk_source_iter_forward_search (const GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
562 const gchar *str,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
563 GtkSourceSearchFlags flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
564 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
565 GtkTextIter *match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
566 const GtkTextIter *limit)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
567 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
568 gchar **lines = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
569 GtkTextIter match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
570 gboolean retval = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
571 GtkTextIter search;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
572 gboolean visible_only;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
573 gboolean slice;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
574
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
575 g_return_val_if_fail (iter != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
576 g_return_val_if_fail (str != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
577
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
578 if ((flags & GTK_SOURCE_SEARCH_CASE_INSENSITIVE) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
579 return gtk_text_iter_forward_search (iter, str, flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
580 match_start, match_end,
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
581 limit);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
582
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
583 if (limit && gtk_text_iter_compare (iter, limit) >= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
584 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
585
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
586 if (*str == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
587 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
588 /* If we can move one char, return the empty string there */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
589 match = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
590
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
591 if (gtk_text_iter_forward_char (&match))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
592 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
593 if (limit && gtk_text_iter_equal (&match, limit))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
594 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
595
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
596 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
597 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
598 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
599 *match_end = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
600 return TRUE;
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 else
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 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
605 }
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
608 visible_only = (flags & GTK_SOURCE_SEARCH_VISIBLE_ONLY) != 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
609 slice = (flags & GTK_SOURCE_SEARCH_TEXT_ONLY) == 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
610
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
611 /* locate all lines */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
612 lines = strbreakup (str, "\n", -1);
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 search = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
615
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
616 do
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 /* This loop has an inefficient worst-case, where
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
619 * gtk_text_iter_get_text () is called repeatedly on
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
620 * a single line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
621 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
622 GtkTextIter end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
623
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
624 if (limit && gtk_text_iter_compare (&search, limit) >= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
625 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
626
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
627 if (lines_match (&search, (const gchar**)lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
628 visible_only, slice, &match, &end))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
629 {
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
630 if (limit == NULL ||
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
631 (limit && gtk_text_iter_compare (&end, limit) <= 0))
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
632 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
633 retval = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
634
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
635 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
636 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
637 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
638 *match_end = end;
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 break;
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 } while (gtk_text_iter_forward_line (&search));
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 g_strfreev ((gchar**)lines);
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 return retval;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
647 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
648
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
649 /**
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
650 * gtk_source_iter_backward_search:
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
651 * @iter: a #GtkTextIter where the search begins.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
652 * @str: search string.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
653 * @flags: bitmask of flags affecting the search.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
654 * @match_start: return location for start of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
655 * @match_end: return location for end of match, or %%NULL.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
656 * @limit: location of last possible @match_start, or %%NULL for start of buffer.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
657 *
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
658 * Same as gtk_text_iter_backward_search(), but supports case insensitive
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
659 * searching.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
660 *
12465
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
661 * Return value: whether a match was found.
59859abbe998 [gaim-migrate @ 14775]
Peter Lawler <pidgin@bleeter.id.au>
parents: 12205
diff changeset
662 **/
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
663 gboolean
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
664 gtk_source_iter_backward_search (const GtkTextIter *iter,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
665 const gchar *str,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
666 GtkSourceSearchFlags flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
667 GtkTextIter *match_start,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
668 GtkTextIter *match_end,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
669 const GtkTextIter *limit)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
670 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
671 gchar **lines = NULL;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
672 GtkTextIter match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
673 gboolean retval = FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
674 GtkTextIter search;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
675 gboolean visible_only;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
676 gboolean slice;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
677
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
678 g_return_val_if_fail (iter != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
679 g_return_val_if_fail (str != NULL, FALSE);
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
680
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
681 if ((flags & GTK_SOURCE_SEARCH_CASE_INSENSITIVE) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
682 return gtk_text_iter_backward_search (iter, str, flags,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
683 match_start, match_end,
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 19859
diff changeset
684 limit);
7358
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
685
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
686 if (limit && gtk_text_iter_compare (iter, limit) <= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
687 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
688
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
689 if (*str == '\0')
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
690 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
691 /* If we can move one char, return the empty string there */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
692 match = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
693
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
694 if (gtk_text_iter_backward_char (&match))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
695 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
696 if (limit && gtk_text_iter_equal (&match, limit))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
697 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
698
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
699 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
700 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
701 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
702 *match_end = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
703 return TRUE;
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 else
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 return FALSE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
708 }
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
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
711 visible_only = (flags & GTK_SOURCE_SEARCH_VISIBLE_ONLY) != 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
712 slice = (flags & GTK_SOURCE_SEARCH_TEXT_ONLY) == 0;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
713
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
714 /* locate all lines */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
715 lines = strbreakup (str, "\n", -1);
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 search = *iter;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
718
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
719 while (TRUE)
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 /* This loop has an inefficient worst-case, where
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
722 * gtk_text_iter_get_text () is called repeatedly on
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
723 * a single line.
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
724 */
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
725 GtkTextIter end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
726
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
727 if (limit && gtk_text_iter_compare (&search, limit) <= 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
728 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
729
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
730 if (backward_lines_match (&search, (const gchar**)lines,
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
731 visible_only, slice, &match, &end))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
732 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
733 if (limit == NULL || (limit &&
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
734 gtk_text_iter_compare (&end, limit) > 0))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
735 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
736 retval = TRUE;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
737
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
738 if (match_start)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
739 *match_start = match;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
740 if (match_end)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
741 *match_end = end;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
742 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
743 break;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
744 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
745
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
746 if (gtk_text_iter_get_line_offset (&search) == 0)
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
747 {
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
748 if (!gtk_text_iter_backward_line (&search))
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
749 break;
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 else
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 gtk_text_iter_set_line_offset (&search, 0);
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 }
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 g_strfreev ((gchar**)lines);
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 return retval;
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
760 }
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
761
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
762 /*
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
763 * gtk_source_iter_find_matching_bracket is implemented in gtksourcebuffer.c
129ed09d791d [gaim-migrate @ 7951]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
764 */

mercurial