@@ -354,10 +354,18 @@ static int Lbuf_tostring(lua_State *L) {
354
354
}
355
355
356
356
static int Lbuf_new (lua_State * L ) {
357
+ int i , top = lua_gettop (L );
357
358
pb_Buffer * buf = (pb_Buffer * )lua_newuserdata (L , sizeof (pb_Buffer ));
358
359
pb_initbuffer (buf , L );
359
360
lua_rawgetp (L , LUA_REGISTRYINDEX , pb_buftype );
360
361
lua_setmetatable (L , -2 );
362
+ for (i = 1 ; i <= top ; ++ i ) {
363
+ size_t len ;
364
+ const char * s = pb_tolbuffer (L , i , & len );
365
+ pb_prepbuffer (buf , len );
366
+ memcpy (& buf -> buf [buf -> used ], s , len );
367
+ buf -> used += len ;
368
+ }
361
369
return 1 ;
362
370
}
363
371
@@ -524,7 +532,7 @@ static int Lbuf_clear(lua_State *L) {
524
532
static int Lbuf_concat (lua_State * L ) {
525
533
pb_Buffer * buf = check_buffer (L , 1 );
526
534
int i , top = lua_gettop (L );
527
- for (i = 2 ; i < top ; ++ i ) {
535
+ for (i = 2 ; i <= top ; ++ i ) {
528
536
size_t len ;
529
537
const char * s = pb_tolbuffer (L , i , & len );
530
538
pb_prepbuffer (buf , len );
@@ -597,7 +605,7 @@ LUALIB_API int luaopen_pb_buffer(lua_State *L) {
597
605
typedef struct pb_Decoder {
598
606
size_t len ;
599
607
const char * s ;
600
- const char * p , * start , * end ;
608
+ const char * p , * end ;
601
609
} pb_Decoder ;
602
610
603
611
static int pb_readvarint (pb_Decoder * dec , uint64_t * pv ) {
@@ -800,14 +808,13 @@ static int pb_pushscalar(pb_FBDecoder *dec, int wiretype, int type) {
800
808
801
809
static void init_decoder (pb_Decoder * dec , lua_State * L , int idx ) {
802
810
size_t len ;
803
- const char * s = luaL_checklstring (L , idx , & len );
811
+ const char * s = pb_tolbuffer (L , idx , & len );
804
812
lua_Integer i = luaL_optinteger (L , idx + 1 , 1 );
805
813
lua_Integer j = luaL_optinteger (L , idx + 2 , len );
806
814
rangerelat (& i , & j , len );
807
815
dec -> s = s ;
808
816
dec -> len = len ;
809
817
dec -> p = s + i - 1 ;
810
- dec -> start = s ;
811
818
dec -> end = dec -> p + j ;
812
819
lua_pushvalue (L , idx );
813
820
lua_rawsetp (L , LUA_REGISTRYINDEX , dec );
@@ -827,7 +834,7 @@ static int Ldec_new(lua_State *L) {
827
834
if (lua_gettop (L ) == 0 ) {
828
835
dec = (pb_Decoder * )lua_newuserdata (L , sizeof (pb_Decoder ));
829
836
dec -> len = 0 ;
830
- dec -> s = dec -> p = dec -> start = dec -> end = NULL ;
837
+ dec -> s = dec -> p = dec -> end = NULL ;
831
838
}
832
839
else {
833
840
lua_settop (L , 3 );
@@ -844,14 +851,14 @@ static int Ldec_reset(lua_State *L) {
844
851
lua_pushnil (L );
845
852
lua_rawsetp (L , LUA_REGISTRYINDEX , dec );
846
853
dec -> len = 0 ;
847
- dec -> s = dec -> p = dec -> start = dec -> end = NULL ;
854
+ dec -> s = dec -> p = dec -> end = NULL ;
848
855
return 0 ;
849
856
}
850
857
851
858
static int Ldec_source (lua_State * L ) {
852
859
pb_Decoder * dec = check_decoder (L , 1 );
853
- size_t oi = dec -> p - dec -> start + 1 ;
854
- size_t oj = dec -> end - dec -> start ;
860
+ size_t oi = dec -> p - dec -> s + 1 ;
861
+ size_t oj = dec -> end - dec -> s ;
855
862
int top = lua_gettop (L );
856
863
if (top != 1 ) lua_settop (L , 3 );
857
864
lua_rawgetp (L , LUA_REGISTRYINDEX , dec );
@@ -863,34 +870,30 @@ static int Ldec_source(lua_State *L) {
863
870
864
871
static int Ldec_pos (lua_State * L ) {
865
872
pb_Decoder * dec = check_decoder (L , 1 );
866
- size_t pos = dec -> p - dec -> start + 1 ;
873
+ size_t pos = dec -> p - dec -> s + 1 ;
867
874
lua_pushinteger (L , (lua_Integer )pos );
868
875
if (lua_gettop (L ) != 1 ) {
869
876
lua_Integer npos = posrelat (luaL_optinteger (L , 2 , pos ),
870
- dec -> end - dec -> start );
877
+ dec -> end - dec -> s );
871
878
if (npos < 1 ) npos = 1 ;
872
- dec -> p = dec -> start + npos - 1 ;
879
+ dec -> p = dec -> s + npos - 1 ;
873
880
}
874
881
return 1 ;
875
882
}
876
883
877
884
static int Ldec_len (lua_State * L ) {
878
885
pb_Decoder * dec = check_decoder (L , 1 );
879
- size_t len = dec -> end - dec -> start ;
880
- lua_pushinteger (L , (lua_Integer )len );
881
- if (lua_gettop (L ) != 1 ) {
882
- lua_Integer len ;
883
- len = luaL_optinteger (L , 2 , dec -> len );
886
+ int type = lua_type (L , 2 );
887
+ lua_pushinteger (L , (lua_Integer )(dec -> end - dec -> p ));
888
+ lua_pushinteger (L , (lua_Integer )dec -> len );
889
+ if (type <= 0 )
890
+ dec -> end = dec -> s + dec -> len ;
891
+ else if (type == LUA_TNUMBER ) {
892
+ size_t len = (size_t )lua_tointeger (L , 2 );
884
893
if (len > dec -> len ) len = dec -> len ;
885
- dec -> end = dec -> start + len ;
894
+ dec -> end = dec -> s + len ;
886
895
}
887
- return 1 ;
888
- }
889
-
890
- static int Ldec_rawlen (lua_State * L ) {
891
- pb_Decoder * dec = check_decoder (L , 1 );
892
- lua_pushinteger (L , (lua_Integer )dec -> len );
893
- return 1 ;
896
+ return 2 ;
894
897
}
895
898
896
899
static int Ldec_finished (lua_State * L ) {
@@ -1037,12 +1040,29 @@ static int values_iter(lua_State *L) {
1037
1040
}
1038
1041
1039
1042
static int Ldec_values (lua_State * L ) {
1040
- check_buffer (L , 1 );
1043
+ check_decoder (L , 1 );
1041
1044
lua_pushcfunction (L , values_iter );
1042
1045
lua_pushvalue (L , 1 );
1043
1046
return 2 ;
1044
1047
}
1045
1048
1049
+ static int Ldec_update (lua_State * L ) {
1050
+ pb_Decoder * dec = check_decoder (L , 1 );
1051
+ pb_Buffer * buf ;
1052
+ lua_rawgetp (L , LUA_REGISTRYINDEX , dec );
1053
+ if ((buf = testudata (L , -1 , pb_buftype )) == NULL )
1054
+ return 0 ;
1055
+ if (buf -> used == dec -> p - dec -> s ) {
1056
+ dec -> p = dec -> s ;
1057
+ buf -> used = 0 ;
1058
+ }
1059
+ dec -> p = buf -> buf + (dec -> p - dec -> s );
1060
+ dec -> s = buf -> buf ;
1061
+ dec -> len = buf -> used ;
1062
+ dec -> end = buf -> buf + buf -> used ;
1063
+ return_self (L );
1064
+ }
1065
+
1046
1066
LUALIB_API int luaopen_pb_decoder (lua_State * L ) {
1047
1067
luaL_Reg libs [] = {
1048
1068
{ "__gc" , Ldec_reset },
@@ -1054,16 +1074,16 @@ LUALIB_API int luaopen_pb_decoder(lua_State *L) {
1054
1074
ENTRY (source ),
1055
1075
ENTRY (pos ),
1056
1076
ENTRY (len ),
1057
- ENTRY (rawlen ),
1058
1077
ENTRY (tag ),
1059
- ENTRY (varint ),
1060
1078
ENTRY (bytes ),
1061
1079
ENTRY (fixed32 ),
1062
1080
ENTRY (fixed64 ),
1081
+ ENTRY (varint ),
1063
1082
ENTRY (fetch ),
1064
1083
ENTRY (skip ),
1065
1084
ENTRY (values ),
1066
1085
ENTRY (finished ),
1086
+ ENTRY (update ),
1067
1087
#undef ENTRY
1068
1088
{ NULL , NULL }
1069
1089
};
0 commit comments