summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rwxr-xr-xsrc/common/endianness.c6
-rwxr-xr-xsrc/common/endianness.h11
-rw-r--r--src/common/extstr.c66
-rw-r--r--src/common/extstr.h5
4 files changed, 79 insertions, 9 deletions
diff --git a/src/common/endianness.c b/src/common/endianness.c
index 202262a..17ee252 100755
--- a/src/common/endianness.c
+++ b/src/common/endianness.c
@@ -45,7 +45,7 @@
* *
******************************************************************************/
-bool read_u8(uint8_t *target, const uint8_t *data, off_t *pos, off_t len, SourceEndian endian)
+bool read_u8(uint8_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian)
{
if ((len - *pos) < 1) return false;
@@ -74,7 +74,7 @@ bool read_u8(uint8_t *target, const uint8_t *data, off_t *pos, off_t len, Source
* *
******************************************************************************/
-bool read_u16(uint16_t *target, const uint8_t *data, off_t *pos, off_t len, SourceEndian endian)
+bool read_u16(uint16_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian)
{
if ((len - *pos) < 2) return false;
@@ -127,7 +127,7 @@ bool read_u16(uint16_t *target, const uint8_t *data, off_t *pos, off_t len, Sour
* *
******************************************************************************/
-bool read_u32(uint32_t *target, const uint8_t *data, off_t *pos, off_t len, SourceEndian endian)
+bool read_u32(uint32_t *target, const bin_t *data, off_t *pos, off_t len, SourceEndian endian)
{
if ((len - *pos) < 4) return false;
diff --git a/src/common/endianness.h b/src/common/endianness.h
index 7ae9575..b4c3975 100755
--- a/src/common/endianness.h
+++ b/src/common/endianness.h
@@ -26,10 +26,13 @@
#include <stdbool.h>
-#include <stdint.h>
#include <sys/types.h>
+#include "../arch/archbase.h"
+
+
+
/* Type de boutismes existants */
typedef enum _SourceEndian
{
@@ -41,13 +44,13 @@ typedef enum _SourceEndian
/* Lit un nombre non signé sur un octet. */
-bool read_u8(uint8_t *, const uint8_t *, off_t *, off_t, SourceEndian );
+bool read_u8(uint8_t *, const bin_t *, off_t *, off_t, SourceEndian);
/* Lit un nombre non signé sur deux octets. */
-bool read_u16(uint16_t *, const uint8_t *, off_t *, off_t, SourceEndian);
+bool read_u16(uint16_t *, const bin_t *, off_t *, off_t, SourceEndian);
/* Lit un nombre non signé sur quatre octets. */
-bool read_u32(uint32_t *, const uint8_t *, off_t *, off_t, SourceEndian);
+bool read_u32(uint32_t *, const bin_t *, off_t *, off_t, SourceEndian);
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. *
* *
diff --git a/src/common/extstr.h b/src/common/extstr.h
index 2ce0257..3e27608 100644
--- a/src/common/extstr.h
+++ b/src/common/extstr.h
@@ -35,7 +35,10 @@ char *strprep(char *, const char *);
/* Compare deux chaînes de caractères en partant de la fin. */
int strrcmp(const char *, const char *);
-/* S'assure qu'une chaîne de caractère tient sur une ligne. */
+/* Remplace des éléments d'une chaîne par d'autres. */
+char *strrpl(char *, const char *, const char *);
+
+/* S'assure qu'une chaîne de caractères tient sur une ligne. */
char *escape_crlf(char *);