[OpenWrt-Devel] [RFC] libubox/binary.h design proposal
Javier Domingo Cansino
javierdo1 at gmail.com
Mon Oct 5 05:41:32 EDT 2015
After feedback in IRC, I will drop this idea, and try to go the kernel way,
supporting endianess annotated structures with sparse rules checking.
https://lwn.net/Articles/205624/
The motivation is that it's really difficult to keep in sync all the format
strings, and although there may be ways to deal with it, I rather prefer
this other design.
On Mon, Oct 5, 2015 at 10:25 AM Javier Domingo Cansino <javierdo1 at gmail.com>
wrote:
> Hello,
>
> I have been asked for examples and use cases. Github repo has been updated.
>
> I do also have doubts on if it's worth it. If a library like this existed
> I would be definitely using it, make conversions, does take care of
> alignment, can manage unaligned data and endianness. etc.
>
> But I am not really sure if someone apart from me would find it
> interesting (long time ago I haven't seen a protocol unaligned with
> different endianess).
>
> Waiting for your feedback!
>
> /*
> * Syntax for the function is as follows.
> * %[p][n][a][lb][01r]{i,y,w,d,q,s}
> *
> * All the characters that don't follow this will be treated as raw chars
> * to be written as they are.
> *
> * Data type
> * * i - bit
> * * y - byte
> * * w - 2 byte word
> * * d - 4 byte word
> * * q - 8 byte word
> * * s - string without termination (use strlen()+1 in quantity to null)
> *
> * Data value
> * * 0 - fill the specified space with zeros
> * * 1 - fill the specified space with ones
> * * r - fill the specified space with random data
> *
> * String data type is not valid in this case. When quantity is also
> * specified, use l/b to separate: %5b0 -> 5 bits of value 0
> *
> * Endianess. No conversion by default
> * * l - little endian
> * * b - big endian
> *
> * Alignment. No alignment by default
> * * a - align this to it's datatype
> * bits are aligned to byte
> *
> * Quantity. One by default
> * * n - number of same datatype (placed together)
> * this denotes length of string, padded with 0
> *
> * Pointer. Default everything is passed by value
> * * p - specify that passed parameter is a pointer to value(s)
> *
> * Obviously, when quantity is specified, and datatype is not bits, p
> * is required.
> *
> * Some examples:
> * * %4lw - 4 little endian 2 byte word
> * * %2i - 2 bits 'ab' from value b'000000ab'
> * * %2bi - 2 bits 'ab' from value b'000000ba'
> * * %2li - 2 bits 'ab' from value b'ab000000'
> * * %5y
> *
> * Calling functions example:
> * int32_t dw[]=[1,2,3,4]
> *
> * v = writebv("%lw%2i%ay%p4d", 2047, 3, 'n', dw);
> *
> * in a big endian computer
> * // *v = 0xff07c06e00000001000000020000000300000004
> *
> * struct my_data_t {
> * uint16_t a;
> * uint8_t b:2;
> * uint8_t unused1:6;
> * uint8_t c;
> * uint32_t d[4];
> * } *my_data;
> * char letter;
> *
> * // If we want to have all extracted from the blob
> * my_data = readbv(v, "%lw%2i%ay%p4d");
> *
> * // If we just want to extract the char
> * readb(v, "%0w%2l0i%ay%4l0d", &letter);
> *
> * // We have aligned data, but if we removed the 'a' from %ay, we
> * wouldn't have unaligned data and this would still work.
> *
> */
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20151005/d7601d05/attachment.htm>
-------------- next part --------------
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list