Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
poor man's try to save some memory in actions. Does not seem very efficient, but...
[simgrid.git] / src / xbt / xbt_str.c
index e43bdc9..b075214 100644 (file)
@@ -9,11 +9,11 @@
  * under the terms of the license (GNU LGPL) which comes with this package.
  */
 
+#include "portable.h"
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
 #include "xbt/str.h"            /* headers of these functions */
 #include "xbt/strbuff.h"
-#include "portable.h"
 #include "xbt/matrix.h"         /* for the diff */
 
 /**  @brief Strip whitespace (or other characters) from the end of a string.
@@ -229,7 +229,7 @@ char *xbt_str_varsubst(char *str, xbt_dict_t patterns)
 
 xbt_dynar_t xbt_str_split(const char *s, const char *sep)
 {
-  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), xbt_free_ref);
+  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
   const char *p, *q;
   int done;
   const char *sep_dflt = " \t\n\r\x0B";
@@ -278,7 +278,7 @@ xbt_dynar_t xbt_str_split(const char *s, const char *sep)
  */
 xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
 {
-  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), xbt_free_ref);
+  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
   int done;
   const char *p, *q;
 
@@ -330,7 +330,7 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
 
 xbt_dynar_t xbt_str_split_quoted(const char *s)
 {
-  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), xbt_free_ref);
+  xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
   char *str_to_free;            /* we have to copy the string before, to handle backslashes */
   char *beg, *end;              /* pointers around the parsed chunk */
   int in_simple_quote = 0, in_double_quote = 0;
@@ -417,6 +417,7 @@ xbt_dynar_t xbt_str_split_quoted(const char *s)
     }
   }
   free(str_to_free);
+  xbt_dynar_shrink(res,0);
   return res;
 }
 
@@ -434,8 +435,7 @@ xbt_dynar_t xbt_str_split_quoted(const char *s)
                    xbt_dynar_free(&d);
 
 XBT_TEST_SUITE("xbt_str", "String Handling");
-XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted,
-              "test the function xbt_str_split_quoted")
+XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted,"test the function xbt_str_split_quoted")
 {
   xbt_dynar_t d;
   char *s;
@@ -467,8 +467,7 @@ XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted,
                    free(s); \
                    xbt_dynar_free(&d);
 
-XBT_TEST_UNIT("xbt_str_split_str", test_split_str,
-              "test the function xbt_str_split_str")
+XBT_TEST_UNIT("xbt_str_split_str", test_split_str,"test the function xbt_str_split_str")
 {
   xbt_dynar_t d;
   char *s;
@@ -510,10 +509,7 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep)
   return res;
 }
 
-#if !defined(HAVE_GETLINE) || defined(DOXYGEN)
-/* prototype here, just in case */
-long getline(char **buf, size_t * n, FILE * stream);
-
+#if defined(SIMGRID_NEED_GETLINE) || defined(DOXYGEN)
 /** @brief Get a single line from the stream (reimplementation of the GNU getline)
  *
  * This is a redefinition of the GNU getline function, used on platforms where it does not exists.
@@ -674,7 +670,7 @@ char *xbt_str_diff(char *a, char *b)
   xbt_dynar_t db = xbt_str_split(b, "\n");
 
   xbt_matrix_t C = diff_build_LCS(da, db);
-  xbt_dynar_t diff = xbt_dynar_new(sizeof(char *), xbt_free_ref);
+  xbt_dynar_t diff = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
   char *res = NULL;
 
   diff_build_diff(diff, C, da, db, xbt_dynar_length(da) - 1,
@@ -711,8 +707,8 @@ char* xbt_str_from_file(FILE *file) {
   memset(bread,0,1024);
 
   while (!feof(file)) {
-    fread(bread, 1, 1023, file);
-    bread[1023] = '\0';
+    int got = fread(bread, 1, 1023, file);
+    bread[got] = '\0';
     xbt_strbuff_append(buff,bread);
   }