mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-23 01:59:43 +01:00
Harden next_wrap against getting stuck on a single character
If, somehow, a single character is wider than the limit, next_wrap would get you stuck in an infinite loop by refusing to update the start index and giving a line length of 0. Now, it just gives you a line with that single character. I also made some small readability improvements: I renamed next_wrap_s to next_wrap_buf, and added comments at the top of both functions explaining what they do.
This commit is contained in:
parent
9747843c18
commit
11b372c741
1 changed files with 21 additions and 3 deletions
|
@ -686,7 +686,9 @@ static bool next_wrap(
|
||||||
const char* str,
|
const char* str,
|
||||||
const int maxwidth
|
const int maxwidth
|
||||||
) {
|
) {
|
||||||
/* This function is UTF-8 aware. But start/len still are bytes. */
|
/* Get information about the current line in wordwrapped text,
|
||||||
|
* given this line starts at str[*start].
|
||||||
|
* *start is updated to the start of the next line. */
|
||||||
size_t idx = 0;
|
size_t idx = 0;
|
||||||
size_t lenfromlastspace = 0;
|
size_t lenfromlastspace = 0;
|
||||||
size_t lastspace = 0;
|
size_t lastspace = 0;
|
||||||
|
@ -733,6 +735,12 @@ static bool next_wrap(
|
||||||
*len = lenfromlastspace;
|
*len = lenfromlastspace;
|
||||||
*start = lastspace + 1;
|
*start = lastspace + 1;
|
||||||
}
|
}
|
||||||
|
if (idx == 0)
|
||||||
|
{
|
||||||
|
// Oops, we're stuck at a single character
|
||||||
|
*len = 1;
|
||||||
|
*start += 1;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,7 +751,7 @@ next:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool next_wrap_s(
|
static bool next_wrap_buf(
|
||||||
Font* f,
|
Font* f,
|
||||||
char buffer[],
|
char buffer[],
|
||||||
const size_t buffer_size,
|
const size_t buffer_size,
|
||||||
|
@ -751,6 +759,16 @@ static bool next_wrap_s(
|
||||||
const char* str,
|
const char* str,
|
||||||
const int maxwidth
|
const int maxwidth
|
||||||
) {
|
) {
|
||||||
|
/* Get each line of wordwrapped text, writing one line at a time to a buffer.
|
||||||
|
* Call as follows:
|
||||||
|
*
|
||||||
|
* char buf[256];
|
||||||
|
* size_t start = 0;
|
||||||
|
* while (next_wrap_buf(font, buf, sizeof(buf), &start, "String to wordwrap", 320))
|
||||||
|
* {
|
||||||
|
* // buf contains a line of text
|
||||||
|
* }
|
||||||
|
*/
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
const size_t prev_start = *start;
|
const size_t prev_start = *start;
|
||||||
|
|
||||||
|
@ -1177,7 +1195,7 @@ int print_wrap(
|
||||||
start = 0;
|
start = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (next_wrap_s(pf.font_sel, buffer, sizeof(buffer), &start, str, maxwidth))
|
while (next_wrap_buf(pf.font_sel, buffer, sizeof(buffer), &start, str, maxwidth))
|
||||||
{
|
{
|
||||||
print(flags, x, y, buffer, r, g, b);
|
print(flags, x, y, buffer, r, g, b);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue