Bugfix to snprint_cameltospaces() when given a short buffer [thanks Romain Chossart]

This commit is contained in:
Paul LeoNerd Evans 2013-08-26 18:46:01 +01:00
parent e9a1302e4c
commit e3d0baa846
2 changed files with 22 additions and 6 deletions

View File

@ -8,7 +8,7 @@ int main(int argc, char *argv[])
char buffer[16]; char buffer[16];
size_t len; size_t len;
plan_tests(40); plan_tests(44);
tk = termkey_new_abstract("vt100", 0); tk = termkey_new_abstract("vt100", 0);
@ -106,6 +106,15 @@ int main(int argc, char *argv[])
is_int(len, 7, "length for sym/PageUp/0 lowerspace"); is_int(len, 7, "length for sym/PageUp/0 lowerspace");
is_str(buffer, "page up", "buffer for sym/PageUp/0 lowerspace"); is_str(buffer, "page up", "buffer for sym/PageUp/0 lowerspace");
/* If size of buffer is too small, strfkey should return something consistent */
len = termkey_strfkey(tk, buffer, 4, &key, 0);
is_int(len, 6, "length for sym/PageUp/0");
is_str(buffer, "Pag", "buffer of len 4 for sym/PageUp/0");
len = termkey_strfkey(tk, buffer, 4, &key, TERMKEY_FORMAT_LOWERSPACE);
is_int(len, 7, "length for sym/PageUp/0 lowerspace");
is_str(buffer, "pag", "buffer of len 4 for sym/PageUp/0 lowerspace");
key.type = TERMKEY_TYPE_FUNCTION; key.type = TERMKEY_TYPE_FUNCTION;
key.code.number = 5; key.code.number = 5;
key.modifiers = 0; key.modifiers = 0;

View File

@ -198,19 +198,26 @@ static int snprint_cameltospaces(char *str, size_t size, const char *src)
{ {
int prev_lower = 0; int prev_lower = 0;
size_t l = 0; size_t l = 0;
while(*src && l < size) { while(*src && l < size - 1) {
if(isupper(*src) && prev_lower) { if(isupper(*src) && prev_lower) {
if(str) if(str)
str[l++] = ' '; str[l++] = ' ';
if(l >= size) if(l >= size - 1)
return -1; break;
} }
prev_lower = islower(*src); prev_lower = islower(*src);
str[l++] = tolower(*src++); str[l++] = tolower(*src++);
} }
if(l >= size)
return -1;
str[l] = 0; str[l] = 0;
/* For consistency with snprintf, return the number of bytes that would have
* been written, excluding '\0' */
while(*src) {
if(isupper(*src) && prev_lower) {
l++;
}
prev_lower = islower(*src);
src++; l++;
}
return l; return l;
} }