summaryrefslogtreecommitdiff
path: root/src/common/extstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/extstr.c')
-rw-r--r--src/common/extstr.c147
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;
+
+}