source: atk2-sc3-1.4.0-ntisr/library/log_output.c@ 172

Last change on this file since 172 was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 8.5 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2011-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: log_output.c 425 2015-12-07 08:06:19Z witz-itoyo $
74 */
75
76/*
77 * システムログのフォーマット出力
78 */
79
80#include "log_output.h"
81
82void
83_kernel_KernelLibrarySyslog(void *param)
84{
85#ifdef USE_KERNEL_LIBRARY_SYSLOG
86 KERLIBSLG_PRM *prm = (KERLIBSLG_PRM *) param;
87
88 switch (prm->index) {
89 case KERLIBSLG_ID_SYSLOG_INITIALIZE:
90 _syslog_syslog_initialize();
91 break;
92
93 case KERLIBSLG_ID_SYSLOG_WRI_LOG:
94 prm->return_er = _syslog_syslog_wri_log(prm->prio, prm->p_const_syslog);
95 break;
96
97 case KERLIBSLG_ID_SYSLOG_MSK_LOG:
98 prm->return_er = _syslog_syslog_msk_log(prm->lowmask);
99 break;
100
101 case KERLIBSLG_ID_SYSLOG_PRINTF:
102 _syslog_syslog_printf(prm->p_format, prm->p_args, prm->outputc);
103 break;
104
105 case KERLIBSLG_ID_SYSLOG_PRINT:
106 _syslog_syslog_print(prm->p_const_syslog, prm->outputc);
107 break;
108
109 default:
110 /* 上記のケース以外の場合,処理は行わない */
111 break;
112 }
113#endif /* USE_KERNEL_LIBRARY_SYSLOG */
114 return;
115}
116
117/*
118 * 数値を文字列に変換時,uintptr型の数値の最大文字数
119 * 8進数,10進数,16進数へ変換を想定
120 * 動作例:
121 * 2Byteの場合:16進数:FFFF →4文字
122 * :10進数:65535 →5文字
123 * : 8進数:177777→6文字
124 * →CONVERT_BUFLENは最大の6文字を返す
125 * 計算パラメータ:
126 * 8U:1バイトのビット数
127 * 2U:3で割った際の余り1ビット,または2ビット分を含めるための補正値
128 * 3U:10進数へ変換時,最大3ビットで1文字になる
129 * (4ビットだと2桁数字になるため)
130 * 計算例:
131 * 2Byteの場合
132 * ビット数は2 * 8U = 16bit
133 * 単純に3で割ると,16 / 3 = 5となり,余り1ビット分の文字数が
134 * 切り捨てられてしまう
135 * 3で割る前に2ビット分足すことで,切捨てを防ぐ
136 * (16 + 2) / 3 = 6文字
137 */
138#define CONVERT_BUFLEN (((sizeof(uintptr) * 8U) + 2U) / 3U)
139
140/*
141 * 数値を文字列に変換
142 */
143static void
144convert(uintptr val, uint32 radix, const char8 *radchar,
145 uint32 width, boolean minus, boolean padzero, void (*outputc)(char8 c))
146{
147 char8 buf[CONVERT_BUFLEN];
148 uint32 i, j;
149
150 i = 0U;
151 do {
152 buf[i++] = radchar[val % radix];
153 val /= radix;
154 } while ((i < CONVERT_BUFLEN) && (val != 0U));
155
156 if ((minus != FALSE) && (width > 0U)) {
157 width -= 1U;
158 }
159 if ((minus != FALSE) && (padzero != FALSE)) {
160 (*outputc)('-');
161 }
162 for (j = i; j < width; j++) {
163 (*outputc)((char8) ((padzero != FALSE) ? '0' : ' '));
164 }
165 if ((minus != FALSE) && (padzero == FALSE)) {
166 (*outputc)('-');
167 }
168 while (i > 0U) {
169 (*outputc)(buf[--i]);
170 }
171}
172
173/*
174 * 文字列整形出力
175 */
176static const char8 raddec[] = "0123456789";
177static const char8 radhex[] = "0123456789abcdef";
178static const char8 radHEX[] = "0123456789ABCDEF";
179
180void
181_syslog_syslog_printf(const char8 *format, const uintptr *p_args, void (*outputc)(char8 c))
182{
183 char8 c;
184 uint32 width;
185 boolean padzero;
186 sintptr val;
187 const char8 *str;
188
189 while ((c = *format++) != '\0') {
190 if (c != '%') {
191 (*outputc)(c);
192 continue;
193 }
194
195 width = 0U;
196 padzero = FALSE;
197 if ((c = *format++) == '0') {
198 padzero = TRUE;
199 c = *format++;
200 }
201 while (('0' <= c) && (c <= '9')) {
202 width = (width * 10U) + (c - '0');
203 c = *format++;
204 }
205 if (c == 'l') {
206 c = *format++;
207 }
208 switch (c) {
209 case 'd':
210 val = (sintptr) (*p_args++);
211 if (val >= 0) {
212 convert((uintptr) val, 10U, raddec,
213 width, FALSE, padzero, outputc);
214 }
215 else {
216 convert((uintptr) (-val), 10U, raddec,
217 width, TRUE, padzero, outputc);
218 }
219 break;
220 case 'u':
221 val = (sintptr) (*p_args++);
222 convert((uintptr) val, 10U, raddec, width, FALSE, padzero, outputc);
223 break;
224 case 'x':
225 case 'p':
226 val = (sintptr) (*p_args++);
227 convert((uintptr) val, 16U, radhex, width, FALSE, padzero, outputc);
228 break;
229 case 'X':
230 val = (sintptr) (*p_args++);
231 convert((uintptr) val, 16U, radHEX, width, FALSE, padzero, outputc);
232 break;
233 case 'c':
234 (*outputc)((char8) (uintptr) (*p_args++));
235 break;
236 case 's':
237 str = (const char8 *) (*p_args++);
238 while ((c = *str++) != '\0') {
239 (*outputc)(c);
240 }
241 break;
242 case '%':
243 (*outputc)('%');
244 break;
245 case '\0':
246 format--;
247 break;
248 default:
249 /* 上記のケース以外の場合,処理は行わない */
250 break;
251 }
252 }
253}
254
255/*
256 * ログ情
257報の出力
258 */
259void
260_syslog_syslog_print(const SYSLOG *p_syslog, void (*outputc)(char8 c))
261{
262 switch (p_syslog->logtype) {
263 case LOG_TYPE_COMMENT:
264 _syslog_syslog_printf((const char8 *) (p_syslog->loginfo[0]),
265 &(p_syslog->loginfo[1]), outputc);
266 break;
267 case LOG_TYPE_ASSERT:
268 _syslog_syslog_printf("%s:%u: Assertion '%s' failed.",
269 &(p_syslog->loginfo[0]), outputc);
270 break;
271 default:
272 /* 上記のケース以外の場合,出力は行わない */
273 break;
274 }
275}
Note: See TracBrowser for help on using the repository browser.