X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a1242a2bc911c3188adccdc7b719cf8d8fa21f8c..11047b815e4628f874c983e757821ca6445e14ce:/src/xbt/xbt_str.c diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index fc0b7ff4db..6e520bcc43 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -1,19 +1,16 @@ -/* $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. @@ -176,7 +173,7 @@ end: * @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) { @@ -229,7 +226,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 +275,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 +327,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 +414,7 @@ xbt_dynar_t xbt_str_split_quoted(const char *s) } } free(str_to_free); + xbt_dynar_shrink(res, 0); return res; } @@ -434,14 +432,15 @@ 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; 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"); @@ -466,7 +465,7 @@ XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted,"test the function xbt_s 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; @@ -477,7 +476,7 @@ XBT_TEST_UNIT("xbt_str_split_str", test_split_str,"test the function xbt_str_spl 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 */ @@ -508,10 +507,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. @@ -563,15 +559,16 @@ long getline(char **buf, size_t * n, FILE * stream) 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 */ @@ -601,13 +598,14 @@ static xbt_matrix_t diff_build_LCS(xbt_dynar_t da, xbt_dynar_t db) 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; } @@ -638,20 +636,19 @@ static void diff_build_diff(xbt_dynar_t res, 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); @@ -672,7 +669,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, @@ -702,16 +699,17 @@ char *xbt_str_diff(char *a, char *b) /** @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)) { int got = fread(bread, 1, 1023, file); bread[got] = '\0'; - xbt_strbuff_append(buff,bread); + xbt_strbuff_append(buff, bread); } res = buff->data;