Path: blob/master/waterbox/libc/functions/stdio/_PDCLIB_flushbuffer.c
2 views
/* _PDCLIB_flushbuffer( struct _PDCLIB_file_t * )12This file is part of the Public Domain C Library (PDCLib).3Permission is granted to use, modify, and / or redistribute at will.4*/56#include <stdio.h>7#include <string.h>89#ifndef REGTEST10#include "_PDCLIB_glue.h"11#include "_PDCLIB_io.h"121314static int flushsubbuffer( FILE * stream, size_t length )15{16size_t justWrote;17size_t written = 0;18int rv = 0;1920#if 021// Very useful for debugging buffering issues22char l = '<', r = '>';23stream->ops->write( stream->handle, &l, 1, &justWrote );24#endif2526while( written != length )27{28size_t toWrite = length - written;2930bool res = stream->ops->write( stream->handle, stream->buffer + written,31toWrite, &justWrote);32written += justWrote;33stream->pos.offset += justWrote;3435if (!res)36{37stream->status |= _PDCLIB_ERRORFLAG;38rv = EOF;39break;40}41}4243#if 044stream->ops->write( stream->handle, &r, 1, &justWrote );45#endif4647stream->bufidx -= written;48#ifdef _PDCLIB_NEED_EOL_TRANSLATION49stream->bufnlexp -= written;50#endif51memmove( stream->buffer, stream->buffer + written, stream->bufidx );5253return rv;54}5556int _PDCLIB_flushbuffer( FILE * stream )57{58#ifdef _PDCLIB_NEED_EOL_TRANSLATION59// if a text stream, and this platform needs EOL translation, well...60if ( ! ( stream->status & _PDCLIB_FBIN ) )61{62// Special case: buffer is full and we start with a \n63if ( stream->bufnlexp == 064&& stream->bufidx == stream->bufend65&& stream->buffer[0] == '\n' )66{67char cr = '\r';68size_t written = 0;69bool res = stream->ops->write( stream->handle, &cr, 1, &written );7071if (!res) {72stream->status |= _PDCLIB_ERRORFLAG;73return EOF;74}7576}7778for ( ; stream->bufnlexp < stream->bufidx; stream->bufnlexp++ )79{80if (stream->buffer[stream->bufnlexp] == '\n' ) {81if ( stream->bufidx == stream->bufend ) {82// buffer is full. Need to print out everything up till now83if( flushsubbuffer( stream, stream->bufnlexp - 1 ) )84{85return EOF;86}87}8889// we have spare space in buffer. Shift everything 1char and90// insert \r91memmove( &stream->buffer[stream->bufnlexp + 1],92&stream->buffer[stream->bufnlexp],93stream->bufidx - stream->bufnlexp );94stream->buffer[stream->bufnlexp] = '\r';9596stream->bufnlexp++;97stream->bufidx++;98}99}100}101#endif102return flushsubbuffer( stream, stream->bufidx );103}104105#endif106107108#ifdef TEST109#include "_PDCLIB_test.h"110111int main( void )112{113/* Testing covered by ftell.c */114return TEST_RESULTS;115}116117#endif118119120121