ERRORS9.C
[目次 | 関数]
1|/***************************************************************************
2| 1. <<< [Errors9] デバッグツール・軽量版 >>>
3|****************************************************************************/
4|
5|#include "errors.ah"
6|
7|#include <stdarg.h>
8|#include <stdio.h>
9|#include <string.h>
10|
11|void Errors_printfToBinMem( const char* fmt, va_list va );
12|void Errors_printToSDV( const char* msg );
13|
14|/*-------------------------------------------------------------------------*/
15|/* 2. <<< ◆(Errors_Log) 記録領域 >>> */
16|/*-------------------------------------------------------------------------*/
17|
18|Errors_Log Errors_log[Errors_log_m];
19|Errors_Log* Errors_log_p = Errors_log;
20|int Errors_log_n = 1;
21|
22|/***************************************************************************
23| 3. <<< [Errors_Log_add] 記録領域に記録する >>>
24|【補足】
25|・内部用です。
26|****************************************************************************/
27|void Errors_Log_add( const char* file, int line, int type, int data )
28|{
29| Errors_log_p->file = (char*)file;
30| Errors_log_p->line = line;
31| Errors_log_p->type = type;
32| Errors_log_p->data = data;
33| Errors_log_p ++;
34|
35| if ( Errors_log_p >= Errors_log + Errors_log_m ) {
36| Errors_log_p = Errors_log + Errors_log_m / 2;
37| Errors_log_p->file = (char*)Errors_log_n;
38| Errors_log_p->line = 0;
39| Errors_log_p->type = 0;
40| Errors_log_p->data = 0;
41| Errors_log_p ++;
42| Errors_log_n++;
43| }
44|}
45|
46|
47|/*-------------------------------------------------------------------------*/
48|/* 4. <<< ◆ デバッグツール >>> */
49|/*-------------------------------------------------------------------------*/
50|
51|int Errors_count = 0;
52|
53|/***********************************************************************
54| 5. <<< [bp] ブレークポイント >>>
55|【補足】
56|・本関数または bf にブレークポイントを張ると、エラーが発生したときに止まります。
57|・引数は、Errors_Log 構造体に対応しています。
58|************************************************************************/
59|void bp( const char* file, int line, int type, int data )
60|{
61| char msg[512];
62|
63| #if defined(ERRORS_PRINTF_TO_BINMEM)
64| Errors_Log_add( file, line, type, data );
65| #endif
66|
67| sprintf( msg, "Break 0x%X at %s(%d)\n", data, file, line );
68|
69| #if defined(ERRORS_PRINTF_TO_SDV)
70| Errors_printToSDV( msg );
71| #endif
72|
73| bf( data );
74|}
75|
76|
77|/***************************************************************************
78| 6. <<< [Errors_Mark_imp] Mark の関数部分 >>>
79|****************************************************************************/
80|#ifndef ERRORS_CUT_DEBUG_TOOL
81|void Errors_Mark_imp( char* file, int line )
82|{
83| char msg[256];
84|
85| #if defined(ERRORS_PRINTF_TO_BINMEM)
86| Errors_Log_add( __FILE__, __LINE__, 0, 0 );
87| #endif
88|
89| sprintf( msg, "MARK: %s (%d)\n", file, line );
90|
91| #if defined(ERRORS_PRINTF_TO_SDV)
92| Errors_printToSDV( msg );
93| #endif
94|}
95|#endif
96|
97|/***************************************************************************
98| 7. <<< [Errors_Count_imp] COUNT の関数部分 >>>
99|【補足】
100|・内部用です。
101|【内部補足】
102|・返り値は bool 値で、指定のカウントになったら true を返します。
103|****************************************************************************/
104|#ifndef ERRORS_CUT_DEBUG_TOOL
105|int Errors_Count_imp( int n )
106|{
107| Errors_count++;
108| Errors_printf( "COUNT = %d", Errors_count );
109| return Errors_count == n;
110|}
111|#endif
112|
113|
114|/***************************************************************************
115| 8. <<< [Errors_WD_imp] WD の関数部分 >>>
116|****************************************************************************/
117|#ifndef ERRORS_CUT_DEBUG_TOOL
118|void Errors_WD_imp( char* file, int line, int ver, char* name, void* p )
119|{
120| char msg[256];
121|
122| #if defined(ERRORS_PRINTF_TO_BINMEM)
123| Errors_Log_add( __FILE__, __LINE__, 1, ver );
124| #endif
125|
126| sprintf( msg, "%s (%p) = %d(0x%X) \'%c\' : %s(%d)\n",
127| name, p, ver, ver, Errors_getDispCh( ver ), file, line );
128|
129| #if defined(ERRORS_PRINTF_TO_SDV)
130| Errors_printToSDV( msg );
131| #endif
132|}
133|#endif
134|
135|
136|/***************************************************************************
137| 9. <<< [Errors_WS_imp] WS の関数部分 >>>
138|****************************************************************************/
139|#ifndef ERRORS_CUT_DEBUG_TOOL
140|void Errors_WS_imp( char* file, int line, const char* ver, char* name, void* p )
141|{
142| char msg[256];
143|
144| #if defined(ERRORS_PRINTF_TO_BINMEM)
145| Errors_Log_add( __FILE__, __LINE__, 2, (int)ver );
146| #endif
147|
148| sprintf( msg, "%s (%p) = %p \"%s\" : %s(%d)\n",
149| name, p, ver, ver, file, line );
150|
151| #if defined(ERRORS_PRINTF_TO_SDV)
152| Errors_printToSDV( msg );
153| #endif
154|}
155|#endif
156|
157|/***************************************************************************
158| 10. <<< [Errors_WP_imp] WP の関数部分 >>>
159|****************************************************************************/
160|#ifndef ERRORS_CUT_DEBUG_TOOL
161|void Errors_WP_imp( char* file, int line, void* ver, char* name, void* p )
162|{
163| char msg[256];
164|
165| #if defined(ERRORS_PRINTF_TO_BINMEM)
166| Errors_Log_add( __FILE__, __LINE__, 1, (int)ver );
167| #endif
168|
169| sprintf( msg, "%s (%p) = %d(0x%X) : %s(%d)\n",
170| name, p, ver, ver, file, line );
171|
172| #if defined(ERRORS_PRINTF_TO_SDV)
173| Errors_printToSDV( msg );
174| #endif
175|}
176|#endif
177|
178|
179|/***************************************************************************
180| 11. <<< [Errors_printf_release] デバッグ表示(リリース版) >>>
181|****************************************************************************/
182|void Errors_printf_release( const char* fmt, ... )
183|{
184| va_list va;
185| char msg[256];
186|
187| #if defined(ERRORS_PRINTF_TO_BINMEM)
188| va_start( va, fmt );
189| Errors_printfToBinMem( fmt, va );
190| va_end( va );
191| #endif
192|
193| va_start( va, fmt );
194| vsprintf( msg, fmt, va );
195| va_end( va );
196|
197| #if defined(ERRORS_PRINTF_TO_SDV)
198| Errors_printToSDV( msg );
199| Errors_printToSDV( "\n" );
200| #endif
201|}
202|
203|
204|
205|
206|/***************************************************************************
207| 12. <<< [Errors_printfToBinMem] 32bit ダンプ用デバッグ出力 >>>
208|****************************************************************************/
209|void Errors_printfToBinMem( const char* fmt, va_list va )
210|{
211| char* p = (char*)fmt;
212| int n = 0;
213| int v[3];
214|
215| Errors_Log_add( __FILE__, __LINE__, 0x10, (int)fmt );
216|
217| while ( *p != '\0' ) {
218| if ( *p == '%' ) {
219| if ( *(p+1) == '%' ) p++;
220| else {
221| v[n] = va_arg( va, int );
222| n++;
223| if ( n == 3 ) {
224| Errors_Log_add( (char*)v[0], v[1], v[2], 0x10 );
225| n = 0;
226| }
227| }
228| }
229| p++;
230| }
231|
232| if ( n > 0 ) {
233| if ( n == 1 ) {v[1] = 0, v[2] = 0;}
234| else if ( n == 2 ) v[2] = 0;
235| Errors_Log_add( (char*)v[0], v[1], v[2], 0x10 );
236| }
237|}
238|
239|/***************************************************************************
240| 13. <<< [Errors_printToSDV] SDV 用デバッグ出力 >>>
241|****************************************************************************/
242|void Errors_printToSDV( const char* msg )
243|{
244| DSerial_writeChar( 0x86 );
245| DSerial_writeChar( strlen(msg) );
246| DSerial_writeStr( msg );
247| DSerial_readChar();
248| DSerial_readChar();
249|}
250|
251|/**************************************************************************
252| 14. <<< [Errors_getDispCh] 表示可能な文字を返す >>>
253|***************************************************************************/
254|int Errors_getDispCh( int c )
255|{
256| if ( c == '\0' ) return '0';
257| else if ( c == '\r' ) return ' ';
258| else if ( c == '\n' ) return ' ';
259| else if ( c > 0x100 || c < 0x20 ) return '.';
260| else return c;
261|}
262|
263|