diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4svbuf.ctr |
Initial commit
Diffstat (limited to 'support/dktools/dk4svbuf.ctr')
-rw-r--r-- | support/dktools/dk4svbuf.ctr | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/support/dktools/dk4svbuf.ctr b/support/dktools/dk4svbuf.ctr new file mode 100644 index 0000000000..4bba80db63 --- /dev/null +++ b/support/dktools/dk4svbuf.ctr @@ -0,0 +1,127 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2016-xxxx +license = bsd + +%% header + +/** @file dk4svbuf.h File buffering. +*/ + +#ifndef DK4CONF_H_INCLUDED +#include "dk4conf.h" +#endif + +#ifndef STDIO_H_INCLUDED +#include <stdio.h> +#define STDIO_H_INCLUDED 1 +#endif + +#ifndef DK4ERROR_H_INCLUDED +#include "dk4error.h" +#endif + +/** How to buffer a file. +*/ +typedef enum { + DK4_FILE_NO_BUFFERING = 0 , /**< Do not use buffers. */ + DK4_FILE_LINE_BUFFERING , /**< Buffer lines. */ + DK4_FILE_FULL_BUFFERING /**< Full buffering. */ +} dk4_file_buffering_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/** Set up buffering for a file. + @param fipo File to modify. + @param tp Buffering type. + @param pbuf Start address of buffer to use, may be NULL. + @param szbuf Size of buffer, may be 0. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. +*/ +int +dk4setvbuf( + FILE *fipo, + dk4_file_buffering_t tp, + char *pbuf, + size_t szbuf, + dk4_er_t *erp +); + +#ifdef __cplusplus +} +#endif + +/* vim: set ai sw=4 ts=4 : */ +%% module + + +#include "dk4svbuf.h" + + +$!trace-include + + + +/** Buffering type constants. +*/ +static int buffering_types[] = { + _IONBF, _IOLBF, _IOFBF +}; + + +int +dk4setvbuf( + FILE *fipo, + dk4_file_buffering_t tp, + char *pbuf, + size_t szbuf, + dk4_er_t *erp +) +{ + int back = 0; +#if DK4_HAVE_SETVBUF + int svbres = 0; +#endif + int btp; + + if (NULL != fipo) { + btp = ( + ((0 <= (int)tp) && (3 > (int)tp)) + ? (buffering_types[(int)tp]) + : (buffering_types[2]) + ); +#if DK4_HAVE_SETVBUF + svbres = setvbuf( + fipo, + ((0 < szbuf) ? (pbuf) : (NULL)), + (((NULL != pbuf) && (0 < szbuf)) ? (btp) : (buffering_types[0])), + szbuf + ); + if (0 == svbres) { + back = 1; + } + else { + dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); + } +#else +#if DK4_HAVE_SETBUFFER + setbuffer(fipo, pbuf, szbuf); + back = 1; +#else + back = 1; + dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); +#endif +#endif + } + else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + return back; +} + +/* vim: set ai sw=4 ts=4 : */ + |