From: <eli...@us...> - 2008-12-22 16:27:27
|
Revision: 3166 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3166&view=rev Author: elias_naur Date: 2008-12-22 16:27:21 +0000 (Mon, 22 Dec 2008) Log Message: ----------- Made sprintfJavaString handle arbitrary length strings and reduce stack usage Modified Paths: -------------- trunk/LWJGL/src/native/common/common_tools.c Modified: trunk/LWJGL/src/native/common/common_tools.c =================================================================== --- trunk/LWJGL/src/native/common/common_tools.c 2008-12-22 11:55:28 UTC (rev 3165) +++ trunk/LWJGL/src/native/common/common_tools.c 2008-12-22 16:27:21 UTC (rev 3166) @@ -67,17 +67,36 @@ return debug; } -static jstring sprintfJavaString(JNIEnv *env, const char *format, va_list ap) { -#define BUFFER_SIZE 400 - char buffer[BUFFER_SIZE]; - jstring str; +static int do_vsnprintf(char* buffer, size_t buffer_size, const char *format, va_list ap) { #ifdef _MSC_VER - vsnprintf_s(buffer, BUFFER_SIZE, _TRUNCATE, format, ap); + return vsnprintf_s(buffer, buffer_size, _TRUNCATE, format, ap); #else - vsnprintf(buffer, BUFFER_SIZE, format, ap); + return vsnprintf(buffer, buffer_size, format, ap); #endif - buffer[BUFFER_SIZE - 1] = '\0'; +} + +static jstring sprintfJavaString(JNIEnv *env, const char *format, va_list ap) { + int buffer_size = 2; + char *buffer; + jstring str; + int str_size; + va_list cp_ap; + buffer = (char *)malloc(sizeof(char)*buffer_size); + if (buffer == NULL) + return NULL; + va_copy(cp_ap, ap); + str_size = do_vsnprintf(buffer, buffer_size, format, ap); + if (str_size > buffer_size) { + free(buffer); + buffer_size = str_size + 1; + buffer = (char *)malloc(sizeof(char)*buffer_size); + if (buffer == NULL) + return NULL; + int blah = do_vsnprintf(buffer, buffer_size, format, cp_ap); + } + va_end(cp_ap); str = (*env)->NewStringUTF(env, buffer); + free(buffer); return str; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |