/* 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 Chrysalide. If not, see .
*/
#include "ibuf.h"
#include
#include
/******************************************************************************
* *
* 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 : Fournit la taille totale du tampon constitué. *
* *
* Retour : Valeur positive (ou nulle !). *
* *
* Remarques : - *
* *
******************************************************************************/
size_t get_input_buffer_size(const input_buffer *ibuf)
{
size_t result; /* Quantité à retourner */
result = ibuf->len;
return result;
}
/******************************************************************************
* *
* 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)
{
size_t result; /* Quantité à renvoyer */
assert(ibuf->pos <= (ibuf->len + 1));
if (ibuf->pos > ibuf->len)
result = 0;
else
result = ibuf->len - ibuf->pos;
return result;
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à consulter. *
* *
* Description : Détermine s'il reste encore des données disponibles. *
* *
* Retour : true si des données sont encore présentes, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
bool input_buffer_contain_data(const input_buffer *ibuf)
{
bool result; /* Bilan à retourner */
size_t remaining; /* Quantité restante */
remaining = count_input_buffer_remaining(ibuf);
result = (remaining > 0);
return result;
}
/******************************************************************************
* *
* 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 + 1));
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 à consulter. *
* remaining = taille de la chaîne retournée. [OUT] *
* *
* Description : Fournit la chaîne de caractère restant à traiter. *
* *
* Retour : Pointeur vers les données courantes. *
* *
* Remarques : - *
* *
******************************************************************************/
const char *get_input_buffer_string(const input_buffer *ibuf, size_t *remaining)
{
const char *result; /* Pointeur à retourner */
assert(ibuf->pos <= ibuf->len);
result = ibuf->text + ibuf->pos;
*remaining = ibuf->len - ibuf->pos;
return result;
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à parcourir. *
* *
* Description : Fournit le caractère courant à la tête de lecture courante. *
* *
* Retour : Caractère courant. *
* *
* Remarques : - *
* *
******************************************************************************/
char peek_input_buffer_char(const input_buffer *ibuf)
{
assert(ibuf->pos <= ibuf->len);
return *(ibuf->text + ibuf->pos);
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à parcourir. *
* *
* Description : Fournit le caractère suivant la tête de lecture courante. *
* *
* Retour : Caractère courant. *
* *
* Remarques : - *
* *
******************************************************************************/
char peek_input_buffer_next_char(const input_buffer *ibuf)
{
char result; /* Valeur à retourner */
assert(ibuf->pos <= ibuf->len);
if (ibuf->pos == ibuf->len)
result = '\0';
else
result = *(ibuf->text + ibuf->pos + 1);
return result;
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à parcourir. *
* *
* Description : Fournit et avance la tête de lecture courante. *
* *
* Retour : Caractère courant. *
* *
* Remarques : - *
* *
******************************************************************************/
char get_input_buffer_next_char(input_buffer *ibuf)
{
char result; /* Valeur à retourner */
assert(ibuf->pos <= ibuf->len);
result = *(ibuf->text + ibuf->pos);
advance_input_buffer(ibuf, 1);
return result;
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à parcourir. *
* out = caractère courant, s'il existe. *
* *
* Description : Fournit et avance la tête de lecture courante, si possible. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool get_input_buffer_next_char_carefully(input_buffer *ibuf, char *out)
{
char result; /* Valeur à retourner */
assert(ibuf->pos <= ibuf->len);
result = input_buffer_contain_data(ibuf);
if (result)
{
*out = *(ibuf->text + ibuf->pos);
advance_input_buffer(ibuf, 1);
}
return result;
}
/******************************************************************************
* *
* Paramètres : ibuf = tampon de données à parcourir. *
* c = caractère à retrouver. *
* *
* Description : Vérifie la nature du caractère courant. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool check_input_buffer_char(input_buffer *ibuf, char c)
{
bool result; /* Validation à retourner */
if (peek_input_buffer_char(ibuf) == c)
{
result = true;
advance_input_buffer(ibuf, 1);
}
else
result = false;
return result;
}
/******************************************************************************
* *
* 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;
}