/* 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 .
*/
#ifndef _PLUGINS_KAITAI_EXPRESSION_H
#define _PLUGINS_KAITAI_EXPRESSION_H
#include
#include
#include
#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 */