X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/72a105702165975d1702e64af7d28b60eb311672..0218d1ba16d5c3952c3dbd273f9aa6a2f0d60e28:/tools/tesh2/src/str_replace.c diff --git a/tools/tesh2/src/str_replace.c b/tools/tesh2/src/str_replace.c index 5c868333b9..df147e456e 100644 --- a/tools/tesh2/src/str_replace.c +++ b/tools/tesh2/src/str_replace.c @@ -6,62 +6,103 @@ #include int -str_replace(char** str, const char* what, const char* with) +str_replace(char** str, const char* what, const char* with, const char* delimiters) { - size_t pos, i; - char* begin; + size_t pos, i, len; + char* begin = NULL; char* buf; - - if(!(begin = strstr(*str, what))) + int size; + + if(!*str || !what) + { + errno = EINVAL; + return -1; + } + + if(delimiters) + { + char* delimited; + + if(!(delimited = (char*) calloc((strlen(what) + 2) , sizeof(char)))) + return -1; + + len = strlen(delimiters); + + for(i = 0; i < len; i++) + { + memset(delimited, 0, (strlen(what) + 2)); + + sprintf(delimited,"%s%c", what, delimiters[i]); + + if((begin = strstr(*str, delimited))) + break; + } + + free(delimited); + } + else + begin = strstr(*str, what); + + + if(!begin && (size = (int)strlen(*str) - (int)strlen(what)) >= 0 && !strcmp(*str + size, what)) + begin = strstr(*str, what); + + if(!begin) { errno = ESRCH; return -1; } - + pos = begin - *str; - + i = 0; - + pos += strlen(what); - + if(begin == *str) { - if(!(buf = (char*) calloc(strlen(with) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) + if(!(buf = (char*) calloc((with ? strlen(with) : 0) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) return -1; - - strcpy(buf, with); - + + if(with) + strcpy(buf, with); + if(pos < strlen(*str)) - strcpy(buf + strlen(with), *str + pos); + strcpy(buf + (with ? strlen(with) : 0), *str + pos); } else { - if(!(buf = (char*) calloc((begin - *str) + strlen(with) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) + if(!(buf = (char*) calloc((begin - *str) + (with ? strlen(with) : 0) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) return -1; - + strncpy(buf, *str, (begin - *str)); - strcpy(buf + (begin - *str) , with); - + + if(with) + strcpy(buf + (begin - *str) , with); if(pos < strlen(*str)) - strcpy(buf + (begin - *str) + strlen(with), *str + pos); - } - - free(*str);; + strcpy(buf + (begin - *str) + (with ? strlen(with) : 0), *str + pos); + } + + free(*str); + *str = buf; - + return 0; - -} + +} int -str_replace_all(char** str, const char* what, const char* with) +str_replace_all(char** str, const char* what, const char* with, const char* delimiters) { int rv; - - while(!(rv = str_replace(str, what, with))); - + + while(!(rv = str_replace(str, what, with, delimiters))); + return (errno == ESRCH) ? 0 : -1; } + + +