diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-05-24 00:38:15 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-05-24 00:38:15 (GMT) |
commit | 5eab5f1bf3665e948e2054817fb688963dc86935 (patch) | |
tree | 0d0547b7fd90cf51992a449bdca0d9f7b38b3174 /plugins/kaitai/expression.h | |
parent | 9f4abb8a20871c64b33f88ad5538bbbe111c1d4c (diff) |
Define a first implementation of Kaitai parsing.
Diffstat (limited to 'plugins/kaitai/expression.h')
-rw-r--r-- | plugins/kaitai/expression.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/plugins/kaitai/expression.h b/plugins/kaitai/expression.h new file mode 100644 index 0000000..06cf9cf --- /dev/null +++ b/plugins/kaitai/expression.h @@ -0,0 +1,134 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * expression.h - déclarations de prototypes utiles aux résolutions d'expressions + * + * Copyright (C) 2022 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _PLUGINS_KAITAI_EXPRESSION_H +#define _PLUGINS_KAITAI_EXPRESSION_H + + +#include <stdbool.h> +#include <sys/types.h> + + +#include <common/szstr.h> + + +#include "array.h" +#include "scope.h" +#include "stream.h" + + + +/* Type de valeur résolue */ +typedef enum _GrammarValueType +{ + GVT_ERROR, /* Erreur remontée */ + GVT_UNSIGNED_INTEGER, /* Valeur entière #1 */ + GVT_SIGNED_INTEGER, /* Valeur entière #2 */ + GVT_FLOAT, /* Valeur fractionnée */ + GVT_BOOLEAN, /* Valeur booléenne */ + GVT_BYTES, /* Série d'octets dynamique */ + GVT_ARRAY, /* Tableau d'éléments divers */ + GVT_RECORD, /* Correspondance en place */ + GVT_STREAM, /* Flux de données */ + +} GrammarValueType; + +/* Informations transportées par une expression */ +typedef struct _resolved_value_t +{ + GrammarValueType type; /* Type de valeur portée */ + + union + { + unsigned long long unsigned_integer;/* Valeur entière #1 */ + signed long long signed_integer; /* Valeur entière #2 */ + double floating_number; /* Valeur à virgule flottante */ + bool status; /* Valeur à deux états */ + sized_string_t bytes; /* Série d'octets */ + + GKaitaiArray *array; /* Tableau d'éléments divers */ + GMatchRecord *record; /* Correspondance désignée */ + GKaitaiStream *stream; /* Flux de données pour Kaitai */ + + }; + +} resolved_value_t; + + +#define COPY_RESOLVED_VALUE(dst, src) \ + do \ + { \ + (dst) = (src); \ + switch ((dst).type) \ + { \ + case GVT_ARRAY: \ + g_object_ref(G_OBJECT((dst).array)); \ + break; \ + case GVT_RECORD: \ + g_object_ref(G_OBJECT((dst).record)); \ + break; \ + case GVT_STREAM: \ + g_object_ref(G_OBJECT((dst).stream)); \ + break; \ + default: \ + break; \ + } \ + } \ + while (0) + + +#define EXIT_RESOLVED_VALUE(v) \ + switch ((v).type) \ + { \ + case GVT_ARRAY: \ + g_clear_object(&(v).array); \ + break; \ + case GVT_RECORD: \ + g_clear_object(&(v).record); \ + break; \ + case GVT_STREAM: \ + g_clear_object(&(v).stream); \ + break; \ + default: \ + break; \ + } + + +/* Interprète une expression en une valeur quelconque. */ +bool resolve_kaitai_expression_as_any(const kaitai_scope_t *, const char *, size_t, resolved_value_t *); + +/* Interprète une expression en valeur ciblée entière. */ +bool resolve_kaitai_expression_as_integer(const kaitai_scope_t *, const char *, size_t, resolved_value_t *); + +/* Interprète une expression en valeur ciblée booléenne. */ +bool resolve_kaitai_expression_as_boolean(const kaitai_scope_t *, const char *, size_t, resolved_value_t *); + +/* Interprète une expression en série d'octets. */ +bool resolve_kaitai_expression_as_bytes(const kaitai_scope_t *, const char *, size_t, resolved_value_t *); + +/* Interprète une expression en flux de données pour Kaitai. */ +bool resolve_kaitai_expression_as_stream(const kaitai_scope_t *, const char *, size_t, GKaitaiStream **); + + + +#endif /* _PLUGINS_KAITAI_EXPRESSION_H */ |