-/* $Id$ */
-
/* xbt_str.c - various helping functions to deal with strings */
-/* Copyright (C) 2005-2008 The SimGrid Team. */
-/* All rights reserved. */
+/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+ * 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.
- */
+ * 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.
* @param str the string to modify
* @param from char to search
* @param to char to put instead
- * @param amount amount of changes to do (=0 means all)
+ * @param occurence number of changes to do (=0 means all)
*/
void xbt_str_subst(char *str, char from, char to, int occurence)
{
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";
*/
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;
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;
}
}
free(str_to_free);
+ xbt_dynar_shrink(res, 0);
return res;
}
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;
mytest("Empty", "", "");
mytest("Basic test", "toto tutu", "totoXXXtutu");
- mytest("Useless backslashes", "\\t\\o\\t\\o \\t\\u\\t\\u", "totoXXXtutu");
+ mytest("Useless backslashes", "\\t\\o\\t\\o \\t\\u\\t\\u",
+ "totoXXXtutu");
mytest("Protected space", "toto\\ tutu", "toto tutu");
mytest("Several spaces", "toto tutu", "totoXXXtutu");
mytest("LTriming", " toto tatu", "totoXXXtatu");
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;
mytest_str("String with no separator in it", "toto", "##", "toto");
mytest_str("Basic test", "toto##tutu", "##", "totoXXXtutu");
}
-#endif /* SIMGRID_TEST */
+#endif /* SIMGRID_TEST */
/** @brief Join a set of strings as a single string */
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.
return (ssize_t) i;
}
-#endif /* HAVE_GETLINE */
+#endif /* HAVE_GETLINE */
/*
* Diff related functions
*/
static xbt_matrix_t diff_build_LCS(xbt_dynar_t da, xbt_dynar_t db)
{
- xbt_matrix_t C = xbt_matrix_new(xbt_dynar_length(da), xbt_dynar_length(db),
- sizeof(int), NULL);
+ xbt_matrix_t C =
+ xbt_matrix_new(xbt_dynar_length(da), xbt_dynar_length(db),
+ sizeof(int), NULL);
unsigned long i, j;
/* Compute the LCS */
for (j = 1; j < xbt_dynar_length(db); j++) {
if (!strcmp
- (xbt_dynar_get_as(da, i, char *), xbt_dynar_get_as(db, j, char *)))
- *((int *) xbt_matrix_get_ptr(C, i, j)) =
- xbt_matrix_get_as(C, i - 1, j - 1, int) + 1;
+ (xbt_dynar_get_as(da, i, char *),
+ xbt_dynar_get_as(db, j, char *)))
+ *((int *) xbt_matrix_get_ptr(C, i, j)) =
+ xbt_matrix_get_as(C, i - 1, j - 1, int) + 1;
else
*((int *) xbt_matrix_get_ptr(C, i, j)) =
- max(xbt_matrix_get_as(C, i, j - 1, int),
- xbt_matrix_get_as(C, i - 1, j, int));
+ max(xbt_matrix_get_as(C, i, j - 1, int),
+ xbt_matrix_get_as(C, i - 1, j, int));
}
return C;
}
xbt_dynar_push(res, &topush);
} else if (j >= 0 &&
(i <= 0 || j == 0
- || xbt_matrix_get_as(C, i, j - 1, int) >= xbt_matrix_get_as(C,
- i -
- 1,
- j,
- int)))
- {
+ || xbt_matrix_get_as(C, i, j - 1,
+ int) >= xbt_matrix_get_as(C, i - 1, j,
+ int))) {
diff_build_diff(res, C, da, db, i, j - 1);
topush = bprintf("+ %s", xbt_dynar_get_as(db, j, char *));
xbt_dynar_push(res, &topush);
} else if (i >= 0 &&
(j <= 0
|| xbt_matrix_get_as(C, i, j - 1, int) < xbt_matrix_get_as(C,
- i -
- 1, j,
+ i
+ -
+ 1,
+ j,
int)))
{
diff_build_diff(res, C, da, db, i - 1, j);
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,
/** @brief creates a new string containing what can be read on a fd
*
*/
-char* xbt_str_from_file(FILE *file) {
+char *xbt_str_from_file(FILE * file)
+{
xbt_strbuff_t buff = xbt_strbuff_new();
char *res;
char bread[1024];
- memset(bread,0,1024);
+ memset(bread, 0, 1024);
while (!feof(file)) {
- fread(bread, 1, 1023, file);
- bread[1023] = '\0';
- xbt_strbuff_append(buff,bread);
+ int got = fread(bread, 1, 1023, file);
+ bread[got] = '\0';
+ xbt_strbuff_append(buff, bread);
}
res = buff->data;