blob: fc96393c48f6561e22d3097c0056112351c0477f [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001#ifndef STRING_H
2#define STRING_H
3
4#include <stddef.h>
Greg Watson16247822004-03-13 03:34:52 +00005#include <stdlib.h>
6
David Hendricks6053a9c2018-01-28 18:01:10 -08007#if !defined(__ROMCC__)
8#include <console/vtxprintf.h>
9#endif
10
Aaron Durbinac4b00e2013-04-26 11:58:35 -050011/* Stringify a token */
12#ifndef STRINGIFY
13#define _STRINGIFY(x) #x
14#define STRINGIFY(x) _STRINGIFY(x)
15#endif
16
Stefan Reinauera91e0fe2008-08-01 11:39:35 +000017void *memcpy(void *dest, const void *src, size_t n);
18void *memmove(void *dest, const void *src, size_t n);
19void *memset(void *s, int c, size_t n);
20int memcmp(const void *s1, const void *s2, size_t n);
Gabe Black1025f3a2011-09-16 02:18:56 -070021void *memchr(const void *s, int c, size_t n);
Aaron Durbin5577a472016-11-08 09:42:13 -060022#if !defined(__ROMCC__)
Lee Leahy6d71a432017-03-07 15:24:16 -080023int snprintf(char *buf, size_t size, const char *fmt, ...);
David Hendricks6053a9c2018-01-28 18:01:10 -080024int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
Stefan Reinauer6bd571e2009-09-25 21:59:57 +000025#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000026
Stefan Reinauer14e22772010-04-27 06:56:47 +000027// simple string functions
Eric Biederman8ca8d762003-04-22 19:02:15 +000028
Stefan Reinauer14e22772010-04-27 06:56:47 +000029static inline size_t strnlen(const char *src, size_t max)
30{
Eric Biederman8ca8d762003-04-22 19:02:15 +000031 size_t i = 0;
Lee Leahybfdb8932017-03-07 15:17:04 -080032 while ((*src++) && (i < max))
Eric Biederman8ca8d762003-04-22 19:02:15 +000033 i++;
Eric Biederman8ca8d762003-04-22 19:02:15 +000034 return i;
35}
36
37static inline size_t strlen(const char *src)
38{
39 size_t i = 0;
Lee Leahybfdb8932017-03-07 15:17:04 -080040 while (*src++)
Eric Biederman8ca8d762003-04-22 19:02:15 +000041 i++;
Eric Biederman8ca8d762003-04-22 19:02:15 +000042 return i;
43}
44
Greg Watson16247822004-03-13 03:34:52 +000045static inline char *strchr(const char *s, int c)
46{
47 for (; *s; s++) {
48 if (*s == c)
49 return (char *) s;
Stefan Reinauer14e22772010-04-27 06:56:47 +000050 }
Greg Watson16247822004-03-13 03:34:52 +000051 return 0;
52}
Eric Biederman8ca8d762003-04-22 19:02:15 +000053
Stefan Reinauer35b6bbb2010-03-28 21:26:54 +000054#if !defined(__PRE_RAM__)
Greg Watson16247822004-03-13 03:34:52 +000055static inline char *strdup(const char *s)
Stefan Reinauer14e22772010-04-27 06:56:47 +000056{
Greg Watson16247822004-03-13 03:34:52 +000057 size_t sz = strlen(s) + 1;
58 char *d = malloc(sz);
59 memcpy(d, s, sz);
60 return d;
61}
Kyösti Mälkkic36af7b2014-11-18 12:41:16 +020062
63static inline char *strconcat(const char *s1, const char *s2)
64{
65 size_t sz_1 = strlen(s1);
66 size_t sz_2 = strlen(s2);
67 char *d = malloc(sz_1 + sz_2 + 1);
68 memcpy(d, s1, sz_1);
69 memcpy(d + sz_1, s2, sz_2 + 1);
70 return d;
71}
Stefan Reinauer951f5882009-07-19 00:18:15 +000072#endif
Greg Watson16247822004-03-13 03:34:52 +000073
Patrick Rudolph03c7b052018-03-29 10:05:34 +020074/**
75 * Find a character in a string.
76 *
77 * @param s The string.
78 * @param c The character.
79 * @return A pointer to the last occurrence of the character in the
80 * string, or NULL if the character was not encountered within the string.
81 */
82static inline char *strrchr(const char *s, int c)
83{
84 char *p = (char *)s + strlen(s);
85
86 for (; p >= s; p--) {
87 if (*p == c)
88 return p;
89 }
90
91 return NULL;
92}
93
Greg Watson16247822004-03-13 03:34:52 +000094static inline char *strncpy(char *to, const char *from, int count)
95{
96 register char *ret = to;
Lee Leahyb1260552017-03-07 16:01:09 -080097 register char data;
Greg Watson16247822004-03-13 03:34:52 +000098
99 while (count > 0) {
100 count--;
Lee Leahyb1260552017-03-07 16:01:09 -0800101 data = *from++;
102 *to++ = data;
103 if (data == '\0')
Greg Watson16247822004-03-13 03:34:52 +0000104 break;
105 }
106
107 while (count > 0) {
108 count--;
109 *to++ = '\0';
110 }
111 return ret;
112}
113
Stefan Reinauer2c3f2602012-12-19 11:22:07 -0800114static inline char *strcpy(char *dst, const char *src)
Uwe Hermannaac8f662010-09-29 09:54:16 +0000115{
Stefan Reinauer2c3f2602012-12-19 11:22:07 -0800116 char *ptr = dst;
117
Uwe Hermannaac8f662010-09-29 09:54:16 +0000118 while (*src)
119 *dst++ = *src++;
Stefan Reinauer2c3f2602012-12-19 11:22:07 -0800120 *dst = '\0';
121
122 return ptr;
Uwe Hermannaac8f662010-09-29 09:54:16 +0000123}
124
Greg Watson16247822004-03-13 03:34:52 +0000125static inline int strcmp(const char *s1, const char *s2)
Stefan Reinauer14e22772010-04-27 06:56:47 +0000126{
Greg Watson16247822004-03-13 03:34:52 +0000127 int r;
128
129 while ((r = (*s1 - *s2)) == 0 && *s1) {
130 s1++;
131 s2++;
132 }
133 return r;
Stefan Reinauer14e22772010-04-27 06:56:47 +0000134}
Greg Watson16247822004-03-13 03:34:52 +0000135
Stefan Reinauer36c83402009-03-01 10:16:01 +0000136static inline int strncmp(const char *s1, const char *s2, int maxlen)
137{
138 int i;
139
140 for (i = 0; i < maxlen; i++) {
Hannah Williams03d4ae72015-12-01 09:30:27 -0800141 if ((s1[i] != s2[i]) || (s1[i] == '\0'))
Stefan Reinauer36c83402009-03-01 10:16:01 +0000142 return s1[i] - s2[i];
143 }
144
145 return 0;
146}
147
Greg Watson16247822004-03-13 03:34:52 +0000148static inline int isspace(int c)
149{
150 switch (c) {
151 case ' ': case '\f': case '\n':
152 case '\r': case '\t': case '\v':
153 return 1;
154 default:
155 return 0;
156 }
157}
158
159static inline int isdigit(int c)
160{
161 return (c >= '0' && c <= '9');
162}
163
164static inline int isxdigit(int c)
165{
166 return ((c >= '0' && c <= '9') ||
167 (c >= 'a' && c <= 'f') ||
168 (c >= 'A' && c <= 'F'));
169}
170
Greg Watsonf6d05f52004-03-17 17:02:28 +0000171static inline int isupper(int c)
172{
173 return (c >= 'A' && c <= 'Z');
174}
175
Greg Watson16247822004-03-13 03:34:52 +0000176static inline int islower(int c)
177{
178 return (c >= 'a' && c <= 'z');
179}
180
181static inline int toupper(int c)
182{
Elyes HAOUAS8ffd0502016-09-01 19:01:41 +0200183 if (islower(c))
184 c -= 'a'-'A';
185 return c;
Greg Watson16247822004-03-13 03:34:52 +0000186}
Greg Watsonf6d05f52004-03-17 17:02:28 +0000187
188static inline int tolower(int c)
189{
Elyes HAOUAS8ffd0502016-09-01 19:01:41 +0200190 if (isupper(c))
191 c -= 'A'-'a';
192 return c;
Greg Watsonf6d05f52004-03-17 17:02:28 +0000193}
Eric Biederman8ca8d762003-04-22 19:02:15 +0000194#endif /* STRING_H */