From 920b964af91ba03ebfe67302084513cb37b49d10 Mon Sep 17 00:00:00 2001 From: Joerg Wunsch Date: Fri, 15 Mar 2024 14:35:07 +0100 Subject: [PATCH] Add AVRMEM* buffer handling methods m->buf is not directly accessible from within Python. Add two methods that allow to place and retrieve data there, as Python bytes() objects. --- src/libavrdude.i | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/libavrdude.i b/src/libavrdude.i index a7bddf37..266fe838 100644 --- a/src/libavrdude.i +++ b/src/libavrdude.i @@ -196,6 +196,37 @@ typedef struct avrmem { unsigned char * buf; /* pointer to memory buffer */ } AVRMEM; +%extend avrmem { + PyObject *get(unsigned int len, unsigned int offset = 0) { + if (offset > (unsigned)$self->size) + return Py_None; + if (offset + len > (unsigned)$self->size) + len = $self->size - offset; + return PyBytes_FromStringAndSize((char *)($self->buf + offset), len); + } +} + +int avr_initmem(const AVRPART *p); + +%extend avrmem { + %typemap(in) (unsigned char *in, unsigned int len) { + Py_ssize_t len; + PyBytes_AsStringAndSize($input, (char **)&$1, &len); + $2 = len; + } + int put(unsigned char *in, unsigned int len, unsigned int offset = 0) { + if ($self->buf == NULL) + // missing avr_initmem()? + return 0; + if (offset > (unsigned)$self->size) + return 0; + if (offset + len > (unsigned)$self->size) + len = $self->size - offset; + memcpy($self->buf + offset, in, len); + return len; + } +} + // Config file handling int init_config(void);