| /* SPDX-License-Identifier: BSD-3-Clause */ | |
| #include <commonlib/bsd/string.h> | |
| #include <ctype.h> | |
| #include <stddef.h> | |
| size_t strlen(const char *str) | |
| { | |
| const char *ptr = str; | |
| while (*ptr++) | |
| ; | |
| return ptr - str - 1; | |
| } | |
| size_t strnlen(const char *str, size_t maxlen) | |
| { | |
| const char *ptr = str; | |
| const char *end = str + maxlen; | |
| if (!maxlen) | |
| return 0; | |
| while (*ptr++) { | |
| /* Make sure this checks for ==, not >=, because the calculation | |
| for `end` may overflow in some edge cases. */ | |
| if (ptr == end) | |
| return maxlen; | |
| } | |
| return ptr - str - 1; | |
| } | |
| char *strcat(char *dst, const char *src) | |
| { | |
| char *ptr = dst + strlen(dst); | |
| while (*src) | |
| *ptr++ = *src++; | |
| *ptr = '\0'; | |
| return dst; | |
| } | |
| char *strncat(char *dst, const char *src, size_t n) | |
| { | |
| char *ptr = dst + strlen(dst); | |
| /* Not using strncpy() because '\0' may not be appended. */ | |
| while (n-- > 0 && *src) | |
| *ptr++ = *src++; | |
| *ptr = '\0'; | |
| return dst; | |
| } | |
| unsigned int skip_atoi(char **ptr) | |
| { | |
| unsigned int result = 0; | |
| char *str; | |
| for (str = *ptr; isdigit(str[0]); str++) | |
| result = result * 10 + (str[0] - '0'); | |
| *ptr = str; | |
| return result; | |
| } |