// (IEEE Std 1003.1b-1993) specification
//
// For this specific file, see use of clock_gettime,
-// Refer http://man7.org/linux/man-pages/man2/clock_gettime.2.html
+// Refer to http://pubs.opengroup.org/stage7tc1/functions/clock_gettime.html
+// and to http://man7.org/linux/man-pages/man2/clock_gettime.2.html
#ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199309L
+#define _POSIX_C_SOURCE 200809L
#endif
// Platform check can be extended to check and/or define more, or could be
// clock_gettime() support.
#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#endif
-#ifdef _POSIX_TIMERS
+// if we have unistd.h, we're a Unix system
#include <time.h>
+#include <sys/time.h>
#endif
#include "logger.h"
#ifndef __TIZEN__
static oic_log_ctx_t *logCtx = 0;
+#ifndef __ANDROID__
static oic_log_level LEVEL_XTABLE[] =
{ OIC_LOG_DEBUG, OIC_LOG_INFO, OIC_LOG_WARNING, OIC_LOG_ERROR, OIC_LOG_FATAL };
+#endif
#endif
static android_LogPriority LEVEL[] =
{ ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
#endif
-#elif defined __linux__
+#elif defined (__linux__) || defined (__APPLE__)
static const char *LEVEL[] __attribute__ ((unused)) =
{ "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
#elif defined ARDUINO
void OICLogShutdown()
{
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
if (logCtx && logCtx->destroy)
{
logCtx->destroy(logCtx);
__android_log_write(LEVEL[level], tag, logStr);
#endif
-#elif defined __linux__
+#elif defined __linux__ || defined __APPLE__
if (logCtx && logCtx->write_level)
{
logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
}
else
{
- struct timespec when = {};
int min = 0;
int sec = 0;
int ms = 0;
- if (!clock_gettime(CLOCK_REALTIME_COARSE, &when))
+#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
+ struct timespec when = { 0, 0 };
+ clockid_t clk = CLOCK_REALTIME;
+#ifdef CLOCK_REALTIME_COARSE
+ clk = CLOCK_REALTIME_COARSE;
+#endif
+ if (!clock_gettime(clk, &when))
{
min = (when.tv_sec / 60) % 60;
sec = when.tv_sec % 60;
ms = when.tv_nsec / 1000000;
}
+#else
+ struct timeval now;
+ if (!gettimeofday(&now, NULL))
+ {
+ min = (now.tv_sec / 60) % 60;
+ sec = now.tv_sec % 60;
+ ms = now.tv_usec * 1000;
+ }
+#endif
printf("%02d:%02d.%03d %s: %s: %s\n", min, sec, ms, LEVEL[level], tag, logStr);
}
#endif
{
return;
}
- char buffer[MAX_LOG_V_BUFFER_SIZE];
- memset(buffer, 0, sizeof buffer);
+ char buffer[MAX_LOG_V_BUFFER_SIZE] = {};
va_list args;
va_start(args, format);
vsnprintf(buffer, sizeof buffer - 1, format, args);
return;
}
+ // I've got no idea why static initialization doesn't work here. It seems that the compiler
+ // seems to think that this is a variable-sized object
char lineBuffer[LINE_BUFFER_SIZE];
memset(lineBuffer, 0, sizeof lineBuffer);
int lineIndex = 0;
for (i = 0; i < bufferSize; i++)
{
// Format the buffer data into a line
- sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
+ snprintf(&lineBuffer[lineIndex*3], sizeof(lineBuffer)-lineIndex*3, "%02X ", buffer[i]);
+ lineIndex++;
// Output 16 values per line
if (((i + 1) % 16) == 0)
{
return;
}
- char buffer[LINE_BUFFER_SIZE] = {0};
+ char buffer[LINE_BUFFER_SIZE] = {};
strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
Serial.print(buffer);
uint8_t lineIndex = 0;
for (uint8_t i = 0; i < bufferSize; i++)
{
- // Format the buffer data into a line
- sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
+ // Format the buffer data into a line
+ snprintf(&lineBuffer[lineIndex*3], sizeof(lineBuffer)-lineIndex*3, "%02X ", buffer[i]);
+ lineIndex++;
// Output 16 values per line
if (((i+1)%16) == 0)
{
return;
}
char buffer[LINE_BUFFER_SIZE] = {0};
- strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+ GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
Serial.print(buffer);
char c;
Serial.print(F(": "));
char buffer[LINE_BUFFER_SIZE];
va_list ap;
va_start(ap, format);
- strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+ GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
Serial.print(buffer);
char c;
Serial.print(lineNum);
Serial.print(F(": "));
+#ifdef __AVR__
vsnprintf_P(buffer, sizeof(buffer), format, ap);
+#else
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+#endif
for (char *p = &buffer[0]; *p; p++)
{
// emulate cooked mode for newlines
va_end(ap);
}
-#endif //ARDUINO
-
+#endif //ARDUINO
\ No newline at end of file