Commit bf05293973b348f6946c9df92cd3c65ece42d0be

Authored by James Yang
Committed by Wolfgang Denk
1 parent 92fa37eac5
Exists in master and in 55 other branches 8qm-imx_v2020.04_5.4.70_2.3.0, emb_lf_v2022.04, emb_lf_v2023.04, imx_v2015.04_4.1.15_1.0.0_ga, pitx_8mp_lf_v2020.04, smarc-8m-android-10.0.0_2.6.0, smarc-8m-android-11.0.0_2.0.0, smarc-8mp-android-11.0.0_2.0.0, smarc-emmc-imx_v2014.04_3.10.53_1.1.0_ga, smarc-emmc-imx_v2014.04_3.14.28_1.0.0_ga, smarc-imx-l5.0.0_1.0.0-ga, smarc-imx6_v2018.03_4.14.98_2.0.0_ga, smarc-imx7_v2017.03_4.9.11_1.0.0_ga, smarc-imx7_v2018.03_4.14.98_2.0.0_ga, smarc-imx_v2014.04_3.14.28_1.0.0_ga, smarc-imx_v2015.04_4.1.15_1.0.0_ga, smarc-imx_v2017.03_4.9.11_1.0.0_ga, smarc-imx_v2017.03_4.9.88_2.0.0_ga, smarc-imx_v2017.03_o8.1.0_1.3.0_8m, smarc-imx_v2018.03_4.14.78_1.0.0_ga, smarc-m6.0.1_2.1.0-ga, smarc-n7.1.2_2.0.0-ga, smarc-rel_imx_4.1.15_2.0.0_ga, smarc_8m-imx_v2018.03_4.14.98_2.0.0_ga, smarc_8m-imx_v2019.04_4.19.35_1.1.0, smarc_8m_00d0-imx_v2018.03_4.14.98_2.0.0_ga, smarc_8mm-imx_v2018.03_4.14.98_2.0.0_ga, smarc_8mm-imx_v2019.04_4.19.35_1.1.0, smarc_8mm-imx_v2020.04_5.4.24_2.1.0, smarc_8mp_lf_v2020.04, smarc_8mq-imx_v2020.04_5.4.24_2.1.0, smarc_8mq_lf_v2020.04, ti-u-boot-2015.07, u-boot-2013.01.y, v2013.10, v2013.10-smarct33, v2013.10-smartmen, v2014.01, v2014.04, v2014.04-smarct33, v2014.04-smarct33-emmc, v2014.04-smartmen, v2014.07, v2014.07-smarct33, v2014.07-smartmen, v2015.07-smarct33, v2015.07-smarct33-emmc, v2015.07-smarct4x, v2016.05-dlt, v2016.05-smarct3x, v2016.05-smarct3x-emmc, v2016.05-smarct4x, v2017.01-smarct3x, v2017.01-smarct3x-emmc, v2017.01-smarct4x

Fix 64-bit vsprintf.

There were some size and unsigned problems.
Also add support for "ll" size modifier in format string like glibc

Signed-off-by: James Yang <James.Yang@freescale.com>
Acked-by: Jon Loeliger <jdl@freescale.com>

Showing 1 changed file with 17 additions and 4 deletions Side-by-side Diff

lib_generic/vsprintf.c
... ... @@ -105,17 +105,26 @@
105 105 #define SPECIAL 32 /* 0x */
106 106 #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
107 107  
  108 +#ifdef CFG_64BIT_VSPRINTF
108 109 #define do_div(n,base) ({ \
  110 + unsigned int __res; \
  111 + __res = ((unsigned long long) n) % base; \
  112 + n = ((unsigned long long) n) / base; \
  113 + __res; \
  114 +})
  115 +#else
  116 +#define do_div(n,base) ({ \
109 117 int __res; \
110   - __res = ((unsigned long) n) % (unsigned) base; \
111   - n = ((unsigned long) n) / (unsigned) base; \
  118 + __res = ((unsigned long) n) % base; \
  119 + n = ((unsigned long) n) / base; \
112 120 __res; \
113 121 })
  122 +#endif
114 123  
115 124 #ifdef CFG_64BIT_VSPRINTF
116   -static char * number(char * str, long long num, int base, int size, int precision ,int type)
  125 +static char * number(char * str, long long num, unsigned int base, int size, int precision ,int type)
117 126 #else
118   -static char * number(char * str, long num, int base, int size, int precision ,int type)
  127 +static char * number(char * str, long num, unsigned int base, int size, int precision ,int type)
119 128 #endif
120 129 {
121 130 char c,sign,tmp[66];
... ... @@ -255,6 +264,10 @@
255 264 qualifier = -1;
256 265 if (*fmt == 'h' || *fmt == 'l' || *fmt == 'q') {
257 266 qualifier = *fmt;
  267 + if (qualifier == 'l' && *(fmt+1) == 'l') {
  268 + qualifier = 'q';
  269 + ++fmt;
  270 + }
258 271 ++fmt;
259 272 }
260 273