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