From: Bert Vermeulen Date: Wed, 16 May 2012 23:54:57 +0000 (+0200) Subject: sr: add voltage parser and prettyprinter X-Git-Tag: dsupstream~941 X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=79afc8cac4912f5e1025c608a10b05506a191be9;p=libsigrok.git sr: add voltage parser and prettyprinter --- diff --git a/sigrok-proto.h b/sigrok-proto.h index d5a9adb9..ed6dd8d8 100644 --- a/sigrok-proto.h +++ b/sigrok-proto.h @@ -114,12 +114,14 @@ SR_API struct sr_output_format **sr_output_list(void); SR_API char *sr_samplerate_string(uint64_t samplerate); SR_API char *sr_period_string(uint64_t frequency); +SR_API char *sr_voltage_string(struct sr_rational *voltage); SR_API char **sr_parse_triggerstring(struct sr_dev *dev, const char *triggerstring); SR_API int sr_parse_sizestring(const char *sizestring, uint64_t *size); SR_API uint64_t sr_parse_timestring(const char *timestring); SR_API gboolean sr_parse_boolstring(const char *boolstring); SR_API int sr_parse_period(const char *periodstr, struct sr_rational *r); +SR_API int sr_parse_voltage(const char *voltstr, struct sr_rational *r); /*--- version.c -------------------------------------------------------------*/ diff --git a/strutil.c b/strutil.c index ea69a2af..26296cea 100644 --- a/strutil.c +++ b/strutil.c @@ -110,6 +110,45 @@ SR_API char *sr_period_string(uint64_t frequency) return o; } +/** + * Convert a numeric frequency value to the "natural" string representation + * of its voltage value. + * + * E.g. a value of 300000 would be converted to "300mV", 2 to "2V". + * + * @param voltage The voltage represented as a rational number, with the + * denominator a divisor of 1V. + * + * @return A g_try_malloc()ed string representation of the voltage value, + * or NULL upon errors. The caller is responsible to g_free() the + * memory. + */ +SR_API char *sr_voltage_string(struct sr_rational *voltage) +{ + char *o; + int r; + + if (!(o = g_try_malloc0(30 + 1))) { + sr_err("strutil: %s: o malloc failed", __func__); + return NULL; + } + + if (voltage->q == 1000) + r = snprintf(o, 30, "%" PRIu64 "mV", voltage->p); + else if (voltage->q == 1) + r = snprintf(o, 30, "%" PRIu64 "V", voltage->p); + else + r = -1; + + if (r < 0) { + /* Something went wrong... */ + g_free(o); + return NULL; + } + + return o; +} + /** * Parse a trigger specification string. * @@ -344,3 +383,28 @@ SR_API int sr_parse_period(const char *periodstr, struct sr_rational *r) } +SR_API int sr_parse_voltage(const char *voltstr, struct sr_rational *r) +{ + char *s; + + r->p = strtoull(voltstr, &s, 10); + if (r->p == 0 && s == voltstr) + /* No digits found. */ + return SR_ERR_ARG; + + if (s && *s) { + while (*s == ' ') + s++; + if (!strcasecmp(s, "mv")) + r->q = 1000L; + else if (!strcasecmp(s, "v")) + r->q = 1; + else + /* Must have a base suffix. */ + return SR_ERR_ARG; + } + + return SR_OK; +} + +