/* * Copyright 2019 The libgav1 Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIBGAV1_SRC_UTILS_LOGGING_H_ #define LIBGAV1_SRC_UTILS_LOGGING_H_ #include #include "src/utils/compiler_attributes.h" #if !defined(LIBGAV1_ENABLE_LOGGING) #if defined(NDEBUG) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) #define LIBGAV1_ENABLE_LOGGING 0 #else #define LIBGAV1_ENABLE_LOGGING 1 #endif #endif #if LIBGAV1_ENABLE_LOGGING // LIBGAV1_DLOG(severity, printf-format-string) // Debug logging that can optionally be enabled in release builds by explicitly // setting LIBGAV1_ENABLE_LOGGING. // Severity is given as an all-caps version of enum LogSeverity with the // leading 'k' removed: LIBGAV1_DLOG(INFO, "..."); #define LIBGAV1_DLOG(severity, ...) \ do { \ constexpr const char* libgav1_logging_internal_basename = \ libgav1::internal::Basename(__FILE__, sizeof(__FILE__) - 1); \ libgav1::internal::Log(LIBGAV1_LOGGING_INTERNAL_##severity, \ libgav1_logging_internal_basename, __LINE__, \ __VA_ARGS__); \ } while (0) #else #define LIBGAV1_DLOG(severity, ...) \ do { \ } while (0) #endif // LIBGAV1_ENABLE_LOGGING #define LIBGAV1_LOGGING_INTERNAL_ERROR libgav1::internal::LogSeverity::kError #define LIBGAV1_LOGGING_INTERNAL_WARNING \ libgav1::internal::LogSeverity::kWarning #define LIBGAV1_LOGGING_INTERNAL_INFO libgav1::internal::LogSeverity::kInfo namespace libgav1 { namespace internal { enum class LogSeverity : int { kError, kWarning, kInfo, }; // Helper function to implement LIBGAV1_DLOG // Logs |format, ...| at |severity| level, reporting it as called from // |file|:|line|. void Log(libgav1::internal::LogSeverity severity, const char* file, int line, const char* format, ...) LIBGAV1_PRINTF_ATTRIBUTE(4, 5); // Compile-time function to get the 'base' file_name, that is, the part of // a file_name after the last '/' or '\' path separator. The search starts at // the end of the string; the second parameter is the length of the string. constexpr const char* Basename(const char* file_name, size_t offset) { return (offset == 0 || file_name[offset - 1] == '/' || file_name[offset - 1] == '\\') ? file_name + offset : Basename(file_name, offset - 1); } } // namespace internal } // namespace libgav1 #endif // LIBGAV1_SRC_UTILS_LOGGING_H_