]> sigrok.org Git - libsigrok.git/blobdiff - src/output/output.c
output: Add srzip, the session file format.
[libsigrok.git] / src / output / output.c
index 0dd1fe27f7e1cf6bf19f5674cae2546526a82906..1ddbd61ef683fb6d21f111d3393d78f6f1802324 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the libsigrok project.
  *
- * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
+ * Copyright (C) 2014 Bert Vermeulen <bert@biot.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,6 +60,7 @@ extern SR_PRIV struct sr_output_module output_gnuplot;
 extern SR_PRIV struct sr_output_module output_chronovu_la8;
 extern SR_PRIV struct sr_output_module output_csv;
 extern SR_PRIV struct sr_output_module output_analog;
+extern SR_PRIV struct sr_output_module output_srzip;
 extern SR_PRIV struct sr_output_module output_wav;
 /* @endcond */
 
@@ -74,6 +75,7 @@ static const struct sr_output_module *output_module_list[] = {
        &output_vcd,
        &output_chronovu_la8,
        &output_analog,
+       &output_srzip,
        &output_wav,
        NULL,
 };
@@ -170,9 +172,9 @@ SR_API const struct sr_option **sr_output_options_get(const struct sr_output_mod
 
        mod_opts = o->options();
 
-       for (size = 1; mod_opts[size].id; size++)
+       for (size = 0; mod_opts[size].id; size++)
                ;
-       opts = g_malloc(size * sizeof(struct sr_option *));
+       opts = g_malloc((size + 1) * sizeof(struct sr_option *));
 
        for (i = 0; i < size; i++)
                opts[i] = &mod_opts[i];
@@ -187,25 +189,25 @@ SR_API const struct sr_option **sr_output_options_get(const struct sr_output_mod
  *
  * @since 0.4.0
  */
-SR_API void sr_output_options_free(const struct sr_option **opts)
+SR_API void sr_output_options_free(const struct sr_option **options)
 {
-       struct sr_option *opt;
+       int i;
 
-       if (!opts)
+       if (!options)
                return;
 
-       for (opt = (struct sr_option *)opts[0]; opt; opt++) {
-               if (opt->def) {
-                       g_variant_unref(opt->def);
-                       opt->def = NULL;
+       for (i = 0; options[i]; i++) {
+               if (options[i]->def) {
+                       g_variant_unref(options[i]->def);
+                       ((struct sr_option *)options[i])->def = NULL;
                }
 
-               if (opt->values) {
-                       g_slist_free_full(opt->values, (GDestroyNotify)g_variant_unref);
-                       opt->values = NULL;
+               if (options[i]->values) {
+                       g_slist_free_full(options[i]->values, (GDestroyNotify)g_variant_unref);
+                       ((struct sr_option *)options[i])->values = NULL;
                }
        }
-       g_free(opts);
+       g_free(options);
 }
 
 /**
@@ -225,7 +227,7 @@ SR_API const struct sr_output *sr_output_new(const struct sr_output_module *o,
                GHashTable *options, const struct sr_dev_inst *sdi)
 {
        struct sr_output *op;
-       struct sr_option *mod_opts;
+       const struct sr_option *mod_opts;
        const GVariantType *gvt;
        GHashTable *new_opts;
        GHashTableIter iter;
@@ -274,7 +276,6 @@ SR_API const struct sr_output *sr_output_new(const struct sr_output_module *o,
        }
 
        if (op->module->init && op->module->init(op, new_opts) != SR_OK) {
-               g_hash_table_destroy(new_opts);
                g_free(op);
                op = NULL;
        }