diff options
| author | Johannes Berg <johannes@sipsolutions.net> | 2010-05-20 04:35:28 -0400 |
|---|---|---|
| committer | Johannes Berg <johannes@sipsolutions.net> | 2010-05-25 07:17:03 -0400 |
| commit | df4d5ba4cb86f1055160559c9b7024e3dbf76a38 (patch) | |
| tree | eb68c693bf72b67699f622f4549f9228c9d85059 | |
| parent | f45a7087dc1b44d8e2572e4290b18ce00e8c228f (diff) | |
python: improve string handling
This adds ev.str_field('foo') as a non-raising
version of str(ev['foo']) that this patch also
enables. A new C function is necessary because
str(ev['foo'].data) may contain the NUL bytes
that should have terminated the C strings.
Suggested-by: Pierre Tardy <tardyp@gmail.com>
Acked-by: Darren Hart <dvhltc@us.ibm.com>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
| -rw-r--r-- | ctracecmd.i | 26 | ||||
| -rw-r--r-- | tracecmd.py | 8 |
2 files changed, 34 insertions, 0 deletions
diff --git a/ctracecmd.i b/ctracecmd.i index 9569419..624fb63 100644 --- a/ctracecmd.i +++ b/ctracecmd.i | |||
| @@ -69,6 +69,32 @@ static PyObject *py_field_get_data(struct format_field *f, struct record *r) | |||
| 69 | return PyBuffer_FromMemory((char *)r->data + f->offset, f->size); | 69 | return PyBuffer_FromMemory((char *)r->data + f->offset, f->size); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static PyObject *py_field_get_str(struct format_field *f, struct record *r) | ||
| 73 | { | ||
| 74 | if (!strncmp(f->type, "__data_loc ", 11)) { | ||
| 75 | unsigned long long val; | ||
| 76 | int offset; | ||
| 77 | |||
| 78 | if (pevent_read_number_field(f, r->data, &val)) { | ||
| 79 | PyErr_SetString(PyExc_TypeError, | ||
| 80 | "Field is not a valid number"); | ||
| 81 | return NULL; | ||
| 82 | } | ||
| 83 | |||
| 84 | /* | ||
| 85 | * The actual length of the dynamic array is stored | ||
| 86 | * in the top half of the field, and the offset | ||
| 87 | * is in the bottom half of the 32 bit field. | ||
| 88 | */ | ||
| 89 | offset = val & 0xffff; | ||
| 90 | |||
| 91 | return PyString_FromString((char *)r->data + offset); | ||
| 92 | } | ||
| 93 | |||
| 94 | return PyString_FromStringAndSize((char *)r->data + f->offset, | ||
| 95 | strnlen((char *)r->data + f->offset, f->size)); | ||
| 96 | } | ||
| 97 | |||
| 72 | static PyObject *py_format_get_keys(struct event_format *ef) | 98 | static PyObject *py_format_get_keys(struct event_format *ef) |
| 73 | { | 99 | { |
| 74 | PyObject *list; | 100 | PyObject *list; |
diff --git a/tracecmd.py b/tracecmd.py index b14a3b9..ad80ccd 100644 --- a/tracecmd.py +++ b/tracecmd.py | |||
| @@ -110,6 +110,11 @@ class Event(object): | |||
| 110 | return None | 110 | return None |
| 111 | return val | 111 | return val |
| 112 | 112 | ||
| 113 | def str_field(self, name): | ||
| 114 | f = pevent_find_any_field(self._format, name) | ||
| 115 | if f is None: | ||
| 116 | return None | ||
| 117 | return py_field_get_str(f, self._record) | ||
| 113 | 118 | ||
| 114 | class TraceSeq(object): | 119 | class TraceSeq(object): |
| 115 | def __init__(self, trace_seq): | 120 | def __init__(self, trace_seq): |
| @@ -138,6 +143,9 @@ class Field(object): | |||
| 138 | return val | 143 | return val |
| 139 | __int__ = __long__ | 144 | __int__ = __long__ |
| 140 | 145 | ||
| 146 | def __str__(self): | ||
| 147 | return py_field_get_str(self._field, self._record) | ||
| 148 | |||
| 141 | class PEvent(object): | 149 | class PEvent(object): |
| 142 | def __init__(self, pevent): | 150 | def __init__(self, pevent): |
| 143 | self._pevent = pevent | 151 | self._pevent = pevent |
