@@ -64,23 +64,48 @@ void ucdr_set_on_full_buffer_callback(ucdrBuffer* ub, OnFullBuffer on_full_buffe
6464// -------------------------------------------------------------------
6565// PUBLIC IMPLEMENTATION
6666// -------------------------------------------------------------------
67- void ucdr_init_buffer (ucdrBuffer * ub , uint8_t * data , size_t size )
67+ void ucdr_init_buffer (
68+ ucdrBuffer * ub ,
69+ uint8_t * data ,
70+ size_t size )
6871{
69- ucdr_init_buffer_offset (ub , data , size , 0u );
72+ ucdr_init_buffer_origin (ub , data , size , 0u );
7073}
7174
72- void ucdr_init_buffer_offset (ucdrBuffer * ub , uint8_t * data , size_t size , size_t offset )
75+ void ucdr_init_buffer_origin (
76+ ucdrBuffer * ub ,
77+ uint8_t * data ,
78+ size_t size ,
79+ size_t origin )
7380{
74- ucdr_init_buffer_offset_endian (ub , data , size , offset , UCDR_MACHINE_ENDIANNESS );
81+ ucdr_init_buffer_origin_offset (ub , data , size , origin , 0u );
7582}
7683
77- void ucdr_init_buffer_offset_endian (ucdrBuffer * ub , uint8_t * data , size_t size , size_t offset , ucdrEndianness endianness )
84+ void ucdr_init_buffer_origin_offset (
85+ ucdrBuffer * ub ,
86+ uint8_t * data ,
87+ size_t size ,
88+ size_t origin ,
89+ size_t offset )
90+ {
91+ ucdr_init_buffer_origin_offset_endian (ub , data , size , origin , offset , UCDR_MACHINE_ENDIANNESS );
92+ }
93+
94+ void ucdr_init_buffer_origin_offset_endian (
95+ ucdrBuffer * ub ,
96+ uint8_t * data ,
97+ size_t size ,
98+ size_t origin ,
99+ size_t offset ,
100+ ucdrEndianness endianness )
78101{
79102 ub -> init = data ;
80103 ub -> final = ub -> init + size ;
81104 ub -> iterator = ub -> init + offset ;
82- ub -> last_data_size = 0u ;
105+ ub -> origin = origin ;
106+ ub -> offset = origin + offset ;
83107 ub -> endianness = endianness ;
108+ ub -> last_data_size = 0u ;
84109 ub -> error = false;
85110 ub -> on_full_buffer = NULL ;
86111 ub -> args = NULL ;
@@ -100,18 +125,22 @@ void ucdr_reset_buffer(ucdrBuffer* ub)
100125void ucdr_reset_buffer_offset (ucdrBuffer * ub , size_t offset )
101126{
102127 ub -> iterator = ub -> init + offset ;
128+ ub -> offset = ub -> origin + offset ;
103129 ub -> last_data_size = 0u ;
104130 ub -> error = false;
105131}
106132
107133void ucdr_align_to (ucdrBuffer * ub , size_t size )
108134{
109- ub -> iterator += ucdr_buffer_alignment (ub , size );
135+ size_t alignment = ucdr_buffer_alignment (ub , size );
136+ ub -> offset += alignment ;
137+
138+ // TODO (julibert): rethink.
139+ ub -> iterator += alignment ;
110140 if (ub -> iterator > ub -> final )
111141 {
112142 ub -> iterator = ub -> final ;
113143 }
114-
115144 ub -> last_data_size = (uint8_t )size ;
116145}
117146
@@ -122,12 +151,30 @@ size_t ucdr_alignment(size_t current_alignment, size_t data_size)
122151
123152size_t ucdr_buffer_alignment (const ucdrBuffer * ub , size_t data_size )
124153{
125- if (data_size > ub -> last_data_size )
154+ return (data_size > ub -> last_data_size )
155+ ? (data_size - ((uint32_t )(ub -> offset - ub -> origin ) % data_size )) & (data_size - 1 )
156+ : 0 ;
157+ }
158+
159+ void ucdr_advance_buffer (ucdrBuffer * ub , size_t size )
160+ {
161+ if (ucdr_check_buffer_available_for (ub , size ))
126162 {
127- return (data_size - ((uint32_t )(ub -> iterator - ub -> init ) % data_size )) & (data_size - 1 );
163+ ub -> iterator += size ;
164+ ub -> offset += size ;
128165 }
129-
130- return 0 ;
166+ else
167+ {
168+ size_t remaining_size = size ;
169+ size_t serialization_size ;
170+ while (0 < (serialization_size = ucdr_check_final_buffer_behavior_array (ub , remaining_size , 1 )))
171+ {
172+ remaining_size -= serialization_size ;
173+ ub -> iterator += serialization_size ;
174+ ub -> offset += serialization_size ;
175+ }
176+ }
177+ ub -> last_data_size = 1 ;
131178}
132179
133180size_t ucdr_buffer_size (const ucdrBuffer * ub )
0 commit comments