summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/string.h3
-rw-r--r--src/lib/string.c52
2 files changed, 55 insertions, 0 deletions
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;
+}