os_stream: add printf facility

This commit is contained in:
Luca Barbieri 2010-08-20 11:31:24 +02:00
parent 40eef4c20c
commit b1fa352db8
8 changed files with 85 additions and 3 deletions

View File

@ -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 \

View File

@ -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',

View File

@ -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;
}

View File

@ -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_ */

View File

@ -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,
};

View File

@ -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
};

View File

@ -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)

View 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)