diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-04-19 19:25:04 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-04-19 19:25:04 (GMT) |
commit | c177597d6da5dedb32aa176e8370db8ffb7f87aa (patch) | |
tree | 26f7eb2702ba4aa3dfd7267d74fe78ad79791a8c /src/analysis/db/misc | |
parent | 35f37c72e9d81e478395914da6c10b3c546761a7 (diff) |
Handled static strings as well as dynamic strings in comments.
Diffstat (limited to 'src/analysis/db/misc')
-rw-r--r-- | src/analysis/db/misc/rlestr.c | 107 | ||||
-rw-r--r-- | src/analysis/db/misc/rlestr.h | 25 |
2 files changed, 119 insertions, 13 deletions
diff --git a/src/analysis/db/misc/rlestr.c b/src/analysis/db/misc/rlestr.c index 39e2d99..c1d2d95 100644 --- a/src/analysis/db/misc/rlestr.c +++ b/src/analysis/db/misc/rlestr.c @@ -43,12 +43,73 @@ * * ******************************************************************************/ -void init_rle_string(rle_string *str, const char *data) +void init_dynamic_rle_string(rle_string *str, char *data) +{ + if (data != NULL) + { + str->data = data; + str->length = strlen(data); + str->dynamic = true; + } + else + { + str->data = NULL; + str->length = 0; + } + +} + + +/****************************************************************************** +* * +* Paramètres : str = représentation de chaîne à traiter. * +* data = données à conserver en mémoire. * +* * +* Description : Définit une représentation de chaîne de caractères constante.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void init_static_rle_string(rle_string *str, const char *data) +{ + if (data != NULL) + { + str->cst_data = data; + str->length = strlen(data); + str->dynamic = false; + } + else + { + str->data = NULL; + str->length = 0; + } + +} + + +/****************************************************************************** +* * +* Paramètres : str = représentation de chaîne à traiter. * +* data = données à conserver en mémoire. * +* * +* Description : Copie une chaîne de caractères existante. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void dup_into_rle_string(rle_string *str, const char *data) { if (data != NULL) { str->data = strdup(data); str->length = strlen(data); + str->dynamic = true; } else { @@ -72,15 +133,44 @@ void init_rle_string(rle_string *str, const char *data) * * ******************************************************************************/ -void set_rle_string(rle_string *str, const char *data) +void set_dynamic_rle_string(rle_string *str, char *data) { if (str->data != NULL) unset_rle_string(str); if (data != NULL) { - str->data = strdup(data); + str->data = data; + str->length = strlen(data); + str->dynamic = true; + } + +} + + +/****************************************************************************** +* * +* Paramètres : str = représentation de chaîne à traiter. * +* data = données à conserver en mémoire. * +* * +* Description : Constitue une représentation de chaîne de caractères stable. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_static_rle_string(rle_string *str, const char *data) +{ + if (str->data != NULL) + unset_rle_string(str); + + if (data != NULL) + { + str->cst_data = data; str->length = strlen(data); + str->dynamic = false; } } @@ -102,9 +192,10 @@ void unset_rle_string(rle_string *str) { if (str->data != NULL) { - free(str->data); - str->data = NULL; + if (str->dynamic) + free(str->data); + str->data = NULL; str->length = 0; } @@ -184,6 +275,7 @@ bool unpack_rle_string(rle_string *str, packed_buffer *pbuf) if (result && str->length > 0) { str->data = (char *)malloc(str->length + 1); + str->dynamic = true; result = extract_packed_buffer(pbuf, str->data, str->length + 1, false); @@ -323,11 +415,12 @@ bool load_rle_string(rle_string *str, const char *name, const bound_value *value switch (value->type) { case SQLITE_TEXT: - set_rle_string(str, value->cstring); + unset_rle_string(str); + dup_into_rle_string(str, value->cstring); break; case SQLITE_NULL: - set_rle_string(str, NULL); + unset_rle_string(str); break; default: diff --git a/src/analysis/db/misc/rlestr.h b/src/analysis/db/misc/rlestr.h index be76f17..82a7d8c 100644 --- a/src/analysis/db/misc/rlestr.h +++ b/src/analysis/db/misc/rlestr.h @@ -38,18 +38,28 @@ /* Informations de base pour tout élément ajouté */ typedef struct _rle_string { - char *data; /* Chaîne de caractères */ - uint32_t length; /* Taille de la chaîne */ + union + { + char *data; /* Chaîne de caractères */ + const char *cst_data; /* Autre version de chaîne */ + }; + + uint16_t length; /* Taille de la chaîne */ + bool dynamic; /* Type d'allocation utilisée */ } rle_string; /* Définit une représentation de chaîne de caractères. */ -void init_rle_string(rle_string *, const char *); +void init_dynamic_rle_string(rle_string *, char *); + +/* Définit une représentation de chaîne de caractères constante. */ +void init_static_rle_string(rle_string *, const char *); -#define exit_rle_string(rle) /* TODO */ +/* Copie une chaîne de caractères existante. */ +void dup_into_rle_string(rle_string *, const char *); -#define dup_rle_string(dst, src) init_rle_string(dst, (src)->data); +#define exit_rle_string(rle) unset_rle_string(rle) #define get_rle_string(rle) (rle)->data @@ -58,7 +68,10 @@ void init_rle_string(rle_string *, const char *); #define is_rle_string_empty(rle) ((rle)->data == NULL) /* Constitue une représentation de chaîne de caractères. */ -void set_rle_string(rle_string *, const char *); +void set_dynamic_rle_string(rle_string *, char *); + +/* Constitue une représentation de chaîne de caractères stable. */ +void set_static_rle_string(rle_string *, const char *); /* Libère la mémoire associée à la représentation. */ void unset_rle_string(rle_string *); |