/* Copyright (C) 2009 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** 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. */ #include "android/utils/assert.h" #include "android/utils/panic.h" #include typedef struct { const char* file; long lineno; const char* function; } AssertLoc; AssertLoc* _get_assert_loc(void) { /* XXX: Use thread-local storage instead ? */ static AssertLoc loc[1]; return loc; } void _android_assert_loc( const char* fileName, long fileLineno, const char* functionName ) { AssertLoc* loc = _get_assert_loc(); loc->file = fileName; loc->lineno = fileLineno; loc->function = functionName; } static void _android_assert_log_default( const char* fmt, va_list args ) { vfprintf(stderr, fmt, args); } static AAssertLogFunc _assert_log = _android_assert_log_default; void android_assert_fail(const char* messageFmt, ...) { AssertLoc* loc = _get_assert_loc(); va_list args; va_start(args, messageFmt); _assert_log(messageFmt, args); va_end(args); android_panic("ASSERTION FAILURE (%s:%d) in %s\n", loc->file, loc->lineno, loc->function); } void android_assert_registerLog( AAssertLogFunc logger ) { if (logger == NULL) android_panic("Passing NULL to %s\n", __FUNCTION__); _assert_log = logger; }