/* File: libfdt.i */ %module libfdt %{ #define SWIG_FILE_WITH_INIT #include "libfdt.h" %} %pythoncode %{ def Raise(errnum): raise ValueError('Error %s' % fdt_strerror(errnum)) def Name(fdt, offset): name, len = fdt_get_name(fdt, offset) return name def String(fdt, offset): offset = fdt32_to_cpu(offset) name = fdt_string(fdt, offset) return name def swap32(x): return (((x << 24) & 0xFF000000) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | ((x >> 24) & 0x000000FF)) def fdt32_to_cpu(x): return swap32(x) def Data(prop): set_prop(prop) return get_prop_data() %} %include "typemaps.i" %include "cstring.i" %typemap(in) void* = char*; typedef int fdt32_t; struct fdt_property { fdt32_t tag; fdt32_t len; fdt32_t nameoff; char data[0]; }; /* * This is a work-around since I'm not sure of a better way to copy out the * contents of a string. This is used in dtoc/GetProps(). The intent is to * pass in a pointer to a property and access the data field at the end of * it. Ideally the Data() function above would be able to do this directly, * but I'm not sure how to do that. */ #pragma SWIG nowarn=454 %inline %{ static struct fdt_property *cur_prop; void set_prop(struct fdt_property *prop) { cur_prop = prop; } %} %cstring_output_allocate_size(char **s, int *sz, free(*$1)); %inline %{ void get_prop_data(char **s, int *sz) { *sz = fdt32_to_cpu(cur_prop->len); *s = (char *)malloc(*sz); if (!*s) *sz = 0; else memcpy(*s, cur_prop + 1, *sz); } %} %typemap(in) (const void *) { if (!PyByteArray_Check($input)) { SWIG_exception_fail(SWIG_TypeError, "in method '" "$symname" "', argument " "$argnum"" of type '" "$type""'"); } $1 = (void *) PyByteArray_AsString($input); } const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen); int fdt_path_offset(const void *fdt, const char *path); int fdt_first_property_offset(const void *fdt, int nodeoffset); int fdt_next_property_offset(const void *fdt, int offset); const char *fdt_strerror(int errval); const struct fdt_property *fdt_get_property_by_offset(const void *fdt, int offset, int *OUTPUT); const char *fdt_get_name(const void *fdt, int nodeoffset, int *OUTPUT); const char *fdt_string(const void *fdt, int stroffset); int fdt_first_subnode(const void *fdt, int offset); int fdt_next_subnode(const void *fdt, int offset); %typemap(in) (void *) { if (!PyByteArray_Check($input)) { SWIG_exception_fail(SWIG_TypeError, "in method '" "$symname" "', argument " "$argnum"" of type '" "$type""'"); } $1 = PyByteArray_AsString($input); } int fdt_delprop(void *fdt, int nodeoffset, const char *name); const char *fdt_strerror(int errval); int fdt_pack(void *fdt); int fdt_totalsize(const void *fdt); int fdt_off_dt_struct(const void *fdt);