aboutsummaryrefslogtreecommitdiff
path: root/core/platform.cpp
diff options
context:
space:
mode:
authorMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
committerMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
commitad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f (patch)
tree4cc6f3288363889d7342f7f8407c0251e6904819 /core/platform.cpp
downloadflex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.tar.xz
flex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.zip
Initial 1.1.0 binary release
Diffstat (limited to 'core/platform.cpp')
-rw-r--r--core/platform.cpp348
1 files changed, 348 insertions, 0 deletions
diff --git a/core/platform.cpp b/core/platform.cpp
new file mode 100644
index 0000000..8846e9b
--- /dev/null
+++ b/core/platform.cpp
@@ -0,0 +1,348 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2013-2016 NVIDIA Corporation. All rights reserved.
+
+#include "core.h"
+#include "platform.h"
+#include "types.h"
+
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+using namespace std;
+
+#ifdef WIN32
+
+#include <windows.h>
+#include <commdlg.h>
+#include <mmsystem.h>
+
+double GetSeconds()
+{
+ static LARGE_INTEGER lastTime;
+ static LARGE_INTEGER freq;
+ static bool first = true;
+
+ if (first)
+ {
+ QueryPerformanceCounter(&lastTime);
+ QueryPerformanceFrequency(&freq);
+
+ first = false;
+ }
+
+ static double time = 0.0;
+
+ LARGE_INTEGER t;
+ QueryPerformanceCounter(&t);
+
+ __int64 delta = t.QuadPart-lastTime.QuadPart;
+ double deltaSeconds = double(delta) / double(freq.QuadPart);
+
+ time += deltaSeconds;
+
+ lastTime = t;
+
+ return time;
+
+}
+
+void Sleep(double seconds)
+{
+ ::Sleep(DWORD(seconds*1000));
+}
+
+
+//// helper function to get exe path
+//string GetExePath()
+//{
+// const uint32_t kMaxPathLength = 2048;
+//
+// char exepath[kMaxPathLength];
+//
+// // get exe path for file system
+// uint32_t i = GetModuleFileName(NULL, exepath, kMaxPathLength);
+//
+// // rfind first slash
+// while (i && exepath[i] != '\\' && exepath[i] != '//')
+// i--;
+//
+// // insert null terminater to cut off exe name
+// return string(&exepath[0], &exepath[i+1]);
+//}
+//
+//string FileOpenDialog(char *filter)
+//{
+// HWND owner=NULL;
+//
+// OPENFILENAME ofn;
+// char fileName[MAX_PATH] = "";
+// ZeroMemory(&ofn, sizeof(ofn));
+// ofn.lStructSize = sizeof(OPENFILENAME);
+// ofn.hwndOwner = owner;
+// ofn.lpstrFilter = filter;
+// ofn.lpstrFile = fileName;
+// ofn.nMaxFile = MAX_PATH;
+// ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
+// ofn.lpstrDefExt = "";
+//
+// string fileNameStr;
+//
+// if ( GetOpenFileName(&ofn) )
+// fileNameStr = fileName;
+//
+// return fileNameStr;
+//}
+//
+//bool FileMove(const char* src, const char* dest)
+//{
+// BOOL b = MoveFileEx(src, dest, MOVEFILE_REPLACE_EXISTING);
+// return b == TRUE;
+//}
+//
+//bool FileScan(const char* pattern, vector<string>& files)
+//{
+// HANDLE h;
+// WIN32_FIND_DATA info;
+//
+// // build a list of files
+// h = FindFirstFile(pattern, &info);
+//
+// if (h != INVALID_HANDLE_VALUE)
+// {
+// do
+// {
+// if (!(strcmp(info.cFileName, ".") == 0 || strcmp(info.cFileName, "..") == 0))
+// {
+// files.push_back(info.cFileName);
+// }
+// }
+// while (FindNextFile(h, &info));
+//
+// if (GetLastError() != ERROR_NO_MORE_FILES)
+// {
+// return false;
+// }
+//
+// FindClose(h);
+// }
+// else
+// {
+// return false;
+// }
+//
+// return true;
+//}
+
+
+#else
+
+// linux, mac platforms
+#include <sys/time.h>
+
+double GetSeconds()
+{
+ // Figure out time elapsed since last call to idle function
+ static struct timeval last_idle_time;
+ static double time = 0.0;
+
+ struct timeval time_now;
+ gettimeofday(&time_now, NULL);
+
+ if (last_idle_time.tv_usec == 0)
+ last_idle_time = time_now;
+
+ float dt = (float)(time_now.tv_sec - last_idle_time.tv_sec) + 1.0e-6*(time_now.tv_usec - last_idle_time.tv_usec);
+
+ time += dt;
+ last_idle_time = time_now;
+
+ return time;
+}
+
+#endif
+
+
+uint8_t* LoadFileToBuffer(const char* filename, uint32_t* sizeRead)
+{
+ FILE* file = fopen(filename, "rb");
+ if (file)
+ {
+ fseek(file, 0, SEEK_END);
+ long p = ftell(file);
+
+ uint8_t* buf = new uint8_t[p];
+ fseek(file, 0, SEEK_SET);
+ uint32_t len = uint32_t(fread(buf, 1, p, file));
+
+ fclose(file);
+
+ if (sizeRead)
+ {
+ *sizeRead = len;
+ }
+
+ return buf;
+ }
+ else
+ {
+ std::cout << "Could not open file for reading: " << filename << std::endl;
+ return NULL;
+ }
+}
+
+string LoadFileToString(const char* filename)
+{
+ //std::ifstream file(filename);
+ //return string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
+ uint32_t size;
+ uint8_t* buf = LoadFileToBuffer(filename, &size);
+
+ if (buf)
+ {
+ string s(buf, buf+size);
+ delete[] buf;
+
+ return s;
+ }
+ else
+ {
+ return "";
+ }
+}
+
+bool SaveStringToFile(const char* filename, const char* s)
+{
+ FILE* f = fopen(filename, "w");
+ if (!f)
+ {
+ std::cout << "Could not open file for writing: " << filename << std::endl;
+ return false;
+ }
+ else
+ {
+ fputs(s, f);
+ fclose(f);
+
+ return true;
+ }
+}
+
+
+string StripFilename(const char* path)
+{
+ // simply find the last
+ const char* iter=path;
+ const char* last=NULL;
+ while (*iter)
+ {
+ if (*iter == '\\' || *iter== '/')
+ last = iter;
+
+ ++iter;
+ }
+
+ if (last)
+ {
+ return string(path, last+1);
+ }
+ else
+ return string();
+
+}
+
+string GetExtension(const char* path)
+{
+ const char* s = strrchr(path, '.');
+ if (s)
+ {
+ return string(s+1);
+ }
+ else
+ {
+ return "";
+ }
+}
+
+string StripExtension(const char* path)
+{
+ const char* s = strrchr(path, '.');
+ if (s)
+ {
+ return string(path, s);
+ }
+ else
+ {
+ return string(path);
+ }
+}
+
+string NormalizePath(const char* path)
+{
+ string p(path);
+ replace(p.begin(), p.end(), '\\', '/');
+ transform(p.begin(), p.end(), p.begin(), ::tolower);
+
+ return p;
+}
+
+// strips the path from a file name
+string StripPath(const char* path)
+{
+ // simply find the last
+ const char* iter=path;
+ const char* last=NULL;
+ while (*iter)
+ {
+ if (*iter == '\\' || *iter== '/')
+ last = iter;
+
+ ++iter;
+ }
+
+ if (!last)
+ {
+ return string(path);
+ }
+
+ // eat the last slash
+ ++last;
+
+ if (*last)
+ {
+ return string(last);
+ }
+ else
+ {
+ return string();
+ }
+}
+