Merge commit '4c9ef85223ec6e638976eb279b82b9e9ea676b35'

reverse-scroll
nirenjan 2021-08-25 14:22:04 -07:00
commit 52d6920352
6 changed files with 49 additions and 31 deletions

View File

@ -35,3 +35,7 @@ test-driver
# Build directory
/build/
# Test and benchmark programs
test_*
bench_*

View File

@ -125,11 +125,3 @@ definitions.
Pinelog is intended to be integrated into your application source tree, either
by means of including the sources directly, or by including the repository as
a Git submodule or subtree.
The default build of Pinelog uses an autotools generated `config.h` file, which
includes checks for the following GCC attributes. If you don't care about these,
then either create a dummy config.h which includes the macros
`HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR`, `HAVE_FUNC_ATTRIBUTE_DESTRUCTOR` and
`HAVE_FUNC_ATTRIBUTE_FORMAT`, or use the `AX_GCC_FUNC_ATTRIBUTE` macro to check
for the `constructor`, `destructor` and `format` attributes in your
application's `configure.ac` file.

View File

@ -16,14 +16,8 @@ LT_INIT
PKG_PROG_PKG_CONFIG
PKG_INSTALLDIR
AX_COMPILER_FLAGS
AX_GCC_FUNC_ATTRIBUTE([constructor])
AX_GCC_FUNC_ATTRIBUTE([destructor])
AX_GCC_FUNC_ATTRIBUTE([format])
AC_SUBST([PINELOG_CFLAGS])
# Configuration headers
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

View File

@ -6,7 +6,6 @@
* SPDX-License-Identifier: MIT
*/
#include "config.h"
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
@ -78,8 +77,10 @@ static FILE *output_stream = NULL;
static int log_level = PINELOG_DEFAULT_LEVEL;
/* Initialize defaults */
#if HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
__attribute__((constructor))
#if defined __has_attribute
# if __has_attribute(constructor)
__attribute__((constructor))
# endif
#endif
void pinelog_set_defaults(void)
{
@ -87,8 +88,10 @@ void pinelog_set_defaults(void)
log_level = PINELOG_DEFAULT_LEVEL;
}
#if HAVE_FUNC_ATTRIBUTE_DESTRUCTOR
__attribute__((destructor))
#if defined __has_attribute
# if __has_attribute(destructor)
__attribute__((destructor))
# endif
#endif
void pinelog_close_output_stream(void)
{
@ -167,7 +170,8 @@ void pinelog_log_message(int level, const char *file, int line, const char *fmt,
level = PINELOG_LVL_TRACE;
}
#if !HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
#if defined __has_attribute
#if !__has_attribute(constructor)
/*
* Validate and set output stream. Only necessary if the compiler doesn't
* support the constructor attribute
@ -176,6 +180,7 @@ void pinelog_log_message(int level, const char *file, int line, const char *fmt,
output_stream = PINELOG_DEFAULT_STREAM;
}
#endif
#endif
#if PINELOG_SHOW_DATE
do {

View File

@ -18,7 +18,6 @@
#ifndef LOGGING_H
#define LOGGING_H
#include "config.h"
#include <stdio.h>
#ifndef PINELOG_TEST
#include <stdlib.h>
@ -123,10 +122,11 @@ int pinelog_get_level(void);
*
* @returns None
*/
#if HAVE_FUNC_ATTRIBUTE_FORMAT
__attribute__((format(printf, 4, 5)))
#if defined __has_attribute
# if __has_attribute(format)
__attribute__((format(printf, 4, 5)))
# endif
#endif
void pinelog_log_message(int level, const char *file, int line, const char *fmt, ...);
// Test harness will redefine pinelog_exit
@ -134,34 +134,44 @@ void pinelog_log_message(int level, const char *file, int line, const char *fmt,
#define pinelog_exit exit
#endif
// Base filename
#if defined __has_builtin
# if __has_builtin(__builtin_strrchr)
# define PINELOG_FILE __builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__
# endif
#endif
#ifndef PINELOG_FILE
# define PINELOG_FILE __FILE__
#endif
#define PINELOG_FATAL(fmt, ...) do { \
if (PINELOG_LVL_FATAL <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_FATAL, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
pinelog_exit(1); \
} while (0)
#define PINELOG_ERROR(fmt, ...) do { \
if (PINELOG_LVL_ERROR <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_ERROR, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
} while (0)
#define PINELOG_WARN(fmt, ...) do { \
if (PINELOG_LVL_WARNING <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_WARNING, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_WARNING, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
} while(0)
#define PINELOG_INFO(fmt, ...) do { \
if (PINELOG_LVL_INFO <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_INFO, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
} while(0)
#define PINELOG_DEBUG(fmt, ...) do { \
if (PINELOG_LVL_DEBUG <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_DEBUG, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
} while(0)
@ -169,7 +179,7 @@ void pinelog_log_message(int level, const char *file, int line, const char *fmt,
#ifndef PINELOG_DISABLE_TRACE
#define PINELOG_TRACE(fmt, ...) do { \
if (PINELOG_LVL_TRACE <= pinelog_get_level()) { \
pinelog_log_message(PINELOG_LVL_TRACE, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
pinelog_log_message(PINELOG_LVL_TRACE, PINELOG_FILE, __LINE__, fmt, ##__VA_ARGS__); \
} \
} while(0)
#else

View File

@ -98,9 +98,22 @@ static int test_setup(int level, int filter, const char *file, int line)
}
if (PINELOG_SHOW_BACKTRACE) {
char * basename = NULL;
#if defined __has_builtin
#if __has_builtin(__builtin_strrchr)
basename = strrchr(file, '/');
#endif
#endif
if (basename != NULL) {
basename++;
} else {
// Override the const
basename = (char *)file;
}
expected_len += snprintf(&expected_output[expected_len],
sizeof(expected_output) - expected_len,
"%s:%d ", file, line);
"%s:%d ", basename, line);
}
return 1;