@@ -22980,6 +22980,8 @@ LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
22980
22980
#define PRIVATE_LUA_CEMBED_TABLE_RETURN "private_lua_embed_table_return"
22981
22981
22982
22982
#define PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__ "private_lua_c_embed_main_lib_table_%d"
22983
+ #define PRIVATE_LUA_CEMBED_MAIN_LIB_SUB_TABLE "private_lua_c_embed_main_lib_table_%d_%s"
22984
+
22983
22985
#define PRIVATE_LUA_CEMBED_MAIN_META_TABLE__ "private_lua_c_embed_main_meta_table_%d"
22984
22986
#define PRIVATE_LUA_CEMBED_ANONYMOUS_TABLE_ "private_lua_c_embed_anononymous_table_%d_%d"
22985
22987
#define PRIVATE_LUA_CEMBED_ANONYMOUS_FUNC_TABLE_ "private_lua_c_embed_anononymous_func_table_%d_%d"
@@ -23000,6 +23002,7 @@ LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
23000
23002
#define PRIVATE_LUA_CEMBED_WRONG_TYPE_INDEX "index %d at object %s its %s instead of %s"
23001
23003
#define PRIVATE_LUA_CEMBED_ELEMENT_DOES_NOT_HAVE_KEY "index %d at object %s not have a key"
23002
23004
#define PRIVVATE_LUA_CEMBED_TIMEOUT_ERROR "timeout error"
23005
+ #define PRIVATE_LUA_CEMBED_LIB_PROP_WRONG_TYPE "lib prop %s its %s insteadd of %s"
23003
23006
23004
23007
#ifndef LUA_CEMBED_INDEX_DIF
23005
23008
#define LUA_CEMBED_INDEX_DIF 1
@@ -23084,6 +23087,7 @@ typedef struct LuaCEmbed{
23084
23087
void *func_tables;
23085
23088
int lib_identifier;
23086
23089
int stack_leve;
23090
+ char *main_lib_table;
23087
23091
}LuaCEmbed;
23088
23092
23089
23093
@@ -23541,6 +23545,19 @@ void LuaCEmbed_set_string_lib_prop(LuaCEmbed *self,const char *name,const char *
23541
23545
23542
23546
void LuaCEmbed_set_table_lib_prop(LuaCEmbed *self,const char *name,LuaCEmbedTable *value);
23543
23547
23548
+ int private_LuaCEmbed_ensure_lib_prop_type(LuaCEmbed *self,const char *name,int expected_type);;
23549
+
23550
+
23551
+ long long LuaCEmbed_get_long_lib_prop(LuaCEmbed *self,const char *name);
23552
+
23553
+ double LuaCEmbed_get_double_lib_prop(LuaCEmbed *self,const char *name);
23554
+
23555
+ bool LuaCEmbed_get_bool_lib_prop(LuaCEmbed *self,const char *name);
23556
+
23557
+ char * LuaCEmbed_get_string_lib_prop(LuaCEmbed *self,const char *name);
23558
+
23559
+ LuaCEmbedTable *LuaCEmbed_get_table_lib_prop(LuaCEmbed *self,const char *name);
23560
+
23544
23561
23545
23562
23546
23563
@@ -23753,6 +23770,11 @@ typedef struct{
23753
23770
void (*set_string_lib_prop)(LuaCEmbed *self,const char *name,const char * value);
23754
23771
void (*set_table_lib_prop)(LuaCEmbed *self,const char *name,LuaCEmbedTable *value);
23755
23772
23773
+ long long (*get_long_lib_prop)(LuaCEmbed *self,const char *name);
23774
+ double (*get_double_lib_prop)(LuaCEmbed *self,const char *name);
23775
+ bool (*get_bool_lib_prop)(LuaCEmbed *self,const char *name);
23776
+ char * (*get_string_lib_prop)(LuaCEmbed *self,const char *name);
23777
+ LuaCEmbedTable *(*get_table_lib_prop)(LuaCEmbed *self,const char *name);
23756
23778
23757
23779
int (*evaluete_file)(LuaCEmbed *self, const char *file);
23758
23780
void (*add_callback)(LuaCEmbed *self, const char *callback_name, LuaCEmbedResponse* (*callback)(LuaCEmbed *args) );
@@ -23935,7 +23957,11 @@ LuaCEmbed * newLuaCEmbedLib(lua_State *state,bool public_functions){
23935
23957
if(lua_type(self->state,-1) == LUA_CEMBED_NIL){
23936
23958
self->lib_identifier = lua_tointeger(self->state,-1);
23937
23959
}
23960
+
23938
23961
self->lib_identifier +=1;
23962
+
23963
+ self->main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
23964
+
23939
23965
lua_pushinteger(self->state,self->lib_identifier);
23940
23966
lua_setglobal(self->state,PRIVATE_LUA_CEMBED_TOTAL_LIBS);
23941
23967
@@ -24100,7 +24126,9 @@ void LuaCEmbed_free(LuaCEmbed *self){
24100
24126
if(self->error_msg){
24101
24127
free(self->error_msg);
24102
24128
}
24103
-
24129
+ if(self->main_lib_table){
24130
+ free(self->main_lib_table);
24131
+ }
24104
24132
free(self);
24105
24133
}
24106
24134
@@ -24520,7 +24548,6 @@ LuaCEmbedTable * private_newLuaCembedTable(LuaCEmbed *main_embed, const char *fo
24520
24548
if(previews_function){
24521
24549
lua_getglobal(self->main_object->state,previews_function);
24522
24550
}
24523
-
24524
24551
for(int i = 0; i < size; i++){
24525
24552
char *formated = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MULTIRETURN_,self->main_object->stack_leve,i);
24526
24553
lua_getglobal(self->main_object->state,formated);
@@ -24835,16 +24862,33 @@ bool LuaCEmbedTable_get_bool_by_index(LuaCEmbedTable *self, int index){
24835
24862
24836
24863
int LuaCEmbedTable_get_type_prop(LuaCEmbedTable *self, const char *name){
24837
24864
PRIVATE_LUA_CEMBED_TABLE_PROTECT_NUM
24838
- lua_settop(self->main_object->state,0);
24839
-
24840
24865
private_lua_cembed_memory_limit = self->main_object->memory_limit;
24841
-
24842
24866
lua_getglobal(self->main_object->state,self->global_name);
24843
- lua_pushstring(self->main_object->state, name); // Empilha a chave "nome"
24844
- lua_gettable(self->main_object->state, -2);
24845
- int value = lua_type(self->main_object->state,-1);
24867
+ int table_index = lua_gettop(self->main_object->state);
24868
+
24869
+ lua_pushnil(self->main_object->state);
24870
+ while(lua_next(self->main_object->state,table_index)){
24871
+
24872
+ bool has_key =lua_type(self->main_object->state,-2) == LUA_CEMBED_STRING;
24873
+ if(!has_key){
24874
+ lua_pop(self->main_object->state,1);
24875
+ continue;
24876
+ }
24877
+ char* key = (char*)lua_tostring(self->main_object->state,-2);
24878
+
24879
+ if(strcmp(key,name) != 0){
24880
+ lua_pop(self->main_object->state,1);
24881
+ continue;
24882
+ }
24883
+
24884
+ int type = lua_type(self->main_object->state,-1);
24885
+ lua_pop(self->main_object->state,1);
24886
+ PRIVATE_LUA_CEMBED_CLEAR_STACK
24887
+ return type;
24888
+ }
24889
+
24846
24890
PRIVATE_LUA_CEMBED_CLEAR_STACK
24847
- return value ;
24891
+ return LUA_CEMBED_NIL ;
24848
24892
}
24849
24893
24850
24894
char* LuaCembedTable_get_string_prop(LuaCEmbedTable *self , const char *name){
@@ -26524,56 +26568,139 @@ void LuaCEmbed_set_long_lib_prop(LuaCEmbed *self,const char *name,long long valu
26524
26568
}
26525
26569
26526
26570
void LuaCEmbed_set_double_lib_prop(LuaCEmbed *self,const char *name,double value){
26527
- char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
26528
26571
26529
- lua_getglobal(self->state,main_lib_table);
26572
+ lua_getglobal(self->state,self-> main_lib_table);
26530
26573
lua_pushvalue(self->state,-1);
26531
26574
//set the function name
26532
26575
lua_pushstring(self->state,name);
26533
26576
lua_pushnumber(self->state,value);
26534
26577
lua_settable(self->state,-3);
26535
- free(main_lib_table);
26536
26578
26537
26579
}
26538
26580
26539
26581
void LuaCEmbed_set_bool_lib_prop(LuaCEmbed *self,const char *name,bool value){
26540
- char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
26541
26582
26542
- lua_getglobal(self->state,main_lib_table);
26583
+ lua_getglobal(self->state,self-> main_lib_table);
26543
26584
lua_pushvalue(self->state,-1);
26544
26585
//set the function name
26545
26586
lua_pushstring(self->state,name);
26546
26587
lua_pushboolean(self->state,value);
26547
26588
lua_settable(self->state,-3);
26548
- free(main_lib_table);
26549
26589
26550
26590
}
26551
26591
26552
26592
void LuaCEmbed_set_string_lib_prop(LuaCEmbed *self,const char *name,const char * value){
26553
- char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
26554
26593
26555
- lua_getglobal(self->state,main_lib_table);
26594
+ lua_getglobal(self->state,self-> main_lib_table);
26556
26595
lua_pushvalue(self->state,-1);
26557
26596
//set the function name
26558
26597
lua_pushstring(self->state,name);
26559
26598
lua_pushstring(self->state,value);
26560
26599
lua_settable(self->state,-3);
26561
- free(main_lib_table);
26562
26600
26563
26601
}
26564
26602
26565
26603
void LuaCEmbed_set_table_lib_prop(LuaCEmbed *self,const char *name,LuaCEmbedTable *value){
26566
- char *main_lib_table = private_LuaCembed_format(PRIVATE_LUA_CEMBED_MAIN_LIB_TABLE_NAME__,self->lib_identifier);
26567
26604
26568
- lua_getglobal(self->state,main_lib_table);
26605
+ lua_getglobal(self->state,self-> main_lib_table);
26569
26606
lua_pushvalue(self->state,-1);
26570
26607
lua_pushstring(self->state,name);
26571
26608
lua_getglobal(self->state,value->global_name);
26572
26609
lua_settable(self->state,-3);
26573
- free(main_lib_table);
26574
26610
26575
26611
}
26576
26612
26613
+ int private_LuaCEmbed_ensure_lib_prop_type(LuaCEmbed *self,const char *name,int expected_type){
26614
+ int type = lua_type(self->state,-1);
26615
+ if(type!= expected_type){
26616
+ privateLuaCEmbed_raise_error_not_jumping(
26617
+ self,
26618
+ PRIVATE_LUA_CEMBED_LIB_PROP_WRONG_TYPE,
26619
+ name,
26620
+ LuaCembed_convert_arg_code(type),
26621
+ LuaCembed_convert_arg_code(expected_type)
26622
+ );
26623
+ return LUA_CEMBED_GENERIC_ERROR;
26624
+ }
26625
+ return LUA_CEMBED_OK;
26626
+ }
26627
+
26628
+ long long LuaCEmbed_get_long_lib_prop(LuaCEmbed *self,const char *name){
26629
+ lua_getglobal(self->state,self->main_lib_table);
26630
+ lua_getfield(self->state, -1,name);
26631
+ if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_NUMBER)){
26632
+ return LUA_CEMBED_GENERIC_ERROR;
26633
+ }
26634
+ return lua_tointeger(self->state,-1);
26635
+
26636
+ }
26637
+
26638
+ double LuaCEmbed_get_double_lib_prop(LuaCEmbed *self,const char *name){
26639
+
26640
+ lua_getglobal(self->state,self->main_lib_table);
26641
+
26642
+ lua_getfield(self->state, -1,name);
26643
+ if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_NUMBER)){
26644
+ return LUA_CEMBED_GENERIC_ERROR;
26645
+ }
26646
+ return lua_tonumber(self->state,-1);
26647
+ }
26648
+
26649
+ bool LuaCEmbed_get_bool_lib_prop(LuaCEmbed *self,const char *name){
26650
+
26651
+ lua_getglobal(self->state,self->main_lib_table);
26652
+
26653
+ lua_getfield(self->state, -1,name);
26654
+ if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_BOOL)){
26655
+ return LUA_CEMBED_GENERIC_ERROR;
26656
+ }
26657
+ return lua_toboolean(self->state,-1);
26658
+ }
26659
+
26660
+ char * LuaCEmbed_get_string_lib_prop(LuaCEmbed *self,const char *name){
26661
+ lua_getglobal(self->state,self->main_lib_table);
26662
+
26663
+ lua_getfield(self->state, -1,name);
26664
+ if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_STRING)){
26665
+ return NULL;
26666
+ }
26667
+ return (char*)lua_tostring(self->state,-1);
26668
+ }
26669
+
26670
+ LuaCEmbedTable *LuaCEmbed_get_table_lib_prop(LuaCEmbed *self,const char *name){
26671
+ ;
26672
+ lua_getglobal(self->state,self->main_lib_table);
26673
+
26674
+ lua_getfield(self->state, -1,name);
26675
+ if(private_LuaCEmbed_ensure_lib_prop_type(self,name,LUA_CEMBED_TABLE)){
26676
+ return NULL;
26677
+ }
26678
+
26679
+ char *global_sub_table_name = private_LuaCembed_format(
26680
+ PRIVATE_LUA_CEMBED_MAIN_LIB_SUB_TABLE,
26681
+ self->lib_identifier,
26682
+ name
26683
+ );
26684
+ lua_setglobal(self->state,global_sub_table_name);
26685
+
26686
+ privateLuaCEmbedTableArray *target = (privateLuaCEmbedTableArray*)privateLuaCEmbed_get_current_table_array(self);
26687
+
26688
+ LuaCEmbedTable *possible = privateLuaCEmbedTableArray_find_by_global_name(target,global_sub_table_name);
26689
+ if(possible){
26690
+ free(global_sub_table_name);
26691
+ return possible;
26692
+ }
26693
+
26694
+ LuaCEmbedTable *creaeted = private_newLuaCembedTable(self, "%s",global_sub_table_name);
26695
+ free(global_sub_table_name);
26696
+
26697
+ privateLuaCEmbedTableArray_append(
26698
+ target,
26699
+ creaeted
26700
+ );
26701
+ return creaeted;
26702
+ }
26703
+
26577
26704
26578
26705
26579
26706
@@ -26798,6 +26925,11 @@ LuaCEmbedNamespace newLuaCEmbedNamespace(){
26798
26925
self.set_double_lib_prop = LuaCEmbed_set_double_lib_prop;
26799
26926
self.set_string_lib_prop = LuaCEmbed_set_string_lib_prop;
26800
26927
self.set_table_lib_prop = LuaCEmbed_set_table_lib_prop;
26928
+ self.get_long_lib_prop = LuaCEmbed_get_long_lib_prop;
26929
+ self.get_double_lib_prop = LuaCEmbed_get_double_lib_prop;
26930
+ self.get_bool_lib_prop = LuaCEmbed_get_bool_lib_prop;
26931
+ self.get_string_lib_prop = LuaCEmbed_get_string_lib_prop;
26932
+ self.get_table_lib_prop = LuaCEmbed_get_table_lib_prop;
26801
26933
26802
26934
self.free = LuaCEmbed_free;
26803
26935
return self;
0 commit comments