From 6b212d8fcff125a831c0ba068903afd0b22d292c Mon Sep 17 00:00:00 2001 From: Yuji Sasaki Date: Wed, 12 Jun 2019 17:42:19 -0700 Subject: string: implement strspn, strcspn, atol Change-Id: Id8fa880357124b620bde8884949bd8ffff7d0762 Signed-off-by: Patrick Georgi Reviewed-on: https://review.coreboot.org/c/coreboot/+/34450 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner --- src/include/string.h | 3 +++ src/lib/string.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/include/string.h b/src/include/string.h index 30241303eb..d3f09ff102 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -32,6 +32,9 @@ 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); +int strspn(const char *str, const char *spn); +int strcspn(const char *str, const char *spn); +long atol(const char *str); /** * Find a character in a string. diff --git a/src/lib/string.c b/src/lib/string.c index eb6adb67c7..f0c24edcfc 100644 --- a/src/lib/string.c +++ b/src/lib/string.c @@ -132,3 +132,55 @@ unsigned int skip_atoi(char **s) i = i*10 + *((*s)++) - '0'; return i; } + +int strspn(const char *str, const char *spn) +{ + int ret = 0; + + while (*str != 0) { + const char *p; + for (p = spn; *str != *p; p++) + if (*p == '\0') + return ret; + ret++; + str++; + } + return ret; +} + +int strcspn(const char *str, const char *spn) +{ + int ret = 0; + + while (*str != 0) { + const char *p; + for (p = spn; *p != '\0'; p++) + if (*p == *str) + return ret; + ret++; + str++; + } + return ret; +} + +long atol(const char *str) +{ + long ret = 0; + long sign = 1; + + str += strspn(str, " \t\n\r\f\v"); + + if (*str == '+') { + sign = 1; + str++; + } else if (*str == '-') { + sign = -1; + str++; + } + + while (isdigit(*str)) { + ret *= 10; + ret += *str++ - '0'; + } + return ret * sign; +} -- cgit v1.2.3