Mercurial > gub
view patches/pango-1.36.8-substitute-env.patch @ 6433:a3a0085299f5
Update pango to 1.36.8
author | Masamichi Hosoda <trueroad@trueroad.jp> |
---|---|
date | Sat, 29 Aug 2015 15:44:07 +0900 |
parents | |
children |
line wrap: on
line source
--- pango-1.36.8/pango/pango-utils.c.orig 2014-08-31 02:02:57.000000000 +0900 +++ pango-1.36.8/pango/pango-utils.c 2015-08-30 21:31:27.361804200 +0900 @@ -43,6 +43,7 @@ #include <stdlib.h> #include <math.h> #include <locale.h> +#include <ctype.h> #include "pango-font.h" #include "pango-features.h" @@ -177,6 +178,89 @@ return g_strndup (str, len); } + +/** + g_string_substitute_environment() + @orig: a string + + Replaces environment variables of the form ${FOO} or $FOO. + + Return value: A newly-allocated string, that must be freed with + g_string_free() + */ +GString * +g_string_substitute_environment (GString *orig) +{ + GString * out = g_string_new (""); + char *ptr = NULL; + + ptr = orig->str; + while (ptr < orig->str + orig->len) + { + char *dollar = strchr (ptr, '$'); + + if (dollar != NULL) + { + char *start_var = dollar + 1; + char *end_var = start_var; + char *start_next = end_var; + + g_string_append_len (out, ptr, dollar - ptr); + ptr = dollar; + + if (*start_var == '{') + { + start_var ++; + + end_var = strchr (start_var, '}'); + + if (end_var == NULL) + { + end_var = orig->str + orig->len; + start_next = end_var; + } + else + { + start_next = end_var + 1; + } + } + else + { + /* + Hmm. what to do for $1 , $~ etc.? + */ + do + { + end_var ++; + } + while (isalnum (*end_var) || *end_var == '_'); + start_next = end_var; + } + + if (start_var < end_var) + { + GString *var_name = g_string_new_len (start_var, end_var - start_var); + const char *value = g_getenv (var_name->str); + if (value != NULL) + g_string_append (out, value); + g_string_free (var_name, TRUE); + + + ptr = start_next; + } + } + else + break; + + } + + g_string_append (out, ptr); + + return out; +} + + + /** * pango_split_file_list: * @str: a %G_SEARCHPATH_SEPARATOR separated list of filenames @@ -232,6 +316,16 @@ file = g_strdup (g_get_home_dir()); } #endif + + { + GString *file_as_gs = g_string_new (file); + GString *substituted = g_string_substitute_environment (file_as_gs); + g_free (file); + file = substituted->str; + g_string_free (substituted, FALSE); + g_string_free (file_as_gs, TRUE); + } + g_free (files[i]); files[i] = file; @@ -414,6 +508,7 @@ return TRUE; } + /** * pango_scan_string: * @pos: (inout): in/out string position @@ -499,6 +594,13 @@ } } + + { + GString *subbed = g_string_substitute_environment (out); + g_string_assign (out, subbed->str); + g_string_free (subbed, TRUE); + } + *pos = p; return TRUE;