From ca5f7a45ee5ba2d50dedda2692e0319985785572 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 19 Oct 2014 03:01:26 -0700 Subject: [PATCH] Move string utilities out to separate file (really fixing Linux build this time) --- CMakeLists.txt | 11 +++++++---- src/debugger/parser.c | 18 ++++-------------- src/util/string.c | 25 +++++++++++++++++++++++++ src/util/string.h | 9 +++++++++ src/util/vfs.c | 11 +++-------- 5 files changed, 48 insertions(+), 26 deletions(-) create mode 100644 src/util/string.c create mode 100644 src/util/string.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c11d73754..f28deab7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,13 @@ find_feature(USE_FFMPEG "libavcodec;libavformat;libavutil") find_feature(USE_PNG "PNG;ZLIB") find_feature(USE_LIBZIP "libzip") +include(CheckFunctionExists) +check_function_exists(strndup HAVE_STRNDUP) + +if(HAVE_STRNDUP) + add_definitions(-DHAVE_STRNDUP) +endif() + # Platform support if(WIN32) add_definitions(-D_WIN32_WINNT=0x0600) @@ -102,10 +109,6 @@ if(BUILD_BBB OR BUILD_RASPI) endif() endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND OS_LIB bsd) -endif() - # Features set(DEBUGGER_SRC ${CMAKE_SOURCE_DIR}/src/debugger/debugger.c ${CMAKE_SOURCE_DIR}/src/debugger/memory-debugger.c) diff --git a/src/debugger/parser.c b/src/debugger/parser.c index 1eb9379f7..840819e05 100644 --- a/src/debugger/parser.c +++ b/src/debugger/parser.c @@ -1,16 +1,6 @@ #include "parser.h" -static inline char* _strndup(const char* start, size_t len) { -#ifdef HAVE_STRNDUP - return strndup(start, len); -#else - // This is suboptimal, but anything recent should have strndup - char* out = malloc((len + 1) * sizeof(char)); - strncpy(out, start, len); - out[len] = '\0'; - return out; -#endif -} +#include "util/string.h" static struct LexVector* _lexOperator(struct LexVector* lv, char operator) { struct LexVector* lvNext = malloc(sizeof(struct LexVector)); @@ -108,13 +98,13 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) { case '*': case '/': lv->token.type = TOKEN_IDENTIFIER_TYPE; - lv->token.identifierValue = _strndup(tokenStart, string - tokenStart - 1); + lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1); lv = _lexOperator(lv, token); state = LEX_ROOT; break; case ')': lv->token.type = TOKEN_IDENTIFIER_TYPE; - lv->token.identifierValue = _strndup(tokenStart, string - tokenStart - 1); + lv->token.identifierValue = strndup(tokenStart, string - tokenStart - 1); state = LEX_EXPECT_OPERATOR; break; default: @@ -298,7 +288,7 @@ size_t lexExpression(struct LexVector* lv, const char* string, size_t length) { break; case LEX_EXPECT_IDENTIFIER: lv->token.type = TOKEN_IDENTIFIER_TYPE; - lv->token.identifierValue = _strndup(tokenStart, string - tokenStart); + lv->token.identifierValue = strndup(tokenStart, string - tokenStart); break; case LEX_EXPECT_OPERATOR: lvNext = malloc(sizeof(struct LexVector)); diff --git a/src/util/string.c b/src/util/string.c new file mode 100644 index 000000000..e38c78be4 --- /dev/null +++ b/src/util/string.c @@ -0,0 +1,25 @@ +#include "util/string.h" + +#include + +#ifndef HAVE_STRNDUP +char* strndup(const char* start, size_t len) { + // This is suboptimal, but anything recent should have strndup + char* out = malloc((len + 1) * sizeof(char)); + strncpy(out, start, len); + out[len] = '\0'; + return out; +} +#endif + +char* strnrstr(const char* restrict haystack, const char* restrict needle, size_t len) { + char* last = 0; + const char* next = haystack; + size_t needleLen = strlen(needle); + for (; len >= needleLen; --len, ++next) { + if (strncmp(needle, next, needleLen) == 0) { + last = (char*) next; + } + } + return last; +} diff --git a/src/util/string.h b/src/util/string.h new file mode 100644 index 000000000..b78e20180 --- /dev/null +++ b/src/util/string.h @@ -0,0 +1,9 @@ +#ifndef UTIL_STRING_H +#define UTIL_STRING_H + +#include "util/common.h" + +char* strndup(const char* start, size_t len); +char* strnrstr(const char* restrict s1, const char* restrict s2, size_t len); + +#endif diff --git a/src/util/vfs.c b/src/util/vfs.c index 9c8b32332..ccd52877c 100644 --- a/src/util/vfs.c +++ b/src/util/vfs.c @@ -1,5 +1,7 @@ #include "util/vfs.h" +#include "util/string.h" + #include #include @@ -273,14 +275,7 @@ struct VFile* VDirOptionalOpenIncrementFile(struct VDir* dir, const char* realPa if (dotPoint) { len = (dotPoint - filename); } - const char* separator = 0; - const char* nextSeparator = filename; - size_t strstrlen = len; - while ((nextSeparator = strnstr(nextSeparator, infix, strstrlen))) { - strstrlen -= nextSeparator - separator - 1; - separator = nextSeparator; - ++nextSeparator; - } + const char* separator = strnrstr(filename, infix, len); if (!separator) { continue; }