Message ID | 20200408083251.v5.2.I1ca01985ee4914667e7a2ba006de71c2546eada3@changeid |
---|---|
State | Superseded |
Headers | show |
Series | A few little patches | expand |
On 2020-04-08 16:32, Simon Glass wrote: > Add a helper function for this operation. Update the strtoul() tests to > check upper case as well. > > > Signed-off-by: Simon Glass <sjg at chromium.org> Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de> > --- > > Changes in v5: > - Drop change to FAT > - Add new tests for copying an empty string > - Use size_t instead of int, require caller to use SIZE_MAX > - Update the algorithm to avoid dealing with -1 > > Changes in v4: > - Add a new patch to convert a string to upper case > > include/vsprintf.h | 12 +++++++ > lib/strto.c | 8 +++++ > test/str_ut.c | 78 +++++++++++++++++++++++++++++++++++++--------- > 3 files changed, 83 insertions(+), 15 deletions(-) > > diff --git a/include/vsprintf.h b/include/vsprintf.h > index 56844dd2de8..d9fb68add0c 100644 > --- a/include/vsprintf.h > +++ b/include/vsprintf.h > @@ -222,4 +222,16 @@ bool str2long(const char *p, ulong *num); > * @hz: Value to convert > */ > char *strmhz(char *buf, unsigned long hz); > + > +/** > + * str_to_upper() - Convert a string to upper case > + * > + * This simply uses toupper() on each character of the string. > + * > + * @in: String to convert (must be large enough to hold the output string) > + * @out: Buffer to put converted string > + * @len: Number of bytes available in @out (SIZE_MAX for all) > + */ > +void str_to_upper(const char *in, char *out, size_t len); > + > #endif > diff --git a/lib/strto.c b/lib/strto.c > index 55ff9f7437d..c00bb5895df 100644 > --- a/lib/strto.c > +++ b/lib/strto.c > @@ -163,3 +163,11 @@ long trailing_strtol(const char *str) > { > return trailing_strtoln(str, NULL); > } > + > +void str_to_upper(const char *in, char *out, size_t len) > +{ > + for (; len > 0 && *in; len--) > + *out++ = toupper(*in++); > + if (len) > + *out = '\0'; > +} > diff --git a/test/str_ut.c b/test/str_ut.c > index fab8de595cb..7c8015050ad 100644 > --- a/test/str_ut.c > +++ b/test/str_ut.c > @@ -19,36 +19,84 @@ static const char str3[] = "0xbI'm sorry you're alive."; > /* Declare a new str test */ > #define STR_TEST(_name, _flags) UNIT_TEST(_name, _flags, str_test) > > +static int str_test_upper(struct unit_test_state *uts) > +{ > + char out[TEST_STR_SIZE]; > + > + /* Make sure it adds a terminator */ > + out[strlen(str1)] = 'a'; > + str_to_upper(str1, out, SIZE_MAX); > + ut_asserteq_str("I'M SORRY I'M LATE.", out); > + > + /* In-place operation */ > + strcpy(out, str2); > + str_to_upper(out, out, SIZE_MAX); > + ut_asserteq_str("1099ABNO, DON'T BOTHER APOLOGISING.", out); > + > + /* Limited length */ > + str_to_upper(str1, out, 7); > + ut_asserteq_str("I'M SORO, DON'T BOTHER APOLOGISING.", out); > + > + /* In-place with limited length */ > + strcpy(out, str2); > + str_to_upper(out, out, 7); > + ut_asserteq_str("1099ABNo, don't bother apologising.", out); > + > + /* Copy an empty string to a buffer with space*/ > + out[1] = 0x7f; > + str_to_upper("", out, SIZE_MAX); > + ut_asserteq('\0', *out); > + ut_asserteq(0x7f, out[1]); > + > + /* Copy an empty string to a buffer with no space*/ > + out[0] = 0x7f; > + str_to_upper("", out, 0); > + ut_asserteq(0x7f, out[0]); > + > + return 0; > +} > +STR_TEST(str_test_upper, 0); > + > static int run_strtoul(struct unit_test_state *uts, const char *str, int base, > - ulong expect_val, int expect_endp_offset) > + ulong expect_val, int expect_endp_offset, bool upper) > { > + char out[TEST_STR_SIZE]; > char *endp; > ulong val; > > - val = simple_strtoul(str, &endp, base); > + strcpy(out, str); > + if (upper) > + str_to_upper(out, out, -1); > + > + val = simple_strtoul(out, &endp, base); > ut_asserteq(expect_val, val); > - ut_asserteq(expect_endp_offset, endp - str); > + ut_asserteq(expect_endp_offset, endp - out); > > return 0; > } > > static int str_simple_strtoul(struct unit_test_state *uts) > { > - /* Base 10 and base 16 */ > - ut_assertok(run_strtoul(uts, str2, 10, 1099, 4)); > - ut_assertok(run_strtoul(uts, str2, 16, 0x1099ab, 6)); > + int upper; > + > + /* Check that it is case-insentive */ > + for (upper = 0; upper < 2; upper++) { > + /* Base 10 and base 16 */ > + ut_assertok(run_strtoul(uts, str2, 10, 1099, 4, upper)); > + ut_assertok(run_strtoul(uts, str2, 16, 0x1099ab, 6, upper)); > > - /* Invalid string */ > - ut_assertok(run_strtoul(uts, str1, 10, 0, 0)); > + /* Invalid string */ > + ut_assertok(run_strtoul(uts, str1, 10, 0, 0, upper)); > > - /* Base 0 */ > - ut_assertok(run_strtoul(uts, str1, 0, 0, 0)); > - ut_assertok(run_strtoul(uts, str2, 0, 1099, 4)); > - ut_assertok(run_strtoul(uts, str3, 0, 0xb, 3)); > + /* Base 0 */ > + ut_assertok(run_strtoul(uts, str1, 0, 0, 0, upper)); > + ut_assertok(run_strtoul(uts, str2, 0, 1099, 4, upper)); > + ut_assertok(run_strtoul(uts, str3, 0, 0xb, 3, upper)); > > - /* Base 2 */ > - ut_assertok(run_strtoul(uts, str1, 2, 0, 0)); > - ut_assertok(run_strtoul(uts, str2, 2, 2, 2)); > + /* Base 2 */ > + ut_assertok(run_strtoul(uts, str1, 2, 0, 0, upper)); > + ut_assertok(run_strtoul(uts, str2, 2, 2, 2, upper)); > + } > > /* Check endp being NULL */ > ut_asserteq(1099, simple_strtoul(str2, NULL, 0)); >
On Wed, Apr 08, 2020 at 08:32:56AM -0600, Simon Glass wrote: > Add a helper function for this operation. Update the strtoul() tests to > check upper case as well. > > > Signed-off-by: Simon Glass <sjg at chromium.org> > Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de> Applied to u-boot/master, thanks!
diff --git a/include/vsprintf.h b/include/vsprintf.h index 56844dd2de8..d9fb68add0c 100644 --- a/include/vsprintf.h +++ b/include/vsprintf.h @@ -222,4 +222,16 @@ bool str2long(const char *p, ulong *num); * @hz: Value to convert */ char *strmhz(char *buf, unsigned long hz); + +/** + * str_to_upper() - Convert a string to upper case + * + * This simply uses toupper() on each character of the string. + * + * @in: String to convert (must be large enough to hold the output string) + * @out: Buffer to put converted string + * @len: Number of bytes available in @out (SIZE_MAX for all) + */ +void str_to_upper(const char *in, char *out, size_t len); + #endif diff --git a/lib/strto.c b/lib/strto.c index 55ff9f7437d..c00bb5895df 100644 --- a/lib/strto.c +++ b/lib/strto.c @@ -163,3 +163,11 @@ long trailing_strtol(const char *str) { return trailing_strtoln(str, NULL); } + +void str_to_upper(const char *in, char *out, size_t len) +{ + for (; len > 0 && *in; len--) + *out++ = toupper(*in++); + if (len) + *out = '\0'; +} diff --git a/test/str_ut.c b/test/str_ut.c index fab8de595cb..7c8015050ad 100644 --- a/test/str_ut.c +++ b/test/str_ut.c @@ -19,36 +19,84 @@ static const char str3[] = "0xbI'm sorry you're alive."; /* Declare a new str test */ #define STR_TEST(_name, _flags) UNIT_TEST(_name, _flags, str_test) +static int str_test_upper(struct unit_test_state *uts) +{ + char out[TEST_STR_SIZE]; + + /* Make sure it adds a terminator */ + out[strlen(str1)] = 'a'; + str_to_upper(str1, out, SIZE_MAX); + ut_asserteq_str("I'M SORRY I'M LATE.", out); + + /* In-place operation */ + strcpy(out, str2); + str_to_upper(out, out, SIZE_MAX); + ut_asserteq_str("1099ABNO, DON'T BOTHER APOLOGISING.", out); + + /* Limited length */ + str_to_upper(str1, out, 7); + ut_asserteq_str("I'M SORO, DON'T BOTHER APOLOGISING.", out); + + /* In-place with limited length */ + strcpy(out, str2); + str_to_upper(out, out, 7); + ut_asserteq_str("1099ABNo, don't bother apologising.", out); + + /* Copy an empty string to a buffer with space*/ + out[1] = 0x7f; + str_to_upper("", out, SIZE_MAX); + ut_asserteq('\0', *out); + ut_asserteq(0x7f, out[1]); + + /* Copy an empty string to a buffer with no space*/ + out[0] = 0x7f; + str_to_upper("", out, 0); + ut_asserteq(0x7f, out[0]); + + return 0; +} +STR_TEST(str_test_upper, 0); + static int run_strtoul(struct unit_test_state *uts, const char *str, int base, - ulong expect_val, int expect_endp_offset) + ulong expect_val, int expect_endp_offset, bool upper) { + char out[TEST_STR_SIZE]; char *endp; ulong val; - val = simple_strtoul(str, &endp, base); + strcpy(out, str); + if (upper) + str_to_upper(out, out, -1); + + val = simple_strtoul(out, &endp, base); ut_asserteq(expect_val, val); - ut_asserteq(expect_endp_offset, endp - str); + ut_asserteq(expect_endp_offset, endp - out); return 0; } static int str_simple_strtoul(struct unit_test_state *uts) { - /* Base 10 and base 16 */ - ut_assertok(run_strtoul(uts, str2, 10, 1099, 4)); - ut_assertok(run_strtoul(uts, str2, 16, 0x1099ab, 6)); + int upper; + + /* Check that it is case-insentive */ + for (upper = 0; upper < 2; upper++) { + /* Base 10 and base 16 */ + ut_assertok(run_strtoul(uts, str2, 10, 1099, 4, upper)); + ut_assertok(run_strtoul(uts, str2, 16, 0x1099ab, 6, upper)); - /* Invalid string */ - ut_assertok(run_strtoul(uts, str1, 10, 0, 0)); + /* Invalid string */ + ut_assertok(run_strtoul(uts, str1, 10, 0, 0, upper)); - /* Base 0 */ - ut_assertok(run_strtoul(uts, str1, 0, 0, 0)); - ut_assertok(run_strtoul(uts, str2, 0, 1099, 4)); - ut_assertok(run_strtoul(uts, str3, 0, 0xb, 3)); + /* Base 0 */ + ut_assertok(run_strtoul(uts, str1, 0, 0, 0, upper)); + ut_assertok(run_strtoul(uts, str2, 0, 1099, 4, upper)); + ut_assertok(run_strtoul(uts, str3, 0, 0xb, 3, upper)); - /* Base 2 */ - ut_assertok(run_strtoul(uts, str1, 2, 0, 0)); - ut_assertok(run_strtoul(uts, str2, 2, 2, 2)); + /* Base 2 */ + ut_assertok(run_strtoul(uts, str1, 2, 0, 0, upper)); + ut_assertok(run_strtoul(uts, str2, 2, 2, 2, upper)); + } /* Check endp being NULL */ ut_asserteq(1099, simple_strtoul(str2, NULL, 0));
Add a helper function for this operation. Update the strtoul() tests to check upper case as well. Signed-off-by: Simon Glass <sjg at chromium.org> --- Changes in v5: - Drop change to FAT - Add new tests for copying an empty string - Use size_t instead of int, require caller to use SIZE_MAX - Update the algorithm to avoid dealing with -1 Changes in v4: - Add a new patch to convert a string to upper case include/vsprintf.h | 12 +++++++ lib/strto.c | 8 +++++ test/str_ut.c | 78 +++++++++++++++++++++++++++++++++++++--------- 3 files changed, 83 insertions(+), 15 deletions(-)