diff options
Diffstat (limited to 'src/common')
-rwxr-xr-x | src/common/endianness.c | 6 | ||||
-rwxr-xr-x | src/common/endianness.h | 11 | ||||
-rw-r--r-- | src/common/extstr.c | 66 | ||||
-rw-r--r-- | src/common/extstr.h | 5 |
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 *); |