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 @@
(defined(__cpp_constexpr) && __cpp_constexpr >= 200704)
#define FLATBUFFERS_CONSTEXPR constexpr
#else
#define FLATBUFFERS_CONSTEXPR
#define FLATBUFFERS_CONSTEXPR
const
#endif
#if (defined(__cplusplus) && __cplusplus >= 201402L) || \
...
...
include/flatbuffers/util.h
View file @
b99332ef
...
...
@@ -17,41 +17,19 @@
#ifndef FLATBUFFERS_UTIL_H_
#define FLATBUFFERS_UTIL_H_
// clang-format off
#include "flatbuffers/base.h"
#include <errno.h>
#ifndef FLATBUFFERS_PREFER_PRINTF
# include <sstream>
#else // FLATBUFFERS_PREFER_PRINTF
#else
// FLATBUFFERS_PREFER_PRINTF
# include <float.h>
# include <stdio.h>
#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>
#endif // FLATBUFFERS_PREFER_PRINTF
#include <iomanip>
#include <fstream>
#include "flatbuffers/base.h"
#include <string>
namespace
flatbuffers
{
...
...
@@ -435,13 +413,7 @@ bool LoadFile(const char *name, bool binary, std::string *buf);
// If "binary" is false data is written using ifstream's
// text mode, otherwise data is written with no
// transcoding.
inline
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
();
}
bool
SaveFile
(
const
char
*
name
,
const
char
*
buf
,
size_t
len
,
bool
binary
);
// Save data "buf" into file "name" returning true if
// successful, false otherwise. If "binary" is false
...
...
@@ -457,102 +429,35 @@ inline bool SaveFile(const char *name, const std::string &buf, bool binary) {
// Windows ('/' or '\\') separators are used.
// Any new separators inserted are always posix.
// 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 ':'
FLATBUFFERS_CONSTEXPR
char
kPathSeparator
=
'/'
;
// Returns the path with the extension, if any, removed.
inline
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
StripExtension
(
const
std
::
string
&
filepath
);
// Returns the extension, if any.
inline
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
GetExtension
(
const
std
::
string
&
filepath
);
// Return the last component of the path, after the last separator.
inline
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
StripPath
(
const
std
::
string
&
filepath
);
// Strip the last component of the path + separator.
inline
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
StripFileName
(
const
std
::
string
&
filepath
);
// Concatenates a path with a filename, regardless of wether the path
// ends in a separator or not.
inline
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
ConCatPathFileName
(
const
std
::
string
&
path
,
const
std
::
string
&
filename
);
// Replaces any '\\' separators with '/'
inline
std
::
string
PosixPath
(
const
char
*
path
)
{
std
::
string
p
=
path
;
std
::
replace
(
p
.
begin
(),
p
.
end
(),
'\\'
,
'/'
);
return
p
;
}
std
::
string
PosixPath
(
const
char
*
path
);
// This function ensure a directory exists, by recursively
// creating dirs for any parts of the path that don't exist yet.
inline
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
}
void
EnsureDirExists
(
const
std
::
string
&
filepath
);
// Obtains the absolute path from any other path.
// Returns the input path if the absolute path couldn't be resolved.
inline
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
}
std
::
string
AbsolutePath
(
const
std
::
string
&
filepath
);
// To and from UTF-8 unicode conversion functions
...
...
src/util.cpp
View file @
b99332ef
...
...
@@ -14,10 +14,31 @@
* 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 <sys/stat.h>
#include <clocale>
#include <fstream>
namespace
flatbuffers
{
bool
FileExistsRaw
(
const
char
*
name
)
{
...
...
@@ -88,6 +109,97 @@ FileExistsFunction SetFileExistsFunction(
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.
#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && \
(FLATBUFFERS_LOCALE_INDEPENDENT > 0)
...
...
@@ -123,11 +235,10 @@ bool SetGlobalTestLocale(const char *locale_name, std::string *_value) {
if
(
_value
)
*
_value
=
std
::
string
(
the_locale
);
return
true
;
}
#ifdef _MSC_VER
# pragma warning(disable : 4996) // _CRT_SECURE_NO_WARNINGS
#endif
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
);
if
(
!
env_str
)
return
false
;
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