lib/string/strchr/: stp[c]spn(), strrspn(), strnul(): Add macros and functions

Often, a pointer is more useful than a length when calling these.

Link: <https://docs.oracle.com/cd/E86824_01/html/E54769/strrspn-3gen.html>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
Alejandro Colomar
2024-05-18 20:41:30 +02:00
committed by Serge Hallyn
parent b38ee0c6d0
commit 2fcf520184
9 changed files with 155 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#include <config.h>
#include "string/strchr/stpcspn.h"

View File

@@ -0,0 +1,27 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_STRING_STRCHR_STPCSPN_H_
#define SHADOW_INCLUDE_LIB_STRING_STRCHR_STPCSPN_H_
#include <config.h>
#include <string.h>
#include "attr.h"
// Similar to strcspn(3), but return a pointer instead of an offset.
// Similar to strchrnul(3), but search for several delimiters.
// Similar to strpbrk(3), but return 's + strlen(s)' if not found.
#define stpcspn(s, reject) \
({ \
__auto_type s_ = s; \
\
s_ + strcspn(s_, reject); \
})
#endif // include guard

View File

@@ -0,0 +1,7 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#include <config.h>
#include "string/strchr/stpspn.h"

View File

@@ -0,0 +1,26 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_STRING_STRCHR_STPSPN_H_
#define SHADOW_INCLUDE_LIB_STRING_STRCHR_STPSPN_H_
#include <config.h>
#include <string.h>
#include "attr.h"
// Similar to strspn(3), but return a pointer instead of an offset.
// Similar to strchrnul(3), but search for any bytes not in 'accept'.
#define stpspn(s, accept) \
({ \
__auto_type s_ = s; \
\
s_ + strspn(s_, accept); \
})
#endif // include guard

View File

@@ -0,0 +1,7 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#include <config.h>
#include "string/strchr/strnul.h"

View File

@@ -0,0 +1,25 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_STRING_STRCHR_STRNUL_H_
#define SHADOW_INCLUDE_LIB_STRING_STRCHR_STRNUL_H_
#include <config.h>
#include <string.h>
#include "attr.h"
// Similar to strlen(3), but return a pointer instead of an offset.
#define strnul(s) \
({ \
__auto_type s_ = s; \
\
s_ + strlen(s_); \
})
#endif // include guard

View File

@@ -0,0 +1,10 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#include <config.h>
#include "string/strchr/strrspn.h"
extern inline char *strrspn(char *restrict s, const char *restrict accept);

View File

@@ -0,0 +1,38 @@
// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_STRING_STRCHR_STRRSPN_H_
#define SHADOW_INCLUDE_LIB_STRING_STRCHR_STRRSPN_H_
#include <config.h>
#include <string.h>
#include "attr.h"
#include "string/strchr/strnul.h"
ATTR_STRING(2)
inline char *strrspn(char *restrict s, const char *restrict accept);
// Available in Oracle Solaris: strrspn(3GEN).
// <https://docs.oracle.com/cd/E36784_01/html/E36877/strrspn-3gen.html>
inline char *
strrspn(char *restrict s, const char *restrict accept)
{
char *p;
p = strnul(s);
while (p > s) {
p--;
if (strchr(accept, *p) == NULL)
return p + 1;
}
return s;
}
#endif // include guard