Skip to content

Commit 3a0664e

Browse files
committed
Refactor and optimize.
1 parent 56397c4 commit 3a0664e

1 file changed

Lines changed: 34 additions & 30 deletions

File tree

source/tcli.c

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)