[openfirmware] [commit] r2856 - clients/lib
repository service
svn at openfirmware.info
Fri Feb 10 22:31:25 CET 2012
Author: wmb
Date: Fri Feb 10 22:31:25 2012
New Revision: 2856
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2856
Log:
Client library - added strstr and strcasestr, and improved the implementation of some existing functions to generate better code.
Modified:
clients/lib/strings.c
Modified: clients/lib/strings.c
==============================================================================
--- clients/lib/strings.c Wed Feb 8 20:23:15 2012 (r2855)
+++ clients/lib/strings.c Fri Feb 10 22:31:25 2012 (r2856)
@@ -4,28 +4,78 @@
#include "1275.h"
+#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z')
+#define TOLOWER(c) ((c) + 'a' - 'A')
+
int
strcmp(const char *s, const char *t)
{
+ int diff = 0;
int i;
- for (i = 0; s[i] == t[i]; ++i)
- if (s[i] == '\0')
- return (0);
- return((int) (s[i] - t[i]));
+ for (i = 0; 1; ++i) {
+ diff = s[i] - t[i];
+ if (diff || s[i] == '\0')
+ break;
+ }
+ return(diff);
}
int
strncmp(const char *s, const char *t, int len)
{
+ int diff = 0;
+ int i;
+
+ for (i = 0; i != len; ++i) {
+ diff = s[i] - t[i];
+ if (diff || s[i] == '\0')
+ break;
+ }
+
+ return(diff);
+}
+
+int
+strcasecmp(const char *s, const char *t)
+{
+ char sc, tc;
+ int diff = 0;
+ int i;
+
+ for (i = 0; 1; i++) {
+ sc = s[i];
+ tc = t[i];
+ if (ISUPPER(sc))
+ sc = TOLOWER(sc);
+ if (ISUPPER(tc))
+ tc = TOLOWER(tc);
+ diff = sc - tc;
+ if (diff || sc == '\0')
+ break;
+ }
+ return diff;
+}
+
+int
+strncasecmp(const char *s, const char *t, int len)
+{
+ char sc, tc;
+ int diff = 0;
int i;
- for (i = 0; (s[i] == t[i]) && (i != len); ++i)
- if (s[i] == '\0')
- return (0);
- if (i == len)
- return(0);
- return((int) (s[i] - t[i]));
+ for (i=0; i < len; i++) {
+ sc = s[i];
+ if (ISUPPER(sc))
+ sc = TOLOWER(sc);
+ tc = t[i];
+ if (ISUPPER(tc))
+ tc = TOLOWER(tc);
+ diff = sc - tc;
+ if (diff || sc == '\0')
+ break;
+ }
+ return diff;
}
int
@@ -35,7 +85,7 @@
for (i = 0; s[i] != '\0'; ++i)
;
- return((int) i);
+ return i;
}
int
@@ -45,7 +95,7 @@
for (i = 0; i < maxlen && s[i] != '\0'; ++i)
;
- return((int) i);
+ return i;
}
char *
@@ -55,7 +105,7 @@
while (to[i] = from[i])
i += 1;
- return(to);
+ return to;
}
char *
@@ -68,7 +118,7 @@
i += 1;
maxlen--;
}
- return(to);
+ return to;
}
char *
@@ -79,7 +129,7 @@
while (*to)
to += 1;
strcpy(to, from);
- return (ret);
+ return ret;
}
char *
@@ -87,10 +137,10 @@
{
while (*s) {
if (*s == c)
- return (s);
+ return s;
++s;
}
- return ((char *) 0);
+ return (char *) 0;
}
char *
@@ -111,7 +161,33 @@
}
temp = saved_str;
saved_str = s;
- return(temp);
+ return temp;
+}
+
+char *
+strstr(const char *haystack, const char *needle)
+{
+ int len = strlen(needle);
+ char *s;
+
+ for (s = (char *)haystack; *s; s++)
+ if (strncmp(s, needle, len) == 0)
+ return s;
+
+ return NULL;
+}
+
+char *
+strcasestr(const char *haystack, const char *needle)
+{
+ int len = strlen(needle);
+ char *s;
+
+ for (s = (char *)haystack; *s; s++)
+ if (strncasecmp(s, needle, len) == 0)
+ return s;
+
+ return NULL;
}
const void *memchr(const void *s, int c, int len)
More information about the openfirmware
mailing list