modstruct: Add one more extension to typecodes - 'S', a pointer to C string.
Also, add comment with description of extension to CPython's typecodes.
This commit is contained in:
parent
b55a59de4c
commit
62798831be
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
@ -75,7 +76,7 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
|
||||||
case 'q': case 'Q':
|
case 'q': case 'Q':
|
||||||
// TODO: This is for x86
|
// TODO: This is for x86
|
||||||
align = sizeof(int); size = sizeof(long long); break;
|
align = sizeof(int); size = sizeof(long long); break;
|
||||||
case 'P': case 'O':
|
case 'P': case 'O': case 'S':
|
||||||
align = size = sizeof(void*); break;
|
align = size = sizeof(void*); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,6 +162,8 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
|
||||||
*ptr += size;
|
*ptr += size;
|
||||||
if (val_type == 'O') {
|
if (val_type == 'O') {
|
||||||
return (mp_obj_t)val;
|
return (mp_obj_t)val;
|
||||||
|
} else if (val_type == 'S') {
|
||||||
|
return mp_obj_new_str((char*)val, strlen((char*)val), false);
|
||||||
} else if (is_signed(val_type)) {
|
} else if (is_signed(val_type)) {
|
||||||
return mp_obj_new_int(val);
|
return mp_obj_new_int(val);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -39,6 +39,22 @@
|
||||||
|
|
||||||
#if MICROPY_PY_STRUCT
|
#if MICROPY_PY_STRUCT
|
||||||
|
|
||||||
|
/*
|
||||||
|
This module implements most of character typecodes from CPython, with
|
||||||
|
some extensions:
|
||||||
|
|
||||||
|
O - (Pointer to) an arbitrary Python object. This is useful for callback
|
||||||
|
data, etc. Note that you must keep reference to passed object in
|
||||||
|
your Python application, otherwise it may be garbage-collected,
|
||||||
|
and then when you get back this value from callback it may be
|
||||||
|
invalid (and lead to crash).
|
||||||
|
S - Pointer to a string (returned as a Python string). Note the
|
||||||
|
difference from "Ns", - the latter says "in this place of structure
|
||||||
|
is character data of up to N bytes length", while "S" means
|
||||||
|
"in this place of a structure is a pointer to zero-terminated
|
||||||
|
character data".
|
||||||
|
*/
|
||||||
|
|
||||||
STATIC char get_fmt_type(const char **fmt) {
|
STATIC char get_fmt_type(const char **fmt) {
|
||||||
char t = **fmt;
|
char t = **fmt;
|
||||||
switch (t) {
|
switch (t) {
|
||||||
|
|
Loading…
Reference in New Issue