From 9803ca9bf6c146e8b5d5d93662b5d45f6cd87f2f Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 14 Mar 2019 13:27:54 -0700 Subject: [PATCH] CFFI string work --- project/src/ExternalInterface.cpp | 12 ++++--- project/src/graphics/cairo/CairoBindings.cpp | 6 +++- .../src/graphics/opengl/OpenGLBindings.cpp | 18 +++++++---- project/src/media/openal/OpenALBindings.cpp | 12 +++++-- project/src/net/curl/CURLBindings.cpp | 18 +++++++++-- .../src/text/harfbuzz/HarfbuzzBindings.cpp | 32 ++++++++++++++++--- project/src/ui/DropEvent.cpp | 6 ++-- project/src/ui/TextEvent.cpp | 5 ++- .../_internal/backend/kha/KhaApplication.hx | 8 +++++ .../native/NativeOpenGLRenderContext.hx | 1 + src/lime/text/Font.hx | 4 +++ 11 files changed, 99 insertions(+), 23 deletions(-) diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index c1e254d6c..37adee6c0 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -721,8 +721,9 @@ namespace lime { if (path) { int size = std::wcslen (path->c_str ()); - char* result = (char*)malloc (size); + char* result = (char*)malloc (size + 1); std::wcstombs (result, path->c_str (), size); + result[size] = '\0'; delete path; return (vbyte*)result; @@ -790,8 +791,9 @@ namespace lime { if (path) { int size = std::wcslen (path->c_str ()); - char* result = (char*)malloc (size); + char* result = (char*)malloc (size + 1); std::wcstombs (result, path->c_str (), size); + result[size] = '\0'; delete path; return (vbyte*)result; @@ -863,8 +865,9 @@ namespace lime { for (int i = 0; i < files.size (); i++) { int size = std::wcslen (files[i]->c_str ()); - char* _file = (char*)malloc (size); + char* _file = (char*)malloc (size + 1); std::wcstombs (_file, files[i]->c_str (), size); + _file[size] = '\0'; *resultData++ = (vbyte*)_file; delete files[i]; @@ -930,8 +933,9 @@ namespace lime { if (path) { int size = std::wcslen (path->c_str ()); - char* result = (char*)malloc (size); + char* result = (char*)malloc (size + 1); std::wcstombs (result, path->c_str (), size); + result[size] = '\0'; delete path; return (vbyte*)result; diff --git a/project/src/graphics/cairo/CairoBindings.cpp b/project/src/graphics/cairo/CairoBindings.cpp index 544439aae..1de8fcffc 100644 --- a/project/src/graphics/cairo/CairoBindings.cpp +++ b/project/src/graphics/cairo/CairoBindings.cpp @@ -2269,7 +2269,11 @@ namespace lime { HL_PRIM vbyte* hl_lime_cairo_version_string () { const char* version = cairo_version_string (); - return (vbyte*)version; + int length = strlen (version); + char* _version = (char*)malloc (length + 1); + strcpy (_version, version); + _version[length] = '\0'; + return (vbyte*)_version; } diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index 8f7cc20c0..beb061559 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -1835,10 +1835,11 @@ namespace lime { GLint length; glGetActiveUniformBlockiv (program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH, &length); - char* buffer = (char*)malloc (length); + char* buffer = (char*)malloc (length + 1); glGetActiveUniformBlockName (program, uniformBlockIndex, length, 0, buffer); + buffer[length] = '\0'; return (vbyte*)buffer; #else return NULL; @@ -2472,10 +2473,11 @@ namespace lime { } - char* buffer = (char*)malloc (logSize); + char* buffer = (char*)malloc (logSize + 1); glGetProgramInfoLog (program, logSize, 0, buffer); + buffer[logSize] = '\0'; return (vbyte*)buffer; } @@ -2740,10 +2742,11 @@ namespace lime { } - char* buffer = (char*)malloc (logSize); + char* buffer = (char*)malloc (logSize + 1); GLint writeSize; glGetShaderInfoLog (shader, logSize, &writeSize, buffer); + buffer[logSize] = '\0'; return (vbyte*)buffer; } @@ -2867,8 +2870,9 @@ namespace lime { } char *result = new char[len + 1]; - glGetShaderSource (shader, len + 1, 0, result); + glGetShaderSource (shader, len, 0, result); + result[len] = '\0'; return (vbyte*)result; } @@ -2898,8 +2902,9 @@ namespace lime { if (val) { int size = strlen (val); - char* result = (char*)malloc (size); + char* result = (char*)malloc (size + 1); memcpy (result, val, size); + result[size] = '\0'; return (vbyte*)result; } else { @@ -2940,8 +2945,9 @@ namespace lime { if (val) { int size = strlen (val); - char* result = (char*)malloc (size); + char* result = (char*)malloc (size + 1); memcpy (result, val, size); + result[size] = '\0'; return (vbyte*)result; } else { diff --git a/project/src/media/openal/OpenALBindings.cpp b/project/src/media/openal/OpenALBindings.cpp index 67862cb1f..b9822ac70 100644 --- a/project/src/media/openal/OpenALBindings.cpp +++ b/project/src/media/openal/OpenALBindings.cpp @@ -2204,7 +2204,11 @@ namespace lime { HL_PRIM vbyte* hl_lime_al_get_string (int param) { const char* result = alGetString (param); - return (vbyte*)result; + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } @@ -3382,7 +3386,11 @@ namespace lime { ALCdevice* alcDevice = (ALCdevice*)device->ptr; const char* result = alcGetString (alcDevice, param); - return (vbyte*)result; + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } diff --git a/project/src/net/curl/CURLBindings.cpp b/project/src/net/curl/CURLBindings.cpp index 53ffe5bff..c3c2d667c 100644 --- a/project/src/net/curl/CURLBindings.cpp +++ b/project/src/net/curl/CURLBindings.cpp @@ -2188,7 +2188,11 @@ namespace lime { HL_PRIM vbyte* hl_lime_curl_easy_strerror (int errornum) { const char* result = curl_easy_strerror ((CURLcode)errornum); - return (vbyte*)result; + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } @@ -2204,7 +2208,11 @@ namespace lime { HL_PRIM vbyte* hl_lime_curl_easy_unescape (HL_CFFIPointer* curl, hl_vstring* url, int inlength, int outlength) { char* result = curl_easy_unescape ((CURL*)curl->ptr, url ? hl_to_utf8 (url->bytes) : NULL, inlength, &outlength); - return (vbyte*)result; + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } @@ -2751,7 +2759,11 @@ namespace lime { HL_PRIM vbyte* hl_lime_curl_version () { char* result = curl_version (); - return (vbyte*)result; + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } diff --git a/project/src/text/harfbuzz/HarfbuzzBindings.cpp b/project/src/text/harfbuzz/HarfbuzzBindings.cpp index 9535299ec..68cd1f3e4 100644 --- a/project/src/text/harfbuzz/HarfbuzzBindings.cpp +++ b/project/src/text/harfbuzz/HarfbuzzBindings.cpp @@ -722,7 +722,16 @@ namespace lime { const char* result = hb_buffer_serialize_format_to_string ((hb_buffer_serialize_format_t)format); - if (result) return (vbyte*)result; + if (result) { + + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; + + } + return NULL; } @@ -1136,7 +1145,12 @@ namespace lime { char* result = (char*)malloc (128); hb_feature_to_string ((hb_feature_t*)feature->ptr, result, 128); - return (vbyte*)result; + + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } @@ -1401,7 +1415,12 @@ namespace lime { char* result = (char*)malloc (1024); hb_font_glyph_to_string ((hb_font_t*)font->ptr, (hb_codepoint_t)codepoint, result, 1024); - return (vbyte*)result; + + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } @@ -1585,7 +1604,12 @@ namespace lime { hb_language_t _language = (hb_language_t)language->ptr; const char* result = hb_language_to_string (_language); - return (vbyte*)result; + + int length = strlen (result); + char* _result = (char*)malloc (length + 1); + strcpy (_result, result); + _result[length] = '\0'; + return (vbyte*)_result; } diff --git a/project/src/ui/DropEvent.cpp b/project/src/ui/DropEvent.cpp index ecc46eb62..91e40077e 100644 --- a/project/src/ui/DropEvent.cpp +++ b/project/src/ui/DropEvent.cpp @@ -44,8 +44,10 @@ namespace lime { DropEvent* eventObject = (DropEvent*)DropEvent::eventObject->Get (); - // TODO - // eventObject->file = event->file; + int length = strlen ((const char*)event->file); + char* file = (char*)malloc (length + 1); + strcpy (file, (const char*)event->file); + eventObject->file = (vbyte*)file; eventObject->type = event->type; } diff --git a/project/src/ui/TextEvent.cpp b/project/src/ui/TextEvent.cpp index 9ea7cd648..73be08bc9 100644 --- a/project/src/ui/TextEvent.cpp +++ b/project/src/ui/TextEvent.cpp @@ -67,7 +67,10 @@ namespace lime { } - eventObject->text = event->text; + int length = strlen ((const char*)event->text); + char* text = (char*)malloc (length + 1); + strcpy (text, (const char*)event->text); + eventObject->text = (vbyte*)text; eventObject->type = event->type; eventObject->windowID = event->windowID; diff --git a/src/lime/_internal/backend/kha/KhaApplication.hx b/src/lime/_internal/backend/kha/KhaApplication.hx index 90178a563..ead0a578e 100644 --- a/src/lime/_internal/backend/kha/KhaApplication.hx +++ b/src/lime/_internal/backend/kha/KhaApplication.hx @@ -220,7 +220,11 @@ private class ClipboardEventInfo private class DropEventInfo { + #if hl + public var file:hl.Bytes; + #else public var file:String; + #end public var type:DropEventType; public function new(type:DropEventType = null, file:String = null) @@ -427,7 +431,11 @@ private class TextEventInfo public var id:Int; public var length:Int; public var start:Int; + #if hl + public var text:hl.Bytes; + #else public var text:String; + #end public var type:TextEventType; public var windowID:Int; diff --git a/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx b/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx index 9c383e250..b944944aa 100644 --- a/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx +++ b/src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx @@ -2070,6 +2070,7 @@ class NativeOpenGLRenderContext var result = NativeCFFI.lime_gl_get_string(name); #if hl var result = @:privateAccess String.fromUTF8(result); + trace (result); #end return result; #else diff --git a/src/lime/text/Font.hx b/src/lime/text/Font.hx index 1729e1453..f417c4276 100644 --- a/src/lime/text/Font.hx +++ b/src/lime/text/Font.hx @@ -471,7 +471,11 @@ class Font { if (name == null) { + #if hl + name = @:privateAccess String.fromUCS2(NativeCFFI.lime_font_get_family_name(src)); + #else name = cast NativeCFFI.lime_font_get_family_name(src); + #end } ascender = NativeCFFI.lime_font_get_ascender(src);