diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
commit | 4c10dfa2a95cea6fc704d68066d0c284cfd79342 (patch) | |
tree | 5827bbc411459800747e21929daecdf99fde7dfd /src/analysis/scan/exprs/literal.c | |
parent | 3f996be1e5858b54740bf92515795982a16b169a (diff) |
Rewrite core parts of the ROST API.
Diffstat (limited to 'src/analysis/scan/exprs/literal.c')
-rw-r--r-- | src/analysis/scan/exprs/literal.c | 113 |
1 files changed, 47 insertions, 66 deletions
diff --git a/src/analysis/scan/exprs/literal.c b/src/analysis/scan/exprs/literal.c index f40747d..119b871 100644 --- a/src/analysis/scan/exprs/literal.c +++ b/src/analysis/scan/exprs/literal.c @@ -57,10 +57,10 @@ static void g_literal_expression_finalize(GLiteralExpression *); static bool g_literal_expression_compare_rich(const GLiteralExpression *, const GLiteralExpression *, RichCmpOperation, bool *); /* Reproduit une expression en place dans une nouvelle instance. */ -static GScanExpression *g_literal_expression_duplicate(const GLiteralExpression *); +static void g_literal_expression_copy(GLiteralExpression *, const GLiteralExpression *); /* Réduit une expression à une forme plus simple. */ -GScanExpression *g_literal_expression_reduce(GLiteralExpression *, GScanContext *, bool); +static bool g_literal_expression_reduce(GLiteralExpression *, GScanContext *, GScanScope *, GScanExpression **); @@ -98,7 +98,7 @@ static void g_literal_expression_class_init(GLiteralExpressionClass *klass) expr = G_SCAN_EXPRESSION_CLASS(klass); expr->cmp_rich = (compare_expr_rich_fc)g_literal_expression_compare_rich; - expr->dup = (dup_expr_fc)g_literal_expression_duplicate; + expr->copy = (copy_expr_fc)g_literal_expression_copy; expr->reduce = (reduce_expr_fc)g_literal_expression_reduce; } @@ -215,7 +215,8 @@ bool g_literal_expression_create(GLiteralExpression *expr, ExprValueType vtype, va_list ap; /* Liste d'arguements */ const bool *boolean; /* Valeur booléenne */ const unsigned long long *integer; /* Valeur entière 64 bits */ - const char *string; /* Chaîne de caractères */ + const sized_string_t *string; /* Chaîne de caractères */ + const char *raw; /* Chaîne de caractères brute */ size_t len; /* Taille de la chaîne */ int cflags; /* Détails de compilation */ unsigned int i; /* Boucle de parcours */ @@ -241,15 +242,15 @@ bool g_literal_expression_create(GLiteralExpression *expr, ExprValueType vtype, break; case EVT_STRING: - string = va_arg(ap, const char *); - expr->value.string = strdup(string); + string = va_arg(ap, const sized_string_t *); + szstrdup(&expr->value.string, string); break; case EVT_REG_EXPR: - string = va_arg(ap, const char *); - len = strlen(string); + raw = va_arg(ap, const char *); + len = strlen(raw); - result = (len > 2 && string[0] == '/'); + result = (len > 2 && raw[0] == '/'); cflags = REG_EXTENDED | REG_NOSUB; @@ -257,38 +258,38 @@ bool g_literal_expression_create(GLiteralExpression *expr, ExprValueType vtype, { result = (len > 2); - if (string[len - 1] == 'i') + if (raw[len - 1] == 'i') { cflags |= REG_ICASE; len -= 1; } - else if (string[len - 1] == 's') + else if (raw[len - 1] == 's') { cflags |= REG_NEWLINE; len -= 1; } - else if (string[len - 1] == '/') + else if (raw[len - 1] == '/') break; } if (result) - result = (string[len - 1] == '/'); + result = (raw[len - 1] == '/'); if (result) { assert(len > 2); - tmp = strndup(&string[1], len - 2); + tmp = strndup(&raw[1], len - 2); ret = regcomp(&expr->value.preg, tmp, cflags); free(tmp); result = (ret == 0); if (result) - expr->value.regex = strdup(string); + expr->value.regex = strdup(raw); } @@ -378,14 +379,14 @@ bool g_literal_expression_get_integer_value(const GLiteralExpression *item, unsi * * ******************************************************************************/ -bool g_literal_expression_get_string_value(const GLiteralExpression *item, const char **value) +bool g_literal_expression_get_string_value(const GLiteralExpression *item, const sized_string_t **value) { bool result; /* Etat à retourner */ result = (item->value_type == EVT_STRING); if (result) - *value = item->value.string; + *value = &item->value.string; return result; @@ -445,10 +446,12 @@ static bool g_literal_expression_compare_rich(const GLiteralExpression *item, co bool result; /* Etat à retourner */ int cmp; /* Bilan intermédiaire */ + result = g_type_is_a(G_TYPE_FROM_INSTANCE(other), G_TYPE_LITERAL_EXPRESSION); + if (!result) goto done; + if (item->value_type != other->value_type) { *status = compare_rich_integer_values(item->value_type, other->value_type, op); - result = true; goto done; } @@ -480,7 +483,7 @@ static bool g_literal_expression_compare_rich(const GLiteralExpression *item, co break; case EVT_STRING: - cmp = strcmp(item->value.string, other->value.string); + cmp = szstrcmp(&item->value.string, &other->value.string); *status = compare_rich_integer_values(cmp, 0, op); result = true; break; @@ -506,51 +509,51 @@ static bool g_literal_expression_compare_rich(const GLiteralExpression *item, co /****************************************************************************** * * -* Paramètres : expr = expression à copier. * +* Paramètres : dest = emplacement d'enregistrement à constituer. [OUT] * +* src = expression source à copier. * * * * Description : Reproduit une expression en place dans une nouvelle instance.* * * -* Retour : Nouvelle instance d'expression. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -static GScanExpression *g_literal_expression_duplicate(const GLiteralExpression *expr) +static void g_literal_expression_copy(GLiteralExpression *dest, const GLiteralExpression *src) { - GScanExpression *result; /* Instance copiée à retourner */ - const void *ptr; /* Pointeur vers des données */ + GScanExpressionClass *class; /* Classe parente à solliciter */ + + class = G_SCAN_EXPRESSION_CLASS(g_literal_expression_parent_class); + + class->copy(G_SCAN_EXPRESSION(dest), G_SCAN_EXPRESSION(src)); - switch (expr->value_type) + dest->value_type = src->value_type; + + switch (src->value_type) { case EVT_BOOLEAN: - ptr = &expr->value.boolean; + dest->value.boolean = src->value.boolean; break; case EVT_INTEGER: - ptr = &expr->value.integer; + dest->value.integer = src->value.integer; break; case EVT_STRING: - ptr = &expr->value.string; + szstrdup(&dest->value.string, &src->value.string); break; case EVT_REG_EXPR: - ptr = &expr->value.regex; + /*ptr = &expr->value.regex*//* FIXME */; break; default: - ptr = NULL; + assert(false); break; } - assert(ptr != NULL); - - result = g_literal_expression_new(expr->value_type, ptr); - - return result; - } @@ -558,47 +561,25 @@ static GScanExpression *g_literal_expression_duplicate(const GLiteralExpression * * * Paramètres : expr = expression à consulter. * * ctx = contexte de suivi de l'analyse courante. * -* force = impose une conversion en booléen si possible. * +* scope = portée courante des variables locales. * +* out = zone d'enregistrement de la réduction opérée. [OUT] * * * * Description : Réduit une expression à une forme plus simple. * * * -* Retour : Réduction correspondante, expression déjà réduite, ou NULL. * +* Retour : Bilan de l'opération : false en cas d'erreur irrécupérable. * * * * Remarques : - * * * ******************************************************************************/ -GScanExpression *g_literal_expression_reduce(GLiteralExpression *expr, GScanContext *ctx, bool force) +static bool g_literal_expression_reduce(GLiteralExpression *expr, GScanContext *ctx, GScanScope *scope, GScanExpression **out) { - GScanExpression *result; /* Instance à renvoyer */ - - if (!force) - result = NULL; - - else - switch (expr->value_type) - { - case EVT_BOOLEAN: - result = NULL; - break; - - case EVT_INTEGER: - result = g_literal_expression_new(EVT_BOOLEAN, (bool []) { expr->value.integer > 0 }); - break; - - case EVT_STRING: - result = g_literal_expression_new(EVT_BOOLEAN, (bool []) { strlen(expr->value.string) > 0 }); - break; - - case EVT_REG_EXPR: - result = g_literal_expression_new(EVT_BOOLEAN, (bool []) { strlen(expr->value.regex) > 0 }); - break; + bool result; /* Bilan à retourner */ - default: - result = NULL; - break; + result = true; - } + *out = G_SCAN_EXPRESSION(expr); + g_object_ref(G_OBJECT(expr)); return result; |