source: UsbWattMeter/trunk/asp_dcre/library/log_output.c@ 167

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

MIMEにSJISを設定

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