On 7 July 2016 at 17:19, Rasmus Villemoes <linux at rasmusvillemoes.dk> wrote: > On Tue, Jul 05 2016, Markus Mayer <mmayer at broadcom.com> wrote: > >> +/** >> + * strncpytoupper - Copy a length-limited string and convert to uppercase. >> + * @dst: The buffer to store the result. >> + * @src: The string to convert to uppercase. >> + * @len: Maximum string length. May be 0 to set no limit. >> + * >> + * Returns pointer to terminating '\0' in @dst. >> + */ >> +char *strncpytoupper(char *dst, const char *src, size_t len) >> +{ >> + size_t i; >> + >> + for (i = 0; src[i] != '\0' && (i < len || !len); i++) >> + dst[i] = toupper(src[i]); >> + if (i < len || !len) >> + dst[i] = '\0'; >> + >> + return dst + i; >> +} > > Hm, this seems to copy the insane semantics from strncpy of not > guaranteeing '\0'-termination.
Yeah. I've been tossing that one around a bit. The reason I did it this way in the end is due to the use cases I found. strncpy() is being used there and I was a little wary to make too many changes all at once. But I understand your point. I'll look at it again and see what changes might be required in the code that used strncpy() before. > Why use 0 as a sentinel, when (size_t)-1 == SIZE_MAX would work just as > well and require a little less code (no || !len)? I'll change that. > I regret suggesting this return semantics and now agree that void would > be better, especially since there doesn't seem to be anyone who can > use this (or any other) return value. How about > > if (!len) > return; > > for (i = 0; i < len && src[i]; ++i) > dst[i] = toupper(src[i]); > dst[i < len ? i : i-1] = '\0'; This makes sense. > (I think you must do i < len before testing src[i], since the len > parameter should be an upper bound on the number of bytes to access in > both src and dst). > > Rasmus Thanks, -Markus