Kashish Haresh Shah / Mbed 2 deprecated HXCClientShield

Dependencies:   mbed

Committer:
kashish_mbed
Date:
Mon Mar 29 15:37:08 2021 +0000
Revision:
0:bacc6e701fb4
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kashish_mbed 0:bacc6e701fb4 1 /******************************************************************************
kashish_mbed 0:bacc6e701fb4 2 * @file tiny_vsnprintf.c
kashish_mbed 0:bacc6e701fb4 3 * @author MCD Application Team
kashish_mbed 0:bacc6e701fb4 4 * @version V1.1.4
kashish_mbed 0:bacc6e701fb4 5 * @date 08-January-2018
kashish_mbed 0:bacc6e701fb4 6 * @brief Tiny implementation of vsnprintf like function
kashish_mbed 0:bacc6e701fb4 7 ******************************************************************************
kashish_mbed 0:bacc6e701fb4 8 * @attention
kashish_mbed 0:bacc6e701fb4 9 *
kashish_mbed 0:bacc6e701fb4 10 * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics International N.V.
kashish_mbed 0:bacc6e701fb4 11 * All rights reserved.</center></h2>
kashish_mbed 0:bacc6e701fb4 12 *
kashish_mbed 0:bacc6e701fb4 13 * Copyright (c) 1990, 1993
kashish_mbed 0:bacc6e701fb4 14 * The Regents of the University of California. All rights reserved.
kashish_mbed 0:bacc6e701fb4 15 *
kashish_mbed 0:bacc6e701fb4 16 * This code is derived from software contributed to Berkeley by
kashish_mbed 0:bacc6e701fb4 17 * Chris Torek.
kashish_mbed 0:bacc6e701fb4 18 * Redistribution and use in source and binary forms, with or without
kashish_mbed 0:bacc6e701fb4 19 * modification, are permitted, provided that the following conditions are met:
kashish_mbed 0:bacc6e701fb4 20 *
kashish_mbed 0:bacc6e701fb4 21 * 1. Redistribution of source code must retain the above copyright notice,
kashish_mbed 0:bacc6e701fb4 22 * this list of conditions and the following disclaimer.
kashish_mbed 0:bacc6e701fb4 23 * 2. Redistributions in binary form must reproduce the above copyright notice,
kashish_mbed 0:bacc6e701fb4 24 * this list of conditions and the following disclaimer in the documentation
kashish_mbed 0:bacc6e701fb4 25 * and/or other materials provided with the distribution.
kashish_mbed 0:bacc6e701fb4 26 * 3. Neither the name of STMicroelectronics nor the names of other
kashish_mbed 0:bacc6e701fb4 27 * contributors to this software may be used to endorse or promote products
kashish_mbed 0:bacc6e701fb4 28 * derived from this software without specific written permission.
kashish_mbed 0:bacc6e701fb4 29 * 4. This software, including modifications and/or derivative works of this
kashish_mbed 0:bacc6e701fb4 30 * software, must execute solely and exclusively on microcontroller or
kashish_mbed 0:bacc6e701fb4 31 * microprocessor devices manufactured by or for STMicroelectronics.
kashish_mbed 0:bacc6e701fb4 32 * 5. Redistribution and use of this software other than as permitted under
kashish_mbed 0:bacc6e701fb4 33 * this license is void and will automatically terminate your rights under
kashish_mbed 0:bacc6e701fb4 34 * this license.
kashish_mbed 0:bacc6e701fb4 35 *
kashish_mbed 0:bacc6e701fb4 36 * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
kashish_mbed 0:bacc6e701fb4 37 * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
kashish_mbed 0:bacc6e701fb4 38 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
kashish_mbed 0:bacc6e701fb4 39 * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
kashish_mbed 0:bacc6e701fb4 40 * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
kashish_mbed 0:bacc6e701fb4 41 * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
kashish_mbed 0:bacc6e701fb4 42 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
kashish_mbed 0:bacc6e701fb4 43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
kashish_mbed 0:bacc6e701fb4 44 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
kashish_mbed 0:bacc6e701fb4 45 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
kashish_mbed 0:bacc6e701fb4 46 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
kashish_mbed 0:bacc6e701fb4 47 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kashish_mbed 0:bacc6e701fb4 48 *
kashish_mbed 0:bacc6e701fb4 49 ******************************************************************************
kashish_mbed 0:bacc6e701fb4 50 */
kashish_mbed 0:bacc6e701fb4 51
kashish_mbed 0:bacc6e701fb4 52 /* File : barebones/ee_printf.c
kashish_mbed 0:bacc6e701fb4 53 This file contains an implementation of ee_printf that only requires a method to output a char to a UART without pulling in library code.
kashish_mbed 0:bacc6e701fb4 54 This code is based on a file that contains the following:
kashish_mbed 0:bacc6e701fb4 55 Copyright (C) 2002 Michael Ringgaard. All rights reserved.
kashish_mbed 0:bacc6e701fb4 56 Redistribution and use in source and binary forms, with or without
kashish_mbed 0:bacc6e701fb4 57 modification, are permitted provided that the following conditions
kashish_mbed 0:bacc6e701fb4 58 are met:
kashish_mbed 0:bacc6e701fb4 59
kashish_mbed 0:bacc6e701fb4 60 1. Redistributions of source code must retain the above copyright
kashish_mbed 0:bacc6e701fb4 61 notice, this list of conditions and the following disclaimer.
kashish_mbed 0:bacc6e701fb4 62 2. Redistributions in binary form must reproduce the above copyright
kashish_mbed 0:bacc6e701fb4 63 notice, this list of conditions and the following disclaimer in the
kashish_mbed 0:bacc6e701fb4 64 documentation and/or other materials provided with the distribution.
kashish_mbed 0:bacc6e701fb4 65 3. Neither the name of the project nor the names of its contributors
kashish_mbed 0:bacc6e701fb4 66 may be used to endorse or promote products derived from this software
kashish_mbed 0:bacc6e701fb4 67 without specific prior written permission.
kashish_mbed 0:bacc6e701fb4 68
kashish_mbed 0:bacc6e701fb4 69 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
kashish_mbed 0:bacc6e701fb4 70 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
kashish_mbed 0:bacc6e701fb4 71 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
kashish_mbed 0:bacc6e701fb4 72 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
kashish_mbed 0:bacc6e701fb4 73 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
kashish_mbed 0:bacc6e701fb4 74 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
kashish_mbed 0:bacc6e701fb4 75 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
kashish_mbed 0:bacc6e701fb4 76 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
kashish_mbed 0:bacc6e701fb4 77 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
kashish_mbed 0:bacc6e701fb4 78 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
kashish_mbed 0:bacc6e701fb4 79 SUCH DAMAGE.
kashish_mbed 0:bacc6e701fb4 80 */
kashish_mbed 0:bacc6e701fb4 81
kashish_mbed 0:bacc6e701fb4 82 /*
kashish_mbed 0:bacc6e701fb4 83 * Following implementation is adapted from original one
kashish_mbed 0:bacc6e701fb4 84 * https://github.com/jpbonn/coremark_lm32/blob/master/ee_printf.c
kashish_mbed 0:bacc6e701fb4 85 */
kashish_mbed 0:bacc6e701fb4 86
kashish_mbed 0:bacc6e701fb4 87 #define TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 88
kashish_mbed 0:bacc6e701fb4 89 #include <stdarg.h>
kashish_mbed 0:bacc6e701fb4 90 #include <string.h>
kashish_mbed 0:bacc6e701fb4 91 #include "tiny_vsnprintf.h"
kashish_mbed 0:bacc6e701fb4 92
kashish_mbed 0:bacc6e701fb4 93 #define ZEROPAD (1<<0) /* Pad with zero */
kashish_mbed 0:bacc6e701fb4 94 #define SIGN (1<<1) /* Unsigned/signed long */
kashish_mbed 0:bacc6e701fb4 95 #define UPPERCASE (1<<6) /* 'ABCDEF' */
kashish_mbed 0:bacc6e701fb4 96 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 97 #else
kashish_mbed 0:bacc6e701fb4 98 #define PLUS (1<<2) /* Show plus */
kashish_mbed 0:bacc6e701fb4 99 #define HEX_PREP (1<<5) /* 0x */
kashish_mbed 0:bacc6e701fb4 100 #define SPACE (1<<3) /* Spacer */
kashish_mbed 0:bacc6e701fb4 101 #define LEFT (1<<4) /* Left justified */
kashish_mbed 0:bacc6e701fb4 102 #endif
kashish_mbed 0:bacc6e701fb4 103
kashish_mbed 0:bacc6e701fb4 104 #define is_digit(c) ((c) >= '0' && (c) <= '9')
kashish_mbed 0:bacc6e701fb4 105
kashish_mbed 0:bacc6e701fb4 106 static char *lower_digits = "0123456789abcdefghijklmnopqrstuvwxyz";
kashish_mbed 0:bacc6e701fb4 107 static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
kashish_mbed 0:bacc6e701fb4 108 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 109 #else
kashish_mbed 0:bacc6e701fb4 110 static size_t strnlen(const char *s, size_t count);
kashish_mbed 0:bacc6e701fb4 111
kashish_mbed 0:bacc6e701fb4 112 static size_t strnlen(const char *s, size_t count)
kashish_mbed 0:bacc6e701fb4 113 {
kashish_mbed 0:bacc6e701fb4 114 const char *sc;
kashish_mbed 0:bacc6e701fb4 115 for (sc = s; *sc != '\0' && count--; ++sc);
kashish_mbed 0:bacc6e701fb4 116 return sc - s;
kashish_mbed 0:bacc6e701fb4 117 }
kashish_mbed 0:bacc6e701fb4 118 #endif
kashish_mbed 0:bacc6e701fb4 119
kashish_mbed 0:bacc6e701fb4 120 static int ee_skip_atoi(const char **s)
kashish_mbed 0:bacc6e701fb4 121 {
kashish_mbed 0:bacc6e701fb4 122 int i = 0;
kashish_mbed 0:bacc6e701fb4 123 while (is_digit(**s)) i = i*10 + *((*s)++) - '0';
kashish_mbed 0:bacc6e701fb4 124 return i;
kashish_mbed 0:bacc6e701fb4 125 }
kashish_mbed 0:bacc6e701fb4 126
kashish_mbed 0:bacc6e701fb4 127 #define ASSIGN_STR(_c) do { *str++ = (_c); max_size--; if (max_size == 0) return str; } while (0)
kashish_mbed 0:bacc6e701fb4 128
kashish_mbed 0:bacc6e701fb4 129 static char *ee_number(char *str, int max_size, long num, int base, int size, int precision, int type)
kashish_mbed 0:bacc6e701fb4 130 {
kashish_mbed 0:bacc6e701fb4 131 char c;
kashish_mbed 0:bacc6e701fb4 132 char sign, tmp[66];
kashish_mbed 0:bacc6e701fb4 133 char *dig = lower_digits;
kashish_mbed 0:bacc6e701fb4 134 int i;
kashish_mbed 0:bacc6e701fb4 135
kashish_mbed 0:bacc6e701fb4 136 if (type & UPPERCASE) dig = upper_digits;
kashish_mbed 0:bacc6e701fb4 137 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 138 #else
kashish_mbed 0:bacc6e701fb4 139 if (type & LEFT) type &= ~ZEROPAD;
kashish_mbed 0:bacc6e701fb4 140 #endif
kashish_mbed 0:bacc6e701fb4 141 if (base < 2 || base > 36) return 0;
kashish_mbed 0:bacc6e701fb4 142
kashish_mbed 0:bacc6e701fb4 143 c = (type & ZEROPAD) ? '0' : ' ';
kashish_mbed 0:bacc6e701fb4 144 sign = 0;
kashish_mbed 0:bacc6e701fb4 145 if (type & SIGN)
kashish_mbed 0:bacc6e701fb4 146 {
kashish_mbed 0:bacc6e701fb4 147 if (num < 0)
kashish_mbed 0:bacc6e701fb4 148 {
kashish_mbed 0:bacc6e701fb4 149 sign = '-';
kashish_mbed 0:bacc6e701fb4 150 num = -num;
kashish_mbed 0:bacc6e701fb4 151 size--;
kashish_mbed 0:bacc6e701fb4 152 }
kashish_mbed 0:bacc6e701fb4 153 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 154 #else
kashish_mbed 0:bacc6e701fb4 155 else if (type & PLUS)
kashish_mbed 0:bacc6e701fb4 156 {
kashish_mbed 0:bacc6e701fb4 157 sign = '+';
kashish_mbed 0:bacc6e701fb4 158 size--;
kashish_mbed 0:bacc6e701fb4 159 }
kashish_mbed 0:bacc6e701fb4 160 else if (type & SPACE)
kashish_mbed 0:bacc6e701fb4 161 {
kashish_mbed 0:bacc6e701fb4 162 sign = ' ';
kashish_mbed 0:bacc6e701fb4 163 size--;
kashish_mbed 0:bacc6e701fb4 164 }
kashish_mbed 0:bacc6e701fb4 165 #endif
kashish_mbed 0:bacc6e701fb4 166 }
kashish_mbed 0:bacc6e701fb4 167
kashish_mbed 0:bacc6e701fb4 168 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 169 #else
kashish_mbed 0:bacc6e701fb4 170 if (type & HEX_PREP)
kashish_mbed 0:bacc6e701fb4 171 {
kashish_mbed 0:bacc6e701fb4 172 if (base == 16)
kashish_mbed 0:bacc6e701fb4 173 size -= 2;
kashish_mbed 0:bacc6e701fb4 174 else if (base == 8)
kashish_mbed 0:bacc6e701fb4 175 size--;
kashish_mbed 0:bacc6e701fb4 176 }
kashish_mbed 0:bacc6e701fb4 177 #endif
kashish_mbed 0:bacc6e701fb4 178
kashish_mbed 0:bacc6e701fb4 179 i = 0;
kashish_mbed 0:bacc6e701fb4 180
kashish_mbed 0:bacc6e701fb4 181 if (num == 0)
kashish_mbed 0:bacc6e701fb4 182 tmp[i++] = '0';
kashish_mbed 0:bacc6e701fb4 183 else
kashish_mbed 0:bacc6e701fb4 184 {
kashish_mbed 0:bacc6e701fb4 185 while (num != 0)
kashish_mbed 0:bacc6e701fb4 186 {
kashish_mbed 0:bacc6e701fb4 187 tmp[i++] = dig[((unsigned long) num) % (unsigned) base];
kashish_mbed 0:bacc6e701fb4 188 num = ((unsigned long) num) / (unsigned) base;
kashish_mbed 0:bacc6e701fb4 189 }
kashish_mbed 0:bacc6e701fb4 190 }
kashish_mbed 0:bacc6e701fb4 191
kashish_mbed 0:bacc6e701fb4 192 if (i > precision) precision = i;
kashish_mbed 0:bacc6e701fb4 193 size -= precision;
kashish_mbed 0:bacc6e701fb4 194 if (!(type & (ZEROPAD /* TINY option | LEFT */))) while (size-- > 0) ASSIGN_STR(' ');
kashish_mbed 0:bacc6e701fb4 195 if (sign) ASSIGN_STR(sign);
kashish_mbed 0:bacc6e701fb4 196
kashish_mbed 0:bacc6e701fb4 197 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 198 #else
kashish_mbed 0:bacc6e701fb4 199 if (type & HEX_PREP)
kashish_mbed 0:bacc6e701fb4 200 {
kashish_mbed 0:bacc6e701fb4 201 if (base == 8)
kashish_mbed 0:bacc6e701fb4 202 ASSIGN_STR('0');
kashish_mbed 0:bacc6e701fb4 203 else if (base == 16)
kashish_mbed 0:bacc6e701fb4 204 {
kashish_mbed 0:bacc6e701fb4 205 ASSIGN_STR('0');
kashish_mbed 0:bacc6e701fb4 206 ASSIGN_STR(lower_digits[33]);
kashish_mbed 0:bacc6e701fb4 207 }
kashish_mbed 0:bacc6e701fb4 208 }
kashish_mbed 0:bacc6e701fb4 209 #endif
kashish_mbed 0:bacc6e701fb4 210
kashish_mbed 0:bacc6e701fb4 211 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 212 while (size-- > 0) ASSIGN_STR(c);
kashish_mbed 0:bacc6e701fb4 213 #else
kashish_mbed 0:bacc6e701fb4 214 if (!(type & LEFT)) while (size-- > 0) ASSIGN_STR(c);
kashish_mbed 0:bacc6e701fb4 215 #endif
kashish_mbed 0:bacc6e701fb4 216 while (i < precision--) ASSIGN_STR('0');
kashish_mbed 0:bacc6e701fb4 217 while (i-- > 0) ASSIGN_STR(tmp[i]);
kashish_mbed 0:bacc6e701fb4 218 while (size-- > 0) ASSIGN_STR(' ');
kashish_mbed 0:bacc6e701fb4 219
kashish_mbed 0:bacc6e701fb4 220 return str;
kashish_mbed 0:bacc6e701fb4 221 }
kashish_mbed 0:bacc6e701fb4 222
kashish_mbed 0:bacc6e701fb4 223 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 224 #else
kashish_mbed 0:bacc6e701fb4 225 static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type)
kashish_mbed 0:bacc6e701fb4 226 {
kashish_mbed 0:bacc6e701fb4 227 char tmp[24];
kashish_mbed 0:bacc6e701fb4 228 char *dig = lower_digits;
kashish_mbed 0:bacc6e701fb4 229 int i, len;
kashish_mbed 0:bacc6e701fb4 230
kashish_mbed 0:bacc6e701fb4 231 if (type & UPPERCASE) dig = upper_digits;
kashish_mbed 0:bacc6e701fb4 232 len = 0;
kashish_mbed 0:bacc6e701fb4 233 for (i = 0; i < 6; i++)
kashish_mbed 0:bacc6e701fb4 234 {
kashish_mbed 0:bacc6e701fb4 235 if (i != 0) tmp[len++] = ':';
kashish_mbed 0:bacc6e701fb4 236 tmp[len++] = dig[addr[i] >> 4];
kashish_mbed 0:bacc6e701fb4 237 tmp[len++] = dig[addr[i] & 0x0F];
kashish_mbed 0:bacc6e701fb4 238 }
kashish_mbed 0:bacc6e701fb4 239
kashish_mbed 0:bacc6e701fb4 240 if (!(type & LEFT)) while (len < size--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 241 for (i = 0; i < len; ++i) *str++ = tmp[i];
kashish_mbed 0:bacc6e701fb4 242 while (len < size--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 243
kashish_mbed 0:bacc6e701fb4 244 return str;
kashish_mbed 0:bacc6e701fb4 245 }
kashish_mbed 0:bacc6e701fb4 246
kashish_mbed 0:bacc6e701fb4 247 static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type)
kashish_mbed 0:bacc6e701fb4 248 {
kashish_mbed 0:bacc6e701fb4 249 char tmp[24];
kashish_mbed 0:bacc6e701fb4 250 int i, n, len;
kashish_mbed 0:bacc6e701fb4 251
kashish_mbed 0:bacc6e701fb4 252 len = 0;
kashish_mbed 0:bacc6e701fb4 253 for (i = 0; i < 4; i++)
kashish_mbed 0:bacc6e701fb4 254 {
kashish_mbed 0:bacc6e701fb4 255 if (i != 0) tmp[len++] = '.';
kashish_mbed 0:bacc6e701fb4 256 n = addr[i];
kashish_mbed 0:bacc6e701fb4 257
kashish_mbed 0:bacc6e701fb4 258 if (n == 0)
kashish_mbed 0:bacc6e701fb4 259 tmp[len++] = lower_digits[0];
kashish_mbed 0:bacc6e701fb4 260 else
kashish_mbed 0:bacc6e701fb4 261 {
kashish_mbed 0:bacc6e701fb4 262 if (n >= 100)
kashish_mbed 0:bacc6e701fb4 263 {
kashish_mbed 0:bacc6e701fb4 264 tmp[len++] = lower_digits[n / 100];
kashish_mbed 0:bacc6e701fb4 265 n = n % 100;
kashish_mbed 0:bacc6e701fb4 266 tmp[len++] = lower_digits[n / 10];
kashish_mbed 0:bacc6e701fb4 267 n = n % 10;
kashish_mbed 0:bacc6e701fb4 268 }
kashish_mbed 0:bacc6e701fb4 269 else if (n >= 10)
kashish_mbed 0:bacc6e701fb4 270 {
kashish_mbed 0:bacc6e701fb4 271 tmp[len++] = lower_digits[n / 10];
kashish_mbed 0:bacc6e701fb4 272 n = n % 10;
kashish_mbed 0:bacc6e701fb4 273 }
kashish_mbed 0:bacc6e701fb4 274
kashish_mbed 0:bacc6e701fb4 275 tmp[len++] = lower_digits[n];
kashish_mbed 0:bacc6e701fb4 276 }
kashish_mbed 0:bacc6e701fb4 277 }
kashish_mbed 0:bacc6e701fb4 278
kashish_mbed 0:bacc6e701fb4 279 if (!(type & LEFT)) while (len < size--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 280 for (i = 0; i < len; ++i) *str++ = tmp[i];
kashish_mbed 0:bacc6e701fb4 281 while (len < size--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 282
kashish_mbed 0:bacc6e701fb4 283 return str;
kashish_mbed 0:bacc6e701fb4 284 }
kashish_mbed 0:bacc6e701fb4 285 #endif
kashish_mbed 0:bacc6e701fb4 286
kashish_mbed 0:bacc6e701fb4 287 #ifdef HAS_FLOAT
kashish_mbed 0:bacc6e701fb4 288
kashish_mbed 0:bacc6e701fb4 289 char *ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf);
kashish_mbed 0:bacc6e701fb4 290 char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf);
kashish_mbed 0:bacc6e701fb4 291 static void ee_bufcpy(char *d, char *s, int count);
kashish_mbed 0:bacc6e701fb4 292
kashish_mbed 0:bacc6e701fb4 293 void ee_bufcpy(char *pd, char *ps, int count) {
kashish_mbed 0:bacc6e701fb4 294 char *pe=ps+count;
kashish_mbed 0:bacc6e701fb4 295 while (ps!=pe)
kashish_mbed 0:bacc6e701fb4 296 *pd++=*ps++;
kashish_mbed 0:bacc6e701fb4 297 }
kashish_mbed 0:bacc6e701fb4 298
kashish_mbed 0:bacc6e701fb4 299 static void parse_float(double value, char *buffer, char fmt, int precision)
kashish_mbed 0:bacc6e701fb4 300 {
kashish_mbed 0:bacc6e701fb4 301 int decpt, sign, exp, pos;
kashish_mbed 0:bacc6e701fb4 302 char *fdigits = NULL;
kashish_mbed 0:bacc6e701fb4 303 char cvtbuf[80];
kashish_mbed 0:bacc6e701fb4 304 int capexp = 0;
kashish_mbed 0:bacc6e701fb4 305 int magnitude;
kashish_mbed 0:bacc6e701fb4 306
kashish_mbed 0:bacc6e701fb4 307 if (fmt == 'G' || fmt == 'E')
kashish_mbed 0:bacc6e701fb4 308 {
kashish_mbed 0:bacc6e701fb4 309 capexp = 1;
kashish_mbed 0:bacc6e701fb4 310 fmt += 'a' - 'A';
kashish_mbed 0:bacc6e701fb4 311 }
kashish_mbed 0:bacc6e701fb4 312
kashish_mbed 0:bacc6e701fb4 313 if (fmt == 'g')
kashish_mbed 0:bacc6e701fb4 314 {
kashish_mbed 0:bacc6e701fb4 315 fdigits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf);
kashish_mbed 0:bacc6e701fb4 316 magnitude = decpt - 1;
kashish_mbed 0:bacc6e701fb4 317 if (magnitude < -4 || magnitude > precision - 1)
kashish_mbed 0:bacc6e701fb4 318 {
kashish_mbed 0:bacc6e701fb4 319 fmt = 'e';
kashish_mbed 0:bacc6e701fb4 320 precision -= 1;
kashish_mbed 0:bacc6e701fb4 321 }
kashish_mbed 0:bacc6e701fb4 322 else
kashish_mbed 0:bacc6e701fb4 323 {
kashish_mbed 0:bacc6e701fb4 324 fmt = 'f';
kashish_mbed 0:bacc6e701fb4 325 precision -= decpt;
kashish_mbed 0:bacc6e701fb4 326 }
kashish_mbed 0:bacc6e701fb4 327 }
kashish_mbed 0:bacc6e701fb4 328
kashish_mbed 0:bacc6e701fb4 329 if (fmt == 'e')
kashish_mbed 0:bacc6e701fb4 330 {
kashish_mbed 0:bacc6e701fb4 331 fdigits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf);
kashish_mbed 0:bacc6e701fb4 332
kashish_mbed 0:bacc6e701fb4 333 if (sign) *buffer++ = '-';
kashish_mbed 0:bacc6e701fb4 334 *buffer++ = *fdigits;
kashish_mbed 0:bacc6e701fb4 335 if (precision > 0) *buffer++ = '.';
kashish_mbed 0:bacc6e701fb4 336 ee_bufcpy(buffer, fdigits + 1, precision);
kashish_mbed 0:bacc6e701fb4 337 buffer += precision;
kashish_mbed 0:bacc6e701fb4 338 *buffer++ = capexp ? 'E' : 'e';
kashish_mbed 0:bacc6e701fb4 339
kashish_mbed 0:bacc6e701fb4 340 if (decpt == 0)
kashish_mbed 0:bacc6e701fb4 341 {
kashish_mbed 0:bacc6e701fb4 342 if (value == 0.0)
kashish_mbed 0:bacc6e701fb4 343 exp = 0;
kashish_mbed 0:bacc6e701fb4 344 else
kashish_mbed 0:bacc6e701fb4 345 exp = -1;
kashish_mbed 0:bacc6e701fb4 346 }
kashish_mbed 0:bacc6e701fb4 347 else
kashish_mbed 0:bacc6e701fb4 348 exp = decpt - 1;
kashish_mbed 0:bacc6e701fb4 349
kashish_mbed 0:bacc6e701fb4 350 if (exp < 0)
kashish_mbed 0:bacc6e701fb4 351 {
kashish_mbed 0:bacc6e701fb4 352 *buffer++ = '-';
kashish_mbed 0:bacc6e701fb4 353 exp = -exp;
kashish_mbed 0:bacc6e701fb4 354 }
kashish_mbed 0:bacc6e701fb4 355 else
kashish_mbed 0:bacc6e701fb4 356 *buffer++ = '+';
kashish_mbed 0:bacc6e701fb4 357
kashish_mbed 0:bacc6e701fb4 358 buffer[2] = (exp % 10) + '0';
kashish_mbed 0:bacc6e701fb4 359 exp = exp / 10;
kashish_mbed 0:bacc6e701fb4 360 buffer[1] = (exp % 10) + '0';
kashish_mbed 0:bacc6e701fb4 361 exp = exp / 10;
kashish_mbed 0:bacc6e701fb4 362 buffer[0] = (exp % 10) + '0';
kashish_mbed 0:bacc6e701fb4 363 buffer += 3;
kashish_mbed 0:bacc6e701fb4 364 }
kashish_mbed 0:bacc6e701fb4 365 else if (fmt == 'f')
kashish_mbed 0:bacc6e701fb4 366 {
kashish_mbed 0:bacc6e701fb4 367 fdigits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf);
kashish_mbed 0:bacc6e701fb4 368 if (sign) *buffer++ = '-';
kashish_mbed 0:bacc6e701fb4 369 if (*fdigits)
kashish_mbed 0:bacc6e701fb4 370 {
kashish_mbed 0:bacc6e701fb4 371 if (decpt <= 0)
kashish_mbed 0:bacc6e701fb4 372 {
kashish_mbed 0:bacc6e701fb4 373 *buffer++ = '0';
kashish_mbed 0:bacc6e701fb4 374 *buffer++ = '.';
kashish_mbed 0:bacc6e701fb4 375 for (pos = 0; pos < -decpt; pos++) *buffer++ = '0';
kashish_mbed 0:bacc6e701fb4 376 while (*fdigits) *buffer++ = *fdigits++;
kashish_mbed 0:bacc6e701fb4 377 }
kashish_mbed 0:bacc6e701fb4 378 else
kashish_mbed 0:bacc6e701fb4 379 {
kashish_mbed 0:bacc6e701fb4 380 pos = 0;
kashish_mbed 0:bacc6e701fb4 381 while (*fdigits)
kashish_mbed 0:bacc6e701fb4 382 {
kashish_mbed 0:bacc6e701fb4 383 if (pos++ == decpt) *buffer++ = '.';
kashish_mbed 0:bacc6e701fb4 384 *buffer++ = *fdigits++;
kashish_mbed 0:bacc6e701fb4 385 }
kashish_mbed 0:bacc6e701fb4 386 }
kashish_mbed 0:bacc6e701fb4 387 }
kashish_mbed 0:bacc6e701fb4 388 else
kashish_mbed 0:bacc6e701fb4 389 {
kashish_mbed 0:bacc6e701fb4 390 *buffer++ = '0';
kashish_mbed 0:bacc6e701fb4 391 if (precision > 0)
kashish_mbed 0:bacc6e701fb4 392 {
kashish_mbed 0:bacc6e701fb4 393 *buffer++ = '.';
kashish_mbed 0:bacc6e701fb4 394 for (pos = 0; pos < precision; pos++) *buffer++ = '0';
kashish_mbed 0:bacc6e701fb4 395 }
kashish_mbed 0:bacc6e701fb4 396 }
kashish_mbed 0:bacc6e701fb4 397 }
kashish_mbed 0:bacc6e701fb4 398
kashish_mbed 0:bacc6e701fb4 399 *buffer = '\0';
kashish_mbed 0:bacc6e701fb4 400 }
kashish_mbed 0:bacc6e701fb4 401
kashish_mbed 0:bacc6e701fb4 402 static void decimal_point(char *buffer)
kashish_mbed 0:bacc6e701fb4 403 {
kashish_mbed 0:bacc6e701fb4 404 while (*buffer)
kashish_mbed 0:bacc6e701fb4 405 {
kashish_mbed 0:bacc6e701fb4 406 if (*buffer == '.') return;
kashish_mbed 0:bacc6e701fb4 407 if (*buffer == 'e' || *buffer == 'E') break;
kashish_mbed 0:bacc6e701fb4 408 buffer++;
kashish_mbed 0:bacc6e701fb4 409 }
kashish_mbed 0:bacc6e701fb4 410
kashish_mbed 0:bacc6e701fb4 411 if (*buffer)
kashish_mbed 0:bacc6e701fb4 412 {
kashish_mbed 0:bacc6e701fb4 413 int n = strnlen(buffer,256);
kashish_mbed 0:bacc6e701fb4 414 while (n > 0)
kashish_mbed 0:bacc6e701fb4 415 {
kashish_mbed 0:bacc6e701fb4 416 buffer[n + 1] = buffer[n];
kashish_mbed 0:bacc6e701fb4 417 n--;
kashish_mbed 0:bacc6e701fb4 418 }
kashish_mbed 0:bacc6e701fb4 419
kashish_mbed 0:bacc6e701fb4 420 *buffer = '.';
kashish_mbed 0:bacc6e701fb4 421 }
kashish_mbed 0:bacc6e701fb4 422 else
kashish_mbed 0:bacc6e701fb4 423 {
kashish_mbed 0:bacc6e701fb4 424 *buffer++ = '.';
kashish_mbed 0:bacc6e701fb4 425 *buffer = '\0';
kashish_mbed 0:bacc6e701fb4 426 }
kashish_mbed 0:bacc6e701fb4 427 }
kashish_mbed 0:bacc6e701fb4 428
kashish_mbed 0:bacc6e701fb4 429 static void cropzeros(char *buffer)
kashish_mbed 0:bacc6e701fb4 430 {
kashish_mbed 0:bacc6e701fb4 431 char *stop;
kashish_mbed 0:bacc6e701fb4 432
kashish_mbed 0:bacc6e701fb4 433 while (*buffer && *buffer != '.') buffer++;
kashish_mbed 0:bacc6e701fb4 434 if (*buffer++)
kashish_mbed 0:bacc6e701fb4 435 {
kashish_mbed 0:bacc6e701fb4 436 while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++;
kashish_mbed 0:bacc6e701fb4 437 stop = buffer--;
kashish_mbed 0:bacc6e701fb4 438 while (*buffer == '0') buffer--;
kashish_mbed 0:bacc6e701fb4 439 if (*buffer == '.') buffer--;
kashish_mbed 0:bacc6e701fb4 440 while (buffer!=stop)
kashish_mbed 0:bacc6e701fb4 441 *++buffer=0;
kashish_mbed 0:bacc6e701fb4 442 }
kashish_mbed 0:bacc6e701fb4 443 }
kashish_mbed 0:bacc6e701fb4 444
kashish_mbed 0:bacc6e701fb4 445 static char *flt(char *str, double num, int size, int precision, char fmt, int flags)
kashish_mbed 0:bacc6e701fb4 446 {
kashish_mbed 0:bacc6e701fb4 447 char tmp[80];
kashish_mbed 0:bacc6e701fb4 448 char c, sign;
kashish_mbed 0:bacc6e701fb4 449 int n, i;
kashish_mbed 0:bacc6e701fb4 450
kashish_mbed 0:bacc6e701fb4 451 // Left align means no zero padding
kashish_mbed 0:bacc6e701fb4 452 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 453 #else
kashish_mbed 0:bacc6e701fb4 454 if (flags & LEFT) flags &= ~ZEROPAD;
kashish_mbed 0:bacc6e701fb4 455 #endif
kashish_mbed 0:bacc6e701fb4 456
kashish_mbed 0:bacc6e701fb4 457 // Determine padding and sign char
kashish_mbed 0:bacc6e701fb4 458 c = (flags & ZEROPAD) ? '0' : ' ';
kashish_mbed 0:bacc6e701fb4 459 sign = 0;
kashish_mbed 0:bacc6e701fb4 460 if (flags & SIGN)
kashish_mbed 0:bacc6e701fb4 461 {
kashish_mbed 0:bacc6e701fb4 462 if (num < 0.0)
kashish_mbed 0:bacc6e701fb4 463 {
kashish_mbed 0:bacc6e701fb4 464 sign = '-';
kashish_mbed 0:bacc6e701fb4 465 num = -num;
kashish_mbed 0:bacc6e701fb4 466 size--;
kashish_mbed 0:bacc6e701fb4 467 }
kashish_mbed 0:bacc6e701fb4 468 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 469 #else
kashish_mbed 0:bacc6e701fb4 470 else if (flags & PLUS)
kashish_mbed 0:bacc6e701fb4 471 {
kashish_mbed 0:bacc6e701fb4 472 sign = '+';
kashish_mbed 0:bacc6e701fb4 473 size--;
kashish_mbed 0:bacc6e701fb4 474 }
kashish_mbed 0:bacc6e701fb4 475 else if (flags & SPACE)
kashish_mbed 0:bacc6e701fb4 476 {
kashish_mbed 0:bacc6e701fb4 477 sign = ' ';
kashish_mbed 0:bacc6e701fb4 478 size--;
kashish_mbed 0:bacc6e701fb4 479 }
kashish_mbed 0:bacc6e701fb4 480 #endif
kashish_mbed 0:bacc6e701fb4 481 }
kashish_mbed 0:bacc6e701fb4 482
kashish_mbed 0:bacc6e701fb4 483 // Compute the precision value
kashish_mbed 0:bacc6e701fb4 484 if (precision < 0)
kashish_mbed 0:bacc6e701fb4 485 precision = 6; // Default precision: 6
kashish_mbed 0:bacc6e701fb4 486
kashish_mbed 0:bacc6e701fb4 487 // Convert floating point number to text
kashish_mbed 0:bacc6e701fb4 488 parse_float(num, tmp, fmt, precision);
kashish_mbed 0:bacc6e701fb4 489
kashish_mbed 0:bacc6e701fb4 490 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 491 #else
kashish_mbed 0:bacc6e701fb4 492 if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp);
kashish_mbed 0:bacc6e701fb4 493 #endif
kashish_mbed 0:bacc6e701fb4 494 if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp);
kashish_mbed 0:bacc6e701fb4 495
kashish_mbed 0:bacc6e701fb4 496 n = strnlen(tmp,256);
kashish_mbed 0:bacc6e701fb4 497
kashish_mbed 0:bacc6e701fb4 498 // Output number with alignment and padding
kashish_mbed 0:bacc6e701fb4 499 size -= n;
kashish_mbed 0:bacc6e701fb4 500 if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 501 if (sign) *str++ = sign;
kashish_mbed 0:bacc6e701fb4 502 if (!(flags & LEFT)) while (size-- > 0) *str++ = c;
kashish_mbed 0:bacc6e701fb4 503 for (i = 0; i < n; i++) *str++ = tmp[i];
kashish_mbed 0:bacc6e701fb4 504 while (size-- > 0) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 505
kashish_mbed 0:bacc6e701fb4 506 return str;
kashish_mbed 0:bacc6e701fb4 507 }
kashish_mbed 0:bacc6e701fb4 508
kashish_mbed 0:bacc6e701fb4 509 #endif
kashish_mbed 0:bacc6e701fb4 510
kashish_mbed 0:bacc6e701fb4 511 #define CHECK_STR_SIZE(_buf, _str, _size) \
kashish_mbed 0:bacc6e701fb4 512 if ((((_str) - (_buf)) >= ((_size)-1))) { break; }
kashish_mbed 0:bacc6e701fb4 513
kashish_mbed 0:bacc6e701fb4 514 int tiny_vsnprintf_like(char *buf, const int size, const char *fmt, va_list args)
kashish_mbed 0:bacc6e701fb4 515 {
kashish_mbed 0:bacc6e701fb4 516 unsigned long num;
kashish_mbed 0:bacc6e701fb4 517 int base;
kashish_mbed 0:bacc6e701fb4 518 char *str;
kashish_mbed 0:bacc6e701fb4 519 int len;
kashish_mbed 0:bacc6e701fb4 520 int i;
kashish_mbed 0:bacc6e701fb4 521 char *s;
kashish_mbed 0:bacc6e701fb4 522
kashish_mbed 0:bacc6e701fb4 523 int flags; // Flags to number()
kashish_mbed 0:bacc6e701fb4 524
kashish_mbed 0:bacc6e701fb4 525 int field_width; // Width of output field
kashish_mbed 0:bacc6e701fb4 526 int precision; // Min. # of digits for integers; max number of chars for from string
kashish_mbed 0:bacc6e701fb4 527 int qualifier; // 'h', 'l', or 'L' for integer fields
kashish_mbed 0:bacc6e701fb4 528
kashish_mbed 0:bacc6e701fb4 529 if (size <= 0)
kashish_mbed 0:bacc6e701fb4 530 {
kashish_mbed 0:bacc6e701fb4 531 return 0;
kashish_mbed 0:bacc6e701fb4 532 }
kashish_mbed 0:bacc6e701fb4 533
kashish_mbed 0:bacc6e701fb4 534 for (str = buf; *fmt || ((str - buf) >= size-1); fmt++)
kashish_mbed 0:bacc6e701fb4 535 {
kashish_mbed 0:bacc6e701fb4 536 CHECK_STR_SIZE(buf, str, size);
kashish_mbed 0:bacc6e701fb4 537
kashish_mbed 0:bacc6e701fb4 538 if (*fmt != '%')
kashish_mbed 0:bacc6e701fb4 539 {
kashish_mbed 0:bacc6e701fb4 540 *str++ = *fmt;
kashish_mbed 0:bacc6e701fb4 541 continue;
kashish_mbed 0:bacc6e701fb4 542 }
kashish_mbed 0:bacc6e701fb4 543
kashish_mbed 0:bacc6e701fb4 544 // Process flags
kashish_mbed 0:bacc6e701fb4 545 flags = 0;
kashish_mbed 0:bacc6e701fb4 546 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 547 /* Support %0, but not %-, %+, %space and %# */
kashish_mbed 0:bacc6e701fb4 548 fmt++;
kashish_mbed 0:bacc6e701fb4 549 if (*fmt == '0')
kashish_mbed 0:bacc6e701fb4 550 {
kashish_mbed 0:bacc6e701fb4 551 flags |= ZEROPAD;
kashish_mbed 0:bacc6e701fb4 552 }
kashish_mbed 0:bacc6e701fb4 553 #else
kashish_mbed 0:bacc6e701fb4 554 repeat:
kashish_mbed 0:bacc6e701fb4 555 fmt++; // This also skips first '%'
kashish_mbed 0:bacc6e701fb4 556 switch (*fmt)
kashish_mbed 0:bacc6e701fb4 557 {
kashish_mbed 0:bacc6e701fb4 558 case '-': flags |= LEFT; goto repeat;
kashish_mbed 0:bacc6e701fb4 559 case '+': flags |= PLUS; goto repeat;
kashish_mbed 0:bacc6e701fb4 560 case ' ': flags |= SPACE; goto repeat;
kashish_mbed 0:bacc6e701fb4 561 case '#': flags |= HEX_PREP; goto repeat;
kashish_mbed 0:bacc6e701fb4 562 case '0': flags |= ZEROPAD; goto repeat;
kashish_mbed 0:bacc6e701fb4 563 }
kashish_mbed 0:bacc6e701fb4 564 #endif
kashish_mbed 0:bacc6e701fb4 565
kashish_mbed 0:bacc6e701fb4 566 // Get field width
kashish_mbed 0:bacc6e701fb4 567 field_width = -1;
kashish_mbed 0:bacc6e701fb4 568 if (is_digit(*fmt))
kashish_mbed 0:bacc6e701fb4 569 field_width = ee_skip_atoi(&fmt);
kashish_mbed 0:bacc6e701fb4 570 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 571 /* Does not support %* */
kashish_mbed 0:bacc6e701fb4 572 #else
kashish_mbed 0:bacc6e701fb4 573 else if (*fmt == '*')
kashish_mbed 0:bacc6e701fb4 574 {
kashish_mbed 0:bacc6e701fb4 575 fmt++;
kashish_mbed 0:bacc6e701fb4 576 field_width = va_arg(args, int);
kashish_mbed 0:bacc6e701fb4 577 if (field_width < 0)
kashish_mbed 0:bacc6e701fb4 578 {
kashish_mbed 0:bacc6e701fb4 579 field_width = -field_width;
kashish_mbed 0:bacc6e701fb4 580 flags |= LEFT;
kashish_mbed 0:bacc6e701fb4 581 }
kashish_mbed 0:bacc6e701fb4 582 }
kashish_mbed 0:bacc6e701fb4 583 #endif
kashish_mbed 0:bacc6e701fb4 584
kashish_mbed 0:bacc6e701fb4 585 // Get the precision
kashish_mbed 0:bacc6e701fb4 586 precision = -1;
kashish_mbed 0:bacc6e701fb4 587 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 588 /* Does not support %. */
kashish_mbed 0:bacc6e701fb4 589 #else
kashish_mbed 0:bacc6e701fb4 590 if (*fmt == '.')
kashish_mbed 0:bacc6e701fb4 591 {
kashish_mbed 0:bacc6e701fb4 592 ++fmt;
kashish_mbed 0:bacc6e701fb4 593 if (is_digit(*fmt))
kashish_mbed 0:bacc6e701fb4 594 precision = ee_skip_atoi(&fmt);
kashish_mbed 0:bacc6e701fb4 595 else if (*fmt == '*')
kashish_mbed 0:bacc6e701fb4 596 {
kashish_mbed 0:bacc6e701fb4 597 ++fmt;
kashish_mbed 0:bacc6e701fb4 598 precision = va_arg(args, int);
kashish_mbed 0:bacc6e701fb4 599 }
kashish_mbed 0:bacc6e701fb4 600 if (precision < 0) precision = 0;
kashish_mbed 0:bacc6e701fb4 601 }
kashish_mbed 0:bacc6e701fb4 602 #endif
kashish_mbed 0:bacc6e701fb4 603
kashish_mbed 0:bacc6e701fb4 604 // Get the conversion qualifier
kashish_mbed 0:bacc6e701fb4 605 qualifier = -1;
kashish_mbed 0:bacc6e701fb4 606
kashish_mbed 0:bacc6e701fb4 607 if (*fmt == 'l' || *fmt == 'L')
kashish_mbed 0:bacc6e701fb4 608 {
kashish_mbed 0:bacc6e701fb4 609 qualifier = *fmt;
kashish_mbed 0:bacc6e701fb4 610 fmt++;
kashish_mbed 0:bacc6e701fb4 611 }
kashish_mbed 0:bacc6e701fb4 612
kashish_mbed 0:bacc6e701fb4 613
kashish_mbed 0:bacc6e701fb4 614 // Default base
kashish_mbed 0:bacc6e701fb4 615 base = 10;
kashish_mbed 0:bacc6e701fb4 616
kashish_mbed 0:bacc6e701fb4 617 switch (*fmt)
kashish_mbed 0:bacc6e701fb4 618 {
kashish_mbed 0:bacc6e701fb4 619 case 'c':
kashish_mbed 0:bacc6e701fb4 620 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 621 #else
kashish_mbed 0:bacc6e701fb4 622 if (!(flags & LEFT))
kashish_mbed 0:bacc6e701fb4 623 #endif
kashish_mbed 0:bacc6e701fb4 624 while (--field_width > 0) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 625 *str++ = (unsigned char) va_arg(args, int);
kashish_mbed 0:bacc6e701fb4 626 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 627 #else
kashish_mbed 0:bacc6e701fb4 628 while (--field_width > 0) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 629 #endif
kashish_mbed 0:bacc6e701fb4 630 continue;
kashish_mbed 0:bacc6e701fb4 631
kashish_mbed 0:bacc6e701fb4 632 case 's':
kashish_mbed 0:bacc6e701fb4 633 s = va_arg(args, char *);
kashish_mbed 0:bacc6e701fb4 634 if (!s) s = "<NULL>";
kashish_mbed 0:bacc6e701fb4 635 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 636 len = strlen(s);
kashish_mbed 0:bacc6e701fb4 637 #else
kashish_mbed 0:bacc6e701fb4 638 len = strnlen(s, precision);
kashish_mbed 0:bacc6e701fb4 639 if (!(flags & LEFT))
kashish_mbed 0:bacc6e701fb4 640 #endif
kashish_mbed 0:bacc6e701fb4 641 while (len < field_width--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 642 for (i = 0; i < len; ++i) *str++ = *s++;
kashish_mbed 0:bacc6e701fb4 643 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 644 #else
kashish_mbed 0:bacc6e701fb4 645 while (len < field_width--) *str++ = ' ';
kashish_mbed 0:bacc6e701fb4 646 #endif
kashish_mbed 0:bacc6e701fb4 647 continue;
kashish_mbed 0:bacc6e701fb4 648
kashish_mbed 0:bacc6e701fb4 649 #ifdef TINY_PRINTF
kashish_mbed 0:bacc6e701fb4 650 /* Does not support %p, %A, %a, %o */
kashish_mbed 0:bacc6e701fb4 651 #else
kashish_mbed 0:bacc6e701fb4 652 case 'p':
kashish_mbed 0:bacc6e701fb4 653 if (field_width == -1)
kashish_mbed 0:bacc6e701fb4 654 {
kashish_mbed 0:bacc6e701fb4 655 field_width = 2 * sizeof(void *);
kashish_mbed 0:bacc6e701fb4 656 flags |= ZEROPAD;
kashish_mbed 0:bacc6e701fb4 657 }
kashish_mbed 0:bacc6e701fb4 658 str = ee_number(str, (size - (str - buf)), (unsigned long) va_arg(args, void *), 16, field_width, precision, flags);
kashish_mbed 0:bacc6e701fb4 659 continue;
kashish_mbed 0:bacc6e701fb4 660
kashish_mbed 0:bacc6e701fb4 661 case 'A':
kashish_mbed 0:bacc6e701fb4 662 flags |= UPPERCASE;
kashish_mbed 0:bacc6e701fb4 663
kashish_mbed 0:bacc6e701fb4 664 case 'a':
kashish_mbed 0:bacc6e701fb4 665 if (qualifier == 'l')
kashish_mbed 0:bacc6e701fb4 666 str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags);
kashish_mbed 0:bacc6e701fb4 667 else
kashish_mbed 0:bacc6e701fb4 668 str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags);
kashish_mbed 0:bacc6e701fb4 669 continue;
kashish_mbed 0:bacc6e701fb4 670
kashish_mbed 0:bacc6e701fb4 671 // Integer number formats - set up the flags and "break"
kashish_mbed 0:bacc6e701fb4 672 case 'o':
kashish_mbed 0:bacc6e701fb4 673 base = 8;
kashish_mbed 0:bacc6e701fb4 674 break;
kashish_mbed 0:bacc6e701fb4 675 #endif
kashish_mbed 0:bacc6e701fb4 676
kashish_mbed 0:bacc6e701fb4 677 case 'X':
kashish_mbed 0:bacc6e701fb4 678 flags |= UPPERCASE;
kashish_mbed 0:bacc6e701fb4 679
kashish_mbed 0:bacc6e701fb4 680 case 'x':
kashish_mbed 0:bacc6e701fb4 681 base = 16;
kashish_mbed 0:bacc6e701fb4 682 break;
kashish_mbed 0:bacc6e701fb4 683
kashish_mbed 0:bacc6e701fb4 684 case 'd':
kashish_mbed 0:bacc6e701fb4 685 case 'i':
kashish_mbed 0:bacc6e701fb4 686 flags |= SIGN;
kashish_mbed 0:bacc6e701fb4 687
kashish_mbed 0:bacc6e701fb4 688 case 'u':
kashish_mbed 0:bacc6e701fb4 689 break;
kashish_mbed 0:bacc6e701fb4 690
kashish_mbed 0:bacc6e701fb4 691 #ifdef HAS_FLOAT
kashish_mbed 0:bacc6e701fb4 692
kashish_mbed 0:bacc6e701fb4 693 case 'f':
kashish_mbed 0:bacc6e701fb4 694 str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN);
kashish_mbed 0:bacc6e701fb4 695 continue;
kashish_mbed 0:bacc6e701fb4 696
kashish_mbed 0:bacc6e701fb4 697 #endif
kashish_mbed 0:bacc6e701fb4 698
kashish_mbed 0:bacc6e701fb4 699 default:
kashish_mbed 0:bacc6e701fb4 700 if (*fmt != '%') *str++ = '%';
kashish_mbed 0:bacc6e701fb4 701 CHECK_STR_SIZE(buf, str, size);
kashish_mbed 0:bacc6e701fb4 702 if (*fmt)
kashish_mbed 0:bacc6e701fb4 703 *str++ = *fmt;
kashish_mbed 0:bacc6e701fb4 704 else
kashish_mbed 0:bacc6e701fb4 705 --fmt;
kashish_mbed 0:bacc6e701fb4 706 CHECK_STR_SIZE(buf, str, size);
kashish_mbed 0:bacc6e701fb4 707 continue;
kashish_mbed 0:bacc6e701fb4 708 }
kashish_mbed 0:bacc6e701fb4 709
kashish_mbed 0:bacc6e701fb4 710 if (qualifier == 'l')
kashish_mbed 0:bacc6e701fb4 711 num = va_arg(args, unsigned long);
kashish_mbed 0:bacc6e701fb4 712 else if (flags & SIGN)
kashish_mbed 0:bacc6e701fb4 713 num = va_arg(args, int);
kashish_mbed 0:bacc6e701fb4 714 else
kashish_mbed 0:bacc6e701fb4 715 num = va_arg(args, unsigned int);
kashish_mbed 0:bacc6e701fb4 716
kashish_mbed 0:bacc6e701fb4 717 str = ee_number(str, ((size - 1) - (str - buf)), num, base, field_width, precision, flags);
kashish_mbed 0:bacc6e701fb4 718 }
kashish_mbed 0:bacc6e701fb4 719
kashish_mbed 0:bacc6e701fb4 720 *str = '\0';
kashish_mbed 0:bacc6e701fb4 721 return str - buf;
kashish_mbed 0:bacc6e701fb4 722 }
kashish_mbed 0:bacc6e701fb4 723