os_stream: add printf facility
This commit is contained in:
parent
40eef4c20c
commit
b1fa352db8
|
@ -47,6 +47,7 @@ C_SOURCES = \
|
|||
indices/u_indices_gen.c \
|
||||
indices/u_unfilled_gen.c \
|
||||
os/os_misc.c \
|
||||
os/os_stream.c \
|
||||
os/os_stream_log.c \
|
||||
os/os_stream_stdc.c \
|
||||
os/os_stream_str.c \
|
||||
|
|
|
@ -95,6 +95,7 @@ source = [
|
|||
'indices/u_indices_gen.c',
|
||||
'indices/u_unfilled_gen.c',
|
||||
'os/os_misc.c',
|
||||
'os/os_stream.c',
|
||||
'os/os_stream_log.c',
|
||||
'os/os_stream_stdc.c',
|
||||
'os/os_stream_str.c',
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
#include "pipe/p_config.h"
|
||||
|
||||
#include "os_stream.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_string.h"
|
||||
|
||||
int
|
||||
os_default_stream_vprintf (struct os_stream* stream, const char *format, va_list ap)
|
||||
{
|
||||
char buf[1024];
|
||||
int retval;
|
||||
|
||||
retval = util_vsnprintf(buf, sizeof(buf), format, ap);
|
||||
if(retval <= 0)
|
||||
{}
|
||||
else if(retval < sizeof(buf))
|
||||
stream->write(stream, buf, retval);
|
||||
else
|
||||
{
|
||||
int alloc = sizeof(buf);
|
||||
char* str = NULL;
|
||||
for(;;)
|
||||
{
|
||||
alloc += alloc;
|
||||
if(str)
|
||||
FREE(str);
|
||||
str = MALLOC(alloc);
|
||||
if(!str)
|
||||
return -1;
|
||||
|
||||
retval = util_vsnprintf(str, alloc, format, ap);
|
||||
} while(retval >= alloc);
|
||||
|
||||
if(retval > 0)
|
||||
stream->write(stream, str, retval);
|
||||
FREE(str);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
|
@ -50,6 +50,9 @@ struct os_stream
|
|||
|
||||
void
|
||||
(*flush)(struct os_stream *stream);
|
||||
|
||||
int
|
||||
(*vprintf)(struct os_stream *stream, const char* format, va_list ap);
|
||||
};
|
||||
|
||||
|
||||
|
@ -90,6 +93,27 @@ os_stream_flush(struct os_stream *stream)
|
|||
stream->flush(stream);
|
||||
}
|
||||
|
||||
int
|
||||
os_default_stream_vprintf (struct os_stream* stream, const char *format, va_list ap);
|
||||
|
||||
static INLINE int
|
||||
os_stream_vprintf (struct os_stream* stream, const char *format, va_list ap)
|
||||
{
|
||||
return stream->vprintf(stream, format, ap);
|
||||
}
|
||||
|
||||
static INLINE int
|
||||
os_stream_printf (struct os_stream* stream, const char *format, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list args;
|
||||
|
||||
va_start (args, format);
|
||||
retval = stream->vprintf(stream, format, args);
|
||||
va_end (args);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
struct os_stream *
|
||||
os_file_stream_create(const char *filename);
|
||||
|
@ -118,5 +142,4 @@ os_str_stream_get_and_close(struct os_stream *stream);
|
|||
#define os_file_stream_create(_filename) os_null_stream_create()
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _OS_STREAM_H_ */
|
||||
|
|
|
@ -73,7 +73,8 @@ static struct os_stream
|
|||
os_log_stream_struct = {
|
||||
&os_log_stream_close,
|
||||
&os_log_stream_write,
|
||||
&os_log_stream_flush
|
||||
&os_log_stream_flush,
|
||||
&os_default_stream_vprintf,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -56,12 +56,18 @@ os_null_stream_flush(struct os_stream *stream)
|
|||
(void)stream;
|
||||
}
|
||||
|
||||
static int
|
||||
os_null_stream_vprintf (struct os_stream* stream, const char *format, va_list ap)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct os_stream
|
||||
os_null_stream = {
|
||||
&os_null_stream_close,
|
||||
&os_null_stream_write,
|
||||
&os_null_stream_flush
|
||||
&os_null_stream_flush,
|
||||
&os_null_stream_vprintf
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -83,6 +83,14 @@ os_stdc_stream_flush(struct os_stream *_stream)
|
|||
fflush(stream->file);
|
||||
}
|
||||
|
||||
static int
|
||||
os_stdc_stream_vprintf (struct os_stream* _stream, const char *format, va_list ap)
|
||||
{
|
||||
struct os_stdc_stream *stream = os_stdc_stream(_stream);
|
||||
|
||||
return vfprintf(stream->file, format, ap);
|
||||
}
|
||||
|
||||
|
||||
struct os_stream *
|
||||
os_file_stream_create(const char *filename)
|
||||
|
@ -96,6 +104,7 @@ os_file_stream_create(const char *filename)
|
|||
stream->base.close = &os_stdc_stream_close;
|
||||
stream->base.write = &os_stdc_stream_write;
|
||||
stream->base.flush = &os_stdc_stream_flush;
|
||||
stream->base.vprintf = &os_stdc_stream_vprintf;
|
||||
|
||||
stream->file = fopen(filename, "w");
|
||||
if(!stream->file)
|
||||
|
|
|
@ -118,6 +118,7 @@ os_str_stream_create(size_t size)
|
|||
stream->base.close = &os_str_stream_close;
|
||||
stream->base.write = &os_str_stream_write;
|
||||
stream->base.flush = &os_str_stream_flush;
|
||||
stream->base.vprintf = &os_default_stream_vprintf;
|
||||
|
||||
stream->str = os_malloc(size);
|
||||
if(!stream->str)
|
||||
|
|
Loading…
Reference in New Issue