Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Wrap potentially NULL strings to protect solaris
[simgrid.git] / testsuite / xbt / dict_usage.c
index ae87f1f..1a9d63f 100644 (file)
@@ -2,15 +2,15 @@
 
 /* dict_usage - A test of normal usage of a dictionnary                     */
 
-/* Copyright (c) 2004 Martin Quinson. All rights reserved.                  */
+/* Copyright (c) 2003,2004 Martin Quinson. All rights reserved.             */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdio.h>
-#include <assert.h>
 
-#include <gras.h>
+#include "gras.h"
+#include "portable.h"
 
 XBT_LOG_EXTERNAL_CATEGORY(dict);
 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"Logging specific to this test");
@@ -23,7 +23,7 @@ static xbt_error_t traverse(xbt_dict_t head);
 
 static void print_str(void *str);
 static void print_str(void *str) {
-  printf("%s",(char*)str);
+  printf("%s",(char*)PRINTF_STR(str));
 }
 
 static void fill(xbt_dict_t *head) {
@@ -46,7 +46,7 @@ static void debuged_add(xbt_dict_t head,const char*key)
 {
   char *data=xbt_strdup(key);
 
-  printf("   - Add %s\n",key);
+  printf("   - Add %s\n",PRINTF_STR(key));
   xbt_dict_set(head,key,data,&free);
   if (XBT_LOG_ISENABLED(dict,xbt_log_priority_debug)) {
     xbt_dict_dump(head,(void (*)(void*))&printf);
@@ -60,7 +60,9 @@ static xbt_error_t search(xbt_dict_t head,const char*key) {
 
   
   errcode=xbt_dict_get(head,key,&data);
-  printf("   - Search %s. Found %s\n",key,data?(char*)data:"(null)");fflush(stdout);
+  printf("   - Search %s. Found %s\n",PRINTF_STR(key),(char*) PRINTF_STR(data));fflush(stdout);
+  if (!data)
+     return errcode;
   if (strcmp((char*)data,key)) 
     return mismatch_error;
   return errcode;
@@ -70,7 +72,7 @@ static xbt_error_t debuged_remove(xbt_dict_t head,const char*key)
 {
   xbt_error_t errcode;
 
-  printf("   Remove '%s'\n",key);fflush(stdout);
+  printf("   Remove '%s'\n",PRINTF_STR(key));fflush(stdout);
   errcode=xbt_dict_remove(head,key);
   /*  xbt_dict_dump(head,(void (*)(void*))&printf); */
   return errcode;
@@ -83,8 +85,8 @@ static xbt_error_t traverse(xbt_dict_t head) {
   char *data;
 
   xbt_dict_foreach(head,cursor,key,data) {
-    printf("   - Seen:  %s->%s\n",key,data);
-    xbt_assert2(!strcmp(key,data),
+    printf("   - Seen:  %s->%s\n",PRINTF_STR(key),PRINTF_STR(data));
+    xbt_assert2(!data || !strcmp(key,data),
                 "Key(%s) != value(%s). Abording\n",key,data);
   }
   return no_error;
@@ -109,6 +111,26 @@ int main(int argc,char **argv) {
   
   fill(&head);
 
+  /* xbt_dict_dump(head,(void (*)(void*))&printf);*/
+  printf(" - Test that it works with NULL data\n");
+  printf("   - Store NULL under 'null'\n");fflush(stdout);
+  xbt_dict_set(head,"null",NULL,NULL);
+  TRYFAIL(search(head,"null"));
+  /* xbt_dict_dump(head,(void (*)(void*))&printf); */
+  printf("   Check whether I see it while traversing\n");fflush(stdout);
+  {
+     xbt_dict_cursor_t cursor=NULL;
+     char *key;
+     int found=0;
+     
+     xbt_dict_foreach(head,cursor,key,data) {
+       printf("   - Seen:  %s->%s\n",PRINTF_STR(key),PRINTF_STR(data));fflush(stdout);
+       if (!strcmp(key,"null"))
+         found = 1;
+     }
+     xbt_assert0(found,"the key 'null', associated to NULL is not found");
+  }
+   
   printf(" - Change some values\n");
   printf("   - Change 123 to 'Changed 123'\n");
   xbt_dict_set(head,"123",strdup("Changed 123"),&free);
@@ -125,7 +147,7 @@ int main(int argc,char **argv) {
 
   printf(" - Retrive values\n");
   TRYFAIL(xbt_dict_get(head,"123",(void**)&data));
-  assert(data);
+  xbt_assert(data);
   TRYFAIL(strcmp("123",data));
 
   TRYEXPECT(xbt_dict_get(head,"Can't be found",(void**)&data),mismatch_error);