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