1 |
--- pango-1.10.1/pango/pango-utils.c~ 2005-07-28 00:14:46.000000000 +0200 |
2 |
+++ pango-1.10.1/pango/pango-utils.c 2005-11-08 18:03:52.000000000 +0100 |
3 |
@@ -23,6 +23,7 @@ |
4 |
#include <math.h> |
5 |
#include <string.h> |
6 |
#include <stdlib.h> |
7 |
+#include <ctype.h> |
8 |
|
9 |
#include "config.h" |
10 |
|
11 |
@@ -85,6 +86,89 @@ |
12 |
return g_strndup (str, len); |
13 |
} |
14 |
|
15 |
+ |
16 |
+/** |
17 |
+ g_string_substitute_environment() |
18 |
+ @orig: a string |
19 |
+ |
20 |
+ Replaces environment variables of the form ${FOO} or $FOO. |
21 |
+ |
22 |
+ Return value: A newly-allocated string, that must be freed with |
23 |
+ g_string_free() |
24 |
+ */ |
25 |
+GString * |
26 |
+g_string_substitute_environment (GString *orig) |
27 |
+{ |
28 |
+ GString * out = g_string_new (""); |
29 |
+ char *ptr = NULL; |
30 |
+ |
31 |
+ ptr = orig->str; |
32 |
+ while (ptr < orig->str + orig->len) |
33 |
+ { |
34 |
+ char *dollar = strchr (ptr, '$'); |
35 |
+ |
36 |
+ if (dollar != NULL) |
37 |
+ { |
38 |
+ char *start_var = dollar + 1; |
39 |
+ char *end_var = start_var; |
40 |
+ char *start_next = end_var; |
41 |
+ |
42 |
+ g_string_append_len (out, ptr, dollar - ptr); |
43 |
+ ptr = dollar; |
44 |
+ |
45 |
+ if (*start_var == '{') |
46 |
+ { |
47 |
+ start_var ++; |
48 |
+ |
49 |
+ end_var = strchr (start_var, '}'); |
50 |
+ |
51 |
+ if (end_var == NULL) |
52 |
+ { |
53 |
+ end_var = orig->str + orig->len; |
54 |
+ start_next = end_var; |
55 |
+ } |
56 |
+ else |
57 |
+ { |
58 |
+ start_next = end_var + 1; |
59 |
+ } |
60 |
+ } |
61 |
+ else |
62 |
+ { |
63 |
+ /* |
64 |
+ Hmm. what to do for $1 , $~ etc.? |
65 |
+ */ |
66 |
+ do |
67 |
+ { |
68 |
+ end_var ++; |
69 |
+ } |
70 |
+ while (isalnum (*end_var) || *end_var == '_'); |
71 |
+ start_next = end_var; |
72 |
+ } |
73 |
+ |
74 |
+ if (start_var < end_var) |
75 |
+ { |
76 |
+ GString *var_name = g_string_new_len (start_var, end_var - start_var); |
77 |
+ const char *value = g_getenv (var_name->str); |
78 |
+ if (value != NULL) |
79 |
+ g_string_append (out, value); |
80 |
+ g_string_free (var_name, TRUE); |
81 |
+ |
82 |
+ |
83 |
+ ptr = start_next; |
84 |
+ } |
85 |
+ } |
86 |
+ else |
87 |
+ break; |
88 |
+ |
89 |
+ } |
90 |
+ |
91 |
+ g_string_append (out, ptr); |
92 |
+ |
93 |
+ return out; |
94 |
+} |
95 |
+ |
96 |
+ |
97 |
+ |
98 |
/** |
99 |
* pango_split_file_list: |
100 |
* @str: a G_SEARCHPATH_SEPARATOR separated list of filenames |
101 |
@@ -139,6 +223,16 @@ |
102 |
file = g_strdup (g_get_home_dir()); |
103 |
} |
104 |
#endif |
105 |
+ |
106 |
+ { |
107 |
+ GString *file_as_gs = g_string_new (file); |
108 |
+ GString *substituted = g_string_substitute_environment (file_as_gs); |
109 |
+ g_free (file); |
110 |
+ file = substituted->str; |
111 |
+ g_string_free (substituted, FALSE); |
112 |
+ g_string_free (file_as_gs, TRUE); |
113 |
+ } |
114 |
+ |
115 |
g_free (files[i]); |
116 |
files[i] = file; |
117 |
|
118 |
@@ -321,6 +415,7 @@ |
119 |
return TRUE; |
120 |
} |
121 |
|
122 |
+ |
123 |
/** |
124 |
* pango_scan_string: |
125 |
* @pos: in/out string position |
126 |
@@ -404,6 +499,13 @@ |
127 |
} |
128 |
} |
129 |
|
130 |
+ |
131 |
+ { |
132 |
+ GString *subbed = g_string_substitute_environment (out); |
133 |
+ g_string_assign (out, subbed->str); |
134 |
+ g_string_free (subbed, TRUE); |
135 |
+ } |
136 |
+ |
137 |
*pos = p; |
138 |
|
139 |
return TRUE; |