diff --git a/lib/libc/abort.c b/lib/libc/abort.c index 65ce4cc..c9d16cc 100644 --- a/lib/libc/abort.c +++ b/lib/libc/abort.c @@ -7,10 +7,7 @@ #include #include -/* - * This is a basic implementation. This could be improved. - */ -void abort (void) +void abort(void) { ERROR("ABORT\n"); panic(); diff --git a/lib/libc/assert.c b/lib/libc/assert.c index 97fab4b..721b6e5 100644 --- a/lib/libc/assert.c +++ b/lib/libc/assert.c @@ -10,9 +10,9 @@ #include /* -* Only print the output if PLAT_LOG_LEVEL_ASSERT is higher or equal to -* LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1. -*/ + * Only print the output if PLAT_LOG_LEVEL_ASSERT is higher or equal to + * LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1. + */ #if PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_VERBOSE void __assert(const char *file, unsigned int line, const char *assertion) diff --git a/lib/libc/libc.mk b/lib/libc/libc.mk index 022e6bf..575a2aa 100644 --- a/lib/libc/libc.mk +++ b/lib/libc/libc.mk @@ -8,7 +8,11 @@ abort.c \ assert.c \ exit.c \ - mem.c \ + memchr.c \ + memcmp.c \ + memcpy.c \ + memmove.c \ + memset.c \ printf.c \ putchar.c \ puts.c \ diff --git a/lib/libc/mem.c b/lib/libc/mem.c deleted file mode 100644 index 65b62fd..0000000 --- a/lib/libc/mem.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include /* size_t */ - -/* - * Fill @count bytes of memory pointed to by @dst with @val - */ -void *memset(void *dst, int val, size_t count) -{ - char *ptr = dst; - - while (count--) - *ptr++ = val; - - return dst; -} - -/* - * Compare @len bytes of @s1 and @s2 - */ -int memcmp(const void *s1, const void *s2, size_t len) -{ - const unsigned char *s = s1; - const unsigned char *d = s2; - unsigned char sc; - unsigned char dc; - - while (len--) { - sc = *s++; - dc = *d++; - if (sc - dc) - return (sc - dc); - } - - return 0; -} - -/* - * Copy @len bytes from @src to @dst - */ -void *memcpy(void *dst, const void *src, size_t len) -{ - const char *s = src; - char *d = dst; - - while (len--) - *d++ = *s++; - - return dst; -} - -/* - * Move @len bytes from @src to @dst - */ -void *memmove(void *dst, const void *src, size_t len) -{ - /* - * The following test makes use of unsigned arithmetic overflow to - * more efficiently test the condition !(src <= dst && dst < str+len). - * It also avoids the situation where the more explicit test would give - * incorrect results were the calculation str+len to overflow (though - * that issue is probably moot as such usage is probably undefined - * behaviour and a bug anyway. - */ - if ((size_t)dst - (size_t)src >= len) { - /* destination not in source data, so can safely use memcpy */ - return memcpy(dst, src, len); - } else { - /* copy backwards... */ - const char *end = dst; - const char *s = (const char *)src + len; - char *d = (char *)dst + len; - while (d != end) - *--d = *--s; - } - return dst; -} - -/* - * Scan @len bytes of @src for value @c - */ -void *memchr(const void *src, int c, size_t len) -{ - const char *s = src; - - while (len--) { - if (*s == c) - return (void *) s; - s++; - } - - return NULL; -} diff --git a/lib/libc/memchr.c b/lib/libc/memchr.c new file mode 100644 index 0000000..2eba47c --- /dev/null +++ b/lib/libc/memchr.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +void *memchr(const void *src, int c, size_t len) +{ + const char *s = src; + + while (len--) { + if (*s == c) + return (void *) s; + s++; + } + + return NULL; +} diff --git a/lib/libc/memcmp.c b/lib/libc/memcmp.c new file mode 100644 index 0000000..a4c798b --- /dev/null +++ b/lib/libc/memcmp.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +int memcmp(const void *s1, const void *s2, size_t len) +{ + const unsigned char *s = s1; + const unsigned char *d = s2; + unsigned char sc; + unsigned char dc; + + while (len--) { + sc = *s++; + dc = *d++; + if (sc - dc) + return (sc - dc); + } + + return 0; +} diff --git a/lib/libc/memcpy.c b/lib/libc/memcpy.c new file mode 100644 index 0000000..fc0c9fe --- /dev/null +++ b/lib/libc/memcpy.c @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +void *memcpy(void *dst, const void *src, size_t len) +{ + const char *s = src; + char *d = dst; + + while (len--) + *d++ = *s++; + + return dst; +} diff --git a/lib/libc/memmove.c b/lib/libc/memmove.c new file mode 100644 index 0000000..63acf26 --- /dev/null +++ b/lib/libc/memmove.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +void *memmove(void *dst, const void *src, size_t len) +{ + /* + * The following test makes use of unsigned arithmetic overflow to + * more efficiently test the condition !(src <= dst && dst < str+len). + * It also avoids the situation where the more explicit test would give + * incorrect results were the calculation str+len to overflow (though + * that issue is probably moot as such usage is probably undefined + * behaviour and a bug anyway. + */ + if ((size_t)dst - (size_t)src >= len) { + /* destination not in source data, so can safely use memcpy */ + return memcpy(dst, src, len); + } else { + /* copy backwards... */ + const char *end = dst; + const char *s = (const char *)src + len; + char *d = (char *)dst + len; + while (d != end) + *--d = *--s; + } + return dst; +} diff --git a/lib/libc/memset.c b/lib/libc/memset.c new file mode 100644 index 0000000..03aa809 --- /dev/null +++ b/lib/libc/memset.c @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +void *memset(void *dst, int val, size_t count) +{ + char *ptr = dst; + + while (count--) + *ptr++ = val; + + return dst; +} diff --git a/lib/libc/putchar.c b/lib/libc/putchar.c index 8265667..0beb625 100644 --- a/lib/libc/putchar.c +++ b/lib/libc/putchar.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,11 +7,6 @@ #include #include -/* Putchar() should either return the character printed or EOF in case of error. - * Our current console_putc() function assumes success and returns the - * character. Write all other printing functions in terms of putchar(), if - * possible, so they all benefit when this is improved. - */ int putchar(int c) { int res; diff --git a/lib/libc/puts.c b/lib/libc/puts.c index 284cf8c..717b522 100644 --- a/lib/libc/puts.c +++ b/lib/libc/puts.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,15 +9,13 @@ int puts(const char *s) { int count = 0; - while(*s) { + + while (*s) { if (putchar(*s++) == EOF) return EOF; count++; } - /* According to the puts(3) manpage, the function should write a - * trailing newline. - */ if (putchar('\n') == EOF) return EOF;