1/*------------------------------------------------------------------------- 2 * drawElements Base Portability Library 3 * ------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Basic portability. 22 *//*--------------------------------------------------------------------*/ 23 24#include "deDefs.h" 25#include "deInt32.h" 26 27/* Assert base type sizes. */ 28DE_STATIC_ASSERT(sizeof(deUint8) == 1); 29DE_STATIC_ASSERT(sizeof(deUint16) == 2); 30DE_STATIC_ASSERT(sizeof(deUint32) == 4); 31DE_STATIC_ASSERT(sizeof(deUint64) == 8); 32DE_STATIC_ASSERT(sizeof(deInt8) == 1); 33DE_STATIC_ASSERT(sizeof(deInt16) == 2); 34DE_STATIC_ASSERT(sizeof(deInt32) == 4); 35DE_STATIC_ASSERT(sizeof(deInt64) == 8); 36DE_STATIC_ASSERT(sizeof(deUintptr) == sizeof(void*)); 37DE_STATIC_ASSERT(sizeof(deIntptr) == sizeof(void*)); 38DE_STATIC_ASSERT(DE_PTR_SIZE == sizeof(void*)); 39 40/* Sanity checks for DE_PTR_SIZE & DE_CPU */ 41#if !((DE_CPU == DE_CPU_X86_64 || DE_CPU == DE_CPU_ARM_64 || DE_CPU == DE_CPU_MIPS_64) && (DE_PTR_SIZE == 8)) && \ 42 !((DE_CPU == DE_CPU_X86 || DE_CPU == DE_CPU_ARM || DE_CPU == DE_CPU_MIPS) && (DE_PTR_SIZE == 4)) 43# error "DE_CPU and DE_PTR_SIZE mismatch" 44#endif 45 46#if (DE_OS == DE_OS_UNIX || DE_OS == DE_OS_WIN32) && defined(NDEBUG) 47 /* We need __assert_fail declaration from assert.h */ 48# undef NDEBUG 49#endif 50 51#include <stdio.h> 52#include <assert.h> 53#include <string.h> 54 55#if (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS) 56# include <signal.h> 57# include <stdlib.h> 58#endif 59 60#if (DE_OS == DE_OS_ANDROID) 61# include <android/log.h> 62#endif 63 64/* 65#if (DE_OS == DE_OS_WIN32) 66# define WIN32_LEAN_AND_MEAN 67# include <windows.h> 68#endif 69*/ 70 71DE_BEGIN_EXTERN_C 72 73#if defined(DE_ASSERT_FAILURE_CALLBACK) 74static deAssertFailureCallbackFunc g_assertFailureCallback = DE_NULL; 75#endif 76 77void deSetAssertFailureCallback (deAssertFailureCallbackFunc callback) 78{ 79#if defined(DE_ASSERT_FAILURE_CALLBACK) 80 g_assertFailureCallback = callback; 81#else 82 DE_UNREF(callback); 83#endif 84} 85 86void deAssertFail (const char* reason, const char* file, int line) 87{ 88#if defined(DE_ASSERT_FAILURE_CALLBACK) 89 if (g_assertFailureCallback != DE_NULL) 90 { 91 /* Remove callback in case of the callback causes further asserts. */ 92 deAssertFailureCallbackFunc callback = g_assertFailureCallback; 93 deSetAssertFailureCallback(DE_NULL); 94 callback(reason, file, line); 95 } 96#endif 97 98#if (((DE_OS == DE_OS_WIN32) || (DE_OS == DE_OS_WINCE)) && (DE_COMPILER == DE_COMPILER_MSC)) 99 { 100 wchar_t wreason[1024]; 101 wchar_t wfile[128]; 102 int num; 103 int i; 104 105 /* MessageBox(reason, "Assertion failed", MB_OK); */ 106 107 num = deMin32((int)strlen(reason), DE_LENGTH_OF_ARRAY(wreason)-1); 108 for (i = 0; i < num; i++) 109 wreason[i] = reason[i]; 110 wreason[i] = 0; 111 112 num = deMin32((int)strlen(file), DE_LENGTH_OF_ARRAY(wfile)-1); 113 for (i = 0; i < num; i++) 114 wfile[i] = file[i]; 115 wfile[i] = 0; 116 117# if (DE_OS == DE_OS_WIN32) 118 _wassert(wreason, wfile, line); 119# else /* WINCE */ 120 assert(wreason); 121# endif 122 } 123#elif ((DE_OS == DE_OS_WIN32) && (DE_COMPILER == DE_COMPILER_CLANG)) 124 _assert(reason, file, line); 125#elif (DE_OS == DE_OS_UNIX) 126 __assert_fail(reason, file, (unsigned int)line, "Unknown function"); 127#elif (DE_OS == DE_OS_SYMBIAN) 128 __assert("Unknown function", file, line, reason); 129#elif (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS) 130 fprintf(stderr, "Assertion '%s' failed at %s:%d\n", reason, file, line); 131 raise(SIGTRAP); 132 abort(); 133#elif (DE_OS == DE_OS_ANDROID) 134 __android_log_print(ANDROID_LOG_ERROR, "delibs", "Assertion '%s' failed at %s:%d", reason, file, line); 135 __assert(file, line, reason); 136#else 137# error Implement assertion function on your platform. 138#endif 139} 140 141DE_END_EXTERN_C 142