[gtk+/wip/matthiasc/drop-pango-utils] Drop deprecated pango-utils api
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/drop-pango-utils] Drop deprecated pango-utils api
- Date: Sat, 18 Jul 2015 00:30:38 +0000 (UTC)
commit be711e5c73e90dc351c8756d6db468d0ab8c49de
Author: Matthias Clasen <mclasen redhat com>
Date: Sat May 16 18:54:35 2015 -0400
Drop deprecated pango-utils api
Copy the few parsing functions we need.
gtk/gtkimmodule.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 189 insertions(+), 19 deletions(-)
---
diff --git a/gtk/gtkimmodule.c b/gtk/gtkimmodule.c
index 1a90a22..6817857 100644
--- a/gtk/gtkimmodule.c
+++ b/gtk/gtkimmodule.c
@@ -318,6 +318,178 @@ add_builtin_module (const gchar *module_name,
return module;
}
+static gboolean
+scan_string (const char **pos, GString *out)
+{
+ const char *p = *pos, *q = *pos;
+ char *tmp, *tmp2;
+ gboolean quoted;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (!*p)
+ return FALSE;
+ else if (*p == '"')
+ {
+ p++;
+ quoted = FALSE;
+ for (q = p; (*q != '"') || quoted; q++)
+ {
+ if (!*q)
+ return FALSE;
+ quoted = (*q == '\\') && !quoted;
+ }
+
+ tmp = g_strndup (p, q - p);
+ tmp2 = g_strcompress (tmp);
+ g_string_truncate (out, 0);
+ g_string_append (out, tmp2);
+ g_free (tmp);
+ g_free (tmp2);
+ }
+
+ q++;
+ *pos = q;
+
+ return TRUE;
+}
+
+static gboolean
+scan_int (const char **pos, int *out)
+{
+ int i = 0;
+ char buf[32];
+ const char *p = *pos;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (*p < '0' || *p > '9')
+ return FALSE;
+
+ while ((*p >= '0') && (*p <= '9') && i < sizeof (buf))
+ {
+ buf[i] = *p;
+ i++;
+ p++;
+ }
+
+ if (i == sizeof (buf))
+ return FALSE;
+ else
+ buf[i] = '\0';
+
+ *out = atoi (buf);
+ *pos = p;
+
+ return TRUE;
+}
+
+static gboolean
+skip_space (const char **pos)
+{
+ const char *p = *pos;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ *pos = p;
+
+ return !(*p == '\0');
+}
+
+static gint
+read_line (FILE *stream, GString *str)
+{
+ gboolean quoted = FALSE;
+ gboolean comment = FALSE;
+ int n_read = 0;
+ int lines = 1;
+
+ flockfile (stream);
+
+ g_string_truncate (str, 0);
+
+ while (1)
+ {
+ int c;
+
+ c = getc_unlocked (stream);
+
+ if (c == EOF)
+ {
+ if (quoted)
+ g_string_append_c (str, '\\');
+
+ goto done;
+ }
+ else
+ n_read++;
+
+ if (quoted)
+ {
+ quoted = FALSE;
+
+ switch (c)
+ {
+ case '#':
+ g_string_append_c (str, '#');
+ break;
+ case '\r':
+ case '\n':
+ {
+ int next_c = getc_unlocked (stream);
+
+ if (!(next_c == EOF ||
+ (c == '\r' && next_c == '\n') ||
+ (c == '\n' && next_c == '\r')))
+ ungetc (next_c, stream);
+
+ lines++;
+
+ break;
+ }
+ default:
+ g_string_append_c (str, '\\');
+ g_string_append_c (str, c);
+ }
+ }
+ else
+ {
+ switch (c)
+ {
+ case '#':
+ comment = TRUE;
+ break;
+ case '\\':
+ if (!comment)
+ quoted = TRUE;
+ break;
+ case '\n':
+ {
+ int next_c = getc_unlocked (stream);
+
+ if (!(c == EOF ||
+ (c == '\r' && next_c == '\n') ||
+ (c == '\n' && next_c == '\r')))
+ ungetc (next_c, stream);
+
+ goto done;
+ }
+ default:
+ if (!comment)
+ g_string_append_c (str, c);
+ }
+ }
+ }
+
+ done:
+ funlockfile (stream);
+
+ return (n_read > 0) ? lines : 0;
+}
+
static void
gtk_im_module_initialize (void)
{
@@ -404,13 +576,13 @@ gtk_im_module_initialize (void)
return;
}
- while (!have_error && pango_read_line (file, line_buf))
+ while (!have_error && read_line (file, line_buf))
{
const char *p;
-
+
p = line_buf->str;
- if (!pango_skip_space (&p))
+ if (!skip_space (&p))
{
/* Blank line marking the end of a module
*/
@@ -420,7 +592,7 @@ gtk_im_module_initialize (void)
module = NULL;
infos = NULL;
}
-
+
continue;
}
@@ -430,11 +602,9 @@ gtk_im_module_initialize (void)
*/
module = g_object_new (GTK_TYPE_IM_MODULE, NULL);
- if (!pango_scan_string (&p, tmp_buf) ||
- pango_skip_space (&p))
+ if (!scan_string (&p, tmp_buf) || skip_space (&p))
{
- g_warning ("Error parsing context info in '%s'\n %s",
- filename, line_buf->str);
+ g_warning ("Error parsing context info in '%s'\n %s", filename, line_buf->str);
have_error = TRUE;
}
@@ -447,41 +617,41 @@ gtk_im_module_initialize (void)
else
{
GtkIMContextInfo *info = g_new0 (GtkIMContextInfo, 1);
-
+
/* Read information about a context type
*/
- if (!pango_scan_string (&p, tmp_buf))
+ if (!scan_string (&p, tmp_buf))
goto context_error;
info->context_id = g_strdup (tmp_buf->str);
- if (!pango_scan_string (&p, tmp_buf))
+ if (!scan_string (&p, tmp_buf))
goto context_error;
info->context_name = g_strdup (tmp_buf->str);
- if (!pango_scan_string (&p, tmp_buf))
+ if (!scan_string (&p, tmp_buf))
goto context_error;
info->domain = g_strdup (tmp_buf->str);
- if (!pango_scan_string (&p, tmp_buf))
+ if (!scan_string (&p, tmp_buf))
goto context_error;
+
info->domain_dirname = g_strdup (tmp_buf->str);
#ifdef G_OS_WIN32
correct_localedir_prefix ((char **) &info->domain_dirname);
#endif
- if (!pango_scan_string (&p, tmp_buf))
+ if (!scan_string (&p, tmp_buf))
goto context_error;
info->default_locales = g_strdup (tmp_buf->str);
- if (pango_skip_space (&p))
+ if (skip_space (&p))
goto context_error;
infos = g_slist_prepend (infos, info);
continue;
context_error:
- g_warning ("Error parsing context info in '%s'\n %s",
- filename, line_buf->str);
+ g_warning ("Error parsing context info in '%s'\n %s", filename, line_buf->str);
have_error = TRUE;
}
}
@@ -508,8 +678,8 @@ gtk_im_module_initialize (void)
}
static gint
-compare_gtkimcontextinfo_name(const GtkIMContextInfo **a,
- const GtkIMContextInfo **b)
+compare_gtkimcontextinfo_name (const GtkIMContextInfo **a,
+ const GtkIMContextInfo **b)
{
return g_utf8_collate ((*a)->context_name, (*b)->context_name);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]