Re: [PATCHv3] drivers: isdn: get rid of custom strtoul()

From: Tilman Schmidt
Date: Sat Mar 06 2010 - 18:56:38 EST


Am 26.02.2010 08:26 schrieb Andy Shevchenko:
> There were two methods isdn_gethex() and isdn_getnum() which are custom
> implementations of strtoul(). Get rid of them in regard to
> strict_strtoul() kernel's function.
>
> The patch should be applied on top of "[PATCH 3/4] gigaset: reduce syslog
> clutter" [1]
>
> [1] http://patchwork.kernel.org/patch/81327/
>
> Signed-off-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
> Cc: Hansjoerg Lipp <hjlipp@xxxxxx>
> Cc: Tilman Schmidt <tilman@xxxxxxx>

Acked-by: Tilman Schmidt <tilman@xxxxxxx>

Thanks,
Tilman

> ---
> drivers/isdn/gigaset/ev-layer.c | 82 +++++++++-----------------------------
> 1 files changed, 20 insertions(+), 62 deletions(-)
>
> diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c
> index c8f89b7..b1a334b 100644
> --- a/drivers/isdn/gigaset/ev-layer.c
> +++ b/drivers/isdn/gigaset/ev-layer.c
> @@ -420,64 +420,18 @@ static const struct zsau_resp_t {
> {NULL, ZSAU_UNKNOWN}
> };
>
> -/*
> - * Get integer from char-pointer
> - */
> -static int isdn_getnum(char *p)
> -{
> - int v = -1;
> -
> - gig_dbg(DEBUG_EVENT, "string: %s", p);
> -
> - while (*p >= '0' && *p <= '9')
> - v = ((v < 0) ? 0 : (v * 10)) + (int) ((*p++) - '0');
> - if (*p)
> - v = -1; /* invalid Character */
> - return v;
> -}
> -
> -/*
> - * Get integer from char-pointer
> - */
> -static int isdn_gethex(char *p)
> -{
> - int v = 0;
> - int c;
> -
> - gig_dbg(DEBUG_EVENT, "string: %s", p);
> -
> - if (!*p)
> - return -1;
> -
> - do {
> - if (v > (INT_MAX - 15) / 16)
> - return -1;
> - c = *p;
> - if (c >= '0' && c <= '9')
> - c -= '0';
> - else if (c >= 'a' && c <= 'f')
> - c -= 'a' - 10;
> - else if (c >= 'A' && c <= 'F')
> - c -= 'A' - 10;
> - else
> - return -1;
> - v = v * 16 + c;
> - } while (*++p);
> -
> - return v;
> -}
> -
> /* retrieve CID from parsed response
> * returns 0 if no CID, -1 if invalid CID, or CID value 1..65535
> */
> static int cid_of_response(char *s)
> {
> - int cid;
> + unsigned long cid;
> + int rc;
>
> if (s[-1] != ';')
> return 0; /* no CID separator */
> - cid = isdn_getnum(s);
> - if (cid < 0)
> + rc = strict_strtoul(s, 10, &cid);
> + if (rc)
> return 0; /* CID not numeric */
> if (cid < 1 || cid > 65535)
> return -1; /* CID out of range */
> @@ -647,24 +601,28 @@ void gigaset_handle_modem_response(struct cardstate *cs)
> case RT_ZCAU:
> event->parameter = -1;
> if (curarg + 1 < params) {
> - i = isdn_gethex(argv[curarg]);
> - j = isdn_gethex(argv[curarg + 1]);
> - if (i >= 0 && i < 256 && j >= 0 && j < 256)
> - event->parameter = (unsigned) i << 8
> - | j;
> - curarg += 2;
> + unsigned long hi, lo;
> + int rh, rl;
> +
> + rh = strict_strtoul(argv[curarg++], 16, &hi);
> + rl = strict_strtoul(argv[curarg++], 16, &lo);
> +
> + if (rh == 0 && hi < 256 && rl == 0 && lo < 256)
> + event->parameter = (hi << 8) | lo;
> } else
> curarg = params - 1;
> break;
> case RT_NUMBER:
> case RT_HEX:
> if (curarg < params) {
> - if (param_type == RT_HEX)
> - event->parameter =
> - isdn_gethex(argv[curarg]);
> - else
> - event->parameter =
> - isdn_getnum(argv[curarg]);
> + int base = (param_type == RT_HEX) ? 16 : 10;
> + unsigned long res;
> + int rc;
> +
> + rc = strict_strtoul(argv[curarg], base, &res);
> + if (rc == 0)
> + event->parameter = res;
> +
> ++curarg;
> } else
> event->parameter = -1;

--
Tilman Schmidt E-Mail: tilman@xxxxxxx
Bonn, Germany
Diese Nachricht besteht zu 100% aus wiederverwerteten Bits.
Ungeöffnet mindestens haltbar bis: (siehe Rückseite)

Attachment: signature.asc
Description: OpenPGP digital signature