Berry add 'bytes().appendhex()' (#22767)

This commit is contained in:
s-hadinger 2025-01-05 13:12:39 +01:00 committed by GitHub
parent a5610eea09
commit 77d98868bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 11 deletions

View File

@ -9,7 +9,7 @@ All notable changes to this project will be documented in this file.
- Support for Senseair S88 CO2 sensor (#22733) - Support for Senseair S88 CO2 sensor (#22733)
- ESP32 TasmotaLED change dynamically the number of pixels (#22754) - ESP32 TasmotaLED change dynamically the number of pixels (#22754)
- ESP32 expand `Pixels` with reverse, height and alternate (#22755) - ESP32 expand `Pixels` with reverse, height and alternate (#22755)
- Berry allow `bytes().append(nil)` - Berry add `bytes().appendhex()`
### Breaking Changed ### Breaking Changed

View File

@ -18,6 +18,8 @@
#include <ctype.h> #include <ctype.h>
#include "be_byteslib.h" #include "be_byteslib.h"
static const char * hex = "0123456789ABCDEF";
/******************************************************************** /********************************************************************
** Base64 lib from https://github.com/Densaugeo/base64_arduino ** Base64 lib from https://github.com/Densaugeo/base64_arduino
** **
@ -715,7 +717,6 @@ buf_impl bytes_check_data(bvm *vm, size_t add_size) {
} }
size_t be_bytes_tohex(char * out, size_t outsz, const uint8_t * in, size_t insz) { size_t be_bytes_tohex(char * out, size_t outsz, const uint8_t * in, size_t insz) {
static const char * hex = "0123456789ABCDEF";
const uint8_t * pin = in; const uint8_t * pin = in;
char * pout = out; char * pout = out;
for (; pin < in + insz; pout += 2, pin++) { for (; pin < in + insz; pout += 2, pin++) {
@ -1317,17 +1318,15 @@ static int m_copy(bvm *vm)
be_return(vm); /* return self */ be_return(vm); /* return self */
} }
/* accept bytes or int as operand */ /* accept bytes or int or nil as operand */
static int m_connect(bvm *vm) static int m_connect(bvm *vm)
{ {
int argc = be_top(vm); int argc = be_top(vm);
buf_impl attr = m_read_attributes(vm, 1); buf_impl attr = m_read_attributes(vm, 1);
check_ptr_modifiable(vm, &attr); check_ptr_modifiable(vm, &attr);
if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); } if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); }
if (argc >= 2 && (be_isbytes(vm, 2) || be_isint(vm, 2) || be_isstring(vm, 2) || be_isnil(vm, 2))) { if (argc >= 2 && (be_isbytes(vm, 2) || be_isint(vm, 2) || be_isstring(vm, 2))) {
if (be_isnil(vm, 2)) { if (be_isint(vm, 2)) {
// do nothing
} else if (be_isint(vm, 2)) {
bytes_resize(vm, &attr, attr.len + 1); /* resize */ bytes_resize(vm, &attr, attr.len + 1); /* resize */
buf_add1(&attr, be_toint(vm, 2)); buf_add1(&attr, be_toint(vm, 2));
m_write_attributes(vm, 1, &attr); /* update instance */ m_write_attributes(vm, 1, &attr); /* update instance */
@ -1353,6 +1352,30 @@ static int m_connect(bvm *vm)
be_return_nil(vm); /* return self */ be_return_nil(vm); /* return self */
} }
static int m_appendhex(bvm *vm)
{
int argc = be_top(vm);
buf_impl attr = m_read_attributes(vm, 1);
check_ptr_modifiable(vm, &attr);
if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); }
if (argc >= 2 && be_isbytes(vm, 2)) {
buf_impl attr2 = m_read_attributes(vm, 2);
check_ptr(vm, &attr2);
bytes_resize(vm, &attr, attr.len + attr2.len * 2); /* resize */
for (const uint8_t * pin = attr2.bufptr; pin < attr2.bufptr + attr2.len; pin++) {
buf_add1(&attr, hex[((*pin)>>4) & 0xF]);
buf_add1(&attr, hex[ (*pin) & 0xF]);
}
m_write_attributes(vm, 1, &attr); /* update instance */
be_pushvalue(vm, 1);
be_return(vm); /* return self */
}
be_raise(vm, "type_error", "operand must be bytes");
be_return_nil(vm); /* return self */
}
static int bytes_equal(bvm *vm, bbool iseq) static int bytes_equal(bvm *vm, bbool iseq)
{ {
bbool ret; bbool ret;
@ -1892,6 +1915,7 @@ class be_class_bytes (scope: global, name: bytes) {
reverse, func(m_reverse) reverse, func(m_reverse)
copy, func(m_copy) copy, func(m_copy)
append, func(m_connect) append, func(m_connect)
appendhex, func(m_appendhex)
+, func(m_merge) +, func(m_merge)
.., func(m_connect) .., func(m_connect)
==, func(m_equal) ==, func(m_equal)

View File

@ -155,10 +155,10 @@ assert(str(b1) == "bytes('AA')")
b1.append('01') b1.append('01')
assert(str(b1) == "bytes('AA3031')") assert(str(b1) == "bytes('AA3031')")
#- .. with nil -# #- appendhex -#
b1 = bytes("1122") assert(bytes().appendhex(bytes("DEADBEEF")) == bytes("4445414442454546"))
assert(str(b1 .. nil) == "bytes('1122')") assert(bytes("AABBCC").appendhex(bytes("DEADBEEF")) == bytes("AABBCC4445414442454546"))
assert(str(b1.append(nil)) == "bytes('1122')") assert(bytes("AABBCC").appendhex(bytes("")) == bytes("AABBCC"))
#- item -# #- item -#
b = bytes("334455") b = bytes("334455")