summaryrefslogtreecommitdiff
path: root/lib/libfdt/libfdt.swig
blob: 0cb7977ffe5ebeec6cb2baf2216cd48fa4e42af7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* 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);