mirror of https://github.com/mgba-emu/mgba.git
Move string utilities out to separate file (really fixing Linux build this time)
This commit is contained in:
parent
e956ad3f2f
commit
ca5f7a45ee
|
@ -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)
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
#include "util/string.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
|
@ -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
|
|
@ -1,5 +1,7 @@
|
|||
#include "util/vfs.h"
|
||||
|
||||
#include "util/string.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue