fsctl/src/fugue/logger.c

105 lines
2.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fsctl/fugue/logger.h"
//---
// Public
//---
/* fugue_logger_init() : initialize internal logger buffer at fixed size */
int fugue_logger_init(fugue_logger_t *logger, size_t buffer_size)
{
if (logger == NULL)
return -1;
logger->buffer.data = calloc(buffer_size, sizeof(char));
if (logger->buffer.data == NULL)
return -1;
logger->buffer.size = buffer_size;
logger->buffer.pos = 0;
return 0;
}
/* fugue_logger_quit() : uninit logger internal information */
int fugue_logger_quit(fugue_logger_t *logger)
{
if (logger == NULL)
return -1;
if (logger->buffer.data == NULL)
return -1;
free(logger->buffer.data);
logger->buffer.data = NULL;
logger->buffer.size = 0;
logger->buffer.pos = 0;
return 0;
}
/* fugue_logger_clear() : clear buffer content */
int fugue_logger_clear(fugue_logger_t *logger)
{
if (logger == NULL)
return -1;
memset(logger->buffer.data, 0x00, logger->buffer.size);
logger->buffer.pos = 0;
return 0;
}
/* fugue_logger_getline() : getline-like function */
ssize_t fugue_logger_getline(fugue_logger_t *logger, char **str, size_t *ssz)
{
char *str_end;
if (logger == NULL)
return -1;
if (*str == NULL) {
*str = &logger->buffer.data[0];
} else {
str_end = &((*str)[*ssz]);
if (str_end[0] == '\0') {
*str = NULL;
*ssz = 0;
return -1;
}
if (str_end[0] == '\n') {
*str = &str_end[1];
}
}
str_end = strchrnul(*str, '\n');
*ssz = (ptrdiff_t)(str_end - *str);
return 0;
}
/* fugue_logger_vwrite() : write primitive (va-arg) */
ssize_t fugue_logger_vwrite(fugue_logger_t *logger, char *format, va_list ap)
{
int sz;
if (logger == NULL)
return -1;
if (logger->buffer.pos >= (signed)logger->buffer.size)
return -1;
sz = vsnprintf(
&logger->buffer.data[logger->buffer.pos],
logger->buffer.size - logger->buffer.pos,
format,
ap
);
logger->buffer.pos += sz;
return sz;
}
/* fugue_logger_write() : write primitive (va-arg) */
ssize_t fugue_logger_write(fugue_logger_t *logger, char *format, ...)
{
va_list ap;
ssize_t sz;
if (logger == NULL)
return -1;
va_start(ap, format);
sz = fugue_logger_vwrite(logger, format, ap);
va_end(ap);
return sz;
}