mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-01-23 00:07:07 +03:00
113 lines
2.0 KiB
C
113 lines
2.0 KiB
C
/*
|
|
* linux/lib/string.c
|
|
*
|
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
*/
|
|
|
|
/*
|
|
* stupid library routines.. The optimized versions should generally be found
|
|
* as inline code in <asm-xx/string.h>
|
|
*
|
|
* These are buggy as well..
|
|
*
|
|
* * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
|
|
* - Added strsep() which will replace strtok() soon (because strsep() is
|
|
* reentrant and should be faster). Use only strsep() in new code, please.
|
|
*
|
|
* * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
|
|
* Matthew Hawkins <matt@mh.dropbear.id.au>
|
|
* - Kissed strtok() goodbye
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <limits.h>
|
|
#include <string.h>
|
|
|
|
#include <linux/bug.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/string.h>
|
|
|
|
static char *skip_spaces(const char *str)
|
|
{
|
|
while (isspace(*str))
|
|
++str;
|
|
return (char *)str;
|
|
}
|
|
|
|
char *strim(char *s)
|
|
{
|
|
size_t size;
|
|
char *end;
|
|
|
|
size = strlen(s);
|
|
if (!size)
|
|
return s;
|
|
|
|
end = s + size - 1;
|
|
while (end >= s && isspace(*end))
|
|
end--;
|
|
*(end + 1) = '\0';
|
|
|
|
return skip_spaces(s);
|
|
}
|
|
|
|
size_t strlcpy(char *dest, const char *src, size_t size)
|
|
{
|
|
size_t ret = strlen(src);
|
|
|
|
if (size) {
|
|
size_t len = (ret >= size) ? size - 1 : ret;
|
|
memcpy(dest, src, len);
|
|
dest[len] = '\0';
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
ssize_t strscpy(char *dest, const char *src, size_t count)
|
|
{
|
|
long res = 0;
|
|
|
|
if (count == 0 || WARN_ON_ONCE(count > INT_MAX))
|
|
return -E2BIG;
|
|
|
|
while (count) {
|
|
char c;
|
|
|
|
c = src[res];
|
|
dest[res] = c;
|
|
if (!c)
|
|
return res;
|
|
res++;
|
|
count--;
|
|
}
|
|
|
|
/* Hit buffer length without finding a NUL; force NUL-termination. */
|
|
if (res)
|
|
dest[res-1] = '\0';
|
|
|
|
return -E2BIG;
|
|
}
|
|
|
|
void memzero_explicit(void *s, size_t count)
|
|
{
|
|
memset(s, 0, count);
|
|
barrier_data(s);
|
|
}
|
|
|
|
int match_string(const char * const *array, size_t n, const char *string)
|
|
{
|
|
int index;
|
|
const char *item;
|
|
|
|
for (index = 0; index < n; index++) {
|
|
item = array[index];
|
|
if (!item)
|
|
break;
|
|
if (!strcmp(item, string))
|
|
return index;
|
|
}
|
|
|
|
return -EINVAL;
|
|
}
|