Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
flatbuffers
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
flatbuffers
Commits
b99332ef
Commit
b99332ef
authored
Jan 07, 2019
by
Vladimir Glavnyy
Committed by
Wouter van Oortmerssen
Jan 07, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move all platform dependent headers and code to util.cpp module (#5106)
parent
dd288f71
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
118 deletions
+134
-118
base.h
include/flatbuffers/base.h
+1
-1
util.h
include/flatbuffers/util.h
+17
-112
util.cpp
src/util.cpp
+116
-5
No files found.
include/flatbuffers/base.h
View file @
b99332ef
...
@@ -134,7 +134,7 @@
...
@@ -134,7 +134,7 @@
(defined(__cpp_constexpr) && __cpp_constexpr >= 200704)
(defined(__cpp_constexpr) && __cpp_constexpr >= 200704)
#define FLATBUFFERS_CONSTEXPR constexpr
#define FLATBUFFERS_CONSTEXPR constexpr
#else
#else
#define FLATBUFFERS_CONSTEXPR
#define FLATBUFFERS_CONSTEXPR
const
#endif
#endif
#if (defined(__cplusplus) && __cplusplus >= 201402L) || \
#if (defined(__cplusplus) && __cplusplus >= 201402L) || \
...
...
include/flatbuffers/util.h
View file @
b99332ef
...
@@ -17,41 +17,19 @@
...
@@ -17,41 +17,19 @@
#ifndef FLATBUFFERS_UTIL_H_
#ifndef FLATBUFFERS_UTIL_H_
#define FLATBUFFERS_UTIL_H_
#define FLATBUFFERS_UTIL_H_
// clang-format off
#include "flatbuffers/base.h"
#include <errno.h>
#ifndef FLATBUFFERS_PREFER_PRINTF
#ifndef FLATBUFFERS_PREFER_PRINTF
# include <sstream>
# include <sstream>
#else // FLATBUFFERS_PREFER_PRINTF
#else
// FLATBUFFERS_PREFER_PRINTF
# include <float.h>
# include <float.h>
# include <stdio.h>
# include <stdio.h>
#endif // FLATBUFFERS_PREFER_PRINTF
#endif // FLATBUFFERS_PREFER_PRINTF
#ifdef _WIN32
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# ifndef NOMINMAX
# define NOMINMAX
# endif
# include <windows.h> // Must be included before <direct.h>
# include <direct.h>
# include <winbase.h>
# undef interface // This is also important because of reasons
#else
# include <limits.h>
#endif
// clang-format on
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <iomanip>
#include <iomanip>
#include <fstream>
#include <string>
#include "flatbuffers/base.h"
namespace
flatbuffers
{
namespace
flatbuffers
{
...
@@ -435,13 +413,7 @@ bool LoadFile(const char *name, bool binary, std::string *buf);
...
@@ -435,13 +413,7 @@ bool LoadFile(const char *name, bool binary, std::string *buf);
// If "binary" is false data is written using ifstream's
// If "binary" is false data is written using ifstream's
// text mode, otherwise data is written with no
// text mode, otherwise data is written with no
// transcoding.
// transcoding.
inline
bool
SaveFile
(
const
char
*
name
,
const
char
*
buf
,
size_t
len
,
bool
SaveFile
(
const
char
*
name
,
const
char
*
buf
,
size_t
len
,
bool
binary
);
bool
binary
)
{
std
::
ofstream
ofs
(
name
,
binary
?
std
:
:
ofstream
::
binary
:
std
::
ofstream
::
out
);
if
(
!
ofs
.
is_open
())
return
false
;
ofs
.
write
(
buf
,
len
);
return
!
ofs
.
bad
();
}
// Save data "buf" into file "name" returning true if
// Save data "buf" into file "name" returning true if
// successful, false otherwise. If "binary" is false
// successful, false otherwise. If "binary" is false
...
@@ -457,102 +429,35 @@ inline bool SaveFile(const char *name, const std::string &buf, bool binary) {
...
@@ -457,102 +429,35 @@ inline bool SaveFile(const char *name, const std::string &buf, bool binary) {
// Windows ('/' or '\\') separators are used.
// Windows ('/' or '\\') separators are used.
// Any new separators inserted are always posix.
// Any new separators inserted are always posix.
FLATBUFFERS_CONSTEXPR
char
kPathSeparator
=
'/'
;
// We internally store paths in posix format ('/'). Paths supplied
// by the user should go through PosixPath to ensure correct behavior
// on Windows when paths are string-compared.
static
const
char
kPathSeparator
=
'/'
;
static
const
char
kPathSeparatorWindows
=
'\\'
;
static
const
char
*
PathSeparatorSet
=
"
\\
/"
;
// Intentionally no ':'
// Returns the path with the extension, if any, removed.
// Returns the path with the extension, if any, removed.
inline
std
::
string
StripExtension
(
const
std
::
string
&
filepath
)
{
std
::
string
StripExtension
(
const
std
::
string
&
filepath
);
size_t
i
=
filepath
.
find_last_of
(
"."
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
0
,
i
)
:
filepath
;
}
// Returns the extension, if any.
// Returns the extension, if any.
inline
std
::
string
GetExtension
(
const
std
::
string
&
filepath
)
{
std
::
string
GetExtension
(
const
std
::
string
&
filepath
);
size_t
i
=
filepath
.
find_last_of
(
"."
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
i
+
1
)
:
""
;
}
// Return the last component of the path, after the last separator.
// Return the last component of the path, after the last separator.
inline
std
::
string
StripPath
(
const
std
::
string
&
filepath
)
{
std
::
string
StripPath
(
const
std
::
string
&
filepath
);
size_t
i
=
filepath
.
find_last_of
(
PathSeparatorSet
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
i
+
1
)
:
filepath
;
}
// Strip the last component of the path + separator.
// Strip the last component of the path + separator.
inline
std
::
string
StripFileName
(
const
std
::
string
&
filepath
)
{
std
::
string
StripFileName
(
const
std
::
string
&
filepath
);
size_t
i
=
filepath
.
find_last_of
(
PathSeparatorSet
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
0
,
i
)
:
""
;
}
// Concatenates a path with a filename, regardless of wether the path
// Concatenates a path with a filename, regardless of wether the path
// ends in a separator or not.
// ends in a separator or not.
inline
std
::
string
ConCatPathFileName
(
const
std
::
string
&
path
,
std
::
string
ConCatPathFileName
(
const
std
::
string
&
path
,
const
std
::
string
&
filename
)
{
const
std
::
string
&
filename
);
std
::
string
filepath
=
path
;
if
(
filepath
.
length
())
{
char
&
filepath_last_character
=
string_back
(
filepath
);
if
(
filepath_last_character
==
kPathSeparatorWindows
)
{
filepath_last_character
=
kPathSeparator
;
}
else
if
(
filepath_last_character
!=
kPathSeparator
)
{
filepath
+=
kPathSeparator
;
}
}
filepath
+=
filename
;
// Ignore './' at the start of filepath.
if
(
filepath
[
0
]
==
'.'
&&
filepath
[
1
]
==
kPathSeparator
)
{
filepath
.
erase
(
0
,
2
);
}
return
filepath
;
}
// Replaces any '\\' separators with '/'
// Replaces any '\\' separators with '/'
inline
std
::
string
PosixPath
(
const
char
*
path
)
{
std
::
string
PosixPath
(
const
char
*
path
);
std
::
string
p
=
path
;
std
::
replace
(
p
.
begin
(),
p
.
end
(),
'\\'
,
'/'
);
return
p
;
}
// This function ensure a directory exists, by recursively
// This function ensure a directory exists, by recursively
// creating dirs for any parts of the path that don't exist yet.
// creating dirs for any parts of the path that don't exist yet.
inline
void
EnsureDirExists
(
const
std
::
string
&
filepath
)
{
void
EnsureDirExists
(
const
std
::
string
&
filepath
);
auto
parent
=
StripFileName
(
filepath
);
if
(
parent
.
length
())
EnsureDirExists
(
parent
);
// clang-format off
#ifdef _WIN32
(
void
)
_mkdir
(
filepath
.
c_str
());
#else
mkdir
(
filepath
.
c_str
(),
S_IRWXU
|
S_IRGRP
|
S_IXGRP
);
#endif
// clang-format on
}
// Obtains the absolute path from any other path.
// Obtains the absolute path from any other path.
// Returns the input path if the absolute path couldn't be resolved.
// Returns the input path if the absolute path couldn't be resolved.
inline
std
::
string
AbsolutePath
(
const
std
::
string
&
filepath
)
{
std
::
string
AbsolutePath
(
const
std
::
string
&
filepath
);
// clang-format off
#ifdef FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
return
filepath
;
#else
#ifdef _WIN32
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
)
#endif
?
abs_path
:
filepath
;
#endif // FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
// clang-format on
}
// To and from UTF-8 unicode conversion functions
// To and from UTF-8 unicode conversion functions
...
...
src/util.cpp
View file @
b99332ef
...
@@ -14,10 +14,31 @@
...
@@ -14,10 +14,31 @@
* limitations under the License.
* limitations under the License.
*/
*/
#include <clocale>
// clang-format off
// Dont't remove `format off`, it prevent reordering of win-includes.
#ifdef _WIN32
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# ifndef NOMINMAX
# define NOMINMAX
# endif
# include <windows.h> // Must be included before <direct.h>
# include <direct.h>
# include <winbase.h>
# undef interface // This is also important because of reasons
#else
# include <limits.h>
#endif
// clang-format on
#include "flatbuffers/base.h"
#include "flatbuffers/util.h"
#include "flatbuffers/util.h"
#include <sys/stat.h>
#include <clocale>
#include <fstream>
namespace
flatbuffers
{
namespace
flatbuffers
{
bool
FileExistsRaw
(
const
char
*
name
)
{
bool
FileExistsRaw
(
const
char
*
name
)
{
...
@@ -88,6 +109,97 @@ FileExistsFunction SetFileExistsFunction(
...
@@ -88,6 +109,97 @@ FileExistsFunction SetFileExistsFunction(
return
previous_function
;
return
previous_function
;
}
}
bool
SaveFile
(
const
char
*
name
,
const
char
*
buf
,
size_t
len
,
bool
binary
)
{
std
::
ofstream
ofs
(
name
,
binary
?
std
::
ofstream
::
binary
:
std
::
ofstream
::
out
);
if
(
!
ofs
.
is_open
())
return
false
;
ofs
.
write
(
buf
,
len
);
return
!
ofs
.
bad
();
}
// We internally store paths in posix format ('/'). Paths supplied
// by the user should go through PosixPath to ensure correct behavior
// on Windows when paths are string-compared.
static
const
char
kPathSeparatorWindows
=
'\\'
;
static
const
char
*
PathSeparatorSet
=
"
\\
/"
;
// Intentionally no ':'
std
::
string
StripExtension
(
const
std
::
string
&
filepath
)
{
size_t
i
=
filepath
.
find_last_of
(
"."
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
0
,
i
)
:
filepath
;
}
std
::
string
GetExtension
(
const
std
::
string
&
filepath
)
{
size_t
i
=
filepath
.
find_last_of
(
"."
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
i
+
1
)
:
""
;
}
std
::
string
StripPath
(
const
std
::
string
&
filepath
)
{
size_t
i
=
filepath
.
find_last_of
(
PathSeparatorSet
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
i
+
1
)
:
filepath
;
}
std
::
string
StripFileName
(
const
std
::
string
&
filepath
)
{
size_t
i
=
filepath
.
find_last_of
(
PathSeparatorSet
);
return
i
!=
std
::
string
::
npos
?
filepath
.
substr
(
0
,
i
)
:
""
;
}
std
::
string
ConCatPathFileName
(
const
std
::
string
&
path
,
const
std
::
string
&
filename
)
{
std
::
string
filepath
=
path
;
if
(
filepath
.
length
())
{
char
&
filepath_last_character
=
string_back
(
filepath
);
if
(
filepath_last_character
==
kPathSeparatorWindows
)
{
filepath_last_character
=
kPathSeparator
;
}
else
if
(
filepath_last_character
!=
kPathSeparator
)
{
filepath
+=
kPathSeparator
;
}
}
filepath
+=
filename
;
// Ignore './' at the start of filepath.
if
(
filepath
[
0
]
==
'.'
&&
filepath
[
1
]
==
kPathSeparator
)
{
filepath
.
erase
(
0
,
2
);
}
return
filepath
;
}
std
::
string
PosixPath
(
const
char
*
path
)
{
std
::
string
p
=
path
;
std
::
replace
(
p
.
begin
(),
p
.
end
(),
'\\'
,
'/'
);
return
p
;
}
void
EnsureDirExists
(
const
std
::
string
&
filepath
)
{
auto
parent
=
StripFileName
(
filepath
);
if
(
parent
.
length
())
EnsureDirExists
(
parent
);
// clang-format off
#ifdef _WIN32
(
void
)
_mkdir
(
filepath
.
c_str
());
#else
mkdir
(
filepath
.
c_str
(),
S_IRWXU
|
S_IRGRP
|
S_IXGRP
);
#endif
// clang-format on
}
std
::
string
AbsolutePath
(
const
std
::
string
&
filepath
)
{
// clang-format off
#ifdef FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
return
filepath
;
#else
#ifdef _WIN32
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
)
#endif
?
abs_path
:
filepath
;
#endif // FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
// clang-format on
}
// Locale-independent code.
// Locale-independent code.
#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && \
#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && \
(FLATBUFFERS_LOCALE_INDEPENDENT > 0)
(FLATBUFFERS_LOCALE_INDEPENDENT > 0)
...
@@ -123,11 +235,10 @@ bool SetGlobalTestLocale(const char *locale_name, std::string *_value) {
...
@@ -123,11 +235,10 @@ bool SetGlobalTestLocale(const char *locale_name, std::string *_value) {
if
(
_value
)
*
_value
=
std
::
string
(
the_locale
);
if
(
_value
)
*
_value
=
std
::
string
(
the_locale
);
return
true
;
return
true
;
}
}
#ifdef _MSC_VER
# pragma warning(disable : 4996) // _CRT_SECURE_NO_WARNINGS
#endif
bool
ReadEnvironmentVariable
(
const
char
*
var_name
,
std
::
string
*
_value
)
{
bool
ReadEnvironmentVariable
(
const
char
*
var_name
,
std
::
string
*
_value
)
{
#ifdef _MSC_VER
__pragma
(
warning
(
disable
:
4996
));
// _CRT_SECURE_NO_WARNINGS
#endif
auto
env_str
=
std
::
getenv
(
var_name
);
auto
env_str
=
std
::
getenv
(
var_name
);
if
(
!
env_str
)
return
false
;
if
(
!
env_str
)
return
false
;
if
(
_value
)
*
_value
=
std
::
string
(
env_str
);
if
(
_value
)
*
_value
=
std
::
string
(
env_str
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment