source: asp3_wo_tecs/trunk/library/log_output.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 5.8 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 *
10 * 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: log_output.c 127 2014-05-17 12:20:22Z ertl-hiro $
55 */
56
57/*
58 * システムログのフォーマット出力
59 */
60
61#include <t_stddef.h>
62#include <t_syslog.h>
63#include <log_output.h>
64
65/*
66 * 数値を文字列に変換
67 */
68#define CONVERT_BUFLEN ((sizeof(ULOGPAR) * CHAR_BIT + 2) / 3)
69 /* ULOGPAR型の数値の最大文字数 */
70static void
71convert(ULOGPAR val, uint_t radix, const char *radchar,
72 uint_t width, bool_t minus, bool_t padzero, void (*putc)(char))
73{
74 char buf[CONVERT_BUFLEN];
75 uint_t i, j;
76
77 i = 0U;
78 do {
79 buf[i++] = radchar[val % radix];
80 val /= radix;
81 } while (i < CONVERT_BUFLEN && val != 0);
82
83 if (minus && width > 0) {
84 width -= 1;
85 }
86 if (minus && padzero) {
87 (*putc)('-');
88 }
89 for (j = i; j < width; j++) {
90 (*putc)(padzero ? '0' : ' ');
91 }
92 if (minus && !padzero) {
93 (*putc)('-');
94 }
95 while (i > 0U) {
96 (*putc)(buf[--i]);
97 }
98}
99
100/*
101 * 文字列整形出力
102 */
103static const char raddec[] = "0123456789";
104static const char radhex[] = "0123456789abcdef";
105static const char radHEX[] = "0123456789ABCDEF";
106
107void
108syslog_printf(const char *format, const LOGPAR *p_args, void (*putc)(char))
109{
110 char c;
111 uint_t width;
112 bool_t padzero;
113 LOGPAR val;
114 const char *str;
115
116 while ((c = *format++) != '\0') {
117 if (c != '%') {
118 (*putc)(c);
119 continue;
120 }
121
122 width = 0U;
123 padzero = false;
124 if ((c = *format++) == '0') {
125 padzero = true;
126 c = *format++;
127 }
128 while ('0' <= c && c <= '9') {
129 width = width * 10U + c - '0';
130 c = *format++;
131 }
132 if (c == 'l' || c == 't' || c == 'T') {
133 c = *format++;
134 }
135 switch (c) {
136 case 'd':
137 val = (LOGPAR)(*p_args++);
138 if (val >= 0) {
139 convert((ULOGPAR) val, 10U, raddec,
140 width, false, padzero, putc);
141 }
142 else {
143 convert((ULOGPAR)(-val), 10U, raddec,
144 width, true, padzero, putc);
145 }
146 break;
147 case 'u':
148 val = (LOGPAR)(*p_args++);
149 convert((ULOGPAR) val, 10U, raddec, width, false, padzero, putc);
150 break;
151 case 'x':
152 case 'p':
153 val = (LOGPAR)(*p_args++);
154 convert((ULOGPAR) val, 16U, radhex, width, false, padzero, putc);
155 break;
156 case 'X':
157 val = (LOGPAR)(*p_args++);
158 convert((ULOGPAR) val, 16U, radHEX, width, false, padzero, putc);
159 break;
160 case 'c':
161 (*putc)((char)(LOGPAR)(*p_args++));
162 break;
163 case 's':
164 str = (const char *)(*p_args++);
165 while ((c = *str++) != '\0') {
166 (*putc)(c);
167 }
168 break;
169 case '%':
170 (*putc)('%');
171 break;
172 case '\0':
173 format--;
174 break;
175 default:
176 break;
177 }
178 }
179}
180
181/*
182 * ログ情
183報の出力
184 */
185void
186syslog_print(const SYSLOG *p_syslog, void (*putc)(char))
187{
188 switch (p_syslog->logtype) {
189 case LOG_TYPE_COMMENT:
190 syslog_printf((const char *)(p_syslog->logpar[0]),
191 &(p_syslog->logpar[1]), putc);
192 break;
193 case LOG_TYPE_ASSERT:
194 syslog_printf("%s:%u: Assertion `%s' failed.",
195 &(p_syslog->logpar[0]), putc);
196 break;
197 default:
198 /*
199 * 他の種別のログ情
200報には対応していない.
201 */
202 break;
203 }
204}
205
206/*
207 * ログ情
208報喪失メッセージの出力
209 */
210void
211syslog_lostmsg(uint_t lostlog, void (*putc)(char))
212{
213 LOGPAR lostinfo[1];
214
215 lostinfo[0] = (LOGPAR) lostlog;
216 syslog_printf("%d messages are lost.", lostinfo, putc);
217 (*putc)('\n');
218}
Note: See TracBrowser for help on using the repository browser.