aboutsummaryrefslogtreecommitdiff
path: root/src/util/container_meta_data.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-06-13 18:29:34 +0000
committerChristian Grothoff <christian@grothoff.org>2012-06-13 18:29:34 +0000
commitf23ffa877442969db0592c772b98592af3b1f78a (patch)
treea3b2cbb56a9e6650470deb3cce081e1c09b7b24d /src/util/container_meta_data.c
parent1f5326cd1032cbcc914c7809df1a64994eeebbe9 (diff)
downloadgnunet-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.c286
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 @@
40struct MetaItem 40struct 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
82struct GNUNET_CONTAINER_MetaData 87struct 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 */
125static void 135static void
126meta_item_free (struct MetaItem *item) 136meta_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)
141static void 151static void
142invalidate_sbuf (struct GNUNET_CONTAINER_MetaData *md) 152invalidate_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)
157void 167void
158GNUNET_CONTAINER_meta_data_destroy (struct GNUNET_CONTAINER_MetaData *md) 168GNUNET_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)
179void 189void
180GNUNET_CONTAINER_meta_data_clear (struct GNUNET_CONTAINER_MetaData *md) 190GNUNET_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 */
352static int 355static int
353merge_helper (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type, 356merge_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 */
390int 393int
391GNUNET_CONTAINER_meta_data_delete (struct GNUNET_CONTAINER_MetaData *md, 394GNUNET_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];