@@ -236,36 +236,54 @@ static void tcli_rb_pop(tcli_rb_t *const rb)
236236 }
237237}
238238
239- static bool tcli_rb_peekcmp (tcli_rb_t * restrict const rb ,
240- const char * restrict str , size_t len )
239+ static size_t tcli_rb_move_backwards (tcli_rb_t * restrict const rb ,
240+ const size_t max_len )
241241{
242242 TCLI_ASSERT_RB (rb );
243- assert (str );
244243
245244 if (rb -> count == 0 || rb -> pos == rb -> tail )
246- return false;
247-
248- const size_t pos = rb -> pos ;
245+ return 0 ;
249246
250247 tcli_rb_scan_backwards (rb );
251248 assert (rb -> buf [rb -> pos ] == '\0' );
252249 tcli_rb_scan_backwards (rb );
253250
254- size_t l = 0 ;
251+ const size_t pos = rb -> pos ;
252+ size_t len = 0 ;
255253 while (rb -> buf [rb -> pos ] != '\0' ) {
256- l ++ ;
254+ len ++ ;
255+
256+ if (max_len != 0 && len > max_len ) {
257+ rb -> pos = pos ;
258+ return 0 ;
259+ }
257260
258261 if (rb -> pos == rb -> tail )
259262 break ;
260263
261264 tcli_rb_scan_backwards (rb );
262265 }
263266
264- assert (l != 0 );
267+ assert (len != 0 );
265268
266269 if (rb -> pos != rb -> tail )
267270 tcli_rb_scan_forwards (rb );
268271
272+ return len ;
273+ }
274+
275+ static bool tcli_rb_peekcmp (tcli_rb_t * restrict const rb ,
276+ const char * restrict str , size_t len )
277+ {
278+ TCLI_ASSERT_RB (rb );
279+ assert (str );
280+
281+ const size_t pos = rb -> pos ;
282+ const size_t l = tcli_rb_move_backwards (rb , len );
283+
284+ if (l == 0 )
285+ return false;
286+
269287 bool match = l == len ;
270288 if (match ) {
271289 for (size_t i = 0 ; i < l ; i ++ ) {
@@ -329,35 +347,21 @@ static bool tcli_rb_previous(tcli_rb_t *restrict const rb, char *str,
329347 assert (str );
330348 assert (len );
331349
332- SCAN :
350+ SCAN :;
333351
334- if (rb -> count == 0 || rb -> pos == rb -> tail )
335- return false;
336-
337- tcli_rb_scan_backwards (rb );
338- assert (rb -> buf [rb -> pos ] == '\0' );
339- tcli_rb_scan_backwards (rb );
340-
341- size_t l = 0 ;
342- while (rb -> buf [rb -> pos ] != '\0' ) {
343- l ++ ;
352+ const size_t l = tcli_rb_move_backwards (rb , 0 );
344353
345- if (rb -> pos == rb -> tail )
346- break ;
347-
348- tcli_rb_scan_backwards (rb );
349- }
350-
351- assert (l != 0 );
352-
353- if (rb -> pos != rb -> tail )
354- tcli_rb_scan_forwards (rb );
354+ if (l == 0 )
355+ return false;
355356
356357 const size_t pos = rb -> pos ;
357358 if (match_str ) {
358359 if (match_len == 0 || * match_str == '\0' )
359360 return false;
360361
362+ if (l < match_len )
363+ goto SCAN ;
364+
361365 // Check if we match
362366 size_t matched = 0 ;
363367 const char * c = match_str ;
0 commit comments