[openfirmware] [commit] r1767 - clients/lib

repository service svn at openfirmware.info
Wed Mar 10 10:28:16 CET 2010


Author: wmb
Date: Wed Mar 10 10:28:16 2010
New Revision: 1767
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1767

Log:
Added some new string parsing routines to the client library.

Modified:
   clients/lib/printf.c
   clients/lib/strings.c

Modified: clients/lib/printf.c
==============================================================================
--- clients/lib/printf.c	Wed Mar 10 10:27:21 2010	(r1766)
+++ clients/lib/printf.c	Wed Mar 10 10:28:16 2010	(r1767)
@@ -7,37 +7,65 @@
 #include <stdarg.h>
 #include "stdio.h"
 
-int
-atoi(const char *s)
+long
+memtol(const char *s, int len, char **endptr, int base)
 {
-	int temp = 0, base = 10;
+	int temp = 0;
+	int minus = 0;
+	int digit;
+	const char *send = s+len;
 
-	if (*s == '0') {
-		++s;
-		if (*s == 'x') {
+	if (s != send && *s == '+' || *s == '-') {
+		minus = *s == '-';
+		s++;
+	}
+	if (base == 0) {
+		if (s!=send && *s == '0') {
 			++s;
-			base = 16;
+			if (s!=send && toupper(*s) == 'X') {
+				++s;
+				base = 16;
+			} else {
+				base = 8;
+			}
 		} else {
-			base = 8;
+			base = 10;    
+		}
+        } else {
+		if (base == 16 && (send-s) > 1 && *s == '0' && toupper(s[1]) == 'X') {
+			s += 2;
 		}
 	}
-	while (*s) {
-		switch (*s) {
-		case '0': case '1': case '2': case '3': case '4':
-		case '5': case '6': case '7': case '8': case '9':
-			temp = (temp * base) + (*s++ - '0');
-			break;
-		case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-			temp = (temp * base) + (*s++ - 'a' + 10);
-			break;
-		case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-			temp = (temp * base) + (*s++ - 'A' + 10);
-			break;
-		default:
-			return (temp);
+	while (s!=send) {
+		digit = toupper(*s) - '0';
+		if (digit >= 0 && digit <= 9) {
+			temp = (temp * base) + digit;
+			s++;
+		} else {
+			digit = digit + '0' - 'A' + 10;
+			if (digit >= 10 && digit < base) {
+				temp = (temp * base) + digit;
+				s++;
+			} else {
+				break;
+			}
 		}
 	}
-	return (temp);
+	if (endptr)
+		*endptr = (char *)s;
+	return minus ? -temp : temp;
+}
+
+long
+strtol(const char *s, char **endptr, int base)
+{
+	return memtol(s, strlen(s), endptr, base);
+}
+
+int
+atoi(const char *s)
+{
+	return (int)strtol(s, NULL, 10);
 }
 
 STATIC int

Modified: clients/lib/strings.c
==============================================================================
--- clients/lib/strings.c	Wed Mar 10 10:27:21 2010	(r1766)
+++ clients/lib/strings.c	Wed Mar 10 10:28:16 2010	(r1767)
@@ -114,6 +114,23 @@
 	return(temp);
 }
 
+void *memchr(const void *s, int c, int len)
+{
+	unsigned char *p = s;
+	while (len--) {
+		if (*p == (unsigned char)c)
+			return p;
+		p++;
+	}
+	return NULL;
+}
+
+int toupper(int c)
+{
+	return (c >= 'a' && c <= 'z') ? (c - 'a' + 'A') : c;
+}
+
+
 // LICENSE_BEGIN
 // Copyright (c) 2006 FirmWorks
 // 



More information about the openfirmware mailing list