[C++] Updates real_path to be truly portable (#5787)

* Removes posix definition

stat and fseeko are not used. Tested on QNX (GCC 5.4.0) and MinGw

* Updates realpath to more modern (2008) version

* Removes unix specific headers

* Adds detection of strtoll_l as android API < 21 does not provide it

* Includes cstdlib and formatting

Removes cmakelist alterations as not necessary. Formatting not complete.

* Stdlib outside if

Stdlib is available on all platforms

* Fixes indentation

* Adds locale check to android build

* Adds missing brace

* full names

* Removes again, no clue

* Updates base to check for locale independent android

Cmake already checks for others, also MSC?

* Changes to test on available and not requested

* Fixes android bad xopen_version define

* Removes warning
This commit is contained in:
mjvankampen
2020-06-25 23:40:10 +02:00
committed by GitHub
parent e5a8f76a4b
commit 7571b2ac56
2 changed files with 22 additions and 9 deletions

View File

@@ -46,6 +46,10 @@
#include <iterator>
#include <memory>
#if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT)
#include <unistd.h>
#endif
#ifdef _STLPORT_VERSION
#define FLATBUFFERS_CPP98_STL
#endif
@@ -53,6 +57,10 @@
#include <functional>
#endif
#ifdef __ANDROID__
#include <android/api-level.h>
#endif
#include "flatbuffers/stl_emulation.h"
#if defined(__ICCARM__)
@@ -236,10 +244,8 @@ namespace flatbuffers {
#ifndef FLATBUFFERS_LOCALE_INDEPENDENT
// Enable locale independent functions {strtof_l, strtod_l,strtoll_l, strtoull_l}.
// They are part of the POSIX-2008 but not part of the C/C++ standard.
// GCC/Clang have definition (_XOPEN_SOURCE>=700) if POSIX-2008.
#if ((defined(_MSC_VER) && _MSC_VER >= 1800) || \
(defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE>=700)))
(defined(_XOPEN_VERSION) && (_XOPEN_VERSION>=700)) && (!defined(__ANDROID_API__) || (defined(__ANDROID_API__) && (__ANDROID_API__>=21))))
#define FLATBUFFERS_LOCALE_INDEPENDENT 1
#else
#define FLATBUFFERS_LOCALE_INDEPENDENT 0

View File

@@ -16,7 +16,10 @@
// clang-format off
// Dont't remove `format off`, it prevent reordering of win-includes.
#define _POSIX_C_SOURCE 200112L // For stat from stat/stat.h and fseeko() (POSIX extensions).
# define _POSIX_C_SOURCE 200809L
# define _XOPEN_SOURCE 700L
#ifdef _WIN32
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
@@ -31,9 +34,6 @@
# include <direct.h>
# include <winbase.h>
# undef interface // This is also important because of reasons
#else
# define _XOPEN_SOURCE 600 // For PATH_MAX from limits.h (SUSv2 extension)
# include <limits.h>
#endif
// clang-format on
@@ -42,6 +42,7 @@
#include <sys/stat.h>
#include <clocale>
#include <cstdlib>
#include <fstream>
namespace flatbuffers {
@@ -196,8 +197,14 @@ std::string AbsolutePath(const std::string &filepath) {
char abs_path[MAX_PATH];
return GetFullPathNameA(filepath.c_str(), MAX_PATH, abs_path, nullptr)
#else
char abs_path[PATH_MAX];
return realpath(filepath.c_str(), abs_path)
char *abs_path_temp = realpath(filepath.c_str(), nullptr);
bool success = abs_path_temp != nullptr;
std::string abs_path;
if(success) {
abs_path = abs_path_temp;
free(abs_path_temp);
}
return success
#endif
? abs_path
: filepath;