]> sigrok.org Git - libsigrok.git/blobdiff - src/input/input.c
input: Convert chronovu-la8 module.
[libsigrok.git] / src / input / input.c
index 16185aaab39c916c0941bd4ed96e8a82cfb4855b..965013c105a1f95d64e8948839624a8434d2e00d 100644 (file)
@@ -67,9 +67,9 @@ extern SR_PRIV struct sr_input_module input_wav;
 
 static const struct sr_input_module *input_module_list[] = {
        &input_vcd,
-//     &input_chronovu_la8,
+       &input_chronovu_la8,
        &input_wav,
-//     &input_csv,
+       &input_csv,
        /* This one has to be last, because it will take any input. */
 //     &input_binary,
        NULL,
@@ -312,6 +312,12 @@ static gboolean check_required_metadata(const uint8_t *metadata, uint8_t *avail)
  * If an input module is found, an instance is created and returned.
  * Otherwise, NULL is returned.
  *
+ * If an instance is created, it has the given buffer used for scanning
+ * already submitted to it, to be processed before more data is sent.
+ * This allows a frontend to submit an initial chunk of a non-seekable
+ * stream, such as stdin, without having to keep it around and submit
+ * it again later.
+ *
  */
 SR_API const struct sr_input *sr_input_scan_buffer(GString *buf)
 {
@@ -376,7 +382,7 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
        struct sr_input *in;
        const struct sr_input_module *imod;
        GHashTable *meta;
-       GString *buf;
+       GString *header_buf;
        struct stat st;
        unsigned int midx, m, i;
        int fd;
@@ -405,8 +411,10 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
        /* TODO: MIME type */
 
        in = NULL;
-       buf = NULL;
+       header_buf = g_string_sized_new(128);
        for (i = 0; input_module_list[i]; i++) {
+               g_string_truncate(header_buf, 0);
+
                imod = input_module_list[i];
                if (!imod->metadata[0]) {
                        /* Module has no metadata for matching so will take
@@ -420,28 +428,30 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
                meta = g_hash_table_new(NULL, NULL);
                for (m = 0; m < sizeof(imod->metadata); m++) {
                        mitem = imod->metadata[m] & ~SR_INPUT_META_REQUIRED;
+                       if (!mitem)
+                               /* Metadata list is 0-terminated. */
+                               break;
                        if (mitem == SR_INPUT_META_FILENAME)
                                g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
                                                (gpointer)filename);
-                       else if (mitem == SR_INPUT_META_FILESIZE)
+                       else if (mitem == SR_INPUT_META_FILESIZE) {
+                               sr_dbg("inserting fs %d", st.st_size);
                                g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
                                                GINT_TO_POINTER(st.st_size));
-                       else if (mitem == SR_INPUT_META_HEADER) {
-                               buf = g_string_sized_new(128);
+                       } else if (mitem == SR_INPUT_META_HEADER) {
                                if ((fd = open(filename, O_RDONLY)) < 0) {
                                        sr_err("%s", strerror(errno));
                                        return NULL;
                                }
-                               size = read(fd, buf->str, 128);
-                               buf->len = size;
+                               size = read(fd, header_buf->str, 128);
+                               header_buf->len = size;
                                close(fd);
                                if (size <= 0) {
-                                       g_string_free(buf, TRUE);
+                                       g_string_free(header_buf, TRUE);
                                        sr_err("%s", strerror(errno));
                                        return NULL;
                                }
-                               g_hash_table_insert(meta, GINT_TO_POINTER(mitem), buf);
-                               g_string_free(buf, TRUE);
+                               g_hash_table_insert(meta, GINT_TO_POINTER(mitem), header_buf);
                        }
                }
                if (g_hash_table_size(meta) == 0) {
@@ -456,11 +466,9 @@ SR_API const struct sr_input *sr_input_scan_file(const char *filename)
 
                /* Found a matching module. */
                in = sr_input_new(imod, NULL);
-               g_string_insert_len(in->buf, 0, buf->str, buf->len);
                break;
        }
-       if (!in && buf)
-               g_string_free(buf, TRUE);
+       g_string_free(header_buf, TRUE);
 
        return in;
 }