Dear CRUNCHers, I am trying to create a simple ring buffer and here are a few
issues I encountered.
The ring buffer is supposed to be very small and only contain bytes. It is
sufficient to have 4 fields: capacity, head, tail, and byte array.
So I thought this would work:
(define-struct rbuf
(cap char)
(head char)
(tail char)
(buf bytevector))
Problem 1: That generates fields with 32 bits, not chars. I am programming a
microcontroller with CRUNCH and I want to have full control over such types.
The following worked, however:
(define-struct rbuf
(cap (typename uint8_t))
(head (typename uint8_t))
(tail (typename uint8_t))
(buf bytevector))
Problem 2: Besides char not enforcing 8 bit fields, I also had the issue that
I forgot to include (crunch aggregate-types) and `chicken-crunch` gives no
reasonable error (no string) and simply returns an error code != 0.
Problem 3: Next, I want to define accessors. This is probably my fault, but the
following code
(define-compound-accessors (struct rbuf)
(mk-rbuf cap head tail buf)
(cap rbuf-cap)
(head rbuf-head rbuf-head!)
(tail rbuf-tail rbuf-tail!)
(buf rbuf-buf))
generates incorrect/unexpected modifier methods, eg, `rbuf-head!` becomes:
void rbuf_X2dhead_X21(struct rbuf _s, uint8_t _x) { _s.head = _x; }
Only the copy of the struct in the scope of the function gets modified. I was
expecting to see this:
void rbuf_X2dhead_X21(struct rbuf *_s, uint8_t _x) { _s->head = _x; }
Any feedback is appreciated. Thank you in advance!
Best,
- Diogo