linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Lars-Peter Clausen <lars@metafoo.de>
Cc: Jonathan Cameron <jic23@cam.ac.uk>,
	linux-iio@vger.kernel.org, drivers@analog.com
Subject: Re: [PATCH 6/7] iio: Factor out fixed point number parsing into its own function
Date: Tue, 20 Nov 2012 21:14:34 +0000	[thread overview]
Message-ID: <50ABF2BA.5010902@kernel.org> (raw)
In-Reply-To: <1353418611-17614-6-git-send-email-lars@metafoo.de>

On 11/20/2012 01:36 PM, Lars-Peter Clausen wrote:
> Factor out the code for parsing fixed point numbers into its own function and
> make this function globally available. This allows us to reuse the code to parse
> fixed point numbers in individual IIO drivers.
> 
Sensible thing to do.
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
added to togreg branch of iio.git
> ---
>  drivers/iio/industrialio-core.c | 98 ++++++++++++++++++++++++++---------------
>  include/linux/iio/iio.h         |  3 ++
>  2 files changed, 66 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index 3dccd6c..8848f16 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -408,6 +408,64 @@ static ssize_t iio_read_channel_info(struct device *dev,
>  	}
>  }
>  
> +/**
> + * iio_str_to_fixpoint() - Parse a fixed-point number from a string
> + * @str: The string to parse
> + * @fract_mult: Multiplier for the first decimal place, should be a power of 10
> + * @integer: The integer part of the number
> + * @fract: The fractional part of the number
> + *
> + * Returns 0 on success, or a negative error code if the string could not be
> + * parsed.
> + */
> +int iio_str_to_fixpoint(const char *str, int fract_mult,
> +	int *integer, int *fract)
> +{
> +	int i = 0, f = 0;
> +	bool integer_part = true, negative = false;
> +
> +	if (str[0] == '-') {
> +		negative = true;
> +		str++;
> +	} else if (str[0] == '+') {
> +		str++;
> +	}
> +
> +	while (*str) {
> +		if ('0' <= *str && *str <= '9') {
> +			if (integer_part) {
> +				i = i * 10 + *str - '0';
> +			} else {
> +				f += fract_mult * (*str - '0');
> +				fract_mult /= 10;
> +			}
> +		} else if (*str == '\n') {
> +			if (*(str + 1) == '\0')
> +				break;
> +			else
> +				return -EINVAL;
> +		} else if (*str == '.' && integer_part) {
> +			integer_part = false;
> +		} else {
> +			return -EINVAL;
> +		}
> +		str++;
> +	}
> +
> +	if (negative) {
> +		if (i)
> +			i = -i;
> +		else
> +			f = -f;
> +	}
> +
> +	*integer = i;
> +	*fract = f;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(iio_str_to_fixpoint);
> +
>  static ssize_t iio_write_channel_info(struct device *dev,
>  				      struct device_attribute *attr,
>  				      const char *buf,
> @@ -415,8 +473,8 @@ static ssize_t iio_write_channel_info(struct device *dev,
>  {
>  	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
>  	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
> -	int ret, integer = 0, fract = 0, fract_mult = 100000;
> -	bool integer_part = true, negative = false;
> +	int ret, fract_mult = 100000;
> +	int integer, fract;
>  
>  	/* Assumes decimal - precision based on number of digits */
>  	if (!indio_dev->info->write_raw)
> @@ -435,39 +493,9 @@ static ssize_t iio_write_channel_info(struct device *dev,
>  			return -EINVAL;
>  		}
>  
> -	if (buf[0] == '-') {
> -		negative = true;
> -		buf++;
> -	} else if (buf[0] == '+') {
> -		buf++;
> -	}
> -
> -	while (*buf) {
> -		if ('0' <= *buf && *buf <= '9') {
> -			if (integer_part)
> -				integer = integer*10 + *buf - '0';
> -			else {
> -				fract += fract_mult*(*buf - '0');
> -				fract_mult /= 10;
> -			}
> -		} else if (*buf == '\n') {
> -			if (*(buf + 1) == '\0')
> -				break;
> -			else
> -				return -EINVAL;
> -		} else if (*buf == '.' && integer_part) {
> -			integer_part = false;
> -		} else {
> -			return -EINVAL;
> -		}
> -		buf++;
> -	}
> -	if (negative) {
> -		if (integer)
> -			integer = -integer;
> -		else
> -			fract = -fract;
> -	}
> +	ret = iio_str_to_fixpoint(buf, fract_mult, &integer, &fract);
> +	if (ret)
> +		return ret;
>  
>  	ret = indio_dev->info->write_raw(indio_dev, this_attr->c,
>  					 integer, fract, this_attr->address);
> diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
> index adca93a..da8c776 100644
> --- a/include/linux/iio/iio.h
> +++ b/include/linux/iio/iio.h
> @@ -620,6 +620,9 @@ static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev)
>  };
>  #endif
>  
> +int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
> +	int *fract);
> +
>  /**
>   * IIO_DEGREE_TO_RAD() - Convert degree to rad
>   * @deg: A value in degree
> 

  reply	other threads:[~2012-11-20 21:14 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-20 13:36 [PATCH 1/7] iio:imu:adis: Add debugfs register access support Lars-Peter Clausen
2012-11-20 13:36 ` [PATCH 2/7] iio:imu:adis: Add support for 32bit registers Lars-Peter Clausen
2012-11-20 20:55   ` Jonathan Cameron
2012-11-20 13:36 ` [PATCH 3/7] iio:gyro: Add support for the ADIS16136 gyroscope Lars-Peter Clausen
2012-11-20 21:05   ` Jonathan Cameron
2012-11-20 21:15     ` Lars-Peter Clausen
2012-11-20 21:26       ` Jonathan Cameron
2012-11-20 13:36 ` [PATCH 4/7] iio:imu:adis: Add paging support Lars-Peter Clausen
2012-11-20 21:10   ` Jonathan Cameron
2012-11-20 13:36 ` [PATCH 5/7] iio: Add pressure channel type Lars-Peter Clausen
2012-11-20 21:12   ` Jonathan Cameron
2012-11-20 13:36 ` [PATCH 6/7] iio: Factor out fixed point number parsing into its own function Lars-Peter Clausen
2012-11-20 21:14   ` Jonathan Cameron [this message]
2012-11-20 13:36 ` [PATCH 7/7] iio:imu: Add support for the ADIS16480 and similar IMUs Lars-Peter Clausen
2012-11-20 21:24   ` Jonathan Cameron
2012-11-20 19:51 ` [PATCH 1/7] iio:imu:adis: Add debugfs register access support Jonathan Cameron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50ABF2BA.5010902@kernel.org \
    --to=jic23@kernel.org \
    --cc=drivers@analog.com \
    --cc=jic23@cam.ac.uk \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).