Bugfix to snprint_cameltospaces() when given a short buffer [thanks Romain Chossart]
This commit is contained in:
parent
e9a1302e4c
commit
e3d0baa846
|
@ -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;
|
||||||
|
|
17
termkey.c
17
termkey.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue