X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b721afb0365afc75d8f9bb14ab9697411bae931e..1c622be53c551a86b0fbf5ce8f2ee2d776f421b2:/tools/tesh2/src/str_replace.c diff --git a/tools/tesh2/src/str_replace.c b/tools/tesh2/src/str_replace.c index 5c868333b9..e53c505c06 100644 --- a/tools/tesh2/src/str_replace.c +++ b/tools/tesh2/src/str_replace.c @@ -5,7 +5,7 @@ #include -int +/*int str_replace(char** str, const char* what, const char* with) { size_t pos, i; @@ -53,8 +53,187 @@ str_replace(char** str, const char* what, const char* with) return 0; } +*/ + +/* last version int +str_replace(char** str, const char* what, const char* with, const char* delimiters) +{ + size_t pos, i, len; + char* begin; + char* buf; + char* delimited; + int size; + + if(!*str || !what || !with || !delimiters) + { + errno = EINVAL; + return -1; + } + + + 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); + + + 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)))) + return -1; + + strcpy(buf, with); + + if(pos < strlen(*str)) + strcpy(buf + strlen(with), *str + pos); + } + else + { + if(!(buf = (char*) calloc((begin - *str) + strlen(with) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) + return -1; + + strncpy(buf, *str, (begin - *str)); + strcpy(buf + (begin - *str) , with); + + if(pos < strlen(*str)) + strcpy(buf + (begin - *str) + strlen(with), *str + pos); + } + + free(*str);; + *str = buf; + + return 0; + +}*/ int +str_replace(char** str, const char* what, const char* with, const char* delimiters) +{ + size_t pos, i, len; + char* begin; + char* buf; + 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((with ? strlen(with) : 0) + ((pos < strlen(*str)) ? strlen(*str + pos) : 0) + 1, sizeof(char)))) + return -1; + + if(with) + strcpy(buf, with); + + if(pos < strlen(*str)) + strcpy(buf + (with ? strlen(with) : 0), *str + pos); + } + else + { + 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)); + + if(with) + strcpy(buf + (begin - *str) , with); + + if(pos < strlen(*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, const char* delimiters) +{ + int rv; + + while(!(rv = str_replace(str, what, with, delimiters))); + + return (errno == ESRCH) ? 0 : -1; +} + + +/*int str_replace_all(char** str, const char* what, const char* with) { int rv; @@ -62,6 +241,7 @@ str_replace_all(char** str, const char* what, const char* with) while(!(rv = str_replace(str, what, with))); return (errno == ESRCH) ? 0 : -1; -} +}*/ +