Mercurial > audlegacy
comparison src/audacious/tuple.c @ 3510:b2a82a73a788 trunk
Few bits of pre-integration shit.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 09 Sep 2007 16:31:50 +0300 |
parents | 08085ecc7e91 |
children | fb5bc40d0b86 |
comparison
equal
deleted
inserted
replaced
3509:08085ecc7e91 | 3510:b2a82a73a788 |
---|---|
159 } | 159 } |
160 | 160 |
161 return tuple; | 161 return tuple; |
162 } | 162 } |
163 | 163 |
164 | |
165 static gint tuple_get_nfield(const gchar *field) | |
166 { | |
167 gint i; | |
168 for (i = 0; i < FIELD_LAST; i++) | |
169 if (!strcmp(field, tuple_fields[i].name)) | |
170 return i; | |
171 return -1; | |
172 } | |
173 | |
174 | |
164 static TupleValue * | 175 static TupleValue * |
165 tuple_associate_data(Tuple *tuple, const gint cnfield, const gchar *field, TupleValueType ftype) | 176 tuple_associate_data(Tuple *tuple, const gint cnfield, const gchar *field, TupleValueType ftype) |
166 { | 177 { |
167 const gchar *tfield = field; | 178 const gchar *tfield = field; |
168 gint nfield = cnfield; | 179 gint nfield = cnfield; |
171 g_return_val_if_fail(tuple != NULL, NULL); | 182 g_return_val_if_fail(tuple != NULL, NULL); |
172 g_return_val_if_fail(cnfield < FIELD_LAST, NULL); | 183 g_return_val_if_fail(cnfield < FIELD_LAST, NULL); |
173 | 184 |
174 /* Check for known fields */ | 185 /* Check for known fields */ |
175 if (nfield < 0) { | 186 if (nfield < 0) { |
176 gint i; | 187 nfield = tuple_get_nfield(field); |
177 for (i = 0; i < FIELD_LAST && nfield < 0; i++) | |
178 if (!strcmp(field, tuple_fields[i].name)) | |
179 nfield = i; | |
180 | |
181 if (nfield >= 0) { | 188 if (nfield >= 0) { |
182 fprintf(stderr, "WARNING! FIELD_* not used for '%s'!\n", field); | 189 fprintf(stderr, "WARNING! FIELD_* not used for '%s'!\n", field); |
183 } | 190 } |
184 } | 191 } |
185 | 192 |
207 } | 214 } |
208 } else { | 215 } else { |
209 /* Allocate a new value */ | 216 /* Allocate a new value */ |
210 value = mowgli_heap_alloc(tuple_value_heap); | 217 value = mowgli_heap_alloc(tuple_value_heap); |
211 value->type = ftype; | 218 value->type = ftype; |
212 mowgli_dictionary_add(tuple->dict, tfield, value); | |
213 if (nfield >= 0) | 219 if (nfield >= 0) |
214 tuple->values[nfield] = value; | 220 tuple->values[nfield] = value; |
221 else | |
222 mowgli_dictionary_add(tuple->dict, tfield, value); | |
215 } | 223 } |
216 | 224 |
217 return value; | 225 return value; |
218 } | 226 } |
219 | 227 |
221 tuple_associate_string(Tuple *tuple, const gint nfield, const gchar *field, const gchar *string) | 229 tuple_associate_string(Tuple *tuple, const gint nfield, const gchar *field, const gchar *string) |
222 { | 230 { |
223 TupleValue *value; | 231 TupleValue *value; |
224 | 232 |
225 TUPLE_LOCK_WRITE(); | 233 TUPLE_LOCK_WRITE(); |
226 | |
227 if ((value = tuple_associate_data(tuple, nfield, field, TUPLE_STRING)) == NULL) | 234 if ((value = tuple_associate_data(tuple, nfield, field, TUPLE_STRING)) == NULL) |
228 return FALSE; | 235 return FALSE; |
229 | 236 |
230 if (string == NULL) | 237 if (string == NULL) |
231 value->value.string = NULL; | 238 value->value.string = NULL; |
250 TUPLE_UNLOCK_WRITE(); | 257 TUPLE_UNLOCK_WRITE(); |
251 return TRUE; | 258 return TRUE; |
252 } | 259 } |
253 | 260 |
254 void | 261 void |
255 tuple_disassociate(Tuple *tuple, const gint nfield, const gchar *field) | 262 tuple_disassociate(Tuple *tuple, const gint cnfield, const gchar *field) |
256 { | 263 { |
257 TupleValue *value; | 264 TupleValue *value; |
258 const gchar *tfield; | 265 gint nfield = cnfield; |
259 | 266 |
260 g_return_if_fail(tuple != NULL); | 267 g_return_if_fail(tuple != NULL); |
261 g_return_if_fail(nfield < FIELD_LAST); | 268 g_return_if_fail(nfield < FIELD_LAST); |
262 | 269 |
263 TUPLE_LOCK_WRITE(); | 270 if (nfield < 0) |
264 if (nfield < 0) | 271 nfield = tuple_get_nfield(field); |
265 tfield = field; | 272 |
273 TUPLE_LOCK_WRITE(); | |
274 if (nfield < 0) | |
275 /* why _delete()? because _delete() returns the dictnode's data on success */ | |
276 value = mowgli_dictionary_delete(tuple->dict, field); | |
266 else { | 277 else { |
267 tfield = tuple_fields[nfield].name; | 278 value = tuple->values[nfield]; |
268 tuple->values[nfield] = NULL; | 279 tuple->values[nfield] = NULL; |
269 } | 280 } |
270 | 281 |
271 /* why _delete()? because _delete() returns the dictnode's data on success */ | 282 if (value == NULL) { |
272 if ((value = mowgli_dictionary_delete(tuple->dict, tfield)) == NULL) { | |
273 TUPLE_UNLOCK_WRITE(); | 283 TUPLE_UNLOCK_WRITE(); |
274 return; | 284 return; |
275 } | 285 } |
276 | 286 |
277 /* Free associated data */ | 287 /* Free associated data */ |
283 mowgli_heap_free(tuple_value_heap, value); | 293 mowgli_heap_free(tuple_value_heap, value); |
284 TUPLE_UNLOCK_WRITE(); | 294 TUPLE_UNLOCK_WRITE(); |
285 } | 295 } |
286 | 296 |
287 TupleValueType | 297 TupleValueType |
288 tuple_get_value_type(Tuple *tuple, const gint nfield, const gchar *field) | 298 tuple_get_value_type(Tuple *tuple, const gint cnfield, const gchar *field) |
289 { | 299 { |
290 TupleValueType type = TUPLE_UNKNOWN; | 300 TupleValueType type = TUPLE_UNKNOWN; |
301 gint nfield = cnfield; | |
291 | 302 |
292 g_return_val_if_fail(tuple != NULL, TUPLE_UNKNOWN); | 303 g_return_val_if_fail(tuple != NULL, TUPLE_UNKNOWN); |
293 g_return_val_if_fail(nfield < FIELD_LAST, TUPLE_UNKNOWN); | 304 g_return_val_if_fail(nfield < FIELD_LAST, TUPLE_UNKNOWN); |
294 | 305 |
306 if (nfield < 0) | |
307 nfield = tuple_get_nfield(field); | |
308 | |
295 TUPLE_LOCK_READ(); | 309 TUPLE_LOCK_READ(); |
296 if (nfield < 0) { | 310 if (nfield < 0) { |
297 TupleValue *value; | 311 TupleValue *value; |
298 if ((value = mowgli_dictionary_retrieve(tuple->dict, field)) != NULL) | 312 if ((value = mowgli_dictionary_retrieve(tuple->dict, field)) != NULL) |
299 type = value->type; | 313 type = value->type; |
305 TUPLE_UNLOCK_READ(); | 319 TUPLE_UNLOCK_READ(); |
306 return type; | 320 return type; |
307 } | 321 } |
308 | 322 |
309 const gchar * | 323 const gchar * |
310 tuple_get_string(Tuple *tuple, const gint nfield, const gchar *field) | 324 tuple_get_string(Tuple *tuple, const gint cnfield, const gchar *field) |
311 { | 325 { |
312 TupleValue *value; | 326 TupleValue *value; |
327 gint nfield = cnfield; | |
313 | 328 |
314 g_return_val_if_fail(tuple != NULL, NULL); | 329 g_return_val_if_fail(tuple != NULL, NULL); |
315 g_return_val_if_fail(nfield < FIELD_LAST, NULL); | 330 g_return_val_if_fail(nfield < FIELD_LAST, NULL); |
316 | 331 |
332 if (nfield < 0) | |
333 nfield = tuple_get_nfield(field); | |
334 | |
317 TUPLE_LOCK_READ(); | 335 TUPLE_LOCK_READ(); |
318 if (nfield < 0) | 336 if (nfield < 0) |
319 value = mowgli_dictionary_retrieve(tuple->dict, field); | 337 value = mowgli_dictionary_retrieve(tuple->dict, field); |
320 else | 338 else |
321 value = tuple->values[nfield]; | 339 value = tuple->values[nfield]; |
331 return NULL; | 349 return NULL; |
332 } | 350 } |
333 } | 351 } |
334 | 352 |
335 gint | 353 gint |
336 tuple_get_int(Tuple *tuple, const gint nfield, const gchar *field) | 354 tuple_get_int(Tuple *tuple, const gint cnfield, const gchar *field) |
337 { | 355 { |
338 TupleValue *value; | 356 TupleValue *value; |
357 gint nfield = cnfield; | |
339 | 358 |
340 g_return_val_if_fail(tuple != NULL, 0); | 359 g_return_val_if_fail(tuple != NULL, 0); |
341 g_return_val_if_fail(nfield < FIELD_LAST, 0); | 360 g_return_val_if_fail(nfield < FIELD_LAST, 0); |
342 | 361 |
362 if (nfield < 0) | |
363 nfield = tuple_get_nfield(field); | |
364 | |
343 TUPLE_LOCK_READ(); | 365 TUPLE_LOCK_READ(); |
344 if (nfield < 0) | 366 if (nfield < 0) |
345 value = mowgli_dictionary_retrieve(tuple->dict, field); | 367 value = mowgli_dictionary_retrieve(tuple->dict, field); |
346 else | 368 else |
347 value = tuple->values[nfield]; | 369 value = tuple->values[nfield]; |