source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/stdio/scanf.c@ 457

Last change on this file since 457 was 457, 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.5 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2003-2006 by Ryosuke Takeuchi
9 * GJ Business Division RICOH COMPANY,LTD. JAPAN
10 *
11 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
12 * によって公表されている GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
15 * 利用と呼ぶ)することを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
25 * と.
26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
29 * 報告すること.
30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
35 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
36 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
37 *
38 * @(#) $Id$
39 */
40
41/*
42 * scanf代用プログラム
43 */
44
45#include <stdarg.h>
46#include <stdio.h>
47
48typedef void *VP; /* 型が定まらないものへのポインタ */
49typedef VP VP_INT; /* VP または INT */
50
51#define BOOL int
52#define TRUE 1
53#define FALSE 0
54#define FHALF 0
55#define FINT 1
56#define FLONG 2
57
58static BOOL is_terminator(char c)
59{
60 if(c == '\0')
61 return TRUE;
62 else if(c == '\r' || c == '\n' || c == 0xc)
63 return TRUE;
64 else
65 return FALSE;
66}
67
68/*
69 * 文字列を数値に変換
70 */
71static int
72convert(VP_INT p, int radix, int padzero, int width, int minus, int (*getsub)(char **p), char ** getbuf, int type)
73{
74 char c;
75 int i;
76 unsigned long val = 0;
77 int count = 0;
78 int csign = 0;
79
80 if(width <= 0)
81 width = 64;
82 c = getsub(getbuf); /* get first character */
83 if(is_terminator((char)c))
84 return count;
85 if(c < '0' || (c > '9' && c < 'A')
86 || (c > 'Z' && c < 'a') || c > 'z'){
87 c = getsub(getbuf);
88 if(is_terminator((char)c))
89 return count;
90 }
91
92 while(c == ' ' || c == '\t'){ /* skip white space */
93 c = getsub(getbuf);
94 if(is_terminator((char)c))
95 return count;
96 }
97
98 if(padzero && c == '0'){ /* skip pad zero */
99 do{
100 c = getsub(getbuf);
101 if(is_terminator((char)c))
102 return count;
103 }while(c == '0');
104 }
105 for( ; !is_terminator((char)c) ; c = getsub(getbuf), width--){
106 if(c == '\t' || c == ' ' || c == ',')
107 break;
108 i = 0;
109 if(c == '-' && minus){
110 csign = 1;
111 width++;
112 }
113 else if(c >= '0' && c <= '9')
114 i = c - '0';
115 else if(c >= 'A' && c <= 'Z')
116 i = c - 'A' + 10;
117 else if(c >= 'a' && c <= 'z')
118 i = c - 'a' + 10;
119 else
120 continue;
121
122 if(i >= radix)
123 i = radix - 1;
124 val = val * radix + i;
125 count = 1;
126 if(width <= 1)
127 break;
128 }
129 if(csign)
130 val = (unsigned long)((long)val * -1);
131
132 switch(type){
133 case FHALF:
134 *((unsigned short *)p) = (unsigned short)val;
135 break;
136 case FLONG:
137 *((unsigned long *)p) = (unsigned long)val;
138 break;
139 default:
140 *((unsigned int *)p) = (unsigned int)val;
141 break;
142 }
143 return count;
144}
145
146
147/*
148 * データ取り込みライブラリ関数
149 */
150
151int _getformat (int (*getsub)(char **p), char ** getbuf, const char * format, va_list ap)
152{
153 int c;
154 int count = 0;
155 int width;
156 int padzero;
157 VP_INT val;
158 char *str;
159
160 while ((c = *format++) != '\0') {
161 if (c != '%') {
162 continue;
163 }
164
165 width = padzero = 0;
166 c = *format++;
167 if (c >= '1' && c <= '9') {
168 padzero = 1;
169 }
170 while (c >= '0' && c <= '9') {
171 width = width*10 + c - '0';
172 c = *format++;
173 }
174 switch (c) {
175 case 'l': /* long */
176 c = *format++;
177 switch (c) {
178 case 'd': /* long 10進整数 */
179 case 'i': /* long 8,10,16進整数 */
180 val = (VP_INT) va_arg(ap, VP_INT);
181 count += convert(val, 10, padzero, width, 1, getsub, getbuf, FLONG);
182 break;
183 case 'u': /* unsigned long 10進整数 */
184 val = (VP_INT) va_arg(ap, VP_INT);
185 count += convert(val, 10, padzero, width, 0, getsub, getbuf, FLONG);
186 break;
187 case 'o': /* unsigned long 8進整数 */
188 val = (VP_INT) va_arg(ap, VP_INT);
189 count += convert(val, 8, padzero, width, 0, getsub, getbuf, FLONG);
190 break;
191 case 'x': /* unsigned long 16進整数 */
192 val = (VP_INT) va_arg(ap, VP_INT);
193 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FLONG);
194 break;
195 case 'X': /* unsigned long 大文字16進整数 */
196 val = (VP_INT) va_arg(ap, VP_INT);
197 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FLONG);
198 break;
199 case '\0':
200 format--;
201 break;
202 }
203 break;
204 case 'h': /* short */
205 c = *format++;
206 switch (c) {
207 case 'd': /* short 8進整数 */
208 case 'i': /* short 8,10,16進整数 */
209 val = (VP_INT) va_arg(ap, VP_INT);
210 count += convert(val, 10, padzero, width, 1, getsub, getbuf, FHALF);
211 break;
212 case 'u': /* unsigned short 10進整数 */
213 val = (VP_INT) va_arg(ap, VP_INT);
214 count += convert(val, 10, padzero, width, 0, getsub, getbuf, FHALF);
215 break;
216 case 'o': /* unsigned short 8進整数 */
217 val = (VP_INT) va_arg(ap, VP_INT);
218 count += convert(val, 8, padzero, width, 0, getsub, getbuf, FHALF);
219 break;
220 case 'x': /* unsigned short 16進整数 */
221 val = (VP_INT) va_arg(ap, VP_INT);
222 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FHALF);
223 break;
224 case 'X': /* unsigned short 大文字16進整数 */
225 val = (VP_INT) va_arg(ap, VP_INT);
226 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FHALF);
227 break;
228 case '\0':
229 format--;
230 break;
231 }
232 break;
233 case 'd': /* int 10進整数 */
234 case 'i': /* int 8,10,16進整数 */
235 val = (VP_INT) va_arg(ap, VP_INT);
236 count += convert(val, 10, padzero, width, 1, getsub, getbuf, FINT);
237 break;
238 case 'u': /* unsigned int 10進整数 */
239 val = (VP_INT) va_arg(ap, VP_INT);
240 count += convert(val, 10, padzero, width, 0, getsub, getbuf, FINT);
241 break;
242 case 'o': /* unsigned int 8進整数 */
243 val = (VP_INT) va_arg(ap, VP_INT);
244 count += convert(val, 8, padzero, width, 0, getsub, getbuf, FINT);
245 break;
246 case 'x': /* unsigned int 16進整数 */
247 val = (VP_INT) va_arg(ap, VP_INT);
248 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FINT);
249 break;
250 case 'X': /* unsigned int 大文字16進整数 */
251 val = (VP_INT) va_arg(ap, VP_INT);
252 count += convert(val, 16, padzero, width, 0, getsub, getbuf, FINT);
253 break;
254
255 case 'c': /* 1バイト文字 */
256 str = (char *) va_arg(ap, VP_INT);
257 *str = getsub(getbuf);
258 count++;
259 break;
260 case 's': /* 文字列 */
261 str = (char *) va_arg(ap, VP_INT);
262 do{
263 c = getsub(getbuf);
264 if(c == ' ' || c == '\t')
265 break;
266 if(is_terminator((char)c))
267 break;
268 if(width > 0)
269 *str++ = c;
270 width--;
271 }while(c != '\0');
272 *str = '\0';
273 count++;
274 break;
275 case '\0':
276 format--;
277 break;
278 default:
279 break;
280 }
281 }
282 return count;
283}
284
285static int getzi (char ** p)
286{
287 return getchar();
288}
289
290int scanf (const char * format, ...)
291{
292 va_list args;
293 va_start(args, format);
294 return (_getformat(getzi, NULL, format, args));
295}
296
297
Note: See TracBrowser for help on using the repository browser.