This is an automated email from the git hooks/post-receive script. smcv pushed a commit to annotated tag 1.5a in repository iortcw.
commit d3f6f64e9288ed86d719866eda2b2d7f3142a095 Author: MAN-AT-ARMS <[email protected]> Date: Sun Jun 5 14:25:16 2016 -0400 All: Ensure R_PrintLongString doesn't split words between buffers --- MP/code/rend2/tr_init.c | 29 ++++++++++++++++++++++------- MP/code/renderer/tr_init.c | 29 ++++++++++++++++++++++------- SP/code/rend2/tr_init.c | 29 ++++++++++++++++++++++------- SP/code/renderer/tr_init.c | 29 ++++++++++++++++++++++------- 4 files changed, 88 insertions(+), 28 deletions(-) diff --git a/MP/code/rend2/tr_init.c b/MP/code/rend2/tr_init.c index 7d7675f..2ad7d9c 100644 --- a/MP/code/rend2/tr_init.c +++ b/MP/code/rend2/tr_init.c @@ -1104,16 +1104,31 @@ Workaround for ri.Printf's 1024 characters buffer limit. */ void R_PrintLongString(const char *string) { char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); ri.Printf( PRINT_ALL, "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } diff --git a/MP/code/renderer/tr_init.c b/MP/code/renderer/tr_init.c index 25ed2bd..af21f69 100644 --- a/MP/code/renderer/tr_init.c +++ b/MP/code/renderer/tr_init.c @@ -1012,16 +1012,31 @@ Workaround for ri.Printf's 1024 characters buffer limit. */ void R_PrintLongString(const char *string) { char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); ri.Printf( PRINT_ALL, "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } diff --git a/SP/code/rend2/tr_init.c b/SP/code/rend2/tr_init.c index d338fd1..31bc6ca 100644 --- a/SP/code/rend2/tr_init.c +++ b/SP/code/rend2/tr_init.c @@ -1108,16 +1108,31 @@ Workaround for ri.Printf's 1024 characters buffer limit. */ void R_PrintLongString(const char *string) { char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); ri.Printf( PRINT_ALL, "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } diff --git a/SP/code/renderer/tr_init.c b/SP/code/renderer/tr_init.c index 4cb656e..5ddcf55 100644 --- a/SP/code/renderer/tr_init.c +++ b/SP/code/renderer/tr_init.c @@ -1016,16 +1016,31 @@ Workaround for ri.Printf's 1024 characters buffer limit. */ void R_PrintLongString(const char *string) { char buffer[1024]; - const char *p; - int size = strlen(string); + const char *p = string; + int remainingLength = strlen(string); - p = string; - while(size > 0) + while (remainingLength > 0) { - Q_strncpyz(buffer, p, sizeof (buffer) ); + // Take as much characters as possible from the string without splitting words between buffers + // This avoids the client console splitting a word up when one half fits on the current line, + // but the second half would have to be written on a new line + int charsToTake = sizeof(buffer) - 1; + if (remainingLength > charsToTake) { + while (p[charsToTake - 1] > ' ' && p[charsToTake] > ' ') { + charsToTake--; + if (charsToTake == 0) { + charsToTake = sizeof(buffer) - 1; + break; + } + } + } else if (remainingLength < charsToTake) { + charsToTake = remainingLength; + } + + Q_strncpyz( buffer, p, charsToTake + 1 ); ri.Printf( PRINT_ALL, "%s", buffer ); - p += 1023; - size -= 1023; + remainingLength -= charsToTake; + p += charsToTake; } } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

