Berry 're.dump()' (#23162)

This commit is contained in:
s-hadinger 2025-03-17 21:34:59 +01:00 committed by GitHub
parent 3764e88ed2
commit c0d15de965
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 52 additions and 15 deletions

View File

@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
- Support Vango Technologies V924x ultralow power, single-phase, power measurement (#23127) - Support Vango Technologies V924x ultralow power, single-phase, power measurement (#23127)
- Support for HLK-LD2402 24GHz smart wave motion sensor (#23133) - Support for HLK-LD2402 24GHz smart wave motion sensor (#23133)
- Matter prepare for ICD cluster (#23158) - Matter prepare for ICD cluster (#23158)
- Berry `re.dump()`
### Breaking Changed ### Breaking Changed
- Berry remove `Leds.create_matrix` from the standard library waiting for reimplementation (#23114) - Berry remove `Leds.create_matrix` from the standard library waiting for reimplementation (#23114)

View File

@ -231,6 +231,21 @@ int be_re_search_all(bvm *vm) {
return be_re_match_search_all(vm, bfalse); return be_re_match_search_all(vm, bfalse);
} }
// Berry: `re.dump(b:bytes) -> nil``
int be_re_dump(bvm *vm) {
#ifdef USE_BERRY_DEBUG
int32_t argc = be_top(vm); // Get the number of arguments
if (argc >= 1 && be_isbytes(vm, 1)) {
ByteProg *code = (ByteProg*) be_tobytes(vm, 1, NULL);
re1_5_dumpcode(code);
be_return_nil(vm);
}
be_raise(vm, "type_error", NULL);
#else // USE_BERRY_DEBUG
be_return_nil(vm);
#endif
}
// Berry: `re_pattern.search(s:string [, offset:int]) -> list(string)` // Berry: `re_pattern.search(s:string [, offset:int]) -> list(string)`
int re_pattern_search(bvm *vm) { int re_pattern_search(bvm *vm) {
int32_t argc = be_top(vm); // Get the number of arguments int32_t argc = be_top(vm); // Get the number of arguments
@ -415,6 +430,7 @@ module re (scope: global) {
match2, func(be_re_match2) match2, func(be_re_match2)
matchall, func(be_re_match_all) matchall, func(be_re_match_all)
split, func(be_re_split) split, func(be_re_split)
dump, func(be_re_dump)
} }
@const_object_info_end @const_object_info_end

View File

@ -4,62 +4,82 @@
#include "re1.5.h" #include "re1.5.h"
// TASMOTA SPECIFIC
#ifndef INST_BUF_SIZE
#define INST_BUF_SIZE 96
#endif
void be_writebuffer(const char *buffer, size_t length);
#define be_writestring(s) be_writebuffer((s), strlen(s))
#define logbuf(...) snprintf(__lbuf, sizeof(__lbuf), __VA_ARGS__)
#define logfmt(...) \
do { \
char __lbuf[INST_BUF_SIZE]; \
logbuf(__VA_ARGS__); \
be_writestring(__lbuf); \
} while (0)
// all `printf` replaced with `logfmt`
void re1_5_dumpcode(ByteProg *prog) void re1_5_dumpcode(ByteProg *prog)
{ {
int pc = 0; int pc = 0;
char *code = prog->insts; char *code = prog->insts;
while (pc < prog->bytelen) { while (pc < prog->bytelen) {
printf("%2d: ", pc); logfmt("%2d: ", pc);
switch(code[pc++]) { switch(code[pc++]) {
default: default:
assert(0); assert(0);
// re1_5_fatal("printprog"); // re1_5_fatal("printprog");
case Split: case Split:
printf("split %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]); logfmt("split %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
pc++; pc++;
break; break;
case RSplit: case RSplit:
printf("rsplit %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]); logfmt("rsplit %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
pc++; pc++;
break; break;
case Jmp: case Jmp:
printf("jmp %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]); logfmt("jmp %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
pc++; pc++;
break; break;
case Char: case Char:
printf("char %c\n", code[pc++]); logfmt("char %c\n", code[pc++]);
break; break;
case Any: case Any:
printf("any\n"); logfmt("any\n");
break; break;
case Class: case Class:
case ClassNot: { case ClassNot: {
int num = code[pc]; int num = code[pc];
printf("class%s %d", (code[pc - 1] == ClassNot ? "not" : ""), num); logfmt("class%s %d", (code[pc - 1] == ClassNot ? "not" : ""), num);
pc++; pc++;
while (num--) { while (num--) {
printf(" 0x%02x-0x%02x", code[pc], code[pc + 1]); logfmt(" 0x%02x-0x%02x", code[pc], code[pc + 1]);
pc += 2; pc += 2;
} }
printf("\n"); logfmt("\n");
break; break;
} }
case NamedClass: case NamedClass:
printf("namedclass %c\n", code[pc++]); logfmt("namedclass %c\n", code[pc++]);
break; break;
case Match: case Match:
printf("match\n"); logfmt("match\n");
break; break;
case Save: case Save:
printf("save %d\n", (unsigned char)code[pc++]); logfmt("save %d\n", (unsigned char)code[pc++]);
break; break;
case Bol: case Bol:
printf("assert bol\n"); logfmt("assert bol\n");
break; break;
case Eol: case Eol:
printf("assert eol\n"); logfmt("assert eol\n");
break; break;
} }
} }
printf("Bytes: %d, insts: %d\n", prog->bytelen, prog->len); logfmt("Bytes: %d, insts: %d\n", prog->bytelen, prog->len);
} }