diff options
Diffstat (limited to 'src/common/extstr.c')
-rw-r--r-- | src/common/extstr.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/common/extstr.c b/src/common/extstr.c index 9142bd9..ac93f5d 100644 --- a/src/common/extstr.c +++ b/src/common/extstr.c @@ -24,9 +24,12 @@ #include "extstr.h" +#include <ctype.h> #include <malloc.h> #include <regex.h> +#include <stdio.h> #include <string.h> +#include <stdarg.h> @@ -96,6 +99,47 @@ char *strnadd(char *str1, const char *str2, size_t n) /****************************************************************************** * * * Paramètres : str1 = chaîne de caractères à compléter. * +* fmt = description de la forme de la chaîne complémentaire. * +* ... = éléments associés au format à construire. * +* * +* Description : Complète une chaîne de caractères avec une chaîne à formater.* +* * +* Retour : Chaîne de caractères complétée, à libérer de la mémoire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *straddfmt(char *str1, const char *fmt, ...) +{ + char *result; /* Chaîne à renvoyer */ + va_list ap; /* Liste des arguments */ + char *tmp; /* Conservation temporaire */ + int ret; /* Bilan intermédiaire */ + + va_start(ap, fmt); + + ret = vasprintf(&tmp, fmt, ap); + + if (ret != -1) + { + result = stradd(str1, tmp); + free(tmp); + } + + else + result = str1; + + va_end(ap); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : str1 = chaîne de caractères à compléter. * * str2 = chaîne de caractères à ajouter. * * * * Description : Fait précéder une chaîne de caractères par une autre. * @@ -522,3 +566,106 @@ bool _endswith(const char *str, const char *suffix, const char **end) return result; } + + +/****************************************************************************** +* * +* Paramètres : haystack = botte de foin composant l'espace de recherche. * +* haystacklen = taille de cet espace. * +* needle = aiguille visée, cible des recherches. * +* needlelen = taille de l'aiguille à rechercher. * +* * +* Description : Recherche une séquence d'octets dans un ensemble de données. * +* * +* Retour : Adresse de l'éventuelle trouvaille ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const void *memcasemem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) +{ + const void *result; /* Trouvaille à renvoyer */ + const char *_haystack; /* Autre version de la botte */ + const char *_needle; /* Autre version de l'aiguille */ + size_t i; /* Boucle de parcours #1 */ + size_t k; /* Boucle de parcours #2 */ + int c1; /* Caractère de la chaîne #1 */ + int c2; /* Caractère de la chaîne #2 */ + + result = NULL; + + if (needlelen > haystacklen) + goto done; + + _haystack = (const char *)haystack; + _needle = (const char *)needle; + + for (i = 0; i <= (haystacklen - needlelen); i++, _haystack++) + { + for (k = 0; k < needlelen; k++) + { + c1 = toupper(_haystack[k]); + c2 = toupper(_needle[k]); + + if (c1 != c2) + break; + + } + + if (k == needlelen) + { + result = _haystack; + break; + } + + } + + done: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : s1 = première séquence d'octets à consulter. * +* s2 = second séquence d'octets à consulter. * +* n = quantité d'octets à comparer. * +* * +* Description : Compare sans casse deux série d'octets entre elles. * +* * +* Retour : Status de la comparaison des séries d'octets. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int memcasecmp(const void *s1, const void *s2, size_t n) +{ + int result; /* Statut à retourner */ + size_t i; /* Boucle de parcours */ + const char *_s1; /* Séquence avec taille #1 */ + const char *_s2; /* Séquence avec taille #2 */ + int c1; /* Caractère de la chaîne #1 */ + int c2; /* Caractère de la chaîne #2 */ + + result = 0; + + _s1 = (const char *)s1; + _s2 = (const char *)s2; + + for (i = 0; i < n; i++) + { + c1 = toupper(_s1[i]); + c2 = toupper(_s2[i]); + + result = c1 - c2; + if (result != 0) break; + + } + + return result; + +} |