From: Bruno Haible Date: Tue, 24 Sep 2024 10:31:03 +0000 (+0200) Subject: sfl-istream: New module. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=a61bea3aa85dbfd44dd6d5ef1d006f9ccc431af6;p=gnulib.git sfl-istream: New module. * lib/sfl-istream.h: New file. * lib/sfl-istream.c: New file. * modules/sfl-istream: New file. --- diff --git a/ChangeLog b/ChangeLog index 6012c6e7e0..52a498383f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2024-09-24 Bruno Haible + + sfl-istream: New module. + * lib/sfl-istream.h: New file. + * lib/sfl-istream.c: New file. + * modules/sfl-istream: New file. + 2024-09-24 Bruno Haible sf-istream: Add tests. diff --git a/lib/sfl-istream.c b/lib/sfl-istream.c new file mode 100644 index 0000000000..ed6dd16646 --- /dev/null +++ b/lib/sfl-istream.c @@ -0,0 +1,84 @@ +/* A string or file based input stream, that keeps track of a line number. + Copyright (C) 2024 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2024. */ + +#include + +/* Specification. */ +#include "sfl-istream.h" + +void +sfl_istream_init_from_file (sfl_istream_t *stream, FILE *fp) +{ + sf_istream_init_from_file (&stream->istream, fp); + stream->line_number = 1; +} + +void +sfl_istream_init_from_string (sfl_istream_t *stream, const char *input) +{ + sf_istream_init_from_string (&stream->istream, input); + stream->line_number = 1; +} + +void +sfl_istream_init_from_string_desc (sfl_istream_t *stream, string_desc_t input) +{ + sf_istream_init_from_string_desc (&stream->istream, input); + stream->line_number = 1; +} + +void +sfl_set_line_number (sfl_istream_t *stream, size_t line_number) +{ + stream->line_number = line_number; +} + +size_t +sfl_get_line_number (sfl_istream_t *stream) +{ + return stream->line_number; +} + +int +sfl_getc (sfl_istream_t *stream) +{ + int c = sf_getc (&stream->istream); + if (c == '\n') + stream->line_number++; + return c; +} + +int +sfl_ferror (sfl_istream_t *stream) +{ + return sf_ferror (&stream->istream); +} + +void +sfl_ungetc (sfl_istream_t *stream, int c) +{ + if (c == '\n') + stream->line_number--; + sf_ungetc (&stream->istream, c); +} + +void +sfl_free (sfl_istream_t *stream) +{ + sf_free (&stream->istream); +} diff --git a/lib/sfl-istream.h b/lib/sfl-istream.h new file mode 100644 index 0000000000..7b487abbba --- /dev/null +++ b/lib/sfl-istream.h @@ -0,0 +1,79 @@ +/* A string or file based input stream, that keeps track of a line number. + Copyright (C) 2024 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2024. */ + +#ifndef _SFL_ISTREAM_H +#define _SFL_ISTREAM_H + +#include "sf-istream.h" + +/* An input stream type that can read from a file or from a string + and that keeps track of a line number. */ +typedef struct sfl_istream sfl_istream_t; +struct sfl_istream +{ + sf_istream_t istream; + size_t line_number; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Initializes STREAM to read from FP. + FP must be a FILE stream open for reading. */ +extern void sfl_istream_init_from_file (sfl_istream_t *stream, FILE *fp); +/* Initializes STREAM to read from a NUL-terminated string INPUT. + The contents of INPUT must stay available and unchanged as long as STREAM + is in use. */ +extern void sfl_istream_init_from_string (sfl_istream_t *stream, + const char *input); +/* Initializes STREAM to read from a string INPUT. + The contents of INPUT must stay available and unchanged as long as STREAM + is in use. Operations on STREAM will not modify the contents of INPUT. */ +extern void sfl_istream_init_from_string_desc (sfl_istream_t *stream, + string_desc_t input); + +/* Sets the current line number of STREAM. */ +extern void sfl_set_line_number (sfl_istream_t *stream, size_t line_number); + +/* Returns the current line number of STREAM. */ +extern size_t sfl_get_line_number (sfl_istream_t *stream); + +/* Reads a single 'char' from STREAM, and returns it as an 'unsigned char'. + Returns EOF when the end of stream was already reached. */ +extern int sfl_getc (sfl_istream_t *stream); + +/* Tests whether STREAM has encountered an error. + You may want to call this function after sf_getc (stream) has + returned EOF; in other situations it is guaranteed to return 0. */ +extern int sfl_ferror (sfl_istream_t *stream); + +/* Assuming that C was the last value returned by sf_getc (stream), + this call pushes back C onto the stream. + Only 1 character of pushback is guaranteed. */ +extern void sfl_ungetc (sfl_istream_t *stream, int c); + +/* Frees all memory held by STREAM. + This call has no effect on the arguments provided to sfl_istream_init_*. */ +extern void sfl_free (sfl_istream_t *stream); + +#ifdef __cplusplus +} +#endif + +#endif /* _SFL_ISTREAM_H */ diff --git a/modules/sfl-istream b/modules/sfl-istream new file mode 100644 index 0000000000..800f81e5ed --- /dev/null +++ b/modules/sfl-istream @@ -0,0 +1,23 @@ +Description: +A string or file based input stream, that keeps track of a line number. + +Files: +lib/sfl-istream.h +lib/sfl-istream.c + +Depends-on: +sf-istream + +configure.ac: + +Makefile.am: +lib_SOURCES += sfl-istream.c + +Include: +"sfl-istream.h" + +License: +LGPL + +Maintainer: +all