Commit c9741380 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by David S. Miller
Browse files

drivers: isdn: get rid of custom strtoul()



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.

Signed-off-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Cc: Hansjoerg Lipp <hjlipp@web.de>
Cc: Tilman Schmidt <tilman@imap.cc>
Cc: Karsten Keil <isdn@linux-pingi.de>
Cc: gigaset307x-common@lists.sourceforge.net
Cc: netdev@vger.kernel.org
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3944ad68
Loading
Loading
Loading
Loading
+20 −60
Original line number Diff line number Diff line
@@ -385,64 +385,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 */
@@ -612,21 +566,27 @@ 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 type, value;

				i = strict_strtoul(argv[curarg++], 16, &type);
				j = strict_strtoul(argv[curarg++], 16, &value);

				if (i == 0 && type < 256 &&
				    j == 0 && value < 256)
					event->parameter = (type << 8) | value;
			} else
				curarg = params - 1;
			break;
		case RT_NUMBER:
			if (curarg < params) {
				event->parameter = isdn_getnum(argv[curarg]);
				++curarg;
			} else
			event->parameter = -1;
			if (curarg < params) {
				unsigned long res;
				int rc;

				rc = strict_strtoul(argv[curarg++], 10, &res);
				if (rc == 0)
					event->parameter = res;
			}
			gig_dbg(DEBUG_EVENT, "parameter==%d", event->parameter);
			break;
		}