summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rwxr-xr-xandroid/jni/Android.mk3
-rw-r--r--include/flatbuffers/util.h33
-rw-r--r--src/util.cpp71
4 files changed, 87 insertions, 22 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d2edf829..70a7dd54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,7 @@ set(FlatBuffers_Library_SRCS
src/idl_parser.cpp
src/idl_gen_text.cpp
src/reflection.cpp
+ src/util.cpp
)
set(FlatBuffers_Compiler_SRCS
@@ -68,6 +69,7 @@ set(FlatBuffers_Sample_Text_SRCS
include/flatbuffers/util.h
src/idl_parser.cpp
src/idl_gen_text.cpp
+ src/util.cpp
samples/sample_text.cpp
# file generated by running compiler on samples/monster.fbs
${CMAKE_CURRENT_BINARY_DIR}/samples/monster_generated.h
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index 905fbe91..f5f83f17 100755
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -33,7 +33,8 @@ include $(CLEAR_VARS)
LOCAL_MODULE := flatbuffers_extra
LOCAL_SRC_FILES := src/idl_parser.cpp \
src/idl_gen_text.cpp \
- src/reflection.cpp
+ src/reflection.cpp \
+ src/util.cpp
LOCAL_STATIC_LIBRARIES := flatbuffers
include $(BUILD_STATIC_LIBRARY)
diff --git a/include/flatbuffers/util.h b/include/flatbuffers/util.h
index 30037963..cfb211f0 100644
--- a/include/flatbuffers/util.h
+++ b/include/flatbuffers/util.h
@@ -111,33 +111,24 @@ inline int64_t StringToUInt(const char *str, int base = 10) {
#endif
}
+typedef bool (*LoadFileFunction)(const char *filename, bool binary,
+ std::string *dest);
+typedef bool (*FileExistsFunction)(const char *filename);
+
+LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function);
+
+FileExistsFunction SetFileExistsFunction(FileExistsFunction
+ file_exists_function);
+
+
// Check if file "name" exists.
-inline bool FileExists(const char *name) {
- std::ifstream ifs(name);
- return ifs.good();
-}
+bool FileExists(const char *name);
// Load file "name" into "buf" returning true if successful
// false otherwise. If "binary" is false data is read
// using ifstream's text mode, otherwise data is read with
// no transcoding.
-inline bool LoadFile(const char *name, bool binary, std::string *buf) {
- std::ifstream ifs(name, binary ? std::ifstream::binary : std::ifstream::in);
- if (!ifs.is_open()) return false;
- if (binary) {
- // The fastest way to read a file into a string.
- ifs.seekg(0, std::ios::end);
- (*buf).resize(static_cast<size_t>(ifs.tellg()));
- ifs.seekg(0, std::ios::beg);
- ifs.read(&(*buf)[0], (*buf).size());
- } else {
- // This is slower, but works correctly on all platforms for text files.
- std::ostringstream oss;
- oss << ifs.rdbuf();
- *buf = oss.str();
- }
- return !ifs.bad();
-}
+bool LoadFile(const char *name, bool binary, std::string *buf);
// Save data "buf" of length "len" bytes into a file
// "name" returning true if successful, false otherwise.
diff --git a/src/util.cpp b/src/util.cpp
new file mode 100644
index 00000000..452e9eae
--- /dev/null
+++ b/src/util.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "flatbuffers/util.h"
+
+namespace flatbuffers {
+
+bool FileExistsRaw(const char *name) {
+ std::ifstream ifs(name);
+ return ifs.good();
+}
+
+bool LoadFileRaw(const char *name, bool binary, std::string *buf) {
+ std::ifstream ifs(name, binary ? std::ifstream::binary : std::ifstream::in);
+ if (!ifs.is_open()) return false;
+ if (binary) {
+ // The fastest way to read a file into a string.
+ ifs.seekg(0, std::ios::end);
+ (*buf).resize(static_cast<size_t>(ifs.tellg()));
+ ifs.seekg(0, std::ios::beg);
+ ifs.read(&(*buf)[0], (*buf).size());
+ } else {
+ // This is slower, but works correctly on all platforms for text files.
+ std::ostringstream oss;
+ oss << ifs.rdbuf();
+ *buf = oss.str();
+ }
+ return !ifs.bad();
+}
+
+static LoadFileFunction g_load_file_function = LoadFileRaw;
+static FileExistsFunction g_file_exists_function = FileExistsRaw;
+
+bool LoadFile(const char *name, bool binary, std::string *buf) {
+ assert(g_load_file_function);
+ return g_load_file_function(name, binary, buf);
+}
+
+bool FileExists(const char *name) {
+ assert(g_file_exists_function);
+ return g_file_exists_function(name);
+}
+
+LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function) {
+ LoadFileFunction previous_function = g_load_file_function;
+ g_load_file_function = load_file_function ? load_file_function : LoadFileRaw;
+ return previous_function;
+}
+
+FileExistsFunction SetFileExistsFunction(
+ FileExistsFunction file_exists_function) {
+ FileExistsFunction previous_function = g_file_exists_function;
+ g_file_exists_function = file_exists_function ?
+ file_exists_function : FileExistsRaw;
+ return previous_function;
+}
+
+} // namespace flatbuffers