]> sigrok.org Git - libsigrok.git/commitdiff
Factor out common sigrok_samplerate_string().
authorUwe Hermann <redacted>
Wed, 7 Apr 2010 17:43:41 +0000 (19:43 +0200)
committerUwe Hermann <redacted>
Wed, 7 Apr 2010 18:13:57 +0000 (20:13 +0200)
Makefile.am
output/common.c [new file with mode: 0644]
output/output_gnuplot.c
output/output_skeleton.c
output/output_text.c
output/output_vcd.c
sigrok.h

index e0d0a4afc1a285c21c480a6dbce1c8712364a6f1..62c2e2593af864a5ec7eac45d25ee07430d3147d 100644 (file)
@@ -41,6 +41,7 @@ libsigrok_la_SOURCES = \
        output/output_text.c \
        output/output_vcd.c \
        output/output_gnuplot.c \
+       output/common.c \
        output/output.c
 
 libsigrok_la_LIBADD = $(LIBOBJS)
diff --git a/output/common.c b/output/common.c
new file mode 100644 (file)
index 0000000..adb70e1
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the sigrok project.
+ *
+ * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sigrok.h>
+
+/**
+ * Convert a numeric samplerate value to its "natural" string representation.
+ *
+ * E.g. a value of 3000000 would be converted to "3 MHz", 20000 to "20 KHz".
+ *
+ * @param samplerate The samplerate in Hz.
+ * @return A malloc()ed string representation of the samplerate value,
+ *         or NULL upon errors. The caller is responsible to free() the memory.
+ */
+char *sigrok_samplerate_string(uint64_t samplerate)
+{
+       char *o;
+       int r;
+
+       o = malloc(30 + 1); /* Enough for a uint64_t as string + " GHz". */
+       if (o == NULL)
+               return NULL;
+
+       if (samplerate >= GHZ(1))
+               r = snprintf(o, 30, "%"PRIu64" GHz", samplerate / 1000000000);
+       else if (samplerate >= MHZ(1))
+               r = snprintf(o, 30, "%"PRIu64" MHz", samplerate / 1000000);
+       else if (samplerate >= KHZ(1))
+               r = snprintf(o, 30, "%"PRIu64" KHz", samplerate / 1000);
+       else
+               r = snprintf(o, 30, "%"PRIu64" Hz", samplerate);
+
+       if (r < 0) {
+               /* Something went wrong... */
+               free(o);
+               return NULL;
+       }
+
+       return o;
+}
index 25306d8d865149ac5972bb69e4699d384d7de3ad..e79bd9f566de00e285b3cb185dff5939e99bfc68 100644 (file)
@@ -49,8 +49,8 @@ static int init(struct output *o)
        GSList *l;
        uint64_t samplerate;
        int i, b, num_probes;
-       char *c;
-       char sbuf[10], wbuf[1000];
+       char *c, *samplerate_s;
+       char wbuf[1000];
 
        ctx = malloc(sizeof(struct context));
        if (ctx == NULL)
@@ -75,16 +75,9 @@ static int init(struct output *o)
        /* TODO: Handle num_probes == 0, too many probes, etc. */
        samplerate = *((uint64_t *) o->device->plugin->get_device_info(
                        o->device->plugin_index, DI_CUR_SAMPLERATE));
-
-       /* Samplerate string */
-       if (samplerate >= GHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" GHz", samplerate / 1000000000);
-       else if (samplerate >= MHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" MHz", samplerate / 1000000);
-       else if (samplerate >= KHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" KHz", samplerate / 1000);
-       else
-               snprintf(sbuf, 10, "%"PRIu64" Hz", samplerate);
+  
+       if ((samplerate_s = sigrok_samplerate_string(samplerate)) == NULL)
+               return -1; // FIXME
 
        /* Columns / channels */
        wbuf[0] = '\0';
@@ -97,7 +90,9 @@ static int init(struct output *o)
        /* TODO: Timescale */
        b = snprintf(ctx->header, MAX_HEADER_LEN, gnuplot_header,
                     PACKAGE_STRING, "TODO", ctx->num_enabled_probes,
-                    num_probes, (char *)&sbuf, 1, "ns", (char *)&wbuf);
+                    num_probes, samplerate_s, 1, "ns", (char *)&wbuf);
+
+       free(samplerate_s);
 
        /* TODO: Handle snprintf errors. */
 
index 24cada4a1f77c1dbe7d285b8cd03c95d237b9686..4a3f280ecfb772949016c9bd928c6aafa4e6fd8f 100644 (file)
  */
 
 #include <stdint.h>
-
 #include "sigrok.h"
 
