diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/utils/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/utils/log_c.cpp | 71 |
2 files changed, 72 insertions, 0 deletions
diff --git a/host/lib/utils/CMakeLists.txt b/host/lib/utils/CMakeLists.txt index a053846c6..0b163c35f 100644 --- a/host/lib/utils/CMakeLists.txt +++ b/host/lib/utils/CMakeLists.txt @@ -181,6 +181,7 @@ LIBUHD_APPEND_SOURCES( IF(ENABLE_C_API) LIBUHD_APPEND_SOURCES( + ${CMAKE_CURRENT_SOURCE_DIR}/log_c.cpp ${CMAKE_CURRENT_SOURCE_DIR}/thread_priority_c.cpp ) ENDIF(ENABLE_C_API) diff --git a/host/lib/utils/log_c.cpp b/host/lib/utils/log_c.cpp new file mode 100644 index 000000000..bd74a4ecc --- /dev/null +++ b/host/lib/utils/log_c.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2017 Ettus Research (National Instruments Corp) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <uhd/utils/log.h> +#include <uhd/utils/log.hpp> +#include <stdarg.h> + + +void UHD_API _uhd_log( + const uhd_log_severity_level_t log_level, + const char *filename, + const int lineno, + const char *component, + const char *format, + ... +) { + int size = 0; + char *c_str = NULL; + va_list ap; + + /* figure out size */ + va_start(ap, format); + size = vsnprintf(c_str, size, format, ap); + va_end(ap); + + if (size < 0) { + return; + } + + /* trailing '\0' */ + size++; + c_str = (char *)malloc(size); + if (!c_str) { + return; + } + + va_start(ap, format); + size = vsnprintf(c_str, size, format, ap); + if (size < 0) { + goto out_free; + } + va_end(ap); + + try { + uhd::_log::log( + static_cast<uhd::log::severity_level>(log_level), + filename, + unsigned(lineno), + component, + boost::this_thread::get_id() + ) << c_str; + } catch (...) {} + +out_free: + free(c_str); + return; +} |