1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: dbg_DebugString.cpp 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 18248 $ 14 *---------------------------------------------------------------------------*/ 15 16 #include <cstdio> 17 #include <cstdarg> 18 #include <cstring> 19 20 #include <nn/Result.h> 21 #include <nn/config.h> 22 #include <nn/dbg/dbg_DebugString.h> 23 #include <nn/dbg/dbg_Result.h> 24 #include <nn/svc.h> 25 #include <nn/nstd.h> 26 27 namespace nn { namespace dbg { 28 namespace detail { 29 PutString(const char * text,s32 length)30 NN_WEAK_SYMBOL void PutString(const char* text, s32 length) 31 { 32 nn::svc::OutputDebugString(text, length); 33 } 34 VPrintf(const char * fmt,::std::va_list arg)35 NN_WEAK_SYMBOL void VPrintf(const char* fmt, ::std::va_list arg) 36 { 37 char buf[NN_DBG_PRINTF_BUFFER_LENGTH]; 38 u32 length = ::std::vsnprintf(buf, sizeof(buf), fmt, arg); 39 if(length > NN_DBG_PRINTF_BUFFER_LENGTH) 40 { 41 length = NN_DBG_PRINTF_BUFFER_LENGTH; 42 } 43 PutString(buf, length); 44 } 45 TVPrintf(const char * fmt,::std::va_list arg)46 NN_WEAK_SYMBOL void TVPrintf(const char* fmt, ::std::va_list arg) 47 { 48 char buf[NN_DBG_TPRINTF_BUFFER_LENGTH]; 49 u32 length = nstd::TVSNPrintf(buf, sizeof(buf), fmt, arg); 50 if(length > NN_DBG_TPRINTF_BUFFER_LENGTH) 51 { 52 length = NN_DBG_TPRINTF_BUFFER_LENGTH; 53 } 54 PutString(buf, length); 55 } 56 Printf(const char * fmt,...)57 /*NN_WEAK_SYMBOL*/ void Printf(const char* fmt, ...) 58 { 59 va_list vlist; 60 61 va_start(vlist, fmt); 62 nn::dbg::detail::VPrintf(fmt, vlist); 63 va_end(vlist); 64 } 65 TPrintf(const char * fmt,...)66 /*NN_WEAK_SYMBOL*/ void TPrintf(const char* fmt, ...) 67 { 68 va_list vlist; 69 70 va_start(vlist, fmt); 71 nn::dbg::detail::TVPrintf(fmt, vlist); 72 va_end(vlist); 73 } 74 75 } 76 }} 77 78 79 extern "C" { 80 nndbgDetailPrintf(const char * fmt,...)81 /*NN_WEAK_SYMBOL*/ void nndbgDetailPrintf(const char* fmt, ...) 82 { 83 va_list vlist; 84 85 va_start(vlist, fmt); 86 nn::dbg::detail::VPrintf(fmt, vlist); 87 va_end(vlist); 88 } 89 nndbgDetailTPrintf(const char * fmt,...)90 /*NN_WEAK_SYMBOL*/ void nndbgDetailTPrintf(const char* fmt, ...) 91 { 92 va_list vlist; 93 94 va_start(vlist, fmt); 95 nn::dbg::detail::TVPrintf(fmt, vlist); 96 va_end(vlist); 97 } 98 nndbgDetailVPrintf(const char * fmt,va_list arg)99 NN_WEAK_SYMBOL void nndbgDetailVPrintf(const char* fmt, va_list arg) 100 { 101 nn::dbg::detail::VPrintf(fmt, arg); 102 } 103 nndbgDetailTVPrintf(const char * fmt,va_list arg)104 NN_WEAK_SYMBOL void nndbgDetailTVPrintf(const char* fmt, va_list arg) 105 { 106 nn::dbg::detail::TVPrintf(fmt, arg); 107 } 108 nndbgAssertionFailureHandler(bool print,const char * filename,int lineno,const char * fmt,...)109 NN_WEAK_SYMBOL int nndbgAssertionFailureHandler(bool print, const char* filename, int lineno, const char* fmt, ...) 110 { 111 va_list vlist; 112 113 if (print) 114 { 115 nndbgDetailPrintf("Failed assertion at %s:%d\n ", filename, lineno); 116 117 va_start(vlist, fmt); 118 nndbgDetailVPrintf(fmt, vlist); 119 va_end(vlist); 120 121 nndbgDetailPrintf("\n"); 122 } 123 else 124 { 125 NN_UNUSED_VAR(filename); 126 NN_UNUSED_VAR(lineno); 127 NN_UNUSED_VAR(fmt); 128 } 129 130 nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT); 131 132 return 0; 133 } 134 nndbgTAssertionFailureHandler(bool print,const char * filename,int lineno,const char * fmt,...)135 NN_WEAK_SYMBOL int nndbgTAssertionFailureHandler(bool print, const char* filename, int lineno, const char* fmt, ...) 136 { 137 va_list vlist; 138 139 if (print) 140 { 141 nndbgDetailTPrintf("Failed assertion at %s:%d\n ", filename, lineno); 142 143 va_start(vlist, fmt); 144 nndbgDetailTVPrintf(fmt, vlist); 145 va_end(vlist); 146 147 nndbgDetailTPrintf("\n"); 148 } 149 else 150 { 151 NN_UNUSED_VAR(filename); 152 NN_UNUSED_VAR(lineno); 153 NN_UNUSED_VAR(fmt); 154 } 155 156 nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT); 157 158 return 0; 159 } 160 161 } 162