/ src / commonlib / bsd / string.c
string.c
 1  /* SPDX-License-Identifier: BSD-3-Clause */
 2  
 3  #include <commonlib/bsd/string.h>
 4  #include <ctype.h>
 5  #include <stddef.h>
 6  
 7  size_t strlen(const char *str)
 8  {
 9  	const char *ptr = str;
10  
11  	while (*ptr++)
12  		;
13  	return ptr - str - 1;
14  }
15  
16  size_t strnlen(const char *str, size_t maxlen)
17  {
18  	const char *ptr = str;
19  	const char *end = str + maxlen;
20  
21  	if (!maxlen)
22  		return 0;
23  
24  	while (*ptr++) {
25  		/* Make sure this checks for ==, not >=, because the calculation
26  		   for `end` may overflow in some edge cases. */
27  		if (ptr == end)
28  			return maxlen;
29  	}
30  	return ptr - str - 1;
31  }
32  
33  char *strcat(char *dst, const char *src)
34  {
35  	char *ptr = dst + strlen(dst);
36  
37  	while (*src)
38  		*ptr++ = *src++;
39  
40  	*ptr = '\0';
41  	return dst;
42  }
43  
44  char *strncat(char *dst, const char *src, size_t n)
45  {
46  	char *ptr = dst + strlen(dst);
47  
48  	/* Not using strncpy() because '\0' may not be appended. */
49  	while (n-- > 0 && *src)
50  		*ptr++ = *src++;
51  
52  	*ptr = '\0';
53  	return dst;
54  }
55  
56  unsigned int skip_atoi(char **ptr)
57  {
58  	unsigned int result = 0;
59  	char *str;
60  
61  	for (str = *ptr; isdigit(str[0]); str++)
62  		result = result * 10 + (str[0] - '0');
63  	*ptr = str;
64  	return result;
65  }