Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: c-utility/src/xlogging.c
- Revision:
- 0:f7f1f0d76dd6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c-utility/src/xlogging.c Thu Aug 23 06:52:14 2018 +0000 @@ -0,0 +1,137 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#include "azure_c_shared_utility/xlogging.h" +#include "azure_c_shared_utility/consolelogger.h" + +#ifndef NO_LOGGING + + +#ifdef WINCE +#include <stdarg.h> + +void consolelogger_log(LOG_CATEGORY log_category, const char* file, const char* func, int line, unsigned int options, const char* format, ...) +{ + va_list args; + va_start(args, format); + + time_t t = time(NULL); + + switch (log_category) + { + case AZ_LOG_INFO: + (void)printf("Info: "); + break; + case AZ_LOG_ERROR: + (void)printf("Error: Time:%.24s File:%s Func:%s Line:%d ", ctime(&t), file, func, line); + break; + default: + break; + } + + (void)vprintf(format, args); + va_end(args); + + (void)log_category; + if (options & LOG_LINE) + { + (void)printf("\r\n"); + } +} +#endif + +LOGGER_LOG global_log_function = consolelogger_log; + +void xlogging_set_log_function(LOGGER_LOG log_function) +{ + global_log_function = log_function; +} + +LOGGER_LOG xlogging_get_log_function(void) +{ + return global_log_function; +} + +#if (defined(_MSC_VER)) && (!(defined WINCE)) + +LOGGER_LOG_GETLASTERROR global_log_function_GetLastError = consolelogger_log_with_GetLastError; + +void xlogging_set_log_function_GetLastError(LOGGER_LOG_GETLASTERROR log_function_GetLastError) +{ + global_log_function_GetLastError = log_function_GetLastError; +} + +LOGGER_LOG_GETLASTERROR xlogging_get_log_function_GetLastError(void) +{ + return global_log_function_GetLastError; +} +#endif + +/* Print up to 16 bytes per line. */ +#define LINE_SIZE 16 + +/* Return the printable char for the provided value. */ +#define PRINTABLE(c) ((c >= ' ') && (c <= '~')) ? (char)c : '.' + +/* Convert the lower nibble of the provided byte to a hexadecimal printable char. */ +#define HEX_STR(c) (((c) & 0xF) < 0xA) ? (char)(((c) & 0xF) + '0') : (char)(((c) & 0xF) - 0xA + 'A') + +void LogBinary(const char* comment, const void* data, size_t size) +{ + char charBuf[LINE_SIZE + 1]; + char hexBuf[LINE_SIZE * 3 + 1]; + size_t countbuf = 0; + size_t i = 0; + const unsigned char* bufAsChar = (const unsigned char*)data; + const unsigned char* startPos = bufAsChar; + + LOG(AZ_LOG_TRACE, LOG_LINE, "%s %lu bytes", comment, size); + + /* Print the whole buffer. */ + for (i = 0; i < size; i++) + { + /* Store the printable value of the char in the charBuf to print. */ + charBuf[countbuf] = PRINTABLE(*bufAsChar); + + /* Convert the high nibble to a printable hexadecimal value. */ + hexBuf[countbuf * 3] = HEX_STR(*bufAsChar >> 4); + + /* Convert the low nibble to a printable hexadecimal value. */ + hexBuf[countbuf * 3 + 1] = HEX_STR(*bufAsChar); + + hexBuf[countbuf * 3 + 2] = ' '; + + countbuf++; + bufAsChar++; + /* If the line is full, print it to start another one. */ + if (countbuf == LINE_SIZE) + { + charBuf[countbuf] = '\0'; + hexBuf[countbuf * 3] = '\0'; + LOG(AZ_LOG_TRACE, LOG_LINE, "%p: %s %s", startPos, hexBuf, charBuf); + countbuf = 0; + startPos = bufAsChar; + } + } + + /* If the last line does not fit the line size. */ + if (countbuf > 0) + { + /* Close the charBuf string. */ + charBuf[countbuf] = '\0'; + + /* Fill the hexBuf with spaces to keep the charBuf alignment. */ + while ((countbuf++) < LINE_SIZE - 1) + { + hexBuf[countbuf * 3] = ' '; + hexBuf[countbuf * 3 + 1] = ' '; + hexBuf[countbuf * 3 + 2] = ' '; + } + hexBuf[countbuf * 3] = '\0'; + + /* Print the last line. */ + LOG(AZ_LOG_TRACE, LOG_LINE, "%p: %s %s", startPos, hexBuf, charBuf); + } +} + +#endif