1 /******************************************************************************/
2 /* src/kernel/Debug/DebugLog.c */
4 /* Copyright (C) 2017-2018 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
16 #include <hardware/Vga/Vga.h>
22 /******************************************************************************/
24 /******************************************************************************/
26 #define LOG_LENGTH_ID ( 8 ) /** 識別子文字数 */
27 #define LOG_LENGTH_LINENUM ( 4 ) /** 行番号文字数 */
30 #define LOG_CURSOR_ADDR( __ROW, __COLUMN ) \
31 ( ( uint8_t * ) ( VGA_M3_VRAM_ADDR + \
32 ( __ROW ) * VGA_M3_COLUMN * 2 + \
36 #define LOG_ATTR_FG( __BASE ) ( __BASE & 0x0F )
39 #define LOG_ATTR_BG( __BASE ) ( __BASE & 0xF0 )
42 #define LOG_ATTR_FG_CHG( __BASE, __FG ) ( LOG_ATTR_BG( __BASE ) | ( __FG ) )
45 #define LOG_ATTR_BG_CHG( __BASE, __BG ) ( LOG_ATTR_FG( __BASE ) | ( __BG ) )
48 #define LOG_FLAG_LEFT ( 0x01 ) /* 左寄せ */
49 #define LOG_FLAG_SIGN ( 0x02 ) /* 符号表示 */
50 #define LOG_FLAG_SPACE ( 0x04 ) /* 正数符号空白 */
51 #define LOG_FLAG_ALTERNATE ( 0x08 ) /* 代替形式 */
52 #define LOG_FLAG_ZERO ( 0x10 ) /* 0埋め */
53 #define LOG_FLAG_UPPERCASE ( 0x20 ) /* 大文字 */
54 #define LOG_FLAG_UNSIGNED ( 0x40 ) /* 符号無 */
57 #ifdef DEBUG_LOG_ENABLE
58 #define DEBUG_LOG( ... ) \
59 DebugLogOutput( CMN_MODULE_DBG_LOG, \
63 #define DEBUG_LOG( ... )
68 uint32_t moduleId; /**< モジュール・サブモジュール識別子 */
69 char str[ LOG_LENGTH_ID + 1 ]; /**< 識別文字列 */
74 uint32_t row; /**< カーソル行 */
75 uint32_t column; /**< カーソル列 */
76 uint8_t attr; /**< 文字属性 */
80 /******************************************************************************/
82 /******************************************************************************/
83 #ifdef DEBUG_LOG_ENABLE
85 const static logIdTrans_t gIdTransTbl[ CMN_MODULE_NUM + 1 ] = {
86 { CMN_MODULE_INIT_INIT, "INI-INIT" }, /* 初期化制御(初期化) */
87 { CMN_MODULE_DEBUG_INIT, "DBG-INIT" }, /* デバッグ制御(初期化) */
88 { CMN_MODULE_DEBUG_LOG, "DBG-LOG " }, /* デバッグ制御(ログ) */
89 { CMN_MODULE_MEMMNG_INIT, "MEM-INIT" }, /* メモリ管理(初期化) */
90 { CMN_MODULE_MEMMNG_GDT, "MEM-GDT " }, /* メモリ管理(GDT) */
91 { CMN_MODULE_MEMMNG_AREA, "MEM-AREA" }, /* メモリ管理(領域) */
92 { CMN_MODULE_MEMMNG_PAGE, "MEM-PAGE" }, /* メモリ管理(ページ) */
93 { CMN_MODULE_MEMMNG_CTRL, "MEM-CTRL" }, /* メモリ管理(制御) */
94 { CMN_MODULE_TASKMNG_INIT, "TSK-INIT" }, /* タスク管理(初期化) */
95 { CMN_MODULE_TASKMNG_TSS, "TSK-TSS " }, /* タスク管理(TSS) */
96 { CMN_MODULE_TASKMNG_SCHED, "TSK-SCHD" }, /* タスク管理(スケジューラ) */
97 { CMN_MODULE_TASKMNG_TASK, "TSK-TASK" }, /* タスク管理(タスク) */
98 { CMN_MODULE_TASKMNG_ELF, "TSK-ELF " }, /* タスク管理(ELFローダ) */
99 { CMN_MODULE_TASKMNG_PROC, "TSK-PROC" }, /* タスク管理(プロセス) */
100 { CMN_MODULE_INTMNG_INIT, "INT-INIT" }, /* 割込管理(初期化) */
101 { CMN_MODULE_INTMNG_PIC, "INT-PIC " }, /* 割込管理(PIC) */
102 { CMN_MODULE_INTMNG_IDT, "INT-IDT " }, /* 割込管理(IDT) */
103 { CMN_MODULE_INTMNG_HDL, "INT-HDL " }, /* 割込管理(ハンドラ) */
104 { CMN_MODULE_INTMNG_CTRL, "INT-CTRL" }, /* 割込管理(ハードウェア) */
105 { CMN_MODULE_TIMERMNG_INIT, "TIM-INIT" }, /* タイマ管理(初期化) */
106 { CMN_MODULE_TIMERMNG_CTRL, "TIM-CTRL" }, /* タイマ管理(制御) */
107 { CMN_MODULE_TIMERMNG_PIT, "TIM-PIT " }, /* タイマ管理(PIT) */
108 { CMN_MODULE_ITCCTRL_INIT, "ITC-INIT" }, /* タスク間通信制御(初期化) */
109 { CMN_MODULE_ITCCTRL_MSG, "ITC-MSG " }, /* タスク間通信制御(メッセージ) */
110 { CMN_MODULE_IOCTRL_INIT, "IOC-INIT" }, /* 入出力制御(初期化) */
111 { CMN_MODULE_IOCTRL_PORT, "IOC-PORT" }, /* 入出力制御(I/Oポート) */
112 { 0, "UNKNOWN " } };/* 終端 */
115 static char gNumTransTbl[ 2 ][ 17 ] = { "0123456789abcdef",
116 "0123456789ABCDEF" };
121 static logTbl_t gLogTbl;
124 /******************************************************************************/
126 /******************************************************************************/
127 #ifdef DEBUG_LOG_ENABLE
130 static CmnRet_t LogGetNum( char *pStr,
134 /* 書式付き文字列出力(可変長引数型) */
135 static void LogOutput( char *pFormat,
138 /* 書式付き文字列出力(可変長引数リスト型) */
139 static void LogOutputByVaList( char *pFormat,
143 static void LogOutputChar( char c );
146 static void LogOutputNumber( uint32_t value,
152 static void LogOutputString( char *pStr );
155 static uint32_t LogProcEscape( char *pStr );
157 /* 文字属性エスケープシーケンス処理 */
158 static void LogProcEscapeAttr( uint32_t funcNo );
161 static uint32_t LogProcFormat( char *pFormat,
167 /******************************************************************************/
169 /******************************************************************************/
170 /******************************************************************************/
173 * @details ログ管理サブモジュールの初期化を行う。
175 /******************************************************************************/
176 void DebugLogInit( void )
179 memset( &gLogTbl, 0, sizeof ( logTbl_t ) );
182 gLogTbl.attr = VGA_M3_ATTR_FG_WHITE | /* 白色文字属性 */
183 VGA_M3_ATTR_FG_BRIGHT | /* 明色文字属性 */
184 VGA_M3_ATTR_BG_BLACK; /* 黒色背景属性 */
190 /******************************************************************************/
193 * @details デバッグトレースログオプションが有効の時、画面にトレースログ出
196 * @param[in] moduleId モジュール・サブモジュール識別子
197 * - CMN_MODULE_INIT_INIT 初期化制御(初期化)
198 * - CMN_MODULE_DEBUG_INIT デバッグ制御(初期化)
199 * - CMN_MODULE_DEBUG_LOG デバッグ制御(ログ管理)
200 * - CMN_MODULE_MEMMNG_INIT メモリ管理(初期化)
201 * - CMN_MODULE_MEMMNG_GDT メモリ管理(GDT管理)
202 * - CMN_MODULE_MEMMNG_AREA メモリ管理(メモリ領域管理)
203 * - CMN_MODULE_MEMMNG_PAGE メモリ管理(ページ管理)
204 * - CMN_MODULE_MEMMNG_CTRL メモリ管理(メモリ制御)
205 * - CMN_MODULE_TASKMNG_INIT タスク管理(初期化)
206 * - CMN_MODULE_TASKMNG_TSS タスク管理(TSS管理)
207 * - CMN_MODULE_TASKMNG_SCHED タスク管理(スケジューラ)
208 * - CMN_MODULE_TASKMNG_TASK タスク管理(タスク管理)
209 * - CMN_MODULE_TASKMNG_ELF タスク管理(ELFローダ)
210 * - CMN_MODULE_TASKMNG_PROC タスク管理(プロセス管理)
211 * - CMN_MODULE_INTMNG_INIT 割込管理(初期化)
212 * - CMN_MODULE_INTMNG_PIC 割込管理(PIC管理)
213 * - CMN_MODULE_INTMNG_IDT 割込管理(IDT管理)
214 * - CMN_MODULE_INTMNG_HDL 割込管理(ハンドラ管理)
215 * - CMN_MODULE_TIMERMNG_INIT タイマ管理(初期化)
216 * - CMN_MODULE_TIMERMNG_PIT タイマ管理(PIT管理) * - CMN_MODULE_ITCCTRL_INIT タスク間通信制御(初期化)
217 * - CMN_MODULE_ITCCTRL_MSG タスク間通信制御(メッセージ制御)
218 * @param[in] lineNum 行番号
219 * @param[in] *pFormat トレースログ
221 * @note デバッグトレースログオプションの有効化は、コンパイルオプション
222 * にて「DEBUG_LOG_ENABLE」マクロを定義する事で行う。
224 /******************************************************************************/
225 void DebugLogOutput( uint32_t moduleId,
230 #ifdef DEBUG_LOG_ENABLE
231 va_list vaList; /* 可変長引数リスト */
232 uint32_t row; /* カーソル行 */
233 uint32_t column; /* カーソル列 */
234 uint32_t moduleIdx; /* 変換テーブルインデックス */
237 va_start( vaList, pFormat );
243 if ( gLogTbl.row >= VGA_M3_ROW ) {
247 gLogTbl.row = VGA_M3_ROW - 1;
250 for ( row = 0; row < ( VGA_M3_ROW - 1 ); row++ ) {
252 memcpy( LOG_CURSOR_ADDR( row, 0 ),
253 LOG_CURSOR_ADDR( row + 1, 0 ),
258 for ( column = 0; column < VGA_M3_COLUMN; column++ ) {
260 LOG_CURSOR_ADDR( row, column )[ 0 ] = ' ';
261 LOG_CURSOR_ADDR( row, column )[ 1 ] =
262 VGA_M3_ATTR_FG_WHITE | /* 白色文字属性 */
263 VGA_M3_ATTR_FG_BRIGHT | /* 明色文字属性 */
264 VGA_M3_ATTR_BG_BLACK; /* 黒色背景属性 */
268 /* モジュール・サブモジュール識別子変換 */
269 for ( moduleIdx = 0; moduleIdx < CMN_MODULE_NUM; moduleIdx++ ) {
271 if ( gIdTransTbl[ moduleIdx ].moduleId == moduleId ) {
277 /* モジュール・サブモジュール識別子、行番号出力 */
278 LogOutput( "\033[32m%s:%04u \033[0m",
279 gIdTransTbl[ moduleIdx ].str,
283 LogOutputByVaList( pFormat, vaList );
296 /******************************************************************************/
298 /******************************************************************************/
299 #ifdef DEBUG_LOG_ENABLE
300 /******************************************************************************/
303 * @details 数字文字列から数値を取得する。
305 * @param[in] *pStr 文字列
306 * @param[out] *pVaule 数値
307 * @param[out] *pLength 数字文字列長
309 * @retval CMN_SUCCESS 正常終了
310 * @retval CMN_FAILURE 異常終了(数字文字列無し)
312 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
314 /******************************************************************************/
315 static CmnRet_t LogGetNum( char *pStr,
324 while ( pStr[ *pLength ] != '\0' ) {
326 if ( ( '0' <= pStr[ *pLength ] ) && ( pStr[ *pLength ] <= '9' ) ) {
328 *pValue = *pValue * 10 + pStr[ *pLength ] - '0';
341 if ( *pLength == 0 ) {
352 #ifdef DEBUG_LOG_ENABLE
353 /******************************************************************************/
355 * @brief 書式付き文字列出力(可変長引数型)
356 * @details 画面に可変長引数型書式付き文字列を出力する。
358 * @param[in] *pFormat 書式付き文字列
359 * @param[in] ... 可変長引数
361 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
363 /******************************************************************************/
364 static void LogOutput( char *pFormat,
367 va_list vaList; /* 可変長引数リスト */
370 va_start( vaList, pFormat );
373 LogOutputByVaList( pFormat, vaList );
383 #ifdef DEBUG_LOG_ENABLE
384 /******************************************************************************/
386 * @brief 書式付き文字列出力(可変長引数リスト型)
387 * @details 画面に可変長引数リスト型書式付き文字列を出力する。
389 * @param[in] *pFormat 書式付き文字列
390 * @param[in] vaList 可変長引数リスト
392 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
394 /******************************************************************************/
395 static void LogOutputByVaList( char *pFormat,
398 uint32_t idx; /* インデックス */
404 while ( pFormat[ idx ] != '\0' ) {
406 switch ( pFormat[ idx ] ) {
414 idx += LogProcFormat( &pFormat[ idx ], &vaList );
425 idx += LogProcEscape( &pFormat[ idx ] );
433 LogOutputChar( pFormat[ idx ] );
447 #ifdef DEBUG_LOG_ENABLE
448 /******************************************************************************/
451 * @details 画面に一文字出力する。
455 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
457 /******************************************************************************/
458 static void LogOutputChar( char c )
460 uint8_t *pCursor; /* カーソル */
463 if ( gLogTbl.column >= VGA_M3_COLUMN ) {
470 pCursor = LOG_CURSOR_ADDR( gLogTbl.row, gLogTbl.column );
473 pCursor[ 0 ] = ( uint8_t ) c; /* 文字コード */
474 pCursor[ 1 ] = gLogTbl.attr; /* 文字属性 */
484 #ifdef DEBUG_LOG_ENABLE
485 /******************************************************************************/
488 * @details 整数を画面に出力する。
490 * @param[in] value 数値
495 * @param[in] flags フラグ
496 * - LOG_FLAG_LEFT 左寄せ
497 * - LOG_FLAG_SIGN 符号表示
498 * - LOG_FLAG_SPACE 正数符号空白
499 * - LOG_FLAG_ALTERNATE 代替形式
500 * - LOG_FLAG_ZERO 0埋め
501 * - LOG_FLAG_UNSIGNED 符号無
502 * @param[in] width 最小フィールド幅
505 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
507 /******************************************************************************/
508 static void LogOutputNumber( uint32_t value,
513 char buffer[ VGA_M3_COLUMN ]; /* 出力バッファ */
514 char *pTrans; /* 数字変換表 */
515 int32_t length; /* バッファ文字列長 */
516 uint32_t tmp; /* 一時変数 */
517 uint32_t idx; /* インデックス */
520 memset( buffer, '0', sizeof ( buffer ) );
525 if ( ( width < 0 ) && ( VGA_M3_COLUMN <= width ) ) {
526 /* 0未満、LOG_LENGTH_COLUMN超過 */
533 if ( ( flags & LOG_FLAG_LEFT ) != 0 ) {
537 flags = flags & ~LOG_FLAG_ZERO;
541 if ( ( flags & LOG_FLAG_UNSIGNED ) == 0 ) {
545 if ( ( ( int32_t ) tmp ) < 0 ) {
549 tmp = ( uint32_t ) ( ( ( int32_t ) tmp ) * -1 );
556 flags &= ~LOG_FLAG_SIGN; /* 符号表示 */
557 flags &= ~LOG_FLAG_SPACE; /* 正数符号空白 */
561 if ( ( flags & LOG_FLAG_UPPERCASE ) == 0 ) {
565 pTrans = gNumTransTbl[ 0 ];
571 pTrans = gNumTransTbl[ 1 ];
575 if ( ( flags & LOG_FLAG_ALTERNATE ) != 0 ) {
582 /* 最小フィールド幅から代替形式出力分減算 */
585 } else if ( base == 16 ) {
588 /* 最小フィールド幅から代替形式出力分減算 */
593 /* 符号表示フラグ、正数符号空白フラグ判定 */
594 if ( ( ( flags & LOG_FLAG_SIGN ) != 0 ) ||
595 ( ( flags & LOG_FLAG_SPACE ) != 0 ) ) {
596 /* 符号表示フラグ有、または、正数符号空白フラグ有 */
598 /* 最小フィールド幅から符号出力分減算 */
605 buffer[ length++ ] = pTrans[ tmp % base ];
610 } while ( tmp != 0 );
612 /* 0埋めフラグ、最小フィールド幅判定 */
613 if ( ( ( flags & LOG_FLAG_ZERO ) != 0 ) &&
614 ( width > length ) ) {
615 /* 0埋めフラグ有、かつ、最小フィールド幅未満 */
622 if ( ( flags & LOG_FLAG_ALTERNATE ) != 0 ) {
630 buffer[ length++ ] = '0';
632 } else if ( base == 16 ) {
636 buffer[ length++ ] = 'x';
637 buffer[ length++ ] = '0';
642 if ( ( ( flags & LOG_FLAG_SIGN ) != 0 ) &&
643 ( ( int32_t ) value >= 0 ) ) {
645 buffer[ length++ ] = '+';
649 if ( ( ( flags & LOG_FLAG_SPACE ) != 0 ) &&
650 ( ( int32_t ) value >= 0 ) ) {
651 /* 正数符号空白フラグ有、かつ、正数 */
652 buffer[ length++ ] = ' ';
655 /* 符号表示フラグ・正数符号空白フラグ・負数判定 */
656 if ( ( ( ( flags & LOG_FLAG_SIGN ) != 0 ) ||
657 ( ( flags & LOG_FLAG_SPACE ) != 0 ) ) &&
658 ( ( int32_t ) value < 0 ) ) {
659 /* 符号表示または正数符号空白フラグ有、かつ、負数 */
660 buffer[ length++ ] = '-';
663 /* 左寄せフラグ、最小フィールド幅判定 */
664 if ( ( ( flags & LOG_FLAG_LEFT ) == 0 ) &&
665 ( width > length ) ) {
666 /* 左寄せフラグ無、かつ、最小フィールド幅未満 */
669 for ( idx = 0; idx < ( uint32_t ) ( width - length ); idx++ ) {
671 LogOutputChar( ' ' );
676 for ( idx = 0; idx < ( uint32_t ) length; idx++ ) {
678 LogOutputChar( buffer[ ( uint32_t ) length - idx - 1 ] );
682 if ( ( ( flags & LOG_FLAG_LEFT ) != 0 ) &&
683 ( width > length ) ) {
684 /* 左寄せフラグ有、かつ、最小フィールド幅未満 */
687 for ( idx = 0; idx < ( uint32_t ) ( width - length ); idx++ ) {
689 LogOutputChar( ' ' );
698 #ifdef DEBUG_LOG_ENABLE
699 /******************************************************************************/
702 * @details 文字列を画面に出力する。
704 * @param[in] pStr 文字列
706 * @note 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
708 /******************************************************************************/
709 static void LogOutputString( char *pStr )
711 uint32_t idx; /* インデックス */
717 while ( pStr[ idx ] != '\0' ) {
719 switch ( pStr[ idx ] ) {
727 idx += LogProcEscape( &pStr[ idx ] );
735 LogOutputChar( pStr[ idx ] );
749 #ifdef DEBUG_LOG_ENABLE
750 /******************************************************************************/
753 * @details ESCコードを処理する。
755 * @param[in] *pStr エスケープシーケンス
757 * @return エスケープシーケンス文字数
759 * @note - 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
760 * - 画面制御エスケープシーケンスには対応しない。
762 /******************************************************************************/
763 static uint32_t LogProcEscape( char *pStr )
765 CmnRet_t ret; /* 関数戻り値 */
766 uint32_t idx; /* インデックス */
767 uint32_t value; /* 数値 */
768 uint32_t length; /* 文字列長 */
776 if ( pStr[ 0 ] != '[' ) {
783 ret = LogGetNum( &pStr[ idx ], &value, &length );
786 if ( ret == CMN_SUCCESS ) {
794 switch ( pStr[ idx ] ) {
798 /* 文字属性エスケープシーケンス処理 */
799 LogProcEscapeAttr( value );
820 #ifdef DEBUG_LOG_ENABLE
821 /******************************************************************************/
823 * @brief 文字属性エスケープシーケンス処理
824 * @details 文字属性のエスケープシーケンスを処理する。
826 * @param[in] funcNo 機能番号
850 * @note - 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
853 /******************************************************************************/
854 static void LogProcEscapeAttr( uint32_t funcNo )
856 uint8_t attr; /* 文字属性 */
863 gLogTbl.attr = VGA_M3_ATTR_FG_WHITE | /* 白色文字属性 */
864 VGA_M3_ATTR_FG_BRIGHT | /* 明色文字属性 */
865 VGA_M3_ATTR_BG_BLACK; /* 黒色背景属性 */
873 attr = ( LOG_ATTR_BG( gLogTbl.attr ) >> 4 ) |
874 VGA_M3_ATTR_FG_BRIGHT;
875 attr &= ( LOG_ATTR_FG( gLogTbl.attr ) << 4 ) & ~VGA_M3_ATTR_BLINK;
885 LOG_ATTR_FG_CHG( gLogTbl.attr,
886 VGA_M3_ATTR_FG_BLACK | VGA_M3_ATTR_FG_BRIGHT );
892 LOG_ATTR_FG_CHG( gLogTbl.attr,
893 VGA_M3_ATTR_FG_RED | VGA_M3_ATTR_FG_BRIGHT );
899 LOG_ATTR_FG_CHG( gLogTbl.attr,
900 VGA_M3_ATTR_FG_GREEN | VGA_M3_ATTR_FG_BRIGHT );
906 LOG_ATTR_FG_CHG( gLogTbl.attr,
907 VGA_M3_ATTR_FG_BROWN | VGA_M3_ATTR_FG_BRIGHT );
913 LOG_ATTR_FG_CHG( gLogTbl.attr,
914 VGA_M3_ATTR_FG_BLUE | VGA_M3_ATTR_FG_BRIGHT );
920 LOG_ATTR_FG_CHG( gLogTbl.attr,
921 VGA_M3_ATTR_FG_PURPLE |
922 VGA_M3_ATTR_FG_BRIGHT );
928 LOG_ATTR_FG_CHG( gLogTbl.attr,
929 VGA_M3_ATTR_FG_CYAN | VGA_M3_ATTR_FG_BRIGHT );
933 /* 白色文字 *//* FALL THROUGH */
937 LOG_ATTR_FG_CHG( gLogTbl.attr,
938 VGA_M3_ATTR_FG_WHITE | VGA_M3_ATTR_FG_BRIGHT );
942 /* 黒色背景 *//* FALL THROUGH */
945 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
946 VGA_M3_ATTR_BG_BLACK );
951 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_RED );
956 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_RED );
961 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
962 VGA_M3_ATTR_BG_BROWN );
967 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_BLUE );
972 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
973 VGA_M3_ATTR_BG_PURPLE );
978 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_CYAN );
983 gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
984 VGA_M3_ATTR_BG_WHITE );
997 #ifdef DEBUG_LOG_ENABLE
998 /******************************************************************************/
1001 * @details 変換指定子を処理する。
1003 * @param[in] *pFormat 変換指定子
1004 * @param[in] vaList 可変長引数リスト
1006 * @note - 「DEBUG_LOG_ENABLE」マクロが定義されている場合に有効となる。
1009 /******************************************************************************/
1010 static uint32_t LogProcFormat( char *pFormat,
1013 uint32_t idx; /* インデックス */
1014 uint32_t width; /* 最小フィールド幅 */
1015 uint32_t flags; /* フラグ */
1016 uint32_t length; /* 文字列長 */
1017 CmnRet_t ret; /* 関数戻り値 */
1027 switch ( pFormat[ idx ] ) {
1030 idx++; /* インデックス更新 */
1031 flags |= LOG_FLAG_LEFT; /* フラグ設定 */
1036 idx++; /* インデックス更新 */
1037 flags |= LOG_FLAG_SIGN; /* フラグ設定 */
1042 idx++; /* インデックス更新 */
1043 flags |= LOG_FLAG_SPACE; /* フラグ設定 */
1048 idx++; /* インデックス更新 */
1049 flags |= LOG_FLAG_ALTERNATE;/* フラグ設定 */
1054 idx++; /* インデックス更新 */
1055 flags |= LOG_FLAG_ZERO; /* フラグ設定 */
1070 ret = LogGetNum( &pFormat[ idx ], &width, &length );
1073 if ( ret == CMN_SUCCESS ) {
1081 switch ( pFormat[ idx ] ) {
1083 /* 10進符号無整数 *//* FALL THROUGH */
1086 flags |= LOG_FLAG_UNSIGNED; /* 符号無 */
1089 /* 10進符号付整数 *//* FALL THROUGH */
1094 LogOutputNumber( va_arg( *pVaList, uint32_t ), 10, flags, width );
1105 flags |= LOG_FLAG_UNSIGNED; /* 符号無 */
1108 LogOutputNumber( va_arg( *pVaList, uint32_t ), 8, flags, width );
1116 /* 16進符号無整数(大文字) *//* FALL THROUGH */
1119 flags |= LOG_FLAG_UNSIGNED; /* 符号無 */
1120 flags |= LOG_FLAG_UPPERCASE; /* 大文字 */
1126 flags |= LOG_FLAG_UNSIGNED; /* 符号無 */
1129 LogOutputNumber( va_arg( *pVaList, uint32_t ), 16, flags, width );
1140 LogOutputChar( ( char ) va_arg( *pVaList, int ) );
1151 LogOutputString( va_arg( *pVaList, char * ) );
1162 flags |= LOG_FLAG_ALTERNATE; /* 代替表示 */
1163 flags |= LOG_FLAG_UNSIGNED; /* 符号無 */
1166 LogOutputNumber( va_arg( *pVaList, uint32_t ), 16, flags, width );
1177 LogOutputChar( '%' );
1193 return idx + length;
1198 /******************************************************************************/