mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-19 16:56:34 +00:00
Berry 're.dump()' (#23162)
This commit is contained in:
parent
3764e88ed2
commit
c0d15de965
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user