2003-04-22 21:02:15 +02:00
|
|
|
#ifndef STRING_H
|
|
|
|
#define STRING_H
|
|
|
|
|
|
|
|
#include <stddef.h>
|
2004-03-13 04:34:52 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2018-01-29 03:01:10 +01:00
|
|
|
#if !defined(__ROMCC__)
|
|
|
|
#include <console/vtxprintf.h>
|
|
|
|
#endif
|
|
|
|
|
2013-04-26 18:58:35 +02:00
|
|
|
/* Stringify a token */
|
|
|
|
#ifndef STRINGIFY
|
|
|
|
#define _STRINGIFY(x) #x
|
|
|
|
#define STRINGIFY(x) _STRINGIFY(x)
|
|
|
|
#endif
|
|
|
|
|
2008-08-01 13:39:35 +02:00
|
|
|
void *memcpy(void *dest, const void *src, size_t n);
|
|
|
|
void *memmove(void *dest, const void *src, size_t n);
|
|
|
|
void *memset(void *s, int c, size_t n);
|
|
|
|
int memcmp(const void *s1, const void *s2, size_t n);
|
2011-09-16 11:18:56 +02:00
|
|
|
void *memchr(const void *s, int c, size_t n);
|
2016-11-08 16:42:13 +01:00
|
|
|
#if !defined(__ROMCC__)
|
2017-03-08 00:24:16 +01:00
|
|
|
int snprintf(char *buf, size_t size, const char *fmt, ...);
|
2018-01-29 03:01:10 +01:00
|
|
|
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
|
2009-09-25 23:59:57 +02:00
|
|
|
#endif
|
2019-01-29 12:48:01 +01:00
|
|
|
char *strdup(const char *s);
|
|
|
|
char *strconcat(const char *s1, const char *s2);
|
2003-04-22 21:02:15 +02:00
|
|
|
|
2010-04-27 08:56:47 +02:00
|
|
|
// simple string functions
|
2003-04-22 21:02:15 +02:00
|
|
|
|
2010-04-27 08:56:47 +02:00
|
|
|
static inline size_t strnlen(const char *src, size_t max)
|
|
|
|
{
|
2003-04-22 21:02:15 +02:00
|
|
|
size_t i = 0;
|
2017-03-08 00:17:04 +01:00
|
|
|
while ((*src++) && (i < max))
|
2003-04-22 21:02:15 +02:00
|
|
|
i++;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline size_t strlen(const char *src)
|
|
|
|
{
|
|
|
|
size_t i = 0;
|
2017-03-08 00:17:04 +01:00
|
|
|
while (*src++)
|
2003-04-22 21:02:15 +02:00
|
|
|
i++;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline char *strchr(const char *s, int c)
|
|
|
|
{
|
|
|
|
for (; *s; s++) {
|
|
|
|
if (*s == c)
|
|
|
|
return (char *) s;
|
2010-04-27 08:56:47 +02:00
|
|
|
}
|
2004-03-13 04:34:52 +01:00
|
|
|
return 0;
|
|
|
|
}
|
2003-04-22 21:02:15 +02:00
|
|
|
|
2018-03-29 10:05:34 +02:00
|
|
|
/**
|
|
|
|
* Find a character in a string.
|
|
|
|
*
|
|
|
|
* @param s The string.
|
|
|
|
* @param c The character.
|
|
|
|
* @return A pointer to the last occurrence of the character in the
|
|
|
|
* string, or NULL if the character was not encountered within the string.
|
|
|
|
*/
|
|
|
|
static inline char *strrchr(const char *s, int c)
|
|
|
|
{
|
|
|
|
char *p = (char *)s + strlen(s);
|
|
|
|
|
|
|
|
for (; p >= s; p--) {
|
|
|
|
if (*p == c)
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline char *strncpy(char *to, const char *from, int count)
|
|
|
|
{
|
|
|
|
register char *ret = to;
|
2017-03-08 01:01:09 +01:00
|
|
|
register char data;
|
2004-03-13 04:34:52 +01:00
|
|
|
|
|
|
|
while (count > 0) {
|
|
|
|
count--;
|
2017-03-08 01:01:09 +01:00
|
|
|
data = *from++;
|
|
|
|
*to++ = data;
|
|
|
|
if (data == '\0')
|
2004-03-13 04:34:52 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (count > 0) {
|
|
|
|
count--;
|
|
|
|
*to++ = '\0';
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-12-19 20:22:07 +01:00
|
|
|
static inline char *strcpy(char *dst, const char *src)
|
2010-09-29 11:54:16 +02:00
|
|
|
{
|
2012-12-19 20:22:07 +01:00
|
|
|
char *ptr = dst;
|
|
|
|
|
2010-09-29 11:54:16 +02:00
|
|
|
while (*src)
|
|
|
|
*dst++ = *src++;
|
2012-12-19 20:22:07 +01:00
|
|
|
*dst = '\0';
|
|
|
|
|
|
|
|
return ptr;
|
2010-09-29 11:54:16 +02:00
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline int strcmp(const char *s1, const char *s2)
|
2010-04-27 08:56:47 +02:00
|
|
|
{
|
2004-03-13 04:34:52 +01:00
|
|
|
int r;
|
|
|
|
|
|
|
|
while ((r = (*s1 - *s2)) == 0 && *s1) {
|
|
|
|
s1++;
|
|
|
|
s2++;
|
|
|
|
}
|
|
|
|
return r;
|
2010-04-27 08:56:47 +02:00
|
|
|
}
|
2004-03-13 04:34:52 +01:00
|
|
|
|
2009-03-01 11:16:01 +01:00
|
|
|
static inline int strncmp(const char *s1, const char *s2, int maxlen)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < maxlen; i++) {
|
2015-12-01 18:30:27 +01:00
|
|
|
if ((s1[i] != s2[i]) || (s1[i] == '\0'))
|
2009-03-01 11:16:01 +01:00
|
|
|
return s1[i] - s2[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline int isspace(int c)
|
|
|
|
{
|
|
|
|
switch (c) {
|
|
|
|
case ' ': case '\f': case '\n':
|
|
|
|
case '\r': case '\t': case '\v':
|
|
|
|
return 1;
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-01 13:21:40 +01:00
|
|
|
static inline int isprint(int c)
|
|
|
|
{
|
|
|
|
return c >= ' ' && c <= '~';
|
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline int isdigit(int c)
|
|
|
|
{
|
|
|
|
return (c >= '0' && c <= '9');
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int isxdigit(int c)
|
|
|
|
{
|
|
|
|
return ((c >= '0' && c <= '9') ||
|
|
|
|
(c >= 'a' && c <= 'f') ||
|
|
|
|
(c >= 'A' && c <= 'F'));
|
|
|
|
}
|
|
|
|
|
2004-03-17 18:02:28 +01:00
|
|
|
static inline int isupper(int c)
|
|
|
|
{
|
|
|
|
return (c >= 'A' && c <= 'Z');
|
|
|
|
}
|
|
|
|
|
2004-03-13 04:34:52 +01:00
|
|
|
static inline int islower(int c)
|
|
|
|
{
|
|
|
|
return (c >= 'a' && c <= 'z');
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int toupper(int c)
|
|
|
|
{
|
2016-09-01 19:01:41 +02:00
|
|
|
if (islower(c))
|
|
|
|
c -= 'a'-'A';
|
|
|
|
return c;
|
2004-03-13 04:34:52 +01:00
|
|
|
}
|
2004-03-17 18:02:28 +01:00
|
|
|
|
|
|
|
static inline int tolower(int c)
|
|
|
|
{
|
2016-09-01 19:01:41 +02:00
|
|
|
if (isupper(c))
|
|
|
|
c -= 'A'-'a';
|
|
|
|
return c;
|
2004-03-17 18:02:28 +01:00
|
|
|
}
|
2019-05-14 02:45:27 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Parses an unsigned integer and moves the input pointer forward to the first
|
|
|
|
* character that's not a valid digit. s and *s must not be NULL. Result
|
|
|
|
* undefined if it overruns the return type size.
|
|
|
|
*/
|
|
|
|
static inline unsigned int skip_atoi(char **s)
|
|
|
|
{
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
|
|
|
while (isdigit(**s))
|
|
|
|
i = i*10 + *((*s)++) - '0';
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
2003-04-22 21:02:15 +02:00
|
|
|
#endif /* STRING_H */
|