rizin/librz/arch/parse_helper.h
2024-03-07 23:50:22 +08:00

84 lines
1.9 KiB
C

// SPDX-FileCopyrightText: 2024 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef PARSE_HELPER_H
#define PARSE_HELPER_H
#include <rz_parse.h>
typedef struct {
const char *mnemonic;
size_t mnemonic_length;
const char *grammar;
} RzPseudoGrammar;
typedef struct {
const char *expected;
const char *pseudo;
} RzPseudoDirect;
typedef struct {
const char *expected;
const char *replace;
int flag; // 0 for first match, 1 for all matches
} RzPseudoReplace;
typedef struct {
const RzPseudoDirect *direct;
size_t direct_length;
const RzPseudoReplace *replace;
size_t replace_length;
const RzPseudoGrammar *lexicon;
size_t lexicon_length;
int max_args;
RzList /*<char *>*/ *(*tokenize)(const char *assembly, size_t length);
} RzPseudoConfig;
#define RZ_PSEUDO_DEFINE_GRAMMAR(x, y) \
{ .mnemonic = x, .mnemonic_length = sizeof(x) - 1, .grammar = y }
#define RZ_PSEUDO_DEFINE_DIRECT(x, y) \
{ .expected = x, .pseudo = y }
#define RZ_PSEUDO_DEFINE_REPLACE(x, y, f) \
{ .expected = x, .replace = y, .flag = f }
#define RZ_PSEUDO_DEFINE_CONFIG(d, l, r, m, t) \
{ \
.direct = d, \
.direct_length = RZ_ARRAY_SIZE(d), \
.replace = r, \
.replace_length = RZ_ARRAY_SIZE(r), \
.lexicon = l, \
.lexicon_length = RZ_ARRAY_SIZE(l), \
.max_args = m, \
.tokenize = t, \
}
#define RZ_PSEUDO_DEFINE_CONFIG_NO_DIRECT(l, r, m, t) \
{ \
.direct = NULL, \
.direct_length = 0, \
.replace = r, \
.replace_length = RZ_ARRAY_SIZE(r), \
.lexicon = l, \
.lexicon_length = RZ_ARRAY_SIZE(l), \
.max_args = m, \
.tokenize = t, \
}
#define RZ_PSEUDO_DEFINE_CONFIG_ONLY_LEXICON(l, m, t) \
{ \
.direct = NULL, \
.direct_length = 0, \
.replace = NULL, \
.replace_length = 0, \
.lexicon = l, \
.lexicon_length = RZ_ARRAY_SIZE(l), \
.max_args = m, \
.tokenize = t, \
}
RZ_IPI bool rz_pseudo_convert(const RzPseudoConfig *config, const char *assembly, RzStrBuf *sb);
#endif /* PARSE_HELPER_H */