/*------------------------------------------------------------------------- * drawElements Base Portability Library * ------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed 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. * *//*! * \file * \brief Basic portability. *//*--------------------------------------------------------------------*/ #include "deDefs.h" #include "deInt32.h" /* Assert base type sizes. */ DE_STATIC_ASSERT(sizeof(deUint8) == 1); DE_STATIC_ASSERT(sizeof(deUint16) == 2); DE_STATIC_ASSERT(sizeof(deUint32) == 4); DE_STATIC_ASSERT(sizeof(deUint64) == 8); DE_STATIC_ASSERT(sizeof(deInt8) == 1); DE_STATIC_ASSERT(sizeof(deInt16) == 2); DE_STATIC_ASSERT(sizeof(deInt32) == 4); DE_STATIC_ASSERT(sizeof(deInt64) == 8); DE_STATIC_ASSERT(sizeof(deUintptr) == sizeof(void*)); DE_STATIC_ASSERT(sizeof(deIntptr) == sizeof(void*)); DE_STATIC_ASSERT(DE_PTR_SIZE == sizeof(void*)); /* Sanity checks for DE_PTR_SIZE & DE_CPU */ #if !((DE_CPU == DE_CPU_X86_64 || DE_CPU == DE_CPU_ARM_64 || DE_CPU == DE_CPU_MIPS_64) && (DE_PTR_SIZE == 8)) && \ !((DE_CPU == DE_CPU_X86 || DE_CPU == DE_CPU_ARM || DE_CPU == DE_CPU_MIPS) && (DE_PTR_SIZE == 4)) # error "DE_CPU and DE_PTR_SIZE mismatch" #endif #if (DE_OS == DE_OS_UNIX) && defined(NDEBUG) /* We need __assert_fail declaration from assert.h */ # undef NDEBUG #endif #include <stdio.h> #include <assert.h> #include <string.h> #if (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS) # include <signal.h> # include <stdlib.h> #endif #if (DE_OS == DE_OS_ANDROID) # include <android/log.h> #endif /* #if (DE_OS == DE_OS_WIN32) # define WIN32_LEAN_AND_MEAN # include <windows.h> #endif */ DE_BEGIN_EXTERN_C #if defined(DE_ASSERT_FAILURE_CALLBACK) static deAssertFailureCallbackFunc g_assertFailureCallback = DE_NULL; #endif void deSetAssertFailureCallback (deAssertFailureCallbackFunc callback) { #if defined(DE_ASSERT_FAILURE_CALLBACK) g_assertFailureCallback = callback; #else DE_UNREF(callback); #endif } void deAssertFail (const char* reason, const char* file, int line) { #if defined(DE_ASSERT_FAILURE_CALLBACK) if (g_assertFailureCallback != DE_NULL) { /* Remove callback in case of the callback causes further asserts. */ deAssertFailureCallbackFunc callback = g_assertFailureCallback; deSetAssertFailureCallback(DE_NULL); callback(reason, file, line); } #endif #if (((DE_OS == DE_OS_WIN32) || (DE_OS == DE_OS_WINCE)) && (DE_COMPILER == DE_COMPILER_MSC)) { wchar_t wreason[1024]; wchar_t wfile[128]; int num; int i; /* MessageBox(reason, "Assertion failed", MB_OK); */ num = deMin32((int)strlen(reason), DE_LENGTH_OF_ARRAY(wreason)-1); for (i = 0; i < num; i++) wreason[i] = reason[i]; wreason[i] = 0; num = deMin32((int)strlen(file), DE_LENGTH_OF_ARRAY(wfile)-1); for (i = 0; i < num; i++) wfile[i] = file[i]; wfile[i] = 0; # if (DE_OS == DE_OS_WIN32) _wassert(wreason, wfile, line); # else /* WINCE */ assert(wreason); # endif } #elif ((DE_OS == DE_OS_WIN32) && (DE_COMPILER == DE_COMPILER_CLANG)) _assert(reason, file, line); #elif (DE_OS == DE_OS_UNIX) __assert_fail(reason, file, line, "Unknown function"); #elif (DE_OS == DE_OS_SYMBIAN) __assert("Unknown function", file, line, reason); #elif (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS) fprintf(stderr, "Assertion '%s' failed at %s:%d\n", reason, file, line); raise(SIGTRAP); abort(); #elif (DE_OS == DE_OS_ANDROID) __android_log_print(ANDROID_LOG_ERROR, "delibs", "Assertion '%s' failed at %s:%d", reason, file, line); __assert(file, line, reason); #else # error Implement assertion function on your platform. #endif } DE_END_EXTERN_C