@@ -117,39 +117,44 @@ unpack_stream(<<16#C1, _R/binary>>, _) -> throw({badarg, 16#C1});
117117% % for extention types
118118
119119% % fixext 1 stores an integer and a byte array whose length is 1 byte
120- unpack_stream (<<16#D4 , T :8 , Data :1 /binary , Rest /binary >>, ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
121- maybe_unpack_ext (16#D4 , Unpack , T , Data , Rest );
120+ unpack_stream (<<16#D4 , T :8 , Data :1 /binary , Rest /binary >>,
121+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
122+ maybe_unpack_ext (16#D4 , Unpack , T , Data , Rest , Orig );
122123
123124% % fixext 2 stores an integer and a byte array whose length is 2 bytes
124- unpack_stream (<<16#D5 , T :8 , Data :2 /binary , Rest /binary >>, ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
125- maybe_unpack_ext (16#D5 , Unpack , T , Data , Rest );
125+ unpack_stream (<<16#D5 , T :8 , Data :2 /binary , Rest /binary >>,
126+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
127+ maybe_unpack_ext (16#D5 , Unpack , T , Data , Rest , Orig );
126128
127129% % fixext 4 stores an integer and a byte array whose length is 4 bytes
128- unpack_stream (<<16#D6 , T :8 , Data :4 /binary , Rest /binary >>, ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
129- maybe_unpack_ext (16#D6 , Unpack , T , Data , Rest );
130+ unpack_stream (<<16#D6 , T :8 , Data :4 /binary , Rest /binary >>,
131+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
132+ maybe_unpack_ext (16#D6 , Unpack , T , Data , Rest , Orig );
130133
131134% % fixext 8 stores an integer and a byte array whose length is 8 bytes
132- unpack_stream (<<16#D7 , T :8 , Data :8 /binary , Rest /binary >>, ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
133- maybe_unpack_ext (16#D7 , Unpack , T , Data , Rest );
135+ unpack_stream (<<16#D7 , T :8 , Data :8 /binary , Rest /binary >>,
136+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
137+ maybe_unpack_ext (16#D7 , Unpack , T , Data , Rest , Orig );
134138
135139% % fixext 16 stores an integer and a byte array whose length is 16 bytes
136- unpack_stream (<<16#D8 , T :8 , Data :16 /binary , Rest /binary >>, ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
137- maybe_unpack_ext (16#D8 , Unpack , T , Data , Rest );
140+ unpack_stream (<<16#D8 , T :8 , Data :16 /binary , Rest /binary >>,
141+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
142+ maybe_unpack_ext (16#D8 , Unpack , T , Data , Rest , Orig );
138143
139144% % ext 8 stores an integer and a byte array whose length is upto (2^8)-1 bytes:
140145unpack_stream (<<16#C7 , Len :8 , Type :8 , Data :Len /binary , Rest /binary >>,
141- ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
142- maybe_unpack_ext (16#C7 , Unpack , Type , Data , Rest );
146+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
147+ maybe_unpack_ext (16#C7 , Unpack , Type , Data , Rest , Orig );
143148
144149% % ext 16 stores an integer and a byte array whose length is upto (2^16)-1 bytes:
145150unpack_stream (<<16#C8 , Len :16 , Type :8 , Data :Len /binary , Rest /binary >>,
146- ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
147- maybe_unpack_ext (16#C8 , Unpack , Type , Data , Rest );
151+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
152+ maybe_unpack_ext (16#C8 , Unpack , Type , Data , Rest , Orig );
148153
149154% % ext 32 stores an integer and a byte array whose length is upto (2^32)-1 bytes:
150155unpack_stream (<<16#C9 , Len :32 , Type :8 , Data :Len /binary , Rest /binary >>,
151- ? OPTION {ext_unpacker = Unpack } = _Opt ) ->
152- maybe_unpack_ext (16#C9 , Unpack , Type , Data , Rest );
156+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
157+ maybe_unpack_ext (16#C9 , Unpack , Type , Data , Rest , Orig );
153158
154159unpack_stream (_Bin , _ ) -> throw (incomplete ).
155160
@@ -203,9 +208,15 @@ unpack_string(Binary) ->
203208 String -> String
204209 end .
205210
206- maybe_unpack_ext (F , undefined , _ , _ , _Rest ) -> throw ({badarg , {bad_ext , F }});
207- maybe_unpack_ext (_ , Unpack , Type , Data , Rest ) when is_function (Unpack ) ->
211+ maybe_unpack_ext (F , undefined , _ , _ , _Rest , _ ) -> throw ({badarg , {bad_ext , F }});
212+ maybe_unpack_ext (_ , Unpack , Type , Data , Rest , Orig ) when is_function (Unpack , 3 ) ->
213+ case Unpack (Type , Data , Orig ) of
214+ {ok , Term } -> {Term , Rest };
215+ {error , E } -> {error , E }
216+ end ;
217+ maybe_unpack_ext (_ , Unpack , Type , Data , Rest , _ ) when is_function (Unpack , 2 ) ->
208218 case Unpack (Type , Data ) of
209219 {ok , Term } -> {Term , Rest };
210220 {error , E } -> {error , E }
211221 end .
222+
0 commit comments