Enable agent application contexts if filter has such dependencies
[lttng-tools.git] / src / common / filter.c
diff --git a/src/common/filter.c b/src/common/filter.c
new file mode 100644 (file)
index 0000000..f103d24
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * filter.c
+ *
+ * LTTng filter bytecode utilities.
+ *
+ * Copyright 2016 - Jérémie Galarneau <jeremie.galarneau@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, version 2.1 only,
+ * as published by the Free Software Foundation.
+ *
+ * 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 "filter.h"
+#include <stddef.h>
+
+struct bytecode_symbol_iterator {
+       /* No ownership of bytecode is taken. */
+       char *bytecode;
+       size_t offset, len;
+};
+
+struct bytecode_symbol_iterator *bytecode_symbol_iterator_create(
+               struct lttng_filter_bytecode *bytecode)
+{
+       struct bytecode_symbol_iterator *it = NULL;
+
+       if (!bytecode) {
+               goto end;
+       }
+
+       it = zmalloc(sizeof(*it));
+       if (!it) {
+               goto end;
+       }
+
+       it->bytecode = bytecode->data;
+       it->offset = bytecode->reloc_table_offset;
+       it->len = bytecode->len;
+end:
+       return it;
+}
+
+int bytecode_symbol_iterator_next(struct bytecode_symbol_iterator *it)
+{
+       int ret;
+       size_t len;
+
+       if (!it || it->offset >= it->len) {
+               ret = -1;
+               goto end;
+       }
+
+       len = strlen(it->bytecode + it->offset + sizeof(uint16_t)) + 1;
+       it->offset += len + sizeof(uint16_t);
+       ret = it->offset >= it->len ? -1 : 0;
+end:
+       return ret;
+}
+
+int bytecode_symbol_iterator_get_type(struct bytecode_symbol_iterator *it)
+{
+       int ret;
+
+       if (!it) {
+               ret = -1;
+               goto end;
+       }
+
+       ret = *((uint16_t *) (it->bytecode + it->offset));
+end:
+       return ret;
+ }
+
+const char *bytecode_symbol_iterator_get_name(
+               struct bytecode_symbol_iterator *it)
+{
+       const char *ret = NULL;
+
+       if (!it) {
+               goto end;
+       }
+
+       ret = it->bytecode + it->offset + sizeof(uint16_t);
+end:
+       return ret;
+}
+
+void bytecode_symbol_iterator_destroy(struct bytecode_symbol_iterator *it)
+{
+       free(it);
+}
This page took 0.023972 seconds and 4 git commands to generate.