blob: 5bc013dede101d5a6d09ef8a4b0b7e7fdc110074 [file] [log] [blame]
/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
*/
#ifndef _NJS_STR_H_INCLUDED_
#define _NJS_STR_H_INCLUDED_
typedef struct {
size_t length;
u_char *start;
} njs_str_t;
/*
* C99 allows to assign struct as compound literal with struct name cast only.
* SunC however issues error on the cast in struct static initialization:
* non-constant initializer: op "NAME"
* So a separate njs_str_value() macro is intended to use in assignment.
*/
#define njs_length(s) (sizeof(s) - 1)
#define njs_str(s) { njs_length(s), (u_char *) s }
#define njs_null_str { 0, NULL }
#define njs_str_value(s) (njs_str_t) njs_str(s)
njs_inline u_char
njs_lower_case(u_char c)
{
return (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c);
}
njs_inline u_char
njs_upper_case(u_char c)
{
return (u_char) ((c >= 'a' && c <= 'z') ? c & 0xDF : c);
}
njs_inline njs_bool_t
njs_is_whitespace(u_char c)
{
switch (c) {
case 0x09: /* <TAB> */
case 0x0A: /* <LF> */
case 0x0B: /* <VT> */
case 0x0C: /* <FF> */
case 0x0D: /* <CR> */
case 0x20: /* <SP> */
case 0xA0: /* <NBSP> */
return 1;
default:
return 0;
}
}
njs_inline u_char *
njs_strlchr(u_char *p, u_char *last, u_char c)
{
while (p < last) {
if (*p == c) {
return p;
}
p++;
}
return NULL;
}
#define \
njs_strlen(s) \
strlen((char *) s)
#define \
njs_cpymem(dst, src, n) \
(((u_char *) memcpy(dst, src, n)) + (n))
#define \
njs_strncmp(s1, s2, n) \
strncmp((char *) s1, (char *) s2, n)
#define \
njs_strchr(s1, c) \
(u_char *) strchr((const char *) s1, (int) c)
#define \
njs_memset(buf, c, length) \
(void) memset(buf, c, length)
#define \
njs_memzero(buf, length) \
(void) memset(buf, 0, length)
#if (NJS_HAVE_EXPLICIT_BZERO && !NJS_HAVE_MEMORY_SANITIZER)
#define \
njs_explicit_memzero(buf, length) \
explicit_bzero(buf, length)
#elif (NJS_HAVE_EXPLICIT_MEMSET)
#define \
njs_explicit_memzero(buf, length) \
(void) explicit_memset(buf, 0, length)
#else
njs_inline void
njs_explicit_memzero(void *buf, size_t length)
{
volatile u_char *p = (volatile u_char *) buf;
while (length != 0) {
*p++ = 0;
length--;
}
}
#endif
#define \
njs_strstr_eq(s1, s2) \
(((s1)->length == (s2)->length) \
&& (memcmp((s1)->start, (s2)->start, (s1)->length) == 0))
#endif /* _NJS_STR_H_INCLUDED_ */