print.h

Committer:
kurobikari
Date:
Mon Apr 06 13:08:23 2020 +0000
Revision:
0:8164d2af3edf
print.h;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kurobikari 0:8164d2af3edf 1 #include "mbed.h"
kurobikari 0:8164d2af3edf 2 #include "print.h"
kurobikari 0:8164d2af3edf 3 #include "Serial.h"
kurobikari 0:8164d2af3edf 4 #include <stdarg.h>
kurobikari 0:8164d2af3edf 5
kurobikari 0:8164d2af3edf 6 uint8_t st[100]={0};
kurobikari 0:8164d2af3edf 7 int size=0;
kurobikari 0:8164d2af3edf 8
kurobikari 0:8164d2af3edf 9
kurobikari 0:8164d2af3edf 10 Print::Print(PinName Tx, PinName Rx)
kurobikari 0:8164d2af3edf 11 {
kurobikari 0:8164d2af3edf 12 print_f = new Serial(Tx,Rx);
kurobikari 0:8164d2af3edf 13 print_f -> baud(19200);
kurobikari 0:8164d2af3edf 14
kurobikari 0:8164d2af3edf 15 }
kurobikari 0:8164d2af3edf 16
kurobikari 0:8164d2af3edf 17
kurobikari 0:8164d2af3edf 18 void Print::ISR_Serial_Tx()
kurobikari 0:8164d2af3edf 19 {
kurobikari 0:8164d2af3edf 20 static int position=0,TxPosition=0;
kurobikari 0:8164d2af3edf 21
kurobikari 0:8164d2af3edf 22 switch(TxPosition){
kurobikari 0:8164d2af3edf 23 case 0:
kurobikari 0:8164d2af3edf 24
kurobikari 0:8164d2af3edf 25 print_f->putc('T');
kurobikari 0:8164d2af3edf 26 TxPosition++;
kurobikari 0:8164d2af3edf 27 break;
kurobikari 0:8164d2af3edf 28
kurobikari 0:8164d2af3edf 29 case 1:
kurobikari 0:8164d2af3edf 30 print_f->putc(st[position++]);
kurobikari 0:8164d2af3edf 31 if(position>size)
kurobikari 0:8164d2af3edf 32 TxPosition++;
kurobikari 0:8164d2af3edf 33 break;
kurobikari 0:8164d2af3edf 34
kurobikari 0:8164d2af3edf 35 case 2:
kurobikari 0:8164d2af3edf 36 /* UART送信の割り込みイベント解除 */
kurobikari 0:8164d2af3edf 37 print_f -> attach(NULL,Serial::TxIrq);
kurobikari 0:8164d2af3edf 38 position=0;
kurobikari 0:8164d2af3edf 39 TxPosition=0;
kurobikari 0:8164d2af3edf 40 size=0;
kurobikari 0:8164d2af3edf 41 break;
kurobikari 0:8164d2af3edf 42 }
kurobikari 0:8164d2af3edf 43 }
kurobikari 0:8164d2af3edf 44
kurobikari 0:8164d2af3edf 45
kurobikari 0:8164d2af3edf 46 void Print::printf(const char* Format, ...)
kurobikari 0:8164d2af3edf 47 {
kurobikari 0:8164d2af3edf 48 static uint16_t string_size = 0;
kurobikari 0:8164d2af3edf 49
kurobikari 0:8164d2af3edf 50
kurobikari 0:8164d2af3edf 51 va_list ArgList;
kurobikari 0:8164d2af3edf 52 va_start(ArgList, Format);
kurobikari 0:8164d2af3edf 53
kurobikari 0:8164d2af3edf 54 print_f -> attach(this,&Print::ISR_Serial_Tx,Serial::TxIrq);
kurobikari 0:8164d2af3edf 55
kurobikari 0:8164d2af3edf 56 while (*Format != '\0')
kurobikari 0:8164d2af3edf 57 {
kurobikari 0:8164d2af3edf 58 if (*Format == '%')
kurobikari 0:8164d2af3edf 59 {
kurobikari 0:8164d2af3edf 60 /* 0表示のフラグ */
kurobikari 0:8164d2af3edf 61 uint8_t zero_flag = 0;
kurobikari 0:8164d2af3edf 62 /* 符号表示フラグ */
kurobikari 0:8164d2af3edf 63 uint8_t sign_flag = 0;
kurobikari 0:8164d2af3edf 64 /* 左詰め表示フラグ*/
kurobikari 0:8164d2af3edf 65 uint8_t left_flag = 0;
kurobikari 0:8164d2af3edf 66
kurobikari 0:8164d2af3edf 67 /* 全体幅 */
kurobikari 0:8164d2af3edf 68 int16_t o_width = 0;
kurobikari 0:8164d2af3edf 69 /* 小数点以下の幅 */
kurobikari 0:8164d2af3edf 70 int16_t dp_width = -1;
kurobikari 0:8164d2af3edf 71
kurobikari 0:8164d2af3edf 72 /* 引数のデータ幅 */
kurobikari 0:8164d2af3edf 73 int16_t arg_width = 1;
kurobikari 0:8164d2af3edf 74
kurobikari 0:8164d2af3edf 75 Format++;
kurobikari 0:8164d2af3edf 76
kurobikari 0:8164d2af3edf 77 /* 0埋め,+表示,左詰め処理 */
kurobikari 0:8164d2af3edf 78 while (1)
kurobikari 0:8164d2af3edf 79 {
kurobikari 0:8164d2af3edf 80 /* 半角スペースは例外処理 */
kurobikari 0:8164d2af3edf 81 if (*Format == ' ');
kurobikari 0:8164d2af3edf 82 else if (*Format == '0')
kurobikari 0:8164d2af3edf 83 {
kurobikari 0:8164d2af3edf 84 zero_flag = 1;
kurobikari 0:8164d2af3edf 85 }
kurobikari 0:8164d2af3edf 86 else if (*Format == '+')
kurobikari 0:8164d2af3edf 87 {
kurobikari 0:8164d2af3edf 88 sign_flag = 1;
kurobikari 0:8164d2af3edf 89 }
kurobikari 0:8164d2af3edf 90 else if (*Format == '-')
kurobikari 0:8164d2af3edf 91 {
kurobikari 0:8164d2af3edf 92 left_flag = 1;
kurobikari 0:8164d2af3edf 93 }
kurobikari 0:8164d2af3edf 94 /* 処理は存在しない */
kurobikari 0:8164d2af3edf 95 else
kurobikari 0:8164d2af3edf 96 {
kurobikari 0:8164d2af3edf 97 break;
kurobikari 0:8164d2af3edf 98 }
kurobikari 0:8164d2af3edf 99
kurobikari 0:8164d2af3edf 100 /* 処理が存在した */
kurobikari 0:8164d2af3edf 101 /* 調査する文字を次へ */
kurobikari 0:8164d2af3edf 102 Format++;
kurobikari 0:8164d2af3edf 103 }
kurobikari 0:8164d2af3edf 104
kurobikari 0:8164d2af3edf 105 /* 全体幅処理 */
kurobikari 0:8164d2af3edf 106 while (1)
kurobikari 0:8164d2af3edf 107 {
kurobikari 0:8164d2af3edf 108 /* 半角スペースは例外処理 */
kurobikari 0:8164d2af3edf 109 if (*Format == ' ');
kurobikari 0:8164d2af3edf 110 else if ((*Format >= '0' && *Format <= '9'))
kurobikari 0:8164d2af3edf 111 {
kurobikari 0:8164d2af3edf 112 /* 既に入っている数値の桁数を上げる */
kurobikari 0:8164d2af3edf 113 o_width *= 10;
kurobikari 0:8164d2af3edf 114 /* 文字を整数値に直して加算 */
kurobikari 0:8164d2af3edf 115 o_width += (*Format - '0');
kurobikari 0:8164d2af3edf 116 }
kurobikari 0:8164d2af3edf 117 /* 処理は存在しない */
kurobikari 0:8164d2af3edf 118 else
kurobikari 0:8164d2af3edf 119 {
kurobikari 0:8164d2af3edf 120 break;
kurobikari 0:8164d2af3edf 121 }
kurobikari 0:8164d2af3edf 122
kurobikari 0:8164d2af3edf 123 /* 処理が存在した */
kurobikari 0:8164d2af3edf 124 /* 調査する文字を次へ */
kurobikari 0:8164d2af3edf 125 Format++;
kurobikari 0:8164d2af3edf 126 }
kurobikari 0:8164d2af3edf 127
kurobikari 0:8164d2af3edf 128 /* ピリオドを打っていた場合 */
kurobikari 0:8164d2af3edf 129 if (*Format == '.')
kurobikari 0:8164d2af3edf 130 {
kurobikari 0:8164d2af3edf 131 /*調査する文字を次へ*/
kurobikari 0:8164d2af3edf 132 Format++;
kurobikari 0:8164d2af3edf 133
kurobikari 0:8164d2af3edf 134 /* ピリオド打ちによる操作有効 */
kurobikari 0:8164d2af3edf 135 dp_width = 0;
kurobikari 0:8164d2af3edf 136
kurobikari 0:8164d2af3edf 137 /* 最大幅または小数点以下幅処理 */
kurobikari 0:8164d2af3edf 138 while (1)
kurobikari 0:8164d2af3edf 139 {
kurobikari 0:8164d2af3edf 140 /* 半角スペースは例外処理 */
kurobikari 0:8164d2af3edf 141 if (*Format == ' ');
kurobikari 0:8164d2af3edf 142 else if ((*Format >= '0' && *Format <= '9'))
kurobikari 0:8164d2af3edf 143 {
kurobikari 0:8164d2af3edf 144 /* 既に入っている数値の桁数を上げる */
kurobikari 0:8164d2af3edf 145 dp_width *= 10;
kurobikari 0:8164d2af3edf 146 /* 文字を整数値に直して加算 */
kurobikari 0:8164d2af3edf 147 dp_width += (*Format - '0');
kurobikari 0:8164d2af3edf 148 }
kurobikari 0:8164d2af3edf 149 /* 処理は存在しない */
kurobikari 0:8164d2af3edf 150 else
kurobikari 0:8164d2af3edf 151 {
kurobikari 0:8164d2af3edf 152 break;
kurobikari 0:8164d2af3edf 153 }
kurobikari 0:8164d2af3edf 154
kurobikari 0:8164d2af3edf 155 /* 処理が存在した */
kurobikari 0:8164d2af3edf 156 /* 調査する文字を次へ */
kurobikari 0:8164d2af3edf 157 Format++;
kurobikari 0:8164d2af3edf 158 }
kurobikari 0:8164d2af3edf 159 }
kurobikari 0:8164d2af3edf 160
kurobikari 0:8164d2af3edf 161 /* 指定子による出力 */
kurobikari 0:8164d2af3edf 162 /* 整数型数値 */
kurobikari 0:8164d2af3edf 163 if (*Format == 'd')
kurobikari 0:8164d2af3edf 164 {
kurobikari 0:8164d2af3edf 165 /* 引数読み込み */
kurobikari 0:8164d2af3edf 166 int val = va_arg(ArgList, int);
kurobikari 0:8164d2af3edf 167 int work = val;
kurobikari 0:8164d2af3edf 168 /* 桁数を調べる */
kurobikari 0:8164d2af3edf 169 while (work <= -10 || work >= 10)
kurobikari 0:8164d2af3edf 170 {
kurobikari 0:8164d2af3edf 171 work /= 10;
kurobikari 0:8164d2af3edf 172 arg_width++;
kurobikari 0:8164d2af3edf 173 }
kurobikari 0:8164d2af3edf 174
kurobikari 0:8164d2af3edf 175 /* 負の数なら符号表示フラグセット */
kurobikari 0:8164d2af3edf 176 if (val < 0)
kurobikari 0:8164d2af3edf 177 {
kurobikari 0:8164d2af3edf 178 sign_flag = 1;
kurobikari 0:8164d2af3edf 179 }
kurobikari 0:8164d2af3edf 180 /* 指定子にピリオド打ちがあった場合は0埋め有効 */
kurobikari 0:8164d2af3edf 181 if (dp_width != -1)
kurobikari 0:8164d2af3edf 182 {
kurobikari 0:8164d2af3edf 183 zero_flag = 1;
kurobikari 0:8164d2af3edf 184 }
kurobikari 0:8164d2af3edf 185
kurobikari 0:8164d2af3edf 186 /* スペース入力処理 */
kurobikari 0:8164d2af3edf 187 /* 左詰め処理が無ければ数字入力の前に処理 */
kurobikari 0:8164d2af3edf 188 if (left_flag == 0)
kurobikari 0:8164d2af3edf 189 {
kurobikari 0:8164d2af3edf 190 /* スペース幅(全体幅-数値幅,符号も考慮)が存在 かつ */
kurobikari 0:8164d2af3edf 191 /* (0埋め処理なし または 0埋め制限がある場合に限り,0埋めしないスペース幅が存在したら ) */
kurobikari 0:8164d2af3edf 192 /* 以上の場合スペース入力処理ループ */
kurobikari 0:8164d2af3edf 193 while (o_width - arg_width - sign_flag > 0 &&
kurobikari 0:8164d2af3edf 194 (zero_flag == 0 || (dp_width != -1 && o_width - dp_width - sign_flag > 0)))
kurobikari 0:8164d2af3edf 195 {
kurobikari 0:8164d2af3edf 196 /* スペース入力 */
kurobikari 0:8164d2af3edf 197 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 198 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 199 o_width--;
kurobikari 0:8164d2af3edf 200 }
kurobikari 0:8164d2af3edf 201 }
kurobikari 0:8164d2af3edf 202 /* 符号入力,処理 */
kurobikari 0:8164d2af3edf 203 if (sign_flag)
kurobikari 0:8164d2af3edf 204 {
kurobikari 0:8164d2af3edf 205 if (val < 0)
kurobikari 0:8164d2af3edf 206 {
kurobikari 0:8164d2af3edf 207 /* -入力 */
kurobikari 0:8164d2af3edf 208 st[string_size++] = '-';
kurobikari 0:8164d2af3edf 209 /* 数値を絶対値にする */
kurobikari 0:8164d2af3edf 210 val = -val;
kurobikari 0:8164d2af3edf 211 }
kurobikari 0:8164d2af3edf 212 else
kurobikari 0:8164d2af3edf 213 {
kurobikari 0:8164d2af3edf 214 /* +入力 */
kurobikari 0:8164d2af3edf 215 st[string_size++] = '+';
kurobikari 0:8164d2af3edf 216 }
kurobikari 0:8164d2af3edf 217 }
kurobikari 0:8164d2af3edf 218
kurobikari 0:8164d2af3edf 219 /* 0入力処理 */
kurobikari 0:8164d2af3edf 220 /* 0入力幅(全体幅-数値幅,符号も考慮)が存在する場合0入力処理ループ */
kurobikari 0:8164d2af3edf 221 while (dp_width - arg_width > 0)
kurobikari 0:8164d2af3edf 222 {
kurobikari 0:8164d2af3edf 223 /* 0入力 */
kurobikari 0:8164d2af3edf 224 st[string_size++] = '0';
kurobikari 0:8164d2af3edf 225
kurobikari 0:8164d2af3edf 226 /* 0入力制限値を減らす */
kurobikari 0:8164d2af3edf 227 dp_width--;
kurobikari 0:8164d2af3edf 228 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 229 o_width--;
kurobikari 0:8164d2af3edf 230 }
kurobikari 0:8164d2af3edf 231
kurobikari 0:8164d2af3edf 232 /* 引数データ幅分文字列データ幅加算 */
kurobikari 0:8164d2af3edf 233 string_size += arg_width;
kurobikari 0:8164d2af3edf 234
kurobikari 0:8164d2af3edf 235 /* 下位桁から順に文字列に代入 */
kurobikari 0:8164d2af3edf 236 for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++)
kurobikari 0:8164d2af3edf 237 {
kurobikari 0:8164d2af3edf 238 st[string_size - width_cnt - 1] = '0' + (val % 10);
kurobikari 0:8164d2af3edf 239 val /= 10;
kurobikari 0:8164d2af3edf 240 }
kurobikari 0:8164d2af3edf 241
kurobikari 0:8164d2af3edf 242 /* スペース処理 */
kurobikari 0:8164d2af3edf 243 /* 左詰め処理がある場合 */
kurobikari 0:8164d2af3edf 244 if (left_flag == 1)
kurobikari 0:8164d2af3edf 245 {
kurobikari 0:8164d2af3edf 246 /* スペース幅(全体幅-数値幅,符号も考慮)が存在すれば処理 */
kurobikari 0:8164d2af3edf 247 while (o_width - arg_width - sign_flag > 0)
kurobikari 0:8164d2af3edf 248 {
kurobikari 0:8164d2af3edf 249 /* スペース入力 */
kurobikari 0:8164d2af3edf 250 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 251 o_width--;
kurobikari 0:8164d2af3edf 252 }
kurobikari 0:8164d2af3edf 253 }
kurobikari 0:8164d2af3edf 254 }
kurobikari 0:8164d2af3edf 255 /* 実数型数値 */
kurobikari 0:8164d2af3edf 256 else if (*Format == 'f')
kurobikari 0:8164d2af3edf 257 {
kurobikari 0:8164d2af3edf 258 double val;
kurobikari 0:8164d2af3edf 259
kurobikari 0:8164d2af3edf 260 /* 10の倍数 */
kurobikari 0:8164d2af3edf 261 int ten_multi = 1;
kurobikari 0:8164d2af3edf 262
kurobikari 0:8164d2af3edf 263 /* 小数点以下の幅指定が無ければ6桁にする */
kurobikari 0:8164d2af3edf 264 if (dp_width == -1) {
kurobikari 0:8164d2af3edf 265 dp_width = 6;
kurobikari 0:8164d2af3edf 266 }
kurobikari 0:8164d2af3edf 267 /* 小数部分の表示する部分を整数にするために10の倍数を作る */
kurobikari 0:8164d2af3edf 268 for (int width_cnt = 0; width_cnt < dp_width; width_cnt++)
kurobikari 0:8164d2af3edf 269 {
kurobikari 0:8164d2af3edf 270 ten_multi *= 10;
kurobikari 0:8164d2af3edf 271 }
kurobikari 0:8164d2af3edf 272
kurobikari 0:8164d2af3edf 273 /* 必要小数部分が整数部分に出るようにして引数読み込み*/
kurobikari 0:8164d2af3edf 274 val = va_arg(ArgList, double) * ten_multi;
kurobikari 0:8164d2af3edf 275
kurobikari 0:8164d2af3edf 276 double work = val / ten_multi;
kurobikari 0:8164d2af3edf 277 /* 引数データの元々の整数部分のデータ幅を調べる */
kurobikari 0:8164d2af3edf 278 while (work <= -10 || work >= 10)
kurobikari 0:8164d2af3edf 279 {
kurobikari 0:8164d2af3edf 280 work /= 10;
kurobikari 0:8164d2af3edf 281 arg_width++;
kurobikari 0:8164d2af3edf 282 }
kurobikari 0:8164d2af3edf 283
kurobikari 0:8164d2af3edf 284 /* 負の数なら符号表示フラグセット */
kurobikari 0:8164d2af3edf 285 if (val < 0)
kurobikari 0:8164d2af3edf 286 {
kurobikari 0:8164d2af3edf 287 sign_flag = 1;
kurobikari 0:8164d2af3edf 288 }
kurobikari 0:8164d2af3edf 289
kurobikari 0:8164d2af3edf 290 /* スペース入力処理 */
kurobikari 0:8164d2af3edf 291 /* 左詰め処理が無ければ数字入力の前に処理 */
kurobikari 0:8164d2af3edf 292 if (left_flag == 0)
kurobikari 0:8164d2af3edf 293 {
kurobikari 0:8164d2af3edf 294 /* スペース入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在 かつ */
kurobikari 0:8164d2af3edf 295 /* 0埋め処理なし */
kurobikari 0:8164d2af3edf 296 /* 以上の場合スペース入力処理ループ */
kurobikari 0:8164d2af3edf 297 while (o_width - 1 - dp_width - arg_width - sign_flag > 0 && zero_flag == 0 )
kurobikari 0:8164d2af3edf 298 {
kurobikari 0:8164d2af3edf 299 /* スペース入力 */
kurobikari 0:8164d2af3edf 300 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 301 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 302 o_width--;
kurobikari 0:8164d2af3edf 303 }
kurobikari 0:8164d2af3edf 304 }
kurobikari 0:8164d2af3edf 305 /* 符号入力,処理 */
kurobikari 0:8164d2af3edf 306 if (sign_flag)
kurobikari 0:8164d2af3edf 307 {
kurobikari 0:8164d2af3edf 308 if (val < 0)
kurobikari 0:8164d2af3edf 309 {
kurobikari 0:8164d2af3edf 310 /* -入力 */
kurobikari 0:8164d2af3edf 311 st[string_size++] = '-';
kurobikari 0:8164d2af3edf 312 /* 数値を絶対値にする */
kurobikari 0:8164d2af3edf 313 val = -val;
kurobikari 0:8164d2af3edf 314 }
kurobikari 0:8164d2af3edf 315 else
kurobikari 0:8164d2af3edf 316 {
kurobikari 0:8164d2af3edf 317 /* +入力 */
kurobikari 0:8164d2af3edf 318 st[string_size++] = '+';
kurobikari 0:8164d2af3edf 319 }
kurobikari 0:8164d2af3edf 320 }
kurobikari 0:8164d2af3edf 321
kurobikari 0:8164d2af3edf 322 /* 0入力処理 */
kurobikari 0:8164d2af3edf 323 /* 左詰め処理が無ければ処理 */
kurobikari 0:8164d2af3edf 324 if (left_flag == 0)
kurobikari 0:8164d2af3edf 325 {
kurobikari 0:8164d2af3edf 326 /* 0入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在する場合0入力処理ループ */
kurobikari 0:8164d2af3edf 327 while (o_width - 1 - dp_width - arg_width - sign_flag > 0)
kurobikari 0:8164d2af3edf 328 {
kurobikari 0:8164d2af3edf 329 /* 0入力 */
kurobikari 0:8164d2af3edf 330 st[string_size++] = '0';
kurobikari 0:8164d2af3edf 331
kurobikari 0:8164d2af3edf 332 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 333 o_width--;
kurobikari 0:8164d2af3edf 334 }
kurobikari 0:8164d2af3edf 335 }
kurobikari 0:8164d2af3edf 336
kurobikari 0:8164d2af3edf 337 /* (引数データ整数部分幅 + ピリオド + 小数部分幅)分文字列データ幅加算 */
kurobikari 0:8164d2af3edf 338 string_size += (arg_width + 1 + dp_width);
kurobikari 0:8164d2af3edf 339
kurobikari 0:8164d2af3edf 340 /* 下位桁から順に文字列に代入 */
kurobikari 0:8164d2af3edf 341 /* 小数部分 */
kurobikari 0:8164d2af3edf 342 for (int width_cnt = 0; width_cnt < dp_width; width_cnt++)
kurobikari 0:8164d2af3edf 343 {
kurobikari 0:8164d2af3edf 344 st[string_size - width_cnt - 1] = '0' + ((int)val % 10);
kurobikari 0:8164d2af3edf 345 val /= 10;
kurobikari 0:8164d2af3edf 346 }
kurobikari 0:8164d2af3edf 347 /* ピリオド */
kurobikari 0:8164d2af3edf 348 st[string_size - dp_width - 1] = '.';
kurobikari 0:8164d2af3edf 349 /* 整数部分 */
kurobikari 0:8164d2af3edf 350 for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++)
kurobikari 0:8164d2af3edf 351 {
kurobikari 0:8164d2af3edf 352 st[string_size - dp_width - 1 - width_cnt - 1] = '0' + ((int)val % 10);
kurobikari 0:8164d2af3edf 353 val /= 10;
kurobikari 0:8164d2af3edf 354 }
kurobikari 0:8164d2af3edf 355
kurobikari 0:8164d2af3edf 356 /* スペース処理 */
kurobikari 0:8164d2af3edf 357 /* 左詰め処理がある場合 */
kurobikari 0:8164d2af3edf 358 if (left_flag == 1)
kurobikari 0:8164d2af3edf 359 {
kurobikari 0:8164d2af3edf 360 /* スペース入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在処理 */
kurobikari 0:8164d2af3edf 361 while (o_width - 1 - dp_width - arg_width - sign_flag > 0)
kurobikari 0:8164d2af3edf 362 {
kurobikari 0:8164d2af3edf 363 /* スペース入力 */
kurobikari 0:8164d2af3edf 364 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 365 o_width--;
kurobikari 0:8164d2af3edf 366 }
kurobikari 0:8164d2af3edf 367 }
kurobikari 0:8164d2af3edf 368 }
kurobikari 0:8164d2af3edf 369 /* 文字 */
kurobikari 0:8164d2af3edf 370 else if (*Format == 'c')
kurobikari 0:8164d2af3edf 371 {
kurobikari 0:8164d2af3edf 372 char chara = (char)va_arg(ArgList, int);
kurobikari 0:8164d2af3edf 373
kurobikari 0:8164d2af3edf 374 /* 左詰め処理が無ければ数字入力の前に処理 */
kurobikari 0:8164d2af3edf 375 if (left_flag == 0)
kurobikari 0:8164d2af3edf 376 {
kurobikari 0:8164d2af3edf 377 /* スペース入力処理 */
kurobikari 0:8164d2af3edf 378 /* スペース入力幅(全体幅-1文字)が存在 かつ */
kurobikari 0:8164d2af3edf 379 /* 0埋め処理なし */
kurobikari 0:8164d2af3edf 380 /* 以上の場合スペース入力処理ループ */
kurobikari 0:8164d2af3edf 381 while (o_width - 1 > 0 && zero_flag == 0)
kurobikari 0:8164d2af3edf 382 {
kurobikari 0:8164d2af3edf 383 /* スペース入力 */
kurobikari 0:8164d2af3edf 384 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 385 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 386 o_width--;
kurobikari 0:8164d2af3edf 387 }
kurobikari 0:8164d2af3edf 388 /* 0入力処理 */
kurobikari 0:8164d2af3edf 389 /* 0入力幅(全体幅-1文字)が存在 する場合0入力処理ループ */
kurobikari 0:8164d2af3edf 390 while (o_width - 1 > 0)
kurobikari 0:8164d2af3edf 391 {
kurobikari 0:8164d2af3edf 392 /* 0入力 */
kurobikari 0:8164d2af3edf 393 st[string_size++] = '0';
kurobikari 0:8164d2af3edf 394
kurobikari 0:8164d2af3edf 395 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 396 o_width--;
kurobikari 0:8164d2af3edf 397 }
kurobikari 0:8164d2af3edf 398 }
kurobikari 0:8164d2af3edf 399
kurobikari 0:8164d2af3edf 400 st[string_size++] = chara;
kurobikari 0:8164d2af3edf 401
kurobikari 0:8164d2af3edf 402 /* スペース処理 */
kurobikari 0:8164d2af3edf 403 /* 左詰め処理がある場合 */
kurobikari 0:8164d2af3edf 404 if (left_flag == 1)
kurobikari 0:8164d2af3edf 405 {
kurobikari 0:8164d2af3edf 406 /* スペース幅(全体幅-1文字)が存在すれば処理 */
kurobikari 0:8164d2af3edf 407 while (o_width - 1 > 0)
kurobikari 0:8164d2af3edf 408 {
kurobikari 0:8164d2af3edf 409 /* スペース入力 */
kurobikari 0:8164d2af3edf 410 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 411 o_width--;
kurobikari 0:8164d2af3edf 412 }
kurobikari 0:8164d2af3edf 413 }
kurobikari 0:8164d2af3edf 414 }
kurobikari 0:8164d2af3edf 415 /* 文字列 */
kurobikari 0:8164d2af3edf 416 else if (*Format == 's')
kurobikari 0:8164d2af3edf 417 {
kurobikari 0:8164d2af3edf 418 char *chara = va_arg(ArgList, char *);
kurobikari 0:8164d2af3edf 419 char *work = chara;
kurobikari 0:8164d2af3edf 420
kurobikari 0:8164d2af3edf 421 arg_width = 0;
kurobikari 0:8164d2af3edf 422 while (*work != '\0')
kurobikari 0:8164d2af3edf 423 {
kurobikari 0:8164d2af3edf 424 work++;
kurobikari 0:8164d2af3edf 425 arg_width++;
kurobikari 0:8164d2af3edf 426 }
kurobikari 0:8164d2af3edf 427
kurobikari 0:8164d2af3edf 428 /* 左詰め処理が無ければ数字入力の前に処理 */
kurobikari 0:8164d2af3edf 429 if (left_flag == 0)
kurobikari 0:8164d2af3edf 430 {
kurobikari 0:8164d2af3edf 431 /* スペース入力処理 */
kurobikari 0:8164d2af3edf 432 /* スペース入力幅(全体幅-文字幅)が存在 かつ */
kurobikari 0:8164d2af3edf 433 /* 0埋め処理なし */
kurobikari 0:8164d2af3edf 434 /* 以上の場合スペース入力処理ループ */
kurobikari 0:8164d2af3edf 435 while (o_width - arg_width > 0 && zero_flag == 0)
kurobikari 0:8164d2af3edf 436 {
kurobikari 0:8164d2af3edf 437 /* スペース入力 */
kurobikari 0:8164d2af3edf 438 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 439 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 440 o_width--;
kurobikari 0:8164d2af3edf 441 }
kurobikari 0:8164d2af3edf 442 /* 0入力処理 */
kurobikari 0:8164d2af3edf 443 /* 0入力幅(全体幅-文字幅)が存在 する場合0入力処理ループ */
kurobikari 0:8164d2af3edf 444 while (o_width - arg_width > 0)
kurobikari 0:8164d2af3edf 445 {
kurobikari 0:8164d2af3edf 446 /* 0入力 */
kurobikari 0:8164d2af3edf 447 st[string_size++] = '0';
kurobikari 0:8164d2af3edf 448
kurobikari 0:8164d2af3edf 449 /* 全体幅を減らす */
kurobikari 0:8164d2af3edf 450 o_width--;
kurobikari 0:8164d2af3edf 451 }
kurobikari 0:8164d2af3edf 452 }
kurobikari 0:8164d2af3edf 453
kurobikari 0:8164d2af3edf 454 for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++)
kurobikari 0:8164d2af3edf 455 {
kurobikari 0:8164d2af3edf 456 st[string_size++] = chara[width_cnt];
kurobikari 0:8164d2af3edf 457 }
kurobikari 0:8164d2af3edf 458
kurobikari 0:8164d2af3edf 459 /* スペース処理 */
kurobikari 0:8164d2af3edf 460 /* 左詰め処理がある場合 */
kurobikari 0:8164d2af3edf 461 if (left_flag == 1)
kurobikari 0:8164d2af3edf 462 {
kurobikari 0:8164d2af3edf 463 /* スペース幅(全体幅-文字幅)が存在すれば処理 */
kurobikari 0:8164d2af3edf 464 while (o_width - arg_width > 0)
kurobikari 0:8164d2af3edf 465 {
kurobikari 0:8164d2af3edf 466 /* スペース入力 */
kurobikari 0:8164d2af3edf 467 st[string_size++] = ' ';
kurobikari 0:8164d2af3edf 468 o_width--;
kurobikari 0:8164d2af3edf 469 }
kurobikari 0:8164d2af3edf 470 }
kurobikari 0:8164d2af3edf 471 }
kurobikari 0:8164d2af3edf 472 else {
kurobikari 0:8164d2af3edf 473 st[string_size++] = *Format;
kurobikari 0:8164d2af3edf 474 }
kurobikari 0:8164d2af3edf 475 Format++;
kurobikari 0:8164d2af3edf 476 }
kurobikari 0:8164d2af3edf 477 else {
kurobikari 0:8164d2af3edf 478 st[string_size++] = *Format;
kurobikari 0:8164d2af3edf 479 Format++;
kurobikari 0:8164d2af3edf 480 }
kurobikari 0:8164d2af3edf 481 }
kurobikari 0:8164d2af3edf 482 va_end(ArgList);
kurobikari 0:8164d2af3edf 483 st[string_size]='q';
kurobikari 0:8164d2af3edf 484 size=string_size;
kurobikari 0:8164d2af3edf 485 string_size = 0;
kurobikari 0:8164d2af3edf 486 }
kurobikari 0:8164d2af3edf 487
kurobikari 0:8164d2af3edf 488