summaryrefslogtreecommitdiff
path: root/src/common/ibuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/ibuf.c')
-rw-r--r--src/common/ibuf.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/common/ibuf.c b/src/common/ibuf.c
new file mode 100644
index 0000000..6eb04e6
--- /dev/null
+++ b/src/common/ibuf.c
@@ -0,0 +1,173 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * ibuf.c - lecture progressive d'un tampon de données
+ *
+ * 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 "ibuf.h"
+
+
+#include <assert.h>
+#include <string.h>
+
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à initialiser. [OUT] *
+* *
+* Description : Initialise un contenu textuel pour une lecture ultérieure. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void init_text_input_buffer(input_buffer *ibuf, const char *text)
+{
+ ibuf->text = text;
+
+ ibuf->len = strlen(text);
+ ibuf->pos = 0;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à consulter. *
+* *
+* Description : Compte le nombre d'octets encore non lus. *
+* *
+* Retour : Nombre d'octets encore disponibles pour un traitement. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t count_input_buffer_remaining(const input_buffer *ibuf)
+{
+ return ibuf->len - ibuf->pos;
+
+}
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à modifier. *
+* count = progression de la tête de lecture à marquer. *
+* *
+* Description : Avance la tête de lecture dans le tampon de données. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void advance_input_buffer(input_buffer *ibuf, size_t count)
+{
+ assert((ibuf->pos + count) <= ibuf->len);
+
+ ibuf->pos += count;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à consulter. *
+* *
+* Description : Fournit un accès brut au niveau de la tête de lecture. *
+* *
+* Retour : Référence au texte brut courant. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *get_input_buffer_text_access(const input_buffer *ibuf)
+{
+ return ibuf->text + ibuf->pos;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à parcourir. *
+* *
+* Description : Fournit et avance la tête de lecture courante. *
+* *
+* Retour : Caractère courant. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char text_input_buffer_next_char(input_buffer *ibuf)
+{
+ assert(ibuf->pos <= ibuf->len);
+
+ return *(ibuf->text + ibuf->pos++);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à consulter. *
+* pos = sauvegarde de la tête de lecture. [OUT] *
+* *
+* Description : Note la position courante de la tête de lecture. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void save_input_buffer_pos(const input_buffer *ibuf, size_t *pos)
+{
+ *pos = ibuf->pos;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ibuf = tampon de données à consulter. *
+* pos = tête de lecture à définir pour le tampon courant. *
+* *
+* Description : Restaure la position de la tête de lecture. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void restore_input_buffer_pos(input_buffer *ibuf, size_t pos)
+{
+ assert(pos <= ibuf->len);
+
+ ibuf->pos = pos;
+
+}