summaryrefslogtreecommitdiff
path: root/plugins/dexbnf/simple.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-03-11 21:57:05 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-03-11 21:57:05 (GMT)
commit8088f1cbb4304c686ff41520099707a333084a4e (patch)
tree147411c3f90097dc1ae950ec390df2dfccf07ad7 /plugins/dexbnf/simple.c
parenta33dd28e763e3a8b04145fb549aca9320e100a4b (diff)
Defined a new Dex demangler with MUTF-8 support as plugin.
Diffstat (limited to 'plugins/dexbnf/simple.c')
-rw-r--r--plugins/dexbnf/simple.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/plugins/dexbnf/simple.c b/plugins/dexbnf/simple.c
new file mode 100644
index 0000000..43bd467
--- /dev/null
+++ b/plugins/dexbnf/simple.c
@@ -0,0 +1,163 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * simple.c - décodage de simples chaînes de caractères Dex
+ *
+ * Copyright (C) 2018 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "simple.h"
+
+
+#include <malloc.h>
+#include <string.h>
+
+
+#include <common/utf8.h>
+
+
+
+/* Extrait un simple caractère depuis un codage Dex. */
+static size_t dcd_simple_name_char(input_buffer *);
+
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = tampon contenant les données utiles. *
+* *
+* Description : Extrait une simple chaîne de caractères depuis un codage Dex.*
+* *
+* Retour : Chaîne MUTF-8 terminée par un octet nul ou NULL si erreur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *dcd_simple_name(input_buffer *buffer)
+{
+ char *result; /* Nom extrait à renvoyer */
+ const char *start; /* Conservation du départ */
+ size_t count; /* Taille du nom constitué */
+ size_t extra; /* Taille de nouveau caractère */
+
+ /**
+ * La règle traitée est la suivante :
+ *
+ * SimpleName →
+ * SimpleNameChar (SimpleNameChar)*
+ *
+ */
+
+ start = get_input_buffer_text_access(buffer);
+
+ count = 0;
+
+ do
+ {
+ extra = dcd_simple_name_char(buffer);
+ count += extra;
+ }
+ while (extra > 0);
+
+ if (count == 0)
+ result = NULL;
+
+ else
+ {
+ result = malloc((count + 1) * sizeof(char));
+
+ memcpy(result, start, count);
+ result[count] = '\0';
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = tampon contenant les données utiles. *
+* *
+* Description : Extrait un simple caractère depuis un codage Dex. *
+* *
+* Retour : quantité de données consommées, 0 en cas d'erreur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static size_t dcd_simple_name_char(input_buffer *buffer)
+{
+ size_t result; /* Avancée à retourner */
+ const char *text; /* Accès au texte à relire */
+ size_t remaining; /* Quantité restante */
+ unichar_t wc; /* Caractère étendu lu */
+
+ /**
+ * La règle traitée est la suivante :
+ *
+ * SimpleNameChar →
+ * 'A' … 'Z'
+ * | 'a' … 'z'
+ * | '0' … '9'
+ * | '$'
+ * | '-'
+ * | '_'
+ * | U+00a1 … U+1fff
+ * | U+2010 … U+2027
+ * | U+2030 … U+d7ff
+ * | U+e000 … U+ffef
+ * | U+10000 … U+10ffff
+ *
+ */
+
+ text = get_input_buffer_text_access(buffer);
+ remaining = count_input_buffer_remaining(buffer);
+
+ wc = decode_utf8_char(text, remaining, &result);
+
+ if (IS_UTF8_ERROR(wc))
+ return 0;
+
+ switch (wc)
+ {
+ case 'A' ... 'Z':
+ case 'a' ... 'z':
+ case '0' ... '9':
+ case '$':
+ case '-':
+ case '_':
+ case 0x00a1 ... 0x1fff:
+ case 0x2010 ... 0x2027:
+ case 0x2030 ... 0xd7ff:
+ case 0xe000 ... 0xffef:
+ case 0x10000 ... 0x10ffff:
+ advance_input_buffer(buffer, result);
+ break;
+
+ default:
+ result = 0;
+
+ }
+
+ return result;
+
+}