Add string functions needed for libfdt, and add a make target. Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> --- v4: rewrite strchr w/out use of strlen, drop libfdt_env.h modifications --- Makefile | 21 +++++++++++++++++++-- lib/libcflat.h | 4 ++++ lib/string.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 32ae9a59db5b0..fba58e36f272f 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,13 @@ cflatobjs := \ lib/string.o \ lib/report.o +# libfdt paths +LIBFDT_objdir = lib/libfdt +LIBFDT_srcdir = lib/libfdt +LIBFDT_archive = $(LIBFDT_objdir)/libfdt.a +LIBFDT_include = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_INCLUDES)) +LIBFDT_version = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_VERSION)) + #include architecure specific make rules include config/config-$(ARCH).mak @@ -46,6 +53,11 @@ LDFLAGS += -pthread -lrt $(libcflat): $(cflatobjs) $(AR) rcs $@ $^ +include $(LIBFDT_srcdir)/Makefile.libfdt +$(LIBFDT_archive): CFLAGS += -ffreestanding -I lib -I lib/libfdt -Wno-sign-compare +$(LIBFDT_archive): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) + $(AR) rcs $@ $^ + %.o: %.S $(CC) $(CFLAGS) -c -nostdlib -o $@ $< @@ -58,10 +70,15 @@ install: clean: arch_clean $(RM) lib/.*.d $(libcflat) $(cflatobjs) -distclean: clean +libfdt_clean: + $(RM) $(LIBFDT_archive) \ + $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) \ + $(LIBFDT_objdir)/.*.d + +distclean: clean libfdt_clean $(RM) config.mak $(TEST_DIR)-run test.log msr.out cscope.* -cscope: common_dirs = lib +cscope: common_dirs = lib lib/libfdt cscope: $(RM) ./cscope.* find $(TEST_DIR) lib/$(TEST_DIR) $(common_dirs) -maxdepth 1 \ diff --git a/lib/libcflat.h b/lib/libcflat.h index 1bc7dfcac5663..76448a33cde5f 100644 --- a/lib/libcflat.h +++ b/lib/libcflat.h @@ -42,6 +42,7 @@ extern void exit(int code); extern unsigned long strlen(const char *buf); extern char *strcat(char *dest, const char *src); extern int strcmp(const char *a, const char *b); +extern char *strchr(const char *s, int c); extern int printf(const char *fmt, ...); extern int snprintf(char *buf, int size, const char *fmt, ...); @@ -51,6 +52,9 @@ extern void puts(const char *s); extern void *memset(void *s, int c, size_t n); extern void *memcpy(void *dest, const void *src, size_t n); +extern int memcmp(const void *s1, const void *s2, size_t n); +extern void *memmove(void *dest, const void *src, size_t n); +extern void *memchr(const void *s, int c, size_t n); extern long atol(const char *ptr); #define ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0])) diff --git a/lib/string.c b/lib/string.c index 3a9caf720bf2b..fe90c8b1289f2 100644 --- a/lib/string.c +++ b/lib/string.c @@ -31,6 +31,14 @@ int strcmp(const char *a, const char *b) return *a - *b; } +char *strchr(const char *s, int c) +{ + while (*s != (char)c) + if (*s++ == '\0') + return NULL; + return (char *)s; +} + void *memset(void *s, int c, size_t n) { size_t i; @@ -54,6 +62,46 @@ void *memcpy(void *dest, const void *src, size_t n) return dest; } +int memcmp(const void *s1, const void *s2, size_t n) +{ + const unsigned char *a = s1, *b = s2; + int ret = 0; + + while (n--) { + ret = *a - *b; + if (ret) + break; + ++a, ++b; + } + return ret; +} + +void *memmove(void *dest, const void *src, size_t n) +{ + const unsigned char *s = src; + unsigned char *d = dest; + + if (d <= s) { + while (n--) + *d++ = *s++; + } else { + d += n, s += n; + while (n--) + *--d = *--s; + } + return dest; +} + +void *memchr(const void *s, int c, size_t n) +{ + const unsigned char *str = s, chr = (unsigned char)c; + + while (n--) + if (*str++ == chr) + return (void *)(str - 1); + return NULL; +} + long atol(const char *ptr) { long acc = 0; -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html