source: azure_iot_hub_riscv/trunk/asp_baseplatform/monitor/stdio/printf.c@ 453

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

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.8 KB
Line 
1/*
2 * TOPPERS/JSP/ASP/FMP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2019 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
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$
42 */
43
44/*
45 * printf代用プログラム
46 */
47
48#include <itron.h>
49#include <stdarg.h>
50#include <stdio.h>
51
52/*
53 * long型から変換される文字列の最大サイズを計算
54 */
55#define CONVERT_BUFLEN ((sizeof(unsigned long) * CHAR_BIT + 4) / 3)
56
57/*
58 * 数値を文字列に変換
59 */
60static int
61convert(unsigned long val, int radix, const char *radchar, int width, int minus, int padzero,
62 void (*putsub)(char c, char **p), char ** putbuf)
63{
64 char buf[CONVERT_BUFLEN];
65 int i, j;
66 int count = 0;
67
68 i = 0;
69 do {
70 buf[i++] = radchar[val % radix];
71 val /= radix;
72 } while (i < CONVERT_BUFLEN && val != 0);
73
74 width -= minus;
75 if (minus > 0 && padzero > 0) {
76 putsub('-', putbuf);
77 count++;
78 }
79 for (j = i; j < width; j++) {
80 putsub((char)(padzero > 0 ? '0' : ' '), putbuf);
81 count++;
82 }
83 if (minus > 0 && padzero <= 0) {
84 putsub('-', putbuf);
85 count++;
86 }
87 while (i > 0) {
88 putsub(buf[--i], putbuf);
89 count++;
90 }
91 return count;
92}
93
94/*
95 * ログ情報フォーマット用ライブラリ関数
96 */
97static char const raddec[] = "0123456789";
98static char const radhex[] = "0123456789abcdef";
99static char const radHEX[] = "0123456789ABCDEF";
100
101int _setformat (void (*putsub)(char c, char **p), char ** putbuf, const char * format, va_list ap)
102{
103 int c;
104 int count = 0;
105 int width;
106 int padzero;
107 int precision;
108 long val;
109 char const *str;
110
111 while ((c = *format++) != '\0') {
112 if (c != '%') {
113 putsub((char) c, putbuf);
114 count++;
115 continue;
116 }
117
118 width = padzero = precision = 0;
119 if ((c = *format++) == '0') {
120 padzero = 1;
121 c = *format++;
122 }
123 else if (c == '.') {
124 precision = 1;
125 c = *format++;
126 }
127 while ('0' <= c && c <= '9') {
128 width = width*10 + c - '0';
129 c = *format++;
130 }
131 switch (c) {
132 case 'l': /* long */
133 c = *format++;
134 switch (c) {
135 case 'd': /* long 10進整数 */
136 case 'i': /* long 8,10,16進整数 */
137 val = (long) va_arg(ap, long);
138 if (val >= 0)
139 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
140 else
141 count += convert(-val, 10, raddec, width, 1, padzero, putsub, putbuf);
142 break;
143 case 'u': /* unsigned long 10進整数 */
144 val = (long) va_arg(ap, unsigned long);
145 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
146 break;
147 case 'o': /* unsigned long 8進整数 */
148 val = (long) va_arg(ap, unsigned long);
149 count += convert(val, 8, raddec, width, 0, padzero, putsub, putbuf);
150 break;
151 case 'x': /* unsigned long 16進整数 */
152 val = (long) va_arg(ap, unsigned long);
153 count += convert(val, 16, radhex, width, 0, padzero, putsub, putbuf);
154 break;
155 case 'X': /* unsigned long 大文字16進整数 */
156 val = (long) va_arg(ap, unsigned long);
157 count += convert(val, 16, radHEX, width, 0, padzero, putsub, putbuf);
158 break;
159 case '\0':
160 format--;
161 break;
162 }
163 break;
164
165 case 'h': /* short */
166 c = *format++;
167 switch (c) {
168 case 'd': /* short 8進整数 */
169 case 'i': /* short 8,10,16進整数 */
170 val = (long) ((short)va_arg(ap, int));
171 if (val >= 0)
172 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
173 else
174 count += convert(-val, 10, raddec, width, 1, padzero, putsub, putbuf);
175 break;
176 case 'u': /* unsigned short 10進整数 */
177 val = (long) ((unsigned short)va_arg(ap, unsigned int));
178 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
179 break;
180 case 'o': /* unsigned short 8進整数 */
181 val = (long) ((unsigned short)va_arg(ap, unsigned int));
182 count += convert(val, 8, raddec, width, 0, padzero, putsub, putbuf);
183 break;
184 case 'x': /* unsigned short 16進整数 */
185 val = (long) ((unsigned short)va_arg(ap, unsigned int));
186 count += convert(val, 16, radhex, width, 0, padzero, putsub, putbuf);
187 break;
188 case 'X': /* unsigned short 大文字16進整数 */
189 val = (long) ((unsigned short)va_arg(ap, unsigned int));
190 count += convert(val, 16, radHEX, width, 0, padzero, putsub, putbuf);
191 break;
192 case '\0':
193 format--;
194 break;
195 }
196 break;
197 case 'd': /* int 10進整数 */
198 case 'i': /* int 8,10,16進整数 */
199 val = (long) va_arg(ap, int);
200 if (val >= 0)
201 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
202 else
203 count += convert(-val, 10, raddec, width, 1, padzero, putsub, putbuf);
204 break;
205 case 'u': /* unsigned int 10進整数 */
206 val = (long) va_arg(ap, unsigned int);
207 count += convert(val, 10, raddec, width, 0, padzero, putsub, putbuf);
208 break;
209 case 'o': /* unsigned int 8進整数 */
210 val = (long) va_arg(ap, unsigned int);
211 count += convert(val, 8, raddec, width, 0, padzero, putsub, putbuf);
212 break;
213 case 'p':
214 case 'x': /* unsigned int 16進整数 */
215 val = (long) va_arg(ap, unsigned int);
216 count += convert(val, 16, radhex, width, 0, padzero, putsub, putbuf);
217 break;
218 case 'X': /* unsigned int 大文字16進整数 */
219 val = (long) va_arg(ap, unsigned int);
220 count += convert(val, 16, radHEX, width, 0, padzero, putsub, putbuf);
221 break;
222
223 case 'c': /* 1バイト文字 */
224 c = (int) va_arg(ap, unsigned int);
225 putsub((char)(int)c, putbuf);
226 count++;
227 break;
228 case 's': /* 文字列 */
229 str = (char const *) va_arg(ap, VP_INT);
230 if (width > 0) {
231 while (((c = *str++) != '\0') && (width > 0)) {
232 putsub((char) c, putbuf);
233 count++;
234 width--;
235 }
236 while (width > 0) {
237 putsub(' ', putbuf);
238 count++;
239 width--;
240 }
241 }
242 else {
243 while ((c = *str++) != '\0') {
244 putsub((char) c, putbuf);
245 count++;
246 }
247 }
248 break;
249 case '%':
250 putsub('%', putbuf);
251 count++;
252 break;
253 case '\0':
254 format--;
255 break;
256 }
257 }
258 return count;
259}
260
261static void putzi (char c, char ** p)
262{
263 putchar(c);
264}
265
266int printf (const char * format, ...)
267{
268 va_list args;
269 va_start(args, format);
270 int ret = (_setformat(putzi, NULL, format, args));
271 va_end(args);
272 return ret;
273}
274
275
276int vprintf (const char * format, va_list args)
277{
278 return (_setformat(putzi, NULL, format, args));
279}
280
Note: See TracBrowser for help on using the repository browser.