diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
commit | 96cb6971ee3ca529958b8cb1e8e55a6eb4e60eae (patch) | |
tree | 68e49f325de3e93ef186d3e078da8ddc473aedf7 /src/common/extstr.c | |
parent | 80dc0ac97987ad9246bee7c47458a015339453bf (diff) |
Reorganized the way the program is built again and added partial support for the JVM.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@63 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/common/extstr.c')
-rw-r--r-- | src/common/extstr.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/common/extstr.c b/src/common/extstr.c index 5187567..5b2dfd8 100644 --- a/src/common/extstr.c +++ b/src/common/extstr.c @@ -120,9 +120,73 @@ int strrcmp(const char *str1, const char *str2) /****************************************************************************** * * +* Paramètres : haystack = botte de foin à fouiller. * +* needle1 = aiguille à trouver et remplacer. * +* needle2 = aiguille de remplacement. * +* * +* Description : Remplace des éléments d'une chaîne par d'autres. * +* * +* Retour : Adresse de la chaîne de caractères modifiée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *strrpl(char *haystack, const char *needle1, const char *needle2) +{ + size_t inlen; /* Taille en entrée */ + size_t len1; /* Taille de l'aiguille n°1 */ + size_t len2; /* Taille de l'aiguille n°2 */ + regex_t preg; /* Expression régulière */ + int ret; /* Bilan de l'appel */ + size_t curpos; /* Point de recherche */ + regmatch_t pmatch; /* Résultats remontés */ + + inlen = strlen(haystack) + 1; + len1 = strlen(needle1); + len2 = strlen(needle2); + + ret = regcomp(&preg, needle1, REG_EXTENDED | REG_ICASE); + /* TODO: ret */ + + for (curpos = 0; regexec(&preg, &haystack[curpos], 1, &pmatch, 0) != REG_NOMATCH; ) + { + if (len1 != len2) + { + if (len2 > len1) + inlen += len2 - len1; + + else + inlen -= len1 - len2; + + haystack = (char *)realloc(haystack, inlen * sizeof(char *)); + + if (len2 > len1) + memmove(&haystack[curpos + pmatch.rm_eo + len2 - len1], &haystack[curpos + pmatch.rm_eo], + inlen - (len2 - len1) - curpos - pmatch.rm_eo); + + else + memmove(&haystack[curpos + pmatch.rm_eo + len1 - len2], &haystack[curpos + pmatch.rm_eo], + inlen - (len1 - len2) - curpos - pmatch.rm_eo); + + } + + memcpy(&haystack[curpos + pmatch.rm_so], needle2, len2); + + curpos += pmatch.rm_eo + len2; + + } + + return haystack; + +} + + +/****************************************************************************** +* * * Paramètres : input = chaîne de caractères à traiter. * * * -* Description : S'assure qu'une chaîne de caractère tient sur une ligne. * +* Description : S'assure qu'une chaîne de caractères tient sur une ligne. * * * * Retour : Adresse de la chaîne de caractères modifiée. * * * |