comparison src/audacious/tuple_formatter.c @ 3335:63d7947d7376 trunk

simplified the tuple formatter a bit
author Giacomo Lozito <james@develia.org>
date Sat, 11 Aug 2007 20:32:13 +0200
parents 9c53688bb559
children 07ed916b7176
comparison
equal deleted inserted replaced
3334:ea806daf3ef0 3335:63d7947d7376
84 84
85 /* parsers are ugly */ 85 /* parsers are ugly */
86 for (iter = string; *iter != '\0'; iter++) 86 for (iter = string; *iter != '\0'; iter++)
87 { 87 {
88 /* if it's raw text, just copy the byte */ 88 /* if it's raw text, just copy the byte */
89 if (*iter != '$' && *iter != '%' && (*iter != '}' || (*iter == '}' && level > 0))) 89 if (*iter != '$' && *iter != '%' && *iter != '}' )
90 {
91 g_string_append_c(ctx->str, *iter);
92 }
93 else if (*iter == '}' && level > 0)
90 { 94 {
91 level--; 95 level--;
92 g_string_append_c(ctx->str, *iter);
93 } 96 }
94 else if (g_str_has_prefix(iter, "${") == TRUE) 97 else if (g_str_has_prefix(iter, "${") == TRUE)
95 { 98 {
96 GString *expression = g_string_new(""); 99 GString *expression = g_string_new("");
97 GString *argument = g_string_new(""); 100 GString *argument = g_string_new("");
98 GString *sel = expression; 101 GString *sel = expression;
99 gchar *result; 102 gchar *result;
100 gboolean rewind = FALSE; 103 level++;
101 104
102 for (iter += 2; *iter != '\0'; iter++) 105 for (iter += 2; *iter != '\0'; iter++)
103 { 106 {
104 if (*iter == ':') 107 if (*iter == ':')
105 { 108 {
106 level++;
107 if (sel != argument) 109 if (sel != argument)
108 { 110 {
109 sel = argument; 111 sel = argument;
110 continue; 112 continue;
111 } 113 }
123 } 125 }
124 } 126 }
125 else if (*iter == '}' && (sel == argument)) 127 else if (*iter == '}' && (sel == argument))
126 { 128 {
127 level--; 129 level--;
128 if (level + 1 > 0) 130 if (level == 0)
129 { 131 break;
130 iter++; 132 else
131 rewind = *(iter - 1) == '}' && *iter != '}'; 133 g_string_append_c(sel, *iter);
132 break;
133 }
134 g_string_append_c(sel, *iter);
135 } 134 }
136 else if (*iter == '}' && ((sel != argument))) 135 else if (*iter == '}' && ((sel != argument)))
137 break; 136 break;
138 else 137 else
139 g_string_append_c(sel, *iter); 138 g_string_append_c(sel, *iter);
156 g_string_free(expression, TRUE); 155 g_string_free(expression, TRUE);
157 g_string_free(argument, TRUE); 156 g_string_free(argument, TRUE);
158 157
159 if (*iter == '\0') 158 if (*iter == '\0')
160 break; 159 break;
161
162 if (rewind)
163 iter--;
164 } 160 }
165 else if (g_str_has_prefix(iter, "%{") == TRUE) 161 else if (g_str_has_prefix(iter, "%{") == TRUE)
166 { 162 {
167 GString *expression = g_string_new(""); 163 GString *expression = g_string_new("");
168 GString *argument = g_string_new(""); 164 GString *argument = g_string_new("");
169 GString *sel = expression; 165 GString *sel = expression;
170 gchar *result; 166 gchar *result;
171 gboolean rewind = FALSE; 167 level++;
172 168
173 for (iter += 2; *iter != '\0'; iter++) 169 for (iter += 2; *iter != '\0'; iter++)
174 { 170 {
175 if (*iter == ':') 171 if (*iter == ':')
176 { 172 {
177 level++;
178 if (sel != argument) 173 if (sel != argument)
179 { 174 {
180 sel = argument; 175 sel = argument;
181 continue; 176 continue;
182 } 177 }
194 } 189 }
195 } 190 }
196 else if (*iter == '}' && (sel == argument)) 191 else if (*iter == '}' && (sel == argument))
197 { 192 {
198 level--; 193 level--;
199 if (level + 1 > 0) 194 if (level == 0)
200 { 195 break;
201 iter++; 196 else
202 rewind = *(iter - 1) == '}' && *iter != '}';
203 break;
204 }
205 g_string_append_c(sel, *iter); 197 g_string_append_c(sel, *iter);
206 } 198 }
207 else if (*iter == '}' && ((sel != argument))) 199 else if (*iter == '}' && ((sel != argument)))
208 break; 200 break;
209 else 201 else
227 g_string_free(expression, TRUE); 219 g_string_free(expression, TRUE);
228 g_string_free(argument, TRUE); 220 g_string_free(argument, TRUE);
229 221
230 if (*iter == '\0') 222 if (*iter == '\0')
231 break; 223 break;
232
233 if (rewind)
234 iter--;
235 } 224 }
236 } 225 }
237 226
238 out = g_strdup(ctx->str->str); 227 out = g_strdup(ctx->str->str);
239 g_string_free(ctx->str, TRUE); 228 g_string_free(ctx->str, TRUE);