source: uKadecot/trunk/ssp/syssvc/log_output.c@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 5.1 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-2008 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2015 by Naoki Saito
10 * Nagoya Municipal Industrial Research Institute, JAPAN
11 *
12 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * @(#) $Id: log_output.c 108 2015-06-11 09:15:46Z coas-nagasima $
42 */
43
44/*
45 * システムログのフォーマット出力
46 */
47
48#include <t_stddef.h>
49#include <t_syslog.h>
50
51/*
52 * 数値を文字列に変換
53 */
54#define CONVERT_BUFLEN ((sizeof(uintptr_t) * CHAR_BIT + 2) / 3)
55 /* uintptr_t型の数値の最大文字数 */
56static void
57convert(uintptr_t val, uint_t radix, const char *radchar,
58 uint_t width, bool_t minus, bool_t padzero, void (*putc)(char))
59{
60 char buf[CONVERT_BUFLEN];
61 uint_t i, j;
62
63 i = 0U;
64 do {
65 buf[i++] = radchar[val % radix];
66 val /= radix;
67 } while (i < CONVERT_BUFLEN && val != 0);
68
69 if (minus && width > 0U) {
70 width -= 1U;
71 }
72 if (minus && padzero) {
73 (*putc)('-');
74 }
75 for (j = i; j < width; j++) {
76 (*putc)((char)(padzero ? '0' : ' '));
77 }
78 if (minus && !padzero) {
79 (*putc)('-');
80 }
81 while (i > 0U) {
82 (*putc)(buf[--i]);
83 }
84}
85
86/*
87 * 文字列整形出力
88 */
89static const char raddec[] = "0123456789";
90static const char radhex[] = "0123456789abcdef";
91static const char radHEX[] = "0123456789ABCDEF";
92
93void
94syslog_printf(const char *format, const intptr_t *p_args, void (*putc)(char))
95{
96 char c;
97 uint_t width;
98 bool_t padzero;
99 intptr_t val;
100 const char *str;
101
102 while ((c = *format++) != '\0') {
103 if (c != '%') {
104 (*putc)(c);
105 continue;
106 }
107
108 width = 0U;
109 padzero = false;
110 if ((c = *format++) == '0') {
111 padzero = true;
112 c = *format++;
113 }
114 while ('0' <= c && c <= '9') {
115 width = width * 10U + c - '0';
116 c = *format++;
117 }
118 if (c == 'l') {
119 c = *format++;
120 }
121 switch (c) {
122 case 'd':
123 val = (intptr_t)(*p_args++);
124 if (val >= 0) {
125 convert((uintptr_t) val, 10U, raddec,
126 width, false, padzero, putc);
127 }
128 else {
129 convert((uintptr_t)(-val), 10U, raddec,
130 width, true, padzero, putc);
131 }
132 break;
133 case 'u':
134 val = (intptr_t)(*p_args++);
135 convert((uintptr_t) val, 10U, raddec, width, false, padzero, putc);
136 break;
137 case 'x':
138 case 'p':
139 val = (intptr_t)(*p_args++);
140 convert((uintptr_t) val, 16U, radhex, width, false, padzero, putc);
141 break;
142 case 'X':
143 val = (intptr_t)(*p_args++);
144 convert((uintptr_t) val, 16U, radHEX, width, false, padzero, putc);
145 break;
146 case 'c':
147 (*putc)((char)(intptr_t)(*p_args++));
148 break;
149 case 's':
150 str = (const char *)(*p_args++);
151 while ((c = *str++) != '\0') {
152 (*putc)(c);
153 }
154 break;
155 case '%':
156 (*putc)('%');
157 break;
158 case '\0':
159 format--;
160 break;
161 default:
162 break;
163 }
164 }
165}
166
167/*
168 * ログ情報の出力
169 */
170void
171syslog_print(const SYSLOG *p_syslog, void (*putc)(char))
172{
173 switch (p_syslog->logtype) {
174 case LOG_TYPE_COMMENT:
175 syslog_printf((const char *)(p_syslog->loginfo[0]),
176 &(p_syslog->loginfo[1]), putc);
177 break;
178 case LOG_TYPE_ASSERT:
179 syslog_printf("%s:%u: Assertion `%s' failed.",
180 &(p_syslog->loginfo[0]), putc);
181 break;
182 default:
183 // 不明な種別の場合は,何もしない
184 break;
185 }
186}
187
188/*
189 * ログ情報喪失メッセージの出力
190 */
191void
192syslog_lostmsg(uint_t lost, void (*putc)(char))
193{
194 intptr_t lostinfo[1];
195
196 lostinfo[0] = (intptr_t) lost;
197 syslog_printf("%d messages are lost.", lostinfo, putc);
198 (*putc)('\n');
199}
Note: See TracBrowser for help on using the repository browser.