blob: 05e1df8848776ef297e8b7ac37486c0aab89a3b3 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
parcel Lucy;
/** The Debug module provides multiple levels of debugging verbosity. Code for
* debug statements is only compiled "#ifdef LUCY_DEBUG" at compile-time.
* Some statements will then always print; additional output can be enabled
* using the environment variable LUCY_DEBUG. Examples:
*
* LUCY_DEBUG=file.C -> all debug statements in path/file.C
* LUCY_DEBUG=func -> all in functions named exactly 'func'
* LUCY_DEBUG=f* -> all in functions (or files) starting with 'f'
* LUCY_DEBUG=file* -> all in files (or functions) ending with file*'
* LUCY_DEBUG=func1,func2 -> either in func1 or in func2
* LUCY_DEBUG=* -> just print all debug statements
*
* The wildcard character '*' can only go at the end of an identifier.
*/
inert class Lucy::Util::Debug {
/** Private function, used only by the DEBUG macros.
*/
inert void
print_mess(const char *file, int line, const char *func,
const char *pat, ...);
/** Private function, used only by the DEBUG macros.
*/
inert int
debug_should_print(const char *path, const char *func);
/** Force override in cached value of LUCY_DEBUG environment variable.
*/
inert void
set_env_cache(char *override);
/* Under LUCY_DEBUG, track the number of objects allocated, the number
* freed, and the number of global objects. If, after all non-global
* objects should have been cleaned up, these numbers don't balance out,
* there's a memory leak somewhere.
*/
inert int32_t num_allocated;
inert int32_t num_freed;
inert int32_t num_globals;
}
__C__
#ifdef LUCY_DEBUG
#undef LUCY_DEBUG // undef prior to redefining the command line argument
#define LUCY_DEBUG_ENABLED 1
#include <stdio.h>
#include <stdlib.h>
/** Unconditionally print debug statement prepending file and line info.
*/
#define LUCY_DEBUG_PRINT(args...) \
lucy_Debug_print_mess(__FILE__, __LINE__, __func__, ##args)
/** Conditionally execute code if debugging enabled via LUCY_DEBUG environment
* variable.
*/
#define LUCY_DEBUG_DO(actions) \
do { \
static int initialized = 0; \
static int do_it = 0; \
if (!initialized) { \
initialized = 1; \
do_it = lucy_Debug_debug_should_print(__FILE__, __func__); \
} \
if (do_it) { actions; } \
} while (0)
/** Execute code so long as LUCY_DEBUG was defined during compilation.
*/
#define LUCY_IFDEF_DEBUG(actions) do { actions; } while (0)
/** Conditionally print debug statement depending on LUCY_DEBUG env variable.
*/
#define LUCY_DEBUG(args...) \
LUCY_DEBUG_DO(LUCY_DEBUG_PRINT(args));
/** Abort on error if test fails.
*
* Note: unlike the system assert(), this ASSERT() is #ifdef LUCY_DEBUG.
*/
#define LUCY_ASSERT(test , args...) \
do { \
if (!(test)) { \
LUCY_DEBUG_PRINT("ASSERT FAILED (" #test ")\n" args); \
abort(); \
} \
} while (0)
#elif defined(CHY_HAS_GNUC_VARIADIC_MACROS) // not LUCY_DEBUG
#undef LUCY_DEBUG
#define LUCY_DEBUG_ENABLED 0
#define LUCY_DEBUG_DO(actions)
#define LUCY_IFDEF_DEBUG(actions)
#define LUCY_DEBUG_PRINT(args...)
#define LUCY_DEBUG(args...)
#define LUCY_ASSERT(test, args...)
#else // also not LUCY_DEBUG
#undef LUCY_DEBUG
#define LUCY_DEBUG_ENABLED 0
#define LUCY_DEBUG_DO(actions)
#define LUCY_IFDEF_DEBUG(actions)
static void LUCY_DEBUG_PRINT(char *_ignore_me, ...) { }
static void LUCY_DEBUG(char *_ignore_me, ...) { }
static void LUCY_ASSERT(int _ignore_me, ...) { }
#endif // LUCY_DEBUG
#ifdef LUCY_USE_SHORT_NAMES
#define DEBUG_ENABLED LUCY_DEBUG_ENABLED
#define DEBUG_PRINT LUCY_DEBUG_PRINT
#define DEBUG_DO LUCY_DEBUG_DO
#define IFDEF_DEBUG LUCY_IFDEF_DEBUG
#define DEBUG LUCY_DEBUG
#define ASSERT LUCY_ASSERT
#endif
__END_C__