print.h
Print.cpp@0:8164d2af3edf, 2020-04-06 (annotated)
- Committer:
- kurobikari
- Date:
- Mon Apr 06 13:08:23 2020 +0000
- Revision:
- 0:8164d2af3edf
print.h;
Who changed what in which revision?
User | Revision | Line number | New 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 |