mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Move tor_strtok_r to libtor-string
This commit is contained in:
parent
4d81f5211b
commit
9e592d1dec
@ -177,56 +177,6 @@ tor_memmem(const void *_haystack, size_t hlen,
|
|||||||
#endif /* defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) */
|
#endif /* defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) */
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Helper for tor_strtok_r_impl: Advances cp past all characters in
|
|
||||||
* <b>sep</b>, and returns its new value. */
|
|
||||||
static char *
|
|
||||||
strtok_helper(char *cp, const char *sep)
|
|
||||||
{
|
|
||||||
if (sep[1]) {
|
|
||||||
while (*cp && strchr(sep, *cp))
|
|
||||||
++cp;
|
|
||||||
} else {
|
|
||||||
while (*cp && *cp == *sep)
|
|
||||||
++cp;
|
|
||||||
}
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Implementation of strtok_r for platforms whose coders haven't figured out
|
|
||||||
* how to write one. Hey, retrograde libc developers! You can use this code
|
|
||||||
* here for free! */
|
|
||||||
char *
|
|
||||||
tor_strtok_r_impl(char *str, const char *sep, char **lasts)
|
|
||||||
{
|
|
||||||
char *cp, *start;
|
|
||||||
tor_assert(*sep);
|
|
||||||
if (str) {
|
|
||||||
str = strtok_helper(str, sep);
|
|
||||||
if (!*str)
|
|
||||||
return NULL;
|
|
||||||
start = cp = *lasts = str;
|
|
||||||
} else if (!*lasts || !**lasts) {
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
start = cp = *lasts;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sep[1]) {
|
|
||||||
while (*cp && !strchr(sep, *cp))
|
|
||||||
++cp;
|
|
||||||
} else {
|
|
||||||
cp = strchr(cp, *sep);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cp || !*cp) {
|
|
||||||
*lasts = NULL;
|
|
||||||
} else {
|
|
||||||
*cp++ = '\0';
|
|
||||||
*lasts = strtok_helper(cp, sep);
|
|
||||||
}
|
|
||||||
return start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Represents a lockfile on which we hold the lock. */
|
/** Represents a lockfile on which we hold the lock. */
|
||||||
struct tor_lockfile_t {
|
struct tor_lockfile_t {
|
||||||
/** Name of the file */
|
/** Name of the file */
|
||||||
|
@ -73,13 +73,6 @@ tor_memstr(const void *haystack, size_t hlen, const char *needle)
|
|||||||
return tor_memmem(haystack, hlen, needle, strlen(needle));
|
return tor_memmem(haystack, hlen, needle, strlen(needle));
|
||||||
}
|
}
|
||||||
|
|
||||||
char *tor_strtok_r_impl(char *str, const char *sep, char **lasts);
|
|
||||||
#ifdef HAVE_STRTOK_R
|
|
||||||
#define tor_strtok_r(str, sep, lasts) strtok_r(str, sep, lasts)
|
|
||||||
#else
|
|
||||||
#define tor_strtok_r(str, sep, lasts) tor_strtok_r_impl(str, sep, lasts)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===== Time compatibility */
|
/* ===== Time compatibility */
|
||||||
|
|
||||||
struct tm *tor_localtime_r(const time_t *timep, struct tm *result);
|
struct tm *tor_localtime_r(const time_t *timep, struct tm *result);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
/* See LICENSE for licensing information */
|
/* See LICENSE for licensing information */
|
||||||
|
|
||||||
#include "lib/string/compat_string.h"
|
#include "lib/string/compat_string.h"
|
||||||
|
#include "lib/err/torerr.h"
|
||||||
|
|
||||||
/* Inline the strl functions if the platform doesn't have them. */
|
/* Inline the strl functions if the platform doesn't have them. */
|
||||||
#ifndef HAVE_STRLCPY
|
#ifndef HAVE_STRLCPY
|
||||||
@ -12,3 +13,55 @@
|
|||||||
#ifndef HAVE_STRLCAT
|
#ifndef HAVE_STRLCAT
|
||||||
#include "strlcat.c"
|
#include "strlcat.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/** Helper for tor_strtok_r_impl: Advances cp past all characters in
|
||||||
|
* <b>sep</b>, and returns its new value. */
|
||||||
|
static char *
|
||||||
|
strtok_helper(char *cp, const char *sep)
|
||||||
|
{
|
||||||
|
if (sep[1]) {
|
||||||
|
while (*cp && strchr(sep, *cp))
|
||||||
|
++cp;
|
||||||
|
} else {
|
||||||
|
while (*cp && *cp == *sep)
|
||||||
|
++cp;
|
||||||
|
}
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Implementation of strtok_r for platforms whose coders haven't figured out
|
||||||
|
* how to write one. Hey, retrograde libc developers! You can use this code
|
||||||
|
* here for free! */
|
||||||
|
char *
|
||||||
|
tor_strtok_r_impl(char *str, const char *sep, char **lasts)
|
||||||
|
{
|
||||||
|
char *cp, *start;
|
||||||
|
raw_assert(*sep);
|
||||||
|
if (str) {
|
||||||
|
str = strtok_helper(str, sep);
|
||||||
|
if (!*str)
|
||||||
|
return NULL;
|
||||||
|
start = cp = *lasts = str;
|
||||||
|
} else if (!*lasts || !**lasts) {
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
start = cp = *lasts;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sep[1]) {
|
||||||
|
while (*cp && !strchr(sep, *cp))
|
||||||
|
++cp;
|
||||||
|
} else {
|
||||||
|
cp = strchr(cp, *sep);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cp || !*cp) {
|
||||||
|
*lasts = NULL;
|
||||||
|
} else {
|
||||||
|
*cp++ = '\0';
|
||||||
|
*lasts = strtok_helper(cp, sep);
|
||||||
|
}
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
@ -36,4 +36,11 @@ size_t strlcat(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
|
|||||||
size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
|
size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char *tor_strtok_r_impl(char *str, const char *sep, char **lasts);
|
||||||
|
#ifdef HAVE_STRTOK_R
|
||||||
|
#define tor_strtok_r(str, sep, lasts) strtok_r(str, sep, lasts)
|
||||||
|
#else
|
||||||
|
#define tor_strtok_r(str, sep, lasts) tor_strtok_r_impl(str, sep, lasts)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user