#include #include #include #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; }