diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-06-13 18:29:34 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-06-13 18:29:34 +0000 |
commit | f23ffa877442969db0592c772b98592af3b1f78a (patch) | |
tree | a3b2cbb56a9e6650470deb3cce081e1c09b7b24d /src/util/container_meta_data.c | |
parent | 1f5326cd1032cbcc914c7809df1a64994eeebbe9 (diff) | |
download | gnunet-f23ffa877442969db0592c772b98592af3b1f78a.tar.gz gnunet-f23ffa877442969db0592c772b98592af3b1f78a.zip |
-fixing #2153, code clean up in container_meta_data.c
Diffstat (limited to 'src/util/container_meta_data.c')
-rw-r--r-- | src/util/container_meta_data.c | 286 |
1 files changed, 128 insertions, 158 deletions
diff --git a/src/util/container_meta_data.c b/src/util/container_meta_data.c index b1051c8b6..e725486b7 100644 --- a/src/util/container_meta_data.c +++ b/src/util/container_meta_data.c | |||
@@ -40,11 +40,16 @@ | |||
40 | struct MetaItem | 40 | struct MetaItem |
41 | { | 41 | { |
42 | /** | 42 | /** |
43 | * This is a linked list. | 43 | * This is a doubly linked list. |
44 | */ | 44 | */ |
45 | struct MetaItem *next; | 45 | struct MetaItem *next; |
46 | 46 | ||
47 | /** | 47 | /** |
48 | * This is a doubly linked list. | ||
49 | */ | ||
50 | struct MetaItem *prev; | ||
51 | |||
52 | /** | ||
48 | * Name of the extracting plugin. | 53 | * Name of the extracting plugin. |
49 | */ | 54 | */ |
50 | char *plugin_name; | 55 | char *plugin_name; |
@@ -82,9 +87,14 @@ struct MetaItem | |||
82 | struct GNUNET_CONTAINER_MetaData | 87 | struct GNUNET_CONTAINER_MetaData |
83 | { | 88 | { |
84 | /** | 89 | /** |
85 | * Linked list of the meta data items. | 90 | * Head of linked list of the meta data items. |
86 | */ | 91 | */ |
87 | struct MetaItem *items; | 92 | struct MetaItem *items_head; |
93 | |||
94 | /** | ||
95 | * Tail of linked list of the meta data items. | ||
96 | */ | ||
97 | struct MetaItem *items_tail; | ||
88 | 98 | ||
89 | /** | 99 | /** |
90 | * Complete serialized and compressed buffer of the items. | 100 | * Complete serialized and compressed buffer of the items. |
@@ -120,15 +130,15 @@ GNUNET_CONTAINER_meta_data_create () | |||
120 | /** | 130 | /** |
121 | * Free meta data item. | 131 | * Free meta data item. |
122 | * | 132 | * |
123 | * @param item item to free | 133 | * @param mi item to free |
124 | */ | 134 | */ |
125 | static void | 135 | static void |
126 | meta_item_free (struct MetaItem *item) | 136 | meta_item_free (struct MetaItem *mi) |
127 | { | 137 | { |
128 | GNUNET_free_non_null (item->plugin_name); | 138 | GNUNET_free_non_null (mi->plugin_name); |
129 | GNUNET_free_non_null (item->mime_type); | 139 | GNUNET_free_non_null (mi->mime_type); |
130 | GNUNET_free_non_null (item->data); | 140 | GNUNET_free_non_null (mi->data); |
131 | GNUNET_free (item); | 141 | GNUNET_free (mi); |
132 | } | 142 | } |
133 | 143 | ||
134 | 144 | ||
@@ -141,7 +151,7 @@ meta_item_free (struct MetaItem *item) | |||
141 | static void | 151 | static void |
142 | invalidate_sbuf (struct GNUNET_CONTAINER_MetaData *md) | 152 | invalidate_sbuf (struct GNUNET_CONTAINER_MetaData *md) |
143 | { | 153 | { |
144 | if (md->sbuf == NULL) | 154 | if (NULL == md->sbuf) |
145 | return; | 155 | return; |
146 | GNUNET_free (md->sbuf); | 156 | GNUNET_free (md->sbuf); |
147 | md->sbuf = NULL; | 157 | md->sbuf = NULL; |
@@ -157,14 +167,14 @@ invalidate_sbuf (struct GNUNET_CONTAINER_MetaData *md) | |||
157 | void | 167 | void |
158 | GNUNET_CONTAINER_meta_data_destroy (struct GNUNET_CONTAINER_MetaData *md) | 168 | GNUNET_CONTAINER_meta_data_destroy (struct GNUNET_CONTAINER_MetaData *md) |
159 | { | 169 | { |
160 | struct MetaItem *item; | 170 | struct MetaItem *pos; |
161 | 171 | ||
162 | if (md == NULL) | 172 | if (NULL == md) |
163 | return; | 173 | return; |
164 | while (NULL != (item = md->items)) | 174 | while (NULL != (pos = md->items_head)) |
165 | { | 175 | { |
166 | md->items = item->next; | 176 | GNUNET_CONTAINER_DLL_remove (md->items_head, md->items_tail, pos); |
167 | meta_item_free (item); | 177 | meta_item_free (pos); |
168 | } | 178 | } |
169 | GNUNET_free_non_null (md->sbuf); | 179 | GNUNET_free_non_null (md->sbuf); |
170 | GNUNET_free (md); | 180 | GNUNET_free (md); |
@@ -179,21 +189,20 @@ GNUNET_CONTAINER_meta_data_destroy (struct GNUNET_CONTAINER_MetaData *md) | |||
179 | void | 189 | void |
180 | GNUNET_CONTAINER_meta_data_clear (struct GNUNET_CONTAINER_MetaData *md) | 190 | GNUNET_CONTAINER_meta_data_clear (struct GNUNET_CONTAINER_MetaData *md) |
181 | { | 191 | { |
182 | struct MetaItem *item; | 192 | struct MetaItem *mi; |
183 | 193 | ||
184 | if (md == NULL) | 194 | if (NULL == md) |
185 | return; | 195 | return; |
186 | while (NULL != (item = md->items)) | 196 | while (NULL != (mi = md->items_head)) |
187 | { | 197 | { |
188 | md->items = item->next; | 198 | GNUNET_CONTAINER_DLL_remove (md->items_head, md->items_tail, mi); |
189 | meta_item_free (item); | 199 | meta_item_free (mi); |
190 | } | 200 | } |
191 | GNUNET_free_non_null (md->sbuf); | 201 | GNUNET_free_non_null (md->sbuf); |
192 | memset (md, 0, sizeof (struct GNUNET_CONTAINER_MetaData)); | 202 | memset (md, 0, sizeof (struct GNUNET_CONTAINER_MetaData)); |
193 | } | 203 | } |
194 | 204 | ||
195 | 205 | ||
196 | |||
197 | /** | 206 | /** |
198 | * Test if two MDs are equal. We consider them equal if | 207 | * Test if two MDs are equal. We consider them equal if |
199 | * the meta types, formats and content match (we do not | 208 | * the meta types, formats and content match (we do not |
@@ -218,13 +227,10 @@ GNUNET_CONTAINER_meta_data_test_equal (const struct GNUNET_CONTAINER_MetaData | |||
218 | return GNUNET_YES; | 227 | return GNUNET_YES; |
219 | if (md1->item_count != md2->item_count) | 228 | if (md1->item_count != md2->item_count) |
220 | return GNUNET_NO; | 229 | return GNUNET_NO; |
221 | 230 | for (i = md1->items_head; NULL != i; i = i->next) | |
222 | i = md1->items; | ||
223 | while (NULL != i) | ||
224 | { | 231 | { |
225 | found = GNUNET_NO; | 232 | found = GNUNET_NO; |
226 | j = md2->items; | 233 | for (j = md2->items_head; NULL != j; j = j->next) |
227 | while (NULL != j) | ||
228 | { | 234 | { |
229 | if ((i->type == j->type) && (i->format == j->format) && | 235 | if ((i->type == j->type) && (i->format == j->format) && |
230 | (i->data_size == j->data_size) && | 236 | (i->data_size == j->data_size) && |
@@ -233,11 +239,11 @@ GNUNET_CONTAINER_meta_data_test_equal (const struct GNUNET_CONTAINER_MetaData | |||
233 | found = GNUNET_YES; | 239 | found = GNUNET_YES; |
234 | break; | 240 | break; |
235 | } | 241 | } |
236 | j = j->next; | 242 | if (j->data_size < i->data_size) |
243 | break; /* elements are sorted by (decreasing) size... */ | ||
237 | } | 244 | } |
238 | if (found == GNUNET_NO) | 245 | if (GNUNET_NO == found) |
239 | return GNUNET_NO; | 246 | return GNUNET_NO; |
240 | i = i->next; | ||
241 | } | 247 | } |
242 | return GNUNET_YES; | 248 | return GNUNET_YES; |
243 | } | 249 | } |
@@ -257,7 +263,7 @@ GNUNET_CONTAINER_meta_data_test_equal (const struct GNUNET_CONTAINER_MetaData | |||
257 | * @param data_mime_type mime-type of data (not of the original file); | 263 | * @param data_mime_type mime-type of data (not of the original file); |
258 | * can be NULL (if mime-type is not known) | 264 | * can be NULL (if mime-type is not known) |
259 | * @param data actual meta-data found | 265 | * @param data actual meta-data found |
260 | * @param data_len number of bytes in data | 266 | * @param data_size number of bytes in data |
261 | * @return GNUNET_OK on success, GNUNET_SYSERR if this entry already exists | 267 | * @return GNUNET_OK on success, GNUNET_SYSERR if this entry already exists |
262 | * data_mime_type and plugin_name are not considered for "exists" checks | 268 | * data_mime_type and plugin_name are not considered for "exists" checks |
263 | */ | 269 | */ |
@@ -267,64 +273,61 @@ GNUNET_CONTAINER_meta_data_insert (struct GNUNET_CONTAINER_MetaData *md, | |||
267 | enum EXTRACTOR_MetaType type, | 273 | enum EXTRACTOR_MetaType type, |
268 | enum EXTRACTOR_MetaFormat format, | 274 | enum EXTRACTOR_MetaFormat format, |
269 | const char *data_mime_type, const char *data, | 275 | const char *data_mime_type, const char *data, |
270 | size_t data_len) | 276 | size_t data_size) |
271 | { | 277 | { |
272 | struct MetaItem *prev; | ||
273 | struct MetaItem *pos; | 278 | struct MetaItem *pos; |
274 | struct MetaItem *i; | 279 | struct MetaItem *mi; |
275 | char *p; | 280 | char *p; |
276 | 281 | ||
277 | prev = NULL; | 282 | for (pos = md->items_head; NULL != pos; pos = pos->next) |
278 | pos = md->items; | ||
279 | while (NULL != pos) | ||
280 | { | 283 | { |
281 | if (pos->data_size < data_len) | 284 | if (pos->data_size < data_size) |
282 | break; | 285 | break; /* elements are sorted by size in the list */ |
283 | if ((pos->type == type) && (pos->data_size == data_len) && | 286 | if ((pos->type == type) && (pos->data_size == data_size) && |
284 | (0 == memcmp (pos->data, data, data_len))) | 287 | (0 == memcmp (pos->data, data, data_size))) |
285 | { | 288 | { |
286 | if ((pos->mime_type == NULL) && (data_mime_type != NULL)) | 289 | if ((NULL == pos->mime_type) && (NULL != data_mime_type)) |
287 | { | 290 | { |
288 | pos->mime_type = GNUNET_strdup (data_mime_type); | 291 | pos->mime_type = GNUNET_strdup (data_mime_type); |
289 | invalidate_sbuf (md); | 292 | invalidate_sbuf (md); |
290 | } | 293 | } |
291 | if ((pos->format == EXTRACTOR_METAFORMAT_C_STRING) && | 294 | if ((EXTRACTOR_METAFORMAT_C_STRING == pos->format) && |
292 | (format == EXTRACTOR_METAFORMAT_UTF8)) | 295 | (EXTRACTOR_METAFORMAT_UTF8 == format)) |
293 | { | 296 | { |
294 | pos->format = EXTRACTOR_METAFORMAT_UTF8; | 297 | pos->format = EXTRACTOR_METAFORMAT_UTF8; |
295 | invalidate_sbuf (md); | 298 | invalidate_sbuf (md); |
296 | } | 299 | } |
297 | return GNUNET_SYSERR; | 300 | return GNUNET_SYSERR; |
298 | } | 301 | } |
299 | prev = pos; | ||
300 | pos = pos->next; | ||
301 | } | 302 | } |
302 | md->item_count++; | 303 | md->item_count++; |
303 | i = GNUNET_malloc (sizeof (struct MetaItem)); | 304 | mi = GNUNET_malloc (sizeof (struct MetaItem)); |
304 | i->type = type; | 305 | mi->type = type; |
305 | i->format = format; | 306 | mi->format = format; |
306 | i->data_size = data_len; | 307 | mi->data_size = data_size; |
307 | i->next = pos; | 308 | if (NULL == pos) |
308 | if (prev == NULL) | 309 | GNUNET_CONTAINER_DLL_insert_tail (md->items_head, |
309 | md->items = i; | 310 | md->items_tail, |
311 | mi); | ||
310 | else | 312 | else |
311 | prev->next = i; | 313 | GNUNET_CONTAINER_DLL_insert_after (md->items_head, |
312 | i->mime_type = | 314 | md->items_tail, |
313 | (data_mime_type == NULL) ? NULL : GNUNET_strdup (data_mime_type); | 315 | pos->prev, |
314 | i->plugin_name = (plugin_name == NULL) ? NULL : GNUNET_strdup (plugin_name); | 316 | mi); |
315 | i->data = GNUNET_malloc (data_len); | 317 | mi->mime_type = |
316 | memcpy (i->data, data, data_len); | 318 | (NULL == data_mime_type) ? NULL : GNUNET_strdup (data_mime_type); |
317 | /* change OS native dir separators to unix '/' and others to '_' */ | 319 | mi->plugin_name = (NULL == plugin_name) ? NULL : GNUNET_strdup (plugin_name); |
318 | if ( (type == EXTRACTOR_METATYPE_FILENAME) || | 320 | mi->data = GNUNET_malloc (data_size); |
319 | (type == EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME) ) | 321 | memcpy (mi->data, data, data_size); |
322 | /* change all dir separators to POSIX style ('/') */ | ||
323 | if ( (EXTRACTOR_METATYPE_FILENAME == type) || | ||
324 | (EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME == type) ) | ||
320 | { | 325 | { |
321 | p = i->data; | 326 | p = mi->data; |
322 | while ((*p != '\0') && (p < i->data + data_len)) | 327 | while (('\0' != *p) && (p < mi->data + data_size)) |
323 | { | 328 | { |
324 | if (*p == DIR_SEPARATOR) | 329 | if ('\\' == *p) |
325 | *p = '/'; | 330 | *p = '/'; |
326 | else if (*p == '\\') | ||
327 | *p = '_'; | ||
328 | p++; | 331 | p++; |
329 | } | 332 | } |
330 | } | 333 | } |
@@ -346,18 +349,18 @@ GNUNET_CONTAINER_meta_data_insert (struct GNUNET_CONTAINER_MetaData *md, | |||
346 | * @param data_mime_type mime-type of data (not of the original file); | 349 | * @param data_mime_type mime-type of data (not of the original file); |
347 | * can be NULL (if mime-type is not known) | 350 | * can be NULL (if mime-type is not known) |
348 | * @param data actual meta-data found | 351 | * @param data actual meta-data found |
349 | * @param data_len number of bytes in data | 352 | * @param data_size number of bytes in data |
350 | * @return 0 (to continue) | 353 | * @return 0 (to continue) |
351 | */ | 354 | */ |
352 | static int | 355 | static int |
353 | merge_helper (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type, | 356 | merge_helper (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type, |
354 | enum EXTRACTOR_MetaFormat format, const char *data_mime_type, | 357 | enum EXTRACTOR_MetaFormat format, const char *data_mime_type, |
355 | const char *data, size_t data_len) | 358 | const char *data, size_t data_size) |
356 | { | 359 | { |
357 | struct GNUNET_CONTAINER_MetaData *md = cls; | 360 | struct GNUNET_CONTAINER_MetaData *md = cls; |
358 | 361 | ||
359 | (void) GNUNET_CONTAINER_meta_data_insert (md, plugin_name, type, format, | 362 | (void) GNUNET_CONTAINER_meta_data_insert (md, plugin_name, type, format, |
360 | data_mime_type, data, data_len); | 363 | data_mime_type, data, data_size); |
361 | return 0; | 364 | return 0; |
362 | } | 365 | } |
363 | 366 | ||
@@ -384,37 +387,31 @@ GNUNET_CONTAINER_meta_data_merge (struct GNUNET_CONTAINER_MetaData *md, | |||
384 | * @param type type of the item to remove | 387 | * @param type type of the item to remove |
385 | * @param data specific value to remove, NULL to remove all | 388 | * @param data specific value to remove, NULL to remove all |
386 | * entries of the given type | 389 | * entries of the given type |
387 | * @param data_len number of bytes in data | 390 | * @param data_size number of bytes in data |
388 | * @return GNUNET_OK on success, GNUNET_SYSERR if the item does not exist in md | 391 | * @return GNUNET_OK on success, GNUNET_SYSERR if the item does not exist in md |
389 | */ | 392 | */ |
390 | int | 393 | int |
391 | GNUNET_CONTAINER_meta_data_delete (struct GNUNET_CONTAINER_MetaData *md, | 394 | GNUNET_CONTAINER_meta_data_delete (struct GNUNET_CONTAINER_MetaData *md, |
392 | enum EXTRACTOR_MetaType type, | 395 | enum EXTRACTOR_MetaType type, |
393 | const char *data, size_t data_len) | 396 | const char *data, size_t data_size) |
394 | { | 397 | { |
395 | struct MetaItem *pos; | 398 | struct MetaItem *pos; |
396 | struct MetaItem *prev; | ||
397 | 399 | ||
398 | prev = NULL; | 400 | for (pos = md->items_head; NULL != pos; pos = pos->next) |
399 | pos = md->items; | ||
400 | while (NULL != pos) | ||
401 | { | 401 | { |
402 | if (pos->data_size < data_size) | ||
403 | break; /* items are sorted by (decreasing) size */ | ||
402 | if ((pos->type == type) && | 404 | if ((pos->type == type) && |
403 | ((data == NULL) || | 405 | ((NULL == data) || |
404 | ((pos->data_size == data_len) && | 406 | ((pos->data_size == data_size) && |
405 | (0 == memcmp (pos->data, data, data_len))))) | 407 | (0 == memcmp (pos->data, data, data_size))))) |
406 | { | 408 | { |
407 | if (prev == NULL) | 409 | GNUNET_CONTAINER_DLL_remove (md->items_head, md->items_tail, pos); |
408 | md->items = pos->next; | ||
409 | else | ||
410 | prev->next = pos->next; | ||
411 | meta_item_free (pos); | 410 | meta_item_free (pos); |
412 | md->item_count--; | 411 | md->item_count--; |
413 | invalidate_sbuf (md); | 412 | invalidate_sbuf (md); |
414 | return GNUNET_OK; | 413 | return GNUNET_OK; |
415 | } | 414 | } |
416 | prev = pos; | ||
417 | pos = pos->next; | ||
418 | } | 415 | } |
419 | return GNUNET_SYSERR; | 416 | return GNUNET_SYSERR; |
420 | } | 417 | } |
@@ -460,19 +457,15 @@ GNUNET_CONTAINER_meta_data_iterate (const struct GNUNET_CONTAINER_MetaData *md, | |||
460 | { | 457 | { |
461 | struct MetaItem *pos; | 458 | struct MetaItem *pos; |
462 | 459 | ||
463 | if (md == NULL) | 460 | if (NULL == md) |
464 | return 0; | 461 | return 0; |
465 | if (iter == NULL) | 462 | if (NULL == iter) |
466 | return md->item_count; | 463 | return md->item_count; |
467 | pos = md->items; | 464 | for (pos = md->items_head; NULL != pos; pos = pos->next) |
468 | while (NULL != pos) | ||
469 | { | ||
470 | if (0 != | 465 | if (0 != |
471 | iter (iter_cls, pos->plugin_name, pos->type, pos->format, | 466 | iter (iter_cls, pos->plugin_name, pos->type, pos->format, |
472 | pos->mime_type, pos->data, pos->data_size)) | 467 | pos->mime_type, pos->data, pos->data_size)) |
473 | return md->item_count; | 468 | return md->item_count; |
474 | pos = pos->next; | ||
475 | } | ||
476 | return md->item_count; | 469 | return md->item_count; |
477 | } | 470 | } |
478 | 471 | ||
@@ -493,17 +486,13 @@ GNUNET_CONTAINER_meta_data_get_by_type (const struct GNUNET_CONTAINER_MetaData | |||
493 | { | 486 | { |
494 | struct MetaItem *pos; | 487 | struct MetaItem *pos; |
495 | 488 | ||
496 | if (md == NULL) | 489 | if (NULL == md) |
497 | return NULL; | 490 | return NULL; |
498 | pos = md->items; | 491 | for (pos = md->items_head; NULL != pos; pos = pos->next) |
499 | while (NULL != pos) | ||
500 | { | ||
501 | if ((type == pos->type) && | 492 | if ((type == pos->type) && |
502 | ((pos->format == EXTRACTOR_METAFORMAT_UTF8) || | 493 | ((pos->format == EXTRACTOR_METAFORMAT_UTF8) || |
503 | (pos->format == EXTRACTOR_METAFORMAT_C_STRING))) | 494 | (pos->format == EXTRACTOR_METAFORMAT_C_STRING))) |
504 | return GNUNET_strdup (pos->data); | 495 | return GNUNET_strdup (pos->data); |
505 | pos = pos->next; | ||
506 | } | ||
507 | return NULL; | 496 | return NULL; |
508 | } | 497 | } |
509 | 498 | ||
@@ -528,18 +517,16 @@ GNUNET_CONTAINER_meta_data_get_first_by_types (const struct | |||
528 | va_list args; | 517 | va_list args; |
529 | enum EXTRACTOR_MetaType type; | 518 | enum EXTRACTOR_MetaType type; |
530 | 519 | ||
531 | if (md == NULL) | 520 | if (NULL == md) |
532 | return NULL; | 521 | return NULL; |
533 | ret = NULL; | 522 | ret = NULL; |
534 | va_start (args, md); | 523 | va_start (args, md); |
535 | while (1) | 524 | while (1) |
536 | { | 525 | { |
537 | type = va_arg (args, enum EXTRACTOR_MetaType); | 526 | type = va_arg (args, enum EXTRACTOR_MetaType); |
538 | 527 | if (-1 == type) | |
539 | if (type == -1) | ||
540 | break; | 528 | break; |
541 | ret = GNUNET_CONTAINER_meta_data_get_by_type (md, type); | 529 | if (NULL != (ret = GNUNET_CONTAINER_meta_data_get_by_type (md, type))) |
542 | if (ret != NULL) | ||
543 | break; | 530 | break; |
544 | } | 531 | } |
545 | va_end (args); | 532 | va_end (args); |
@@ -562,25 +549,23 @@ GNUNET_CONTAINER_meta_data_get_thumbnail (const struct GNUNET_CONTAINER_MetaData | |||
562 | struct MetaItem *pos; | 549 | struct MetaItem *pos; |
563 | struct MetaItem *match; | 550 | struct MetaItem *match; |
564 | 551 | ||
565 | if (md == NULL) | 552 | if (NULL == md) |
566 | return 0; | 553 | return 0; |
567 | match = NULL; | 554 | match = NULL; |
568 | pos = md->items; | 555 | for (pos = md->items_head; NULL != pos; pos = pos->next) |
569 | while (NULL != pos) | ||
570 | { | 556 | { |
571 | if ((NULL != pos->mime_type) && | 557 | if ((NULL != pos->mime_type) && |
572 | (0 == strncasecmp ("image/", pos->mime_type, strlen ("image/"))) && | 558 | (0 == strncasecmp ("image/", pos->mime_type, strlen ("image/"))) && |
573 | (pos->format == EXTRACTOR_METAFORMAT_BINARY)) | 559 | (EXTRACTOR_METAFORMAT_BINARY == pos->format)) |
574 | { | 560 | { |
575 | if (match == NULL) | 561 | if (NULL == match) |
576 | match = pos; | 562 | match = pos; |
577 | else if ((match->type != EXTRACTOR_METATYPE_THUMBNAIL) && | 563 | else if ((match->type != EXTRACTOR_METATYPE_THUMBNAIL) && |
578 | (pos->type == EXTRACTOR_METATYPE_THUMBNAIL)) | 564 | (pos->type == EXTRACTOR_METATYPE_THUMBNAIL)) |
579 | match = pos; | 565 | match = pos; |
580 | } | 566 | } |
581 | pos = pos->next; | ||
582 | } | 567 | } |
583 | if ((match == NULL) || (match->data_size == 0)) | 568 | if ((NULL == match) || (0 == match->data_size)) |
584 | return 0; | 569 | return 0; |
585 | *thumb = GNUNET_malloc (match->data_size); | 570 | *thumb = GNUNET_malloc (match->data_size); |
586 | memcpy (*thumb, match->data, match->data_size); | 571 | memcpy (*thumb, match->data, match->data_size); |
@@ -601,17 +586,13 @@ GNUNET_CONTAINER_meta_data_duplicate (const struct GNUNET_CONTAINER_MetaData | |||
601 | struct GNUNET_CONTAINER_MetaData *ret; | 586 | struct GNUNET_CONTAINER_MetaData *ret; |
602 | struct MetaItem *pos; | 587 | struct MetaItem *pos; |
603 | 588 | ||
604 | if (md == NULL) | 589 | if (NULL == md) |
605 | return NULL; | 590 | return NULL; |
606 | ret = GNUNET_CONTAINER_meta_data_create (); | 591 | ret = GNUNET_CONTAINER_meta_data_create (); |
607 | pos = md->items; | 592 | for (pos = md->items_tail; NULL != pos; pos = pos->prev) |
608 | while (NULL != pos) | ||
609 | { | ||
610 | GNUNET_CONTAINER_meta_data_insert (ret, pos->plugin_name, pos->type, | 593 | GNUNET_CONTAINER_meta_data_insert (ret, pos->plugin_name, pos->type, |
611 | pos->format, pos->mime_type, pos->data, | 594 | pos->format, pos->mime_type, pos->data, |
612 | pos->data_size); | 595 | pos->data_size); |
613 | pos = pos->next; | ||
614 | } | ||
615 | return ret; | 596 | return ret; |
616 | } | 597 | } |
617 | 598 | ||
@@ -781,10 +762,10 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
781 | 762 | ||
782 | if (max < sizeof (struct MetaDataHeader)) | 763 | if (max < sizeof (struct MetaDataHeader)) |
783 | return GNUNET_SYSERR; /* far too small */ | 764 | return GNUNET_SYSERR; /* far too small */ |
784 | if (md == NULL) | 765 | if (NULL == md) |
785 | return 0; | 766 | return 0; |
786 | 767 | ||
787 | if (md->sbuf != NULL) | 768 | if (NULL != md->sbuf) |
788 | { | 769 | { |
789 | /* try to use serialization cache */ | 770 | /* try to use serialization cache */ |
790 | if (md->sbuf_size <= max) | 771 | if (md->sbuf_size <= max) |
@@ -800,16 +781,14 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
800 | } | 781 | } |
801 | dst = NULL; | 782 | dst = NULL; |
802 | msize = 0; | 783 | msize = 0; |
803 | pos = md->items; | 784 | for (pos = md->items_tail; NULL != pos; pos = pos->prev) |
804 | while (NULL != pos) | ||
805 | { | 785 | { |
806 | msize += sizeof (struct MetaDataEntry); | 786 | msize += sizeof (struct MetaDataEntry); |
807 | msize += pos->data_size; | 787 | msize += pos->data_size; |
808 | if (pos->plugin_name != NULL) | 788 | if (NULL != pos->plugin_name) |
809 | msize += strlen (pos->plugin_name) + 1; | 789 | msize += strlen (pos->plugin_name) + 1; |
810 | if (pos->mime_type != NULL) | 790 | if (NULL != pos->mime_type) |
811 | msize += strlen (pos->mime_type) + 1; | 791 | msize += strlen (pos->mime_type) + 1; |
812 | pos = pos->next; | ||
813 | } | 792 | } |
814 | size = (size_t) msize; | 793 | size = (size_t) msize; |
815 | if (size != msize) | 794 | if (size != msize) |
@@ -826,8 +805,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
826 | mdata = (char *) &ent[md->item_count]; | 805 | mdata = (char *) &ent[md->item_count]; |
827 | off = size - (md->item_count * sizeof (struct MetaDataEntry)); | 806 | off = size - (md->item_count * sizeof (struct MetaDataEntry)); |
828 | i = 0; | 807 | i = 0; |
829 | pos = md->items; | 808 | for (pos = md->items_tail; NULL != pos; pos = pos->prev) |
830 | while (NULL != pos) | ||
831 | { | 809 | { |
832 | ent[i].type = htonl ((uint32_t) pos->type); | 810 | ent[i].type = htonl ((uint32_t) pos->type); |
833 | ent[i].format = htonl ((uint32_t) pos->format); | 811 | ent[i].format = htonl ((uint32_t) pos->format); |
@@ -851,22 +829,20 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
851 | if (pos->mime_type != NULL) | 829 | if (pos->mime_type != NULL) |
852 | memcpy (&mdata[off], pos->mime_type, mlen); | 830 | memcpy (&mdata[off], pos->mime_type, mlen); |
853 | i++; | 831 | i++; |
854 | pos = pos->next; | ||
855 | } | 832 | } |
856 | GNUNET_assert (off == 0); | 833 | GNUNET_assert (0 == off); |
857 | 834 | ||
858 | clen = 0; | 835 | clen = 0; |
859 | cdata = NULL; | 836 | cdata = NULL; |
860 | left = size; | 837 | left = size; |
861 | i = 0; | 838 | i = 0; |
862 | pos = md->items; | 839 | for (pos = md->items_tail; NULL != pos; pos = pos->prev) |
863 | while (pos != NULL) | ||
864 | { | 840 | { |
865 | comp = GNUNET_NO; | 841 | comp = GNUNET_NO; |
866 | if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS)) | 842 | if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS)) |
867 | comp = try_compression ((const char *) &ent[i], left, &cdata, &clen); | 843 | comp = try_compression ((const char *) &ent[i], left, &cdata, &clen); |
868 | 844 | ||
869 | if ((md->sbuf == NULL) && (i == 0)) | 845 | if ((NULL == md->sbuf) && (0 == i)) |
870 | { | 846 | { |
871 | /* fill 'sbuf'; this "modifies" md, but since this is only | 847 | /* fill 'sbuf'; this "modifies" md, but since this is only |
872 | * an internal cache we will cast away the 'const' instead | 848 | * an internal cache we will cast away the 'const' instead |
@@ -892,12 +868,12 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
892 | } | 868 | } |
893 | 869 | ||
894 | if (((left + sizeof (struct MetaDataHeader)) <= max) || | 870 | if (((left + sizeof (struct MetaDataHeader)) <= max) || |
895 | ((comp == GNUNET_YES) && (clen <= max))) | 871 | ((GNUNET_YES == comp) && (clen <= max))) |
896 | { | 872 | { |
897 | /* success, this now fits! */ | 873 | /* success, this now fits! */ |
898 | if (GNUNET_YES == comp) | 874 | if (GNUNET_YES == comp) |
899 | { | 875 | { |
900 | if (dst == NULL) | 876 | if (NULL == dst) |
901 | dst = GNUNET_malloc (clen + sizeof (struct MetaDataHeader)); | 877 | dst = GNUNET_malloc (clen + sizeof (struct MetaDataHeader)); |
902 | hdr = (struct MetaDataHeader *) dst; | 878 | hdr = (struct MetaDataHeader *) dst; |
903 | hdr->version = htonl (2 | HEADER_COMPRESSED); | 879 | hdr->version = htonl (2 | HEADER_COMPRESSED); |
@@ -910,7 +886,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
910 | } | 886 | } |
911 | else | 887 | else |
912 | { | 888 | { |
913 | if (dst == NULL) | 889 | if (NULL == dst) |
914 | dst = GNUNET_malloc (left + sizeof (struct MetaDataHeader)); | 890 | dst = GNUNET_malloc (left + sizeof (struct MetaDataHeader)); |
915 | hdr = (struct MetaDataHeader *) dst; | 891 | hdr = (struct MetaDataHeader *) dst; |
916 | hdr->version = htonl (2); | 892 | hdr->version = htonl (2); |
@@ -943,11 +919,10 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
943 | * end and try again without it */ | 919 | * end and try again without it */ |
944 | left -= sizeof (struct MetaDataEntry); | 920 | left -= sizeof (struct MetaDataEntry); |
945 | left -= pos->data_size; | 921 | left -= pos->data_size; |
946 | if (pos->plugin_name != NULL) | 922 | if (NULL != pos->plugin_name) |
947 | left -= strlen (pos->plugin_name) + 1; | 923 | left -= strlen (pos->plugin_name) + 1; |
948 | if (pos->mime_type != NULL) | 924 | if (NULL != pos->mime_type) |
949 | left -= strlen (pos->mime_type) + 1; | 925 | left -= strlen (pos->mime_type) + 1; |
950 | pos = pos->next; | ||
951 | i++; | 926 | i++; |
952 | } | 927 | } |
953 | GNUNET_free (ent); | 928 | GNUNET_free (ent); |
@@ -956,7 +931,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData | |||
956 | ihdr.version = htonl (2); | 931 | ihdr.version = htonl (2); |
957 | ihdr.entries = htonl (0); | 932 | ihdr.entries = htonl (0); |
958 | ihdr.size = htonl (0); | 933 | ihdr.size = htonl (0); |
959 | if (*target == NULL) | 934 | if (NULL == *target) |
960 | *target = GNUNET_malloc (sizeof (struct MetaDataHeader)); | 935 | *target = GNUNET_malloc (sizeof (struct MetaDataHeader)); |
961 | memcpy (*target, &ihdr, sizeof (struct MetaDataHeader)); | 936 | memcpy (*target, &ihdr, sizeof (struct MetaDataHeader)); |
962 | return sizeof (struct MetaDataHeader); | 937 | return sizeof (struct MetaDataHeader); |
@@ -976,13 +951,13 @@ GNUNET_CONTAINER_meta_data_get_serialized_size (const struct | |||
976 | ssize_t ret; | 951 | ssize_t ret; |
977 | char *ptr; | 952 | char *ptr; |
978 | 953 | ||
979 | if (md->sbuf != NULL) | 954 | if (NULL != md->sbuf) |
980 | return md->sbuf_size; | 955 | return md->sbuf_size; |
981 | ptr = NULL; | 956 | ptr = NULL; |
982 | ret = | 957 | ret = |
983 | GNUNET_CONTAINER_meta_data_serialize (md, &ptr, GNUNET_MAX_MALLOC_CHECKED, | 958 | GNUNET_CONTAINER_meta_data_serialize (md, &ptr, GNUNET_MAX_MALLOC_CHECKED, |
984 | GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL); | 959 | GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL); |
985 | if (ret != -1) | 960 | if (-1 != ret) |
986 | GNUNET_free (ptr); | 961 | GNUNET_free (ptr); |
987 | return ret; | 962 | return ret; |
988 | } | 963 | } |
@@ -1008,14 +983,9 @@ decompress (const char *input, size_t inputSize, size_t outputSize) | |||
1008 | output = GNUNET_malloc (olen); | 983 | output = GNUNET_malloc (olen); |
1009 | if (Z_OK == | 984 | if (Z_OK == |
1010 | uncompress ((Bytef *) output, &olen, (const Bytef *) input, inputSize)) | 985 | uncompress ((Bytef *) output, &olen, (const Bytef *) input, inputSize)) |
1011 | { | ||
1012 | return output; | 986 | return output; |
1013 | } | 987 | GNUNET_free (output); |
1014 | else | 988 | return NULL; |
1015 | { | ||
1016 | GNUNET_free (output); | ||
1017 | return NULL; | ||
1018 | } | ||
1019 | } | 989 | } |
1020 | 990 | ||
1021 | 991 | ||
@@ -1056,9 +1026,9 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1056 | version = ntohl (hdr.version) & HEADER_VERSION_MASK; | 1026 | version = ntohl (hdr.version) & HEADER_VERSION_MASK; |
1057 | compressed = (ntohl (hdr.version) & HEADER_COMPRESSED) != 0; | 1027 | compressed = (ntohl (hdr.version) & HEADER_COMPRESSED) != 0; |
1058 | 1028 | ||
1059 | if (version == 1) | 1029 | if (1 == version) |
1060 | return NULL; /* null pointer */ | 1030 | return NULL; /* null pointer */ |
1061 | if (version != 2) | 1031 | if (2 != version) |
1062 | { | 1032 | { |
1063 | GNUNET_break_op (0); /* unsupported version */ | 1033 | GNUNET_break_op (0); /* unsupported version */ |
1064 | return NULL; | 1034 | return NULL; |
@@ -1084,7 +1054,7 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1084 | data = | 1054 | data = |
1085 | decompress ((const char *) &input[sizeof (struct MetaDataHeader)], | 1055 | decompress ((const char *) &input[sizeof (struct MetaDataHeader)], |
1086 | size - sizeof (struct MetaDataHeader), dataSize); | 1056 | size - sizeof (struct MetaDataHeader), dataSize); |
1087 | if (data == NULL) | 1057 | if (NULL == data) |
1088 | { | 1058 | { |
1089 | GNUNET_break_op (0); | 1059 | GNUNET_break_op (0); |
1090 | return NULL; | 1060 | return NULL; |
@@ -1110,9 +1080,9 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1110 | memcpy (&ent, &cdata[i * sizeof (struct MetaDataEntry)], | 1080 | memcpy (&ent, &cdata[i * sizeof (struct MetaDataEntry)], |
1111 | sizeof (struct MetaDataEntry)); | 1081 | sizeof (struct MetaDataEntry)); |
1112 | format = (enum EXTRACTOR_MetaFormat) ntohl (ent.format); | 1082 | format = (enum EXTRACTOR_MetaFormat) ntohl (ent.format); |
1113 | if ((format != EXTRACTOR_METAFORMAT_UTF8) && | 1083 | if ((EXTRACTOR_METAFORMAT_UTF8 != format) && |
1114 | (format != EXTRACTOR_METAFORMAT_C_STRING) && | 1084 | (EXTRACTOR_METAFORMAT_C_STRING != format) && |
1115 | (format != EXTRACTOR_METAFORMAT_BINARY)) | 1085 | (EXTRACTOR_METAFORMAT_BINARY != format)) |
1116 | { | 1086 | { |
1117 | GNUNET_break_op (0); | 1087 | GNUNET_break_op (0); |
1118 | break; | 1088 | break; |
@@ -1127,10 +1097,10 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1127 | } | 1097 | } |
1128 | left -= dlen; | 1098 | left -= dlen; |
1129 | meta_data = &mdata[left]; | 1099 | meta_data = &mdata[left]; |
1130 | if ((format == EXTRACTOR_METAFORMAT_UTF8) || | 1100 | if ((EXTRACTOR_METAFORMAT_UTF8 == format) || |
1131 | (format == EXTRACTOR_METAFORMAT_C_STRING)) | 1101 | (EXTRACTOR_METAFORMAT_C_STRING == format)) |
1132 | { | 1102 | { |
1133 | if ((dlen == 0) || (mdata[left + dlen - 1] != '\0')) | 1103 | if ((0 == dlen) || ('\0' != mdata[left + dlen - 1])) |
1134 | { | 1104 | { |
1135 | GNUNET_break_op (0); | 1105 | GNUNET_break_op (0); |
1136 | break; | 1106 | break; |
@@ -1142,12 +1112,12 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1142 | break; | 1112 | break; |
1143 | } | 1113 | } |
1144 | left -= plen; | 1114 | left -= plen; |
1145 | if ((plen > 0) && (mdata[left + plen - 1] != '\0')) | 1115 | if ((plen > 0) && ('\0' != mdata[left + plen - 1])) |
1146 | { | 1116 | { |
1147 | GNUNET_break_op (0); | 1117 | GNUNET_break_op (0); |
1148 | break; | 1118 | break; |
1149 | } | 1119 | } |
1150 | if (plen == 0) | 1120 | if (0 == plen) |
1151 | plugin_name = NULL; | 1121 | plugin_name = NULL; |
1152 | else | 1122 | else |
1153 | plugin_name = &mdata[left]; | 1123 | plugin_name = &mdata[left]; |
@@ -1158,12 +1128,12 @@ GNUNET_CONTAINER_meta_data_deserialize (const char *input, size_t size) | |||
1158 | break; | 1128 | break; |
1159 | } | 1129 | } |
1160 | left -= mlen; | 1130 | left -= mlen; |
1161 | if ((mlen > 0) && (mdata[left + mlen - 1] != '\0')) | 1131 | if ((mlen > 0) && ('\0' != mdata[left + mlen - 1])) |
1162 | { | 1132 | { |
1163 | GNUNET_break_op (0); | 1133 | GNUNET_break_op (0); |
1164 | break; | 1134 | break; |
1165 | } | 1135 | } |
1166 | if (mlen == 0) | 1136 | if (0 == mlen) |
1167 | mime_type = NULL; | 1137 | mime_type = NULL; |
1168 | else | 1138 | else |
1169 | mime_type = &mdata[left]; | 1139 | mime_type = &mdata[left]; |