Add array
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 5 Oct 2010 03:09:09 +0000 (23:09 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 5 Oct 2010 03:09:09 +0000 (23:09 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/ctf/ctf.c
formats/ctf/types/array.c [new file with mode: 0644]
formats/ctf/types/sequence.c [new file with mode: 0644]
formats/ctf/types/struct.c
include/babeltrace/ctf/types.h
include/babeltrace/format.h
include/babeltrace/types.h
types/array.c [new file with mode: 0644]
types/float.c
types/struct.c

index 63fe47e3cd6382b8f2a31eac7c8e31acc4d7468d..48c62c02f6d3dff1be4db96f968e5d345d437c05 100644 (file)
@@ -41,6 +41,10 @@ static const struct format ctf_format = {
        .enum_write = ctf_enum_write,
        .struct_begin = ctf_struct_begin,
        .struct_end = ctf_struct_end,
+       .array_begin = ctf_array_begin,
+       .array_end = ctf_array_end,
+       .sequence_begin = ctf_sequence_begin,
+       .sequence_end = ctf_sequence_end,
 };
 
 void ctf_init(void)
diff --git a/formats/ctf/types/array.c b/formats/ctf/types/array.c
new file mode 100644 (file)
index 0000000..0133268
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Common Trace Format
+ *
+ * Array format access functions.
+ *
+ * Copyright (c) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <babeltrace/ctf/types.h>
+
+void ctf_array_begin(struct stream_pos *pos,
+                    const struct type_class_array *array_class)
+{
+       /* No need to align, because the first field will align itself. */
+}
+
+void ctf_array_end(struct stream_pos *pos,
+                  const struct type_class_array *array_class)
+{
+}
diff --git a/formats/ctf/types/sequence.c b/formats/ctf/types/sequence.c
new file mode 100644 (file)
index 0000000..c4c3422
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Common Trace Format
+ *
+ * Sequence format access functions.
+ *
+ * Copyright (c) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <babeltrace/ctf/types.h>
+
+void ctf_sequence_begin(struct stream_pos *pos,
+                       const struct type_class_sequence *sequence_class)
+{
+       align_pos(pos, sequence_class->p.alignment);
+}
+
+void ctf_sequence_end(struct stream_pos *pos,
+                     const struct type_class_sequence *sequence_class)
+{
+}
index 729c456e63c5769663ce720fadf7aa7a2b7e0ccb..f99cc5390f4200fd5c5f1fb393b08511e49f3d60 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 #include <babeltrace/ctf/types.h>
-#include <glib.h>
 
 void ctf_struct_begin(struct stream_pos *pos,
                      const struct type_class_struct *struct_class)
index 75b8bd3e28932f3f1d355a498d6bac82378ac457..eee7d5df7fabc6add9a5ca2edc48c4d55e7b8165 100644 (file)
@@ -76,5 +76,13 @@ void ctf_struct_begin(struct stream_pos *pos,
                      const struct type_class_struct *struct_class);
 void ctf_struct_end(struct stream_pos *pos,
                    const struct type_class_struct *struct_class);
+void ctf_array_begin(struct stream_pos *pos,
+                    const struct type_class_array *array_class);
+void ctf_array_end(struct stream_pos *pos,
+                  const struct type_class_array *array_class);
+void ctf_sequence_begin(struct stream_pos *pos,
+                       const struct type_class_sequence *sequence_class);
+void ctf_sequence_end(struct stream_pos *pos,
+                     const struct type_class_sequence *sequence_class);
 
 #endif /* _BABELTRACE_CTF_TYPES_H */
index bc2bdb067c0b75b1041738d2317ccd1a4bf7e03c..9478dcf4943cbe8aa4a19db7ea2636849bc5a52b 100644 (file)
@@ -66,6 +66,14 @@ struct format {
                             const struct type_class_struct *struct_class);
        void (*struct_end)(struct stream_pos *pos,
                           const struct type_class_struct *struct_class);
+       void (*array_begin)(struct stream_pos *pos,
+                            const struct type_class_array *array_class);
+       void (*array_end)(struct stream_pos *pos,
+                          const struct type_class_array *array_class);
+       void (*sequence_begin)(struct stream_pos *pos,
+                            const struct type_class_sequence *sequence_class);
+       void (*sequence_end)(struct stream_pos *pos,
+                          const struct type_class_sequence *sequence_class);
 };
 
 struct format *bt_lookup_format(GQuark qname);
index ada6c6d1513d0e93ed880a3465e94fc68ed1dc20..cc1965a0aa6fec46e2e74ae93c5f25926b46c67d 100644 (file)
@@ -214,14 +214,22 @@ struct field *
 struct_type_get_field_from_index(struct type_class_struct *struct_class,
                                 unsigned long index);
 
+/*
+ * elem_class passed as parameter now belongs to the array. No need to free it
+ * explicitely.
+ */
 struct type_class_array *array_type_new(const char *name,
                                        size_t len,
                                        struct type_class *elem_class);
 void array_type_free(struct type_class_array *array_class);
 
+/*
+ * int_class and elem_class passed as parameter now belongs to the sequence. No
+ * need to free them explicitely.
+ */
 struct type_class_sequence *sequence_type_new(const char *name,
                                        struct type_class_integer *int_class, 
                                        struct type_class *elem_class);
-void array_type_free(struct type_class_array *array_class);
+void sequence_type_free(struct type_class_sequence *sequence_class);
 
 #endif /* _BABELTRACE_TYPES_H */
diff --git a/types/array.c b/types/array.c
new file mode 100644 (file)
index 0000000..153a38e
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * BabelTrace - Array Type Converter
+ *
+ * Copyright (c) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <babeltrace/compiler.h>
+#include <babeltrace/types.h>
+
+void array_copy(struct stream_pos *dest, const struct format *fdest, 
+               struct stream_pos *src, const struct format *fsrc,
+               const struct type_class *type_class)
+{
+       struct type_class_array *array_class =
+               container_of(type_class, struct type_class_array, p);
+       unsigned int i;
+
+       fsrc->array_begin(src, array_class);
+       fdest->array_begin(dest, array_class);
+
+       for (i = 0; i < array_class->len; i++) {
+               struct type_class *elem_class = array_class->elem;
+               elem_class->copy(dest, fdest, src, fsrc, &elem_class->p);
+       }
+       fsrc->array_end(src, array_class);
+       fdest->array_end(dest, array_class);
+}
+
+void array_type_free(struct type_class_array *array_class)
+{
+       array_class->elem->free(&array_class->elem->p);
+       g_free(array_class);
+}
+
+static void _array_type_free(struct type_class *type_class)
+{
+       struct type_class_struct *array_class =
+               container_of(type_class, struct type_class_array, p);
+       array_type_free(array_class);
+}
+
+struct type_class_array *array_type_new(const char *name, size_t len,
+                                       struct type_class *elem)
+{
+       struct type_class_array *array_class;
+       int ret;
+
+       array_class = g_new(struct type_class_array, 1);
+       type_class = &float_class->p;
+
+       array_class->len = len;
+       type_class->name = g_quark_from_string(name);
+       /* No need to align the array, the first element will align itself */
+       type_class->alignment = 1;
+       type_class->copy = array_copy;
+       type_class->free = _array_type_free;
+
+       if (type_class->name) {
+               ret = ctf_register_type(type_class);
+               if (ret)
+                       goto error_register;
+       }
+       return array_class;
+
+error_register:
+       g_free(array_class);
+       return NULL;
+}
index 266f7579da0c37de05eb43b9218ca31c839f7a35..56ca402c2b4a9a9f4f84f80c26a4a0fa18b8848a 100644 (file)
@@ -40,6 +40,9 @@ void float_copy(struct stream_pos *dest, const struct format *fdest,
 
 void float_type_free(struct type_class_float *float_class)
 {
+       integer_type_free(float_class->exp);
+       integer_type_free(float_class->mantissa);
+       integer_type_free(float_class->sign);
        g_free(float_class);
 }
 
index 8c1a5834eb58fa3825d9fb46996789f48ab99013..b1bedda8849c24e5699fdb281afbccd4c95e1fa1 100644 (file)
@@ -37,7 +37,7 @@ void struct_copy(struct stream_pos *dest, const struct format *fdest,
                                                     struct field, i);
                struct type_class *field_class = field->type_class;
 
-               field_class->copy(dest, fdest, src, fsrc, type_class);
+               field_class->copy(dest, fdest, src, fsrc, &field_class->p);
 
        }
        fsrc->struct_end(src, struct_class);
This page took 0.041989 seconds and 4 git commands to generate.