1/* Copyright (C) 2009 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12#include "android/utils/assert.h" 13#include "android/utils/panic.h" 14#include <stdio.h> 15 16typedef struct { 17 const char* file; 18 long lineno; 19 const char* function; 20} AssertLoc; 21 22AssertLoc* 23_get_assert_loc(void) 24{ 25 /* XXX: Use thread-local storage instead ? */ 26 static AssertLoc loc[1]; 27 return loc; 28} 29 30void 31_android_assert_loc( const char* fileName, 32 long fileLineno, 33 const char* functionName ) 34{ 35 AssertLoc* loc = _get_assert_loc(); 36 37 loc->file = fileName; 38 loc->lineno = fileLineno; 39 loc->function = functionName; 40} 41 42static void 43_android_assert_log_default( const char* fmt, va_list args ) 44{ 45 vfprintf(stderr, fmt, args); 46} 47 48static AAssertLogFunc _assert_log = _android_assert_log_default; 49 50void android_assert_fail(const char* messageFmt, ...) 51{ 52 AssertLoc* loc = _get_assert_loc(); 53 va_list args; 54 55 va_start(args, messageFmt); 56 _assert_log(messageFmt, args); 57 va_end(args); 58 59 android_panic("ASSERTION FAILURE (%s:%d) in %s\n", loc->file, loc->lineno, loc->function); 60} 61 62void android_assert_registerLog( AAssertLogFunc logger ) 63{ 64 if (logger == NULL) 65 android_panic("Passing NULL to %s\n", __FUNCTION__); 66 67 _assert_log = logger; 68} 69