-
-
 static int init(struct output *o)
 {
        return 0;
index 914e51fc97977086d6a799e4df4170b62dde7a43..ae7a75a914b23720afcbe3a787e981b2c7c4c315 100644 (file)
@@ -21,7 +21,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <glib.h>
-#include "sigrok.h"
+#include <sigrok.h>
 
 #define DEFAULT_BPL_BIN 64
 #define DEFAULT_BPL_HEX 256
@@ -73,6 +73,7 @@ static int init(struct output *o, int default_spl)
        GSList *l;
        uint64_t samplerate;
        int num_probes;
+       char *samplerate_s;
 
        ctx = malloc(sizeof(struct context));
        o->internal = ctx;
@@ -95,15 +96,11 @@ static int init(struct output *o, int default_spl)
        num_probes = g_slist_length(o->device->probes);
        samplerate = *((uint64_t *) o->device->plugin->get_device_info(o->device->plugin_index, DI_CUR_SAMPLERATE));
        snprintf(ctx->header, 512, "Acquisition with %d/%d probes at ", ctx->num_enabled_probes, num_probes);
-       if(samplerate >= GHZ(1))
-               snprintf(ctx->header + strlen(ctx->header), 512, "%"PRIu64" GHz", samplerate / 1000000000);
-       else if(samplerate >= MHZ(1))
-               snprintf(ctx->header + strlen(ctx->header), 512, "%"PRIu64" MHz", samplerate / 1000000);
-       else if(samplerate >= KHZ(1))
-               snprintf(ctx->header + strlen(ctx->header), 512, "%"PRIu64" KHz", samplerate / 1000);
-       else
-               snprintf(ctx->header + strlen(ctx->header), 512, "%"PRIu64" Hz", samplerate);
-       snprintf(ctx->header + strlen(ctx->header), 512, "\n");
+
+       if ((samplerate_s = sigrok_samplerate_string(samplerate)) == NULL)
+               return -1; // FIXME
+       snprintf(ctx->header + strlen(ctx->header), 512, "%s\n", samplerate_s);
+       free(samplerate_s);
 
        ctx->linebuf_len = ctx->samples_per_line * 2;
        ctx->linebuf = calloc(1, num_probes * ctx->linebuf_len);
index 0122b61541a1c8410cbdf62f39832b1721eaf3e4..767e398dc5bfec7abe078b187417cebe99173108 100644 (file)
@@ -53,8 +53,8 @@ static int init(struct output *o)
        GSList *l;
        uint64_t samplerate;
        int i, b, num_probes;
-       char *c;
-       char sbuf[10], wbuf[1000];
+       char *c, *samplerate_s;
+       char wbuf[1000];
 
        ctx = malloc(sizeof(struct context));
        if (ctx == NULL)
@@ -80,15 +80,8 @@ static int init(struct output *o)
        samplerate = *((uint64_t *) o->device->plugin->get_device_info(
                        o->device->plugin_index, DI_CUR_SAMPLERATE));
 
-       /* Samplerate string */
-       if (samplerate >= GHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" GHz", samplerate / 1000000000);
-       else if (samplerate >= MHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" MHz", samplerate / 1000000);
-       else if (samplerate >= KHZ(1))
-               snprintf(sbuf, 10, "%"PRIu64" KHz", samplerate / 1000);
-       else
-               snprintf(sbuf, 10, "%"PRIu64" Hz", samplerate);
+       if ((samplerate_s = sigrok_samplerate_string(samplerate)) == NULL)
+               return -1; // FIXME
 
        /* Wires / channels */
        wbuf[0] = '\0';
@@ -101,9 +94,11 @@ static int init(struct output *o)
        /* TODO: date: File or signals? Make y/n configurable. */
        b = snprintf(ctx->header, MAX_HEADER_LEN, vcd_header, "TODO: Date",
                     PACKAGE_STRING, ctx->num_enabled_probes, num_probes,
-                    (char *)&sbuf, 1, "ns", PACKAGE, (char *)&wbuf);
+                    samplerate_s, 1, "ns", PACKAGE, (char *)&wbuf);
        /* TODO: Handle snprintf errors. */
 
+       free(samplerate_s);
+
        ctx->prevbits = calloc(sizeof(int), num_probes);
        if (ctx->prevbits == NULL)
                return SIGROK_ERR_MALLOC;
index 50fd0716ba17229988db7ebcba047e78a9a4d452..89109afd4d1254a20fdfd079f4c472d1ca2e6852 100644 (file)
--- a/sigrok.h
+++ b/sigrok.h
@@ -127,6 +127,8 @@ int filter_probes(int in_unitsize, int out_unitsize, int *probelist,
                  char *data_in, uint64_t length_in, char **data_out,
                  uint64_t *length_out);
 
+char *sigrok_samplerate_string(uint64_t samplerate);
+
 /*--- analyzer.c ------------------------------------------------------------*/
 
 struct analyzer {