source: UsbWattMeter/trunk/ecnl_lwip/fbs_string.c@ 473

Last change on this file since 473 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.5 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 * Copyright (C) 2015 Cores Co., Ltd. Japan
10 *
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * @(#) $Id: fbs_string.c 167 2016-03-08 11:37:45Z coas-nagasima $
41 */
42
43#include <stdint.h>
44#include <limits.h>
45#include <stdarg.h>
46#include "fbs_string.h"
47
48/*
49 * 数値を文字列に変換
50 */
51#define CONVERT_BUFLEN ((sizeof(uintptr_t) * CHAR_BIT + 2) / 3)
52 /* uintptr_t型の数値の最大文字数 */
53static ER
54convert(ECN_FBS_ID fbs, ECN_FBS_SSIZE_T *pos, uintptr_t val, uint_t radix, const char *radchar,
55 uint_t width, bool_t minus, bool_t padzero)
56{
57 char buf[CONVERT_BUFLEN];
58 uint_t i, j;
59 ER ret;
60
61 i = 0U;
62 do {
63 buf[i++] = radchar[val % radix];
64 val /= radix;
65 } while (i < CONVERT_BUFLEN && val != 0);
66
67 if (minus && width > 0) {
68 width -= 1;
69 }
70 if (minus && padzero) {
71 ret = _ecn_fbs_poke(fbs, *pos, '-');
72 if(ret != E_OK)
73 return ret;
74 (*pos)++;
75 }
76 for (j = i; j < width; j++) {
77 ret = _ecn_fbs_poke(fbs, *pos, padzero ? '0' : ' ');
78 if(ret != E_OK)
79 return ret;
80 (*pos)++;
81 }
82 if (minus && !padzero) {
83 ret = _ecn_fbs_poke(fbs, *pos, '-');
84 if(ret != E_OK)
85 return ret;
86 (*pos)++;
87 }
88 while (i > 0U) {
89 ret = _ecn_fbs_poke(fbs, *pos, buf[--i]);
90 if(ret != E_OK)
91 return ret;
92 (*pos)++;
93 }
94 return E_OK;
95}
96
97/*
98 * 文字列整形出力
99 */
100static const char raddec[] = "0123456789";
101static const char radhex[] = "0123456789abcdef";
102static const char radHEX[] = "0123456789ABCDEF";
103
104ECN_FBS_SSIZE_T
105fbs_printf(ECN_FBS_ID fbs, ECN_FBS_SSIZE_T *pos, const char *format, ...)
106{
107 char c;
108 bool_t lflag;
109 uint_t width;
110 bool_t padzero;
111 intptr_t val;
112 const char *str, *head;
113 va_list ap;
114 ER ret;
115
116 va_start(ap, format);
117
118 while ((c = *format++) != '\0') {
119 if (c != '%') {
120 ret = _ecn_fbs_poke(fbs, *pos, c);
121 if (ret != E_OK)
122 return ret;
123 (*pos)++;
124 continue;
125 }
126
127 lflag = false;
128 width = 0U;
129 padzero = false;
130 if ((c = *format++) == '0') {
131 padzero = true;
132 c = *format++;
133 }
134 while ('0' <= c && c <= '9') {
135 width = width * 10U + c - '0';
136 c = *format++;
137 }
138 if (c == 'l') {
139 lflag = true;
140 c = *format++;
141 }
142 switch (c) {
143 case 'd':
144 val = lflag ? (intptr_t) va_arg(ap, long_t)
145 : (intptr_t) va_arg(ap, int_t);
146 if (val >= 0) {
147 ret = convert(fbs, pos, (uintptr_t) val, 10U, raddec,
148 width, false, padzero);
149 if (ret != E_OK)
150 return ret;
151 }
152 else {
153 ret = convert(fbs, pos, (uintptr_t)(-val), 10U, raddec,
154 width, true, padzero);
155 if (ret != E_OK)
156 return ret;
157 }
158 break;
159 case 'u':
160 val = lflag ? (intptr_t) va_arg(ap, ulong_t)
161 : (intptr_t) va_arg(ap, uint_t);
162 ret = convert(fbs, pos, (uintptr_t) val, 10U, raddec, width, false, padzero);
163 if (ret != E_OK)
164 return ret;
165 break;
166 case 'x':
167 case 'p':
168 val = lflag ? (intptr_t) va_arg(ap, ulong_t)
169 : (intptr_t) va_arg(ap, uint_t);
170 ret = convert(fbs, pos, (uintptr_t) val, 16U, radhex, width, false, padzero);
171 if (ret != E_OK)
172 return ret;
173 break;
174 case 'X':
175 val = (intptr_t)va_arg(ap, void *);
176 ret = convert(fbs, pos, (uintptr_t) val, 16U, radHEX, width, false, padzero);
177 if (ret != E_OK)
178 return ret;
179 break;
180 case 'c':
181 ret = _ecn_fbs_poke(fbs, *pos, (char)(intptr_t)va_arg(ap, int));
182 if (ret != E_OK)
183 return ret;
184 (*pos)++;
185 break;
186 case 's':
187 str = head = (const char *)va_arg(ap, const char *);
188 while ((c = *str++) != '\0') {
189 ret = _ecn_fbs_poke(fbs, *pos, c);
190 if (ret != E_OK)
191 return ret;
192 (*pos)++;
193 }
194 break;
195 case '%':
196 ret = _ecn_fbs_poke(fbs, *pos, '%');
197 if (ret != E_OK)
198 return ret;
199 (*pos)++;
200 break;
201 case '\0':
202 format--;
203 break;
204 default:
205 break;
206 }
207 }
208 va_end(ap);
209
210 return E_OK;
211}
Note: See TracBrowser for help on using the repository browser.