summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjussi2024-01-28 18:29:06 +0200
committerjussi2024-01-28 18:29:06 +0200
commit143453af9ea9be82b2d58d665bed62abb716e21f (patch)
tree53ead99a8db6da542c868f48fb3115a3da0d5df6 /src
parent71cc89c3033365746e5dcdb933c460c8e0da7fb0 (diff)
downloadreilua-enhanced-143453af9ea9be82b2d58d665bed62abb716e21f.tar.gz
reilua-enhanced-143453af9ea9be82b2d58d665bed62abb716e21f.tar.bz2
reilua-enhanced-143453af9ea9be82b2d58d665bed62abb716e21f.zip
TextInsert and TextSplit.
Diffstat (limited to 'src')
-rw-r--r--src/lua_core.c3
-rw-r--r--src/text.c61
2 files changed, 64 insertions, 0 deletions
diff --git a/src/lua_core.c b/src/lua_core.c
index a7c9f57..970a2ba 100644
--- a/src/lua_core.c
+++ b/src/lua_core.c
@@ -1765,6 +1765,9 @@ void luaRegister() {
assingGlobalFunction( "GetCodepointNext", ltextGetCodepointNext );
assingGlobalFunction( "GetCodepointPrevious", ltextGetCodepointPrevious );
assingGlobalFunction( "CodepointToUTF8", ltextCodepointToUTF8 );
+ /* Text strings management functions (no UTF-8 strings, only byte chars) */
+ assingGlobalFunction( "TextInsert", ltextTextInsert );
+ assingGlobalFunction( "TextSplit", ltextTextSplit );
/* Audio. */
/* Audio device management functions. */
diff --git a/src/text.c b/src/text.c
index b09eb96..e214c70 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1042,6 +1042,8 @@ int ltextLoadCodepoints( lua_State *L ) {
int count = 0;
int* codepoints = LoadCodepoints( text, &count );
+ lua_createtable( L, count, 0 );
+
for ( int i = 0; i < count; i++ ) {
lua_pushinteger( L, codepoints[i] );
lua_rawseti( L, -2, i + 1 );
@@ -1133,3 +1135,62 @@ int ltextCodepointToUTF8( lua_State *L ) {
return 2;
}
+
+/*
+## Text - Text strings management functions (no UTF-8 strings, only byte chars)
+*/
+
+/*
+> text = RL.TextInsert( string text, string insert, int position )
+
+Insert text in a specific position, moves all text forward
+
+- Success return string
+*/
+int ltextTextInsert( lua_State *L ) {
+ const char* text = luaL_checkstring( L, 1 );
+ const char* insert = luaL_checkstring( L, 2 );
+ int position = luaL_checkinteger( L, 3 );
+
+ // char* result = TextInsert( text, insert, position ); // Bug in the raylib implementation.
+
+ int textLen = TextLength( text );
+ int insertLen = TextLength( insert );
+ char* result = RL_MALLOC( textLen + insertLen + 1 );
+
+ memcpy( result, text, position );
+ memcpy( result + position, insert, insertLen );
+ memcpy( result + position + insertLen, text + position, textLen - position );
+
+ result[ textLen + insertLen ] = '\0'; // Make sure text string is valid!
+
+ lua_pushstring( L, result );
+ free( result );
+
+ return 1;
+}
+
+/*
+> splits = RL.TextSplit( string text, char delimiter )
+
+Split text into multiple strings
+
+- Success return string{}
+*/
+int ltextTextSplit( lua_State *L ) {
+ const char* text = luaL_checkstring( L, 1 );
+ const char* delimiter = luaL_checkstring( L, 2 );
+
+ int count = 0;
+ const char** splits = TextSplit( text, delimiter[0], &count );
+
+ lua_createtable( L, count, 0 );
+
+ for ( int i = 0; i < count; i++ ) {
+ lua_pushstring( L, splits[i] );
+ lua_rawseti( L, -2, i + 1 );
+ }
+ /* Note! No need to free. Uses static memory. */
+
+ return 1;
+}