summaryrefslogtreecommitdiff
path: root/src/core.c
diff options
context:
space:
mode:
authorjussi2025-01-17 17:06:55 +0200
committerjussi2025-01-17 17:06:55 +0200
commit9a1161541d6b066dc7f6e3ca0cdf008f19d3f7be (patch)
tree2a414734f0bde20e6ee4363e6f87cc4e85ebaa53 /src/core.c
parent3cccee885e1b8644490920eca3c372d5690c8eb7 (diff)
downloadreilua-enhanced-9a1161541d6b066dc7f6e3ca0cdf008f19d3f7be.tar.gz
reilua-enhanced-9a1161541d6b066dc7f6e3ca0cdf008f19d3f7be.tar.bz2
reilua-enhanced-9a1161541d6b066dc7f6e3ca0cdf008f19d3f7be.zip
SetBufferData takes table of values.
Diffstat (limited to 'src/core.c')
-rw-r--r--src/core.c181
1 files changed, 71 insertions, 110 deletions
diff --git a/src/core.c b/src/core.c
index 3353ae0..543dda8 100644
--- a/src/core.c
+++ b/src/core.c
@@ -20,6 +20,70 @@ static size_t getBufferElementSize( Buffer* buffer ) {
return 1;
}
+static void setBufferData( lua_State* L, Buffer* buffer, int index, size_t offset ) {
+ int t = index;
+ unsigned char* ucp = buffer->data + offset;
+ unsigned short* usp = buffer->data + offset;
+ unsigned int* uip = buffer->data + offset;
+ unsigned long* ulp = buffer->data + offset;
+ char* cp = buffer->data + offset;
+ short* sp = buffer->data + offset;
+ int* ip = buffer->data + offset;
+ long* lp = buffer->data + offset;
+ float* fp = buffer->data + offset;
+ double* dp = buffer->data + offset;
+
+ lua_pushnil( L );
+
+ while ( lua_next( L, t ) != 0 ) {
+ switch ( buffer->type ) {
+ case BUFFER_UNSIGNED_CHAR:
+ *ucp = (unsigned char)lua_tointeger( L, -1 );
+ ucp++;
+ break;
+ case BUFFER_UNSIGNED_SHORT:
+ *usp = (unsigned short)lua_tointeger( L, -1 );
+ usp++;
+ break;
+ case BUFFER_UNSIGNED_INT:
+ *uip = (unsigned int)lua_tointeger( L, -1 );
+ uip++;
+ break;
+ case BUFFER_UNSIGNED_LONG:
+ *ulp = (unsigned long)lua_tointeger( L, -1 );
+ ulp++;
+ break;
+ case BUFFER_CHAR:
+ *cp = (char)lua_tointeger( L, -1 );
+ cp++;
+ break;
+ case BUFFER_SHORT:
+ *sp = (short)lua_tointeger( L, -1 );
+ sp++;
+ break;
+ case BUFFER_INT:
+ *ip = (int)lua_tointeger( L, -1 );
+ ip++;
+ break;
+ case BUFFER_LONG:
+ *lp = (long)lua_tointeger( L, -1 );
+ lp++;
+ break;
+ case BUFFER_FLOAT:
+ *fp = (float)lua_tonumber( L, -1 );
+ fp++;
+ break;
+ case BUFFER_DOUBLE:
+ *dp = (double)lua_tonumber( L, -1 );
+ dp++;
+ break;
+ default:
+ break;
+ }
+ lua_pop( L, 1 );
+ }
+}
+
void unloadBuffer( Buffer* buffer ) {
free( buffer->data );
@@ -3628,69 +3692,7 @@ int lcoreLoadBuffer( lua_State* L ) {
buffer.size = len * getBufferElementSize( &buffer );
buffer.data = malloc( buffer.size );
- int t = 1;
- int i = 0;
- unsigned char* ucp = buffer.data;
- unsigned short* usp = buffer.data;
- unsigned int* uip = buffer.data;
- unsigned long* ulp = buffer.data;
- char* cp = buffer.data;
- short* sp = buffer.data;
- int* ip = buffer.data;
- long* lp = buffer.data;
- float* fp = buffer.data;
- double* dp = buffer.data;
-
- lua_pushnil( L );
-
- while ( lua_next( L, t ) != 0 ) {
- switch ( type ) {
- case BUFFER_UNSIGNED_CHAR:
- *ucp = (unsigned char)lua_tointeger( L, -1 );
- ucp++;
- break;
- case BUFFER_UNSIGNED_SHORT:
- *usp = (unsigned short)lua_tointeger( L, -1 );
- usp++;
- break;
- case BUFFER_UNSIGNED_INT:
- *uip = (unsigned int)lua_tointeger( L, -1 );
- uip++;
- break;
- case BUFFER_UNSIGNED_LONG:
- *ulp = (unsigned long)lua_tointeger( L, -1 );
- ulp++;
- break;
- case BUFFER_CHAR:
- *cp = (char)lua_tointeger( L, -1 );
- cp++;
- break;
- case BUFFER_SHORT:
- *sp = (short)lua_tointeger( L, -1 );
- sp++;
- break;
- case BUFFER_INT:
- *ip = (int)lua_tointeger( L, -1 );
- ip++;
- break;
- case BUFFER_LONG:
- *lp = (long)lua_tointeger( L, -1 );
- lp++;
- break;
- case BUFFER_FLOAT:
- *fp = (float)lua_tonumber( L, -1 );
- fp++;
- break;
- case BUFFER_DOUBLE:
- *dp = (double)lua_tonumber( L, -1 );
- dp++;
- break;
- default:
- break;
- }
- lua_pop( L, 1 );
- i++;
- }
+ setBufferData( L, &buffer, 1, 0 );
uluaPushBuffer( L, buffer );
return 1;
@@ -3823,65 +3825,24 @@ int lcoreCopyBufferData( lua_State* L ) {
}
/*
-> RL.SetBufferData( Buffer buffer, int position, any value )
+> RL.SetBufferData( Buffer buffer, int position, any{} values )
Set buffer data value
*/
int lcoreSetBufferData( lua_State* L ) {
Buffer* buffer = uluaGetBuffer( L, 1 );
size_t position = luaL_checkinteger( L, 2 );
+ luaL_checktype( L, 3, LUA_TTABLE );
+
+ int len = uluaGetTableLen( L, 3 );
- if ( position < 0 || buffer->size / getBufferElementSize( buffer ) <= position ) {
+ if ( position < 0 || buffer->size / getBufferElementSize( buffer ) <= ( position + len - 1 ) ) {
TraceLog( state->logLevelInvalid, "SetBufferData. position %d out of bounds", position );
return 0;
}
size_t offset = position * getBufferElementSize( buffer );
- unsigned char* ucp = buffer->data + offset;
- unsigned short* usp = buffer->data + offset;
- unsigned int* uip = buffer->data + offset;
- unsigned long* ulp = buffer->data + offset;
- char* cp = buffer->data + offset;
- short* sp = buffer->data + offset;
- int* ip = buffer->data + offset;
- long* lp = buffer->data + offset;
- float* fp = buffer->data + offset;
- double* dp = buffer->data + offset;
-
- switch ( buffer->type ) {
- case BUFFER_UNSIGNED_CHAR:
- *ucp = (unsigned char)lua_tointeger( L, -1 );
- break;
- case BUFFER_UNSIGNED_SHORT:
- *usp = (unsigned short)lua_tointeger( L, -1 );
- break;
- case BUFFER_UNSIGNED_INT:
- *uip = (unsigned int)lua_tointeger( L, -1 );
- break;
- case BUFFER_UNSIGNED_LONG:
- *ulp = (unsigned long)lua_tointeger( L, -1 );
- break;
- case BUFFER_CHAR:
- *cp = (char)lua_tointeger( L, -1 );
- break;
- case BUFFER_SHORT:
- *sp = (short)lua_tointeger( L, -1 );
- break;
- case BUFFER_INT:
- *ip = (int)lua_tointeger( L, -1 );
- break;
- case BUFFER_LONG:
- *lp = (long)lua_tointeger( L, -1 );
- break;
- case BUFFER_FLOAT:
- *fp = (float)lua_tonumber( L, -1 );
- break;
- case BUFFER_DOUBLE:
- *dp = (double)lua_tonumber( L, -1 );
- break;
- default:
- break;
- }
+ setBufferData( L, buffer, 3, offset );
return 0;
}