105 lines
2.4 KiB
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;
|
||
|
}
|