annotate src/gtksourceiter.c @ 12465:ae4ae98bca20

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