14c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* Copyright (C) 2009 The Android Open Source Project 24c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** 34c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This software is licensed under the terms of the GNU General Public 44c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** License version 2, as published by the Free Software Foundation, and 54c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** may be copied, distributed, and modified under those terms. 64c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** 74c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This program is distributed in the hope that it will be useful, 84c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** but WITHOUT ANY WARRANTY; without even the implied warranty of 94c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** GNU General Public License for more details. 114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner*/ 124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/assert.h" 134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include "android/utils/panic.h" 144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <stdio.h> 154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnertypedef struct { 174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner const char* file; 184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner long lineno; 194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner const char* function; 204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} AssertLoc; 214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAssertLoc* 234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_get_assert_loc(void) 244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner /* XXX: Use thread-local storage instead ? */ 264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner static AssertLoc loc[1]; 274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return loc; 284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid 314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_android_assert_loc( const char* fileName, 324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner long fileLineno, 334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner const char* functionName ) 344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AssertLoc* loc = _get_assert_loc(); 364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner loc->file = fileName; 384c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner loc->lineno = fileLineno; 394c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner loc->function = functionName; 404c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 414c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 424c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerstatic void 434c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_android_assert_log_default( const char* fmt, va_list args ) 444c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 454c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner vfprintf(stderr, fmt, args); 464c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 474c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerstatic AAssertLogFunc _assert_log = _android_assert_log_default; 494c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 504c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid android_assert_fail(const char* messageFmt, ...) 514c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AssertLoc* loc = _get_assert_loc(); 534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner va_list args; 544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner va_start(args, messageFmt); 564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _assert_log(messageFmt, args); 574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner va_end(args); 584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner android_panic("ASSERTION FAILURE (%s:%d) in %s\n", loc->file, loc->lineno, loc->function); 604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnervoid android_assert_registerLog( AAssertLogFunc logger ) 634c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (logger == NULL) 654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner android_panic("Passing NULL to %s\n", __FUNCTION__); 664c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _assert_log = logger; 684c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 69