X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Finput.c;h=3db29ffefdee1669795a5ebd854be4ca6eb36d74;hb=6f63b1ee67ef9a8d9511aec9bac5f9d84c21356d;hp=fa5a6f7c4f709e72dd6ab52697d35d54a019f148;hpb=5e364d4fe0b6367717d7dcf3389685b8fe985211;p=libsigrok.git diff --git a/src/input/input.c b/src/input/input.c index fa5a6f7c..3db29ffe 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -19,10 +19,6 @@ #include #include -#include -#include -#include -#include #include #include #include @@ -66,16 +62,20 @@ extern SR_PRIV struct sr_input_module input_chronovu_la8; extern SR_PRIV struct sr_input_module input_csv; extern SR_PRIV struct sr_input_module input_binary; +extern SR_PRIV struct sr_input_module input_trace32_ad; extern SR_PRIV struct sr_input_module input_vcd; extern SR_PRIV struct sr_input_module input_wav; +extern SR_PRIV struct sr_input_module input_raw_analog; /* @endcond */ static const struct sr_input_module *input_module_list[] = { &input_binary, &input_chronovu_la8, &input_csv, + &input_trace32_ad, &input_vcd, &input_wav, + &input_raw_analog, NULL, }; @@ -246,7 +246,7 @@ SR_API struct sr_input *sr_input_new(const struct sr_input_module *imod, GHashTable *options) { struct sr_input *in; - struct sr_option *mod_opts; + const struct sr_option *mod_opts; const GVariantType *gvt; GHashTable *new_opts; GHashTableIter iter; @@ -416,11 +416,11 @@ SR_API int sr_input_scan_buffer(GString *buf, const struct sr_input **in) */ SR_API int sr_input_scan_file(const char *filename, const struct sr_input **in) { + int64_t filesize; FILE *stream; const struct sr_input_module *imod; GHashTable *meta; GString *header; - struct stat st; size_t count; unsigned int midx, i; int ret; @@ -432,22 +432,18 @@ SR_API int sr_input_scan_file(const char *filename, const struct sr_input **in) sr_err("Invalid filename."); return SR_ERR_ARG; } - - if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { - sr_err("No such file."); - return SR_ERR_ARG; - } - - if (stat(filename, &st) < 0) { - sr_err("%s", g_strerror(errno)); - return SR_ERR_ARG; - } - stream = g_fopen(filename, "rb"); if (!stream) { sr_err("Failed to open %s: %s", filename, g_strerror(errno)); return SR_ERR; } + filesize = sr_file_get_size(stream); + if (filesize < 0) { + sr_err("Failed to get size of %s: %s", + filename, g_strerror(errno)); + fclose(stream); + return SR_ERR; + } /* This actually allocates 256 bytes to allow for NUL termination. */ header = g_string_sized_new(255); count = fread(header->str, 1, header->allocated_len - 1, stream); @@ -465,7 +461,7 @@ SR_API int sr_input_scan_file(const char *filename, const struct sr_input **in) g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_FILENAME), (char *)filename); g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_FILESIZE), - GSIZE_TO_POINTER(st.st_size)); + GSIZE_TO_POINTER(MIN(filesize, G_MAXSSIZE))); g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_HEADER), header); midx = 0; @@ -563,6 +559,27 @@ SR_API int sr_input_end(const struct sr_input *in) return in->module->end((struct sr_input *)in); } +/** + * Reset the input module's input handling structures. + * + * Causes the input module to reset its internal state so that we can re-send + * the input data from the beginning without having to re-create the entire + * input module. + * + * @since 0.5.0 + */ +SR_API int sr_input_reset(const struct sr_input *in) +{ + if (!in->module->reset) { + sr_spew("Tried to reset %s module but no reset handler found.", + in->module->id); + return SR_OK; + } + + sr_spew("Resetting %s module.", in->module->id); + return in->module->reset((struct sr_input *)in); +} + /** * Free the specified input instance and all associated resources. * @@ -575,8 +592,7 @@ SR_API void sr_input_free(const struct sr_input *in) if (in->module->cleanup) in->module->cleanup((struct sr_input *)in); - if (in->sdi) - sr_dev_inst_free(in->sdi); + sr_dev_inst_free(in->sdi); if (in->buf->len > 64) { /* That seems more than just some sub-unitsize leftover... */ sr_warn("Found %" G_GSIZE_FORMAT