summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/string.h119
-rw-r--r--src/lib/Makefile.inc9
-rw-r--r--src/lib/string.c109
3 files changed, 131 insertions, 106 deletions
diff --git a/src/include/string.h b/src/include/string.h
index c56a760a04..d164f32b83 100644
--- a/src/include/string.h
+++ b/src/include/string.h
@@ -25,33 +25,13 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
#endif
char *strdup(const char *s);
char *strconcat(const char *s1, const char *s2);
-
-// simple string functions
-
-static inline size_t strnlen(const char *src, size_t max)
-{
- size_t i = 0;
- while ((*src++) && (i < max))
- i++;
- return i;
-}
-
-static inline size_t strlen(const char *src)
-{
- size_t i = 0;
- while (*src++)
- i++;
- return i;
-}
-
-static inline char *strchr(const char *s, int c)
-{
- for (; *s; s++) {
- if (*s == c)
- return (char *) s;
- }
- return 0;
-}
+size_t strnlen(const char *src, size_t max);
+size_t strlen(const char *src);
+char *strchr(const char *s, int c);
+char *strncpy(char *to, const char *from, int count);
+char *strcpy(char *dst, const char *src);
+int strcmp(const char *s1, const char *s2);
+int strncmp(const char *s1, const char *s2, int maxlen);
/**
* Find a character in a string.
@@ -61,71 +41,14 @@ static inline char *strchr(const char *s, int c)
* @return A pointer to the last occurrence of the character in the
* string, or NULL if the character was not encountered within the string.
*/
-static inline char *strrchr(const char *s, int c)
-{
- char *p = (char *)s + strlen(s);
-
- for (; p >= s; p--) {
- if (*p == c)
- return p;
- }
-
- return NULL;
-}
-
-static inline char *strncpy(char *to, const char *from, int count)
-{
- register char *ret = to;
- register char data;
-
- while (count > 0) {
- count--;
- data = *from++;
- *to++ = data;
- if (data == '\0')
- break;
- }
-
- while (count > 0) {
- count--;
- *to++ = '\0';
- }
- return ret;
-}
-
-static inline char *strcpy(char *dst, const char *src)
-{
- char *ptr = dst;
-
- while (*src)
- *dst++ = *src++;
- *dst = '\0';
+char *strrchr(const char *s, int c);
- return ptr;
-}
-
-static inline int strcmp(const char *s1, const char *s2)
-{
- int r;
-
- while ((r = (*s1 - *s2)) == 0 && *s1) {
- s1++;
- s2++;
- }
- return r;
-}
-
-static inline int strncmp(const char *s1, const char *s2, int maxlen)
-{
- int i;
-
- for (i = 0; i < maxlen; i++) {
- if ((s1[i] != s2[i]) || (s1[i] == '\0'))
- return s1[i] - s2[i];
- }
-
- return 0;
-}
+/*
+ * Parses an unsigned integer and moves the input pointer forward to the first
+ * character that's not a valid digit. s and *s must not be NULL. Result
+ * undefined if it overruns the return type size.
+ */
+unsigned int skip_atoi(char **s);
static inline int isspace(int c)
{
@@ -179,18 +102,4 @@ static inline int tolower(int c)
return c;
}
-/*
- * Parses an unsigned integer and moves the input pointer forward to the first
- * character that's not a valid digit. s and *s must not be NULL. Result
- * undefined if it overruns the return type size.
- */
-static inline unsigned int skip_atoi(char **s)
-{
- unsigned int i = 0;
-
- while (isdigit(**s))
- i = i*10 + *((*s)++) - '0';
- return i;
-}
-
#endif /* STRING_H */
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 1350152a40..913675bac8 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -118,7 +118,6 @@ ramstage-y += bootmem.c
ramstage-y += fmap.c
ramstage-y += memchr.c
ramstage-y += memcmp.c
-ramstage-y += string.c
ramstage-y += malloc.c
smm-$(CONFIG_SMM_TSEG) += malloc.c
ramstage-y += dimm_info_util.c
@@ -244,6 +243,14 @@ postcar-y += reset.c
ramstage-y += reset.c
smm-y += reset.c
+decompressor-y += string.c
+bootblock-y += string.c
+verstage-y += string.c
+romstage-y += string.c
+postcar-y += string.c
+ramstage-y += string.c
+smm-y += string.c
+
postcar-y += bootmode.c
postcar-y += boot_device.c
postcar-y += cbfs.c
diff --git a/src/lib/string.c b/src/lib/string.c
index 2e71489ff6..a19f017852 100644
--- a/src/lib/string.c
+++ b/src/lib/string.c
@@ -1,9 +1,14 @@
+#include <assert.h>
+#include <rules.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
char *strdup(const char *s)
{
+ if (!ENV_RAMSTAGE)
+ dead_code(); /* This can't be used without malloc(). */
+
size_t sz = strlen(s) + 1;
char *d = malloc(sz);
if (d)
@@ -13,6 +18,9 @@ char *strdup(const char *s)
char *strconcat(const char *s1, const char *s2)
{
+ if (!ENV_RAMSTAGE)
+ dead_code(); /* This can't be used without malloc(). */
+
size_t sz_1 = strlen(s1);
size_t sz_2 = strlen(s2);
char *d = malloc(sz_1 + sz_2 + 1);
@@ -22,3 +30,104 @@ char *strconcat(const char *s1, const char *s2)
}
return d;
}
+
+size_t strnlen(const char *src, size_t max)
+{
+ size_t i = 0;
+ while ((*src++) && (i < max))
+ i++;
+ return i;
+}
+
+size_t strlen(const char *src)
+{
+ size_t i = 0;
+ while (*src++)
+ i++;
+ return i;
+}
+
+char *strchr(const char *s, int c)
+{
+ do {
+ if (*s == c)
+ return (char *)s;
+ } while (*s++);
+
+ return NULL;
+}
+
+char *strrchr(const char *s, int c)
+{
+ char *p = NULL;
+
+ do {
+ if (*s == c)
+ p = (char *)s;
+ } while (*s++);
+
+ return p;
+}
+
+char *strncpy(char *to, const char *from, int count)
+{
+ char *ret = to;
+ char data;
+
+ while (count > 0) {
+ count--;
+ data = *from++;
+ *to++ = data;
+ if (data == '\0')
+ break;
+ }
+
+ while (count > 0) {
+ count--;
+ *to++ = '\0';
+ }
+ return ret;
+}
+
+char *strcpy(char *dst, const char *src)
+{
+ char *ptr = dst;
+
+ while (*src)
+ *dst++ = *src++;
+ *dst = '\0';
+
+ return ptr;
+}
+
+int strcmp(const char *s1, const char *s2)
+{
+ int r;
+
+ while ((r = (*s1 - *s2)) == 0 && *s1) {
+ s1++;
+ s2++;
+ }
+ return r;
+}
+
+int strncmp(const char *s1, const char *s2, int maxlen)
+{
+ int i;
+
+ for (i = 0; i < maxlen; i++) {
+ if ((s1[i] != s2[i]) || (s1[i] == '\0'))
+ return s1[i] - s2[i];
+ }
+
+ return 0;
+}
+
+unsigned int skip_atoi(char **s)
+{
+ unsigned int i = 0;
+
+ while (isdigit(**s))
+ i = i*10 + *((*s)++) - '0';
+ return i;
+}