Move tor_strtok_r to libtor-string

This commit is contained in:
Nick Mathewson 2018-06-27 15:28:55 -04:00
parent 4d81f5211b
commit 9e592d1dec
4 changed files with 60 additions and 57 deletions

View File

@ -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 */

View 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);

View File

@ -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;
}

View File

@ -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