summaryrefslogtreecommitdiff
path: root/rotord/ofUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/ofUtils.cpp')
-rwxr-xr-xrotord/ofUtils.cpp745
1 files changed, 745 insertions, 0 deletions
diff --git a/rotord/ofUtils.cpp b/rotord/ofUtils.cpp
new file mode 100755
index 0000000..7d7d9cc
--- /dev/null
+++ b/rotord/ofUtils.cpp
@@ -0,0 +1,745 @@
+#include "ofUtils.h"
+//#include "ofImage.h"
+//#include "ofTypes.h"
+//#include "ofGraphics.h"
+//#include "ofAppRunner.h"
+
+#include "Poco/String.h"
+#include "Poco/LocalDateTime.h"
+#include "Poco/DateTimeFormatter.h"
+
+#include <cctype> // for toupper
+
+
+
+/*
+#ifdef TARGET_WIN32
+ #ifndef _MSC_VER
+ #include <unistd.h> // this if for MINGW / _getcwd
+ #include <sys/param.h> // for MAXPATHLEN
+ #endif
+#endif
+
+
+#if defined(TARGET_OF_IPHONE) || defined(TARGET_OSX ) || defined(TARGET_LINUX)
+ #include <sys/time.h>
+#endif
+
+#ifdef TARGET_OSX
+ #ifndef TARGET_OF_IPHONE
+ #include <mach-o/dyld.h>
+ #include <sys/param.h> // for MAXPATHLEN
+ #endif
+#endif
+
+#ifdef TARGET_WIN32
+ #include <mmsystem.h>
+ #ifdef _MSC_VER
+ #include <direct.h>
+ #endif
+
+#endif
+*/
+
+#ifndef MAXPATHLEN
+ #define MAXPATHLEN 1024
+#endif
+
+
+static bool enableDataPath = true;
+//static unsigned long startTime = ofGetSystemTime(); // better at the first frame ?? (currently, there is some delay from static init, to running.
+//static unsigned long startTimeMicros = ofGetSystemTimeMicros();
+
+/*
+//--------------------------------------
+unsigned long ofGetElapsedTimeMillis(){
+ return ofGetSystemTime() - startTime;
+}
+
+//--------------------------------------
+unsigned long ofGetElapsedTimeMicros(){
+ return ofGetSystemTimeMicros() - startTimeMicros;
+}
+
+//--------------------------------------
+float ofGetElapsedTimef(){
+ return ofGetElapsedTimeMicros() / 1000000.0f;
+}
+
+//--------------------------------------
+void ofResetElapsedTimeCounter(){
+ startTime = ofGetSystemTime();
+ startTimeMicros = ofGetSystemTimeMicros();
+}
+*/
+//=======================================
+// this is from freeglut, and used internally:
+/* Platform-dependent time in milliseconds, as an unsigned 32-bit integer.
+ * This value wraps every 49.7 days, but integer overflows cancel
+ * when subtracting an initial start time, unless the total time exceeds
+ * 32-bit, where the GLUT API return value is also overflowed.
+ */
+/*
+unsigned long ofGetSystemTime( ) {
+ #ifndef TARGET_WIN32
+ struct timeval now;
+ gettimeofday( &now, NULL );
+ return now.tv_usec/1000 + now.tv_sec*1000;
+ #else
+ #if defined(_WIN32_WCE)
+ return GetTickCount();
+ #else
+ return timeGetTime();
+ #endif
+ #endif
+}
+*/
+
+/*
+unsigned long ofGetSystemTimeMicros( ) {
+ #ifndef TARGET_WIN32
+ struct timeval now;
+ gettimeofday( &now, NULL );
+ return now.tv_usec + now.tv_sec*1000000;
+ #else
+ #if defined(_WIN32_WCE)
+ return GetTickCount()*1000;
+ #else
+ return timeGetTime()*1000;
+ #endif
+ #endif
+}
+*/
+//--------------------------------------------------
+unsigned int ofGetUnixTime(){
+ return (unsigned int)time(NULL);
+}
+
+//default ofGetTimestampString returns in this format: 2011-01-15-18-29-35-299
+//--------------------------------------------------
+string ofGetTimestampString(){
+ string timeFormat = "%Y-%m-%d-%H-%M-%S-%i";
+ Poco::LocalDateTime now;
+ return Poco::DateTimeFormatter::format(now, timeFormat);
+}
+
+//specify the string format - eg: %Y-%m-%d-%H-%M-%S-%i ( 2011-01-15-18-29-35-299 )
+//--------------------------------------------------
+string ofGetTimestampString(string timestampFormat){
+ Poco::LocalDateTime now;
+ return Poco::DateTimeFormatter::format(now, timestampFormat);
+}
+
+//--------------------------------------------------
+int ofGetSeconds(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ return local.tm_sec;
+}
+
+//--------------------------------------------------
+int ofGetMinutes(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ return local.tm_min;
+}
+
+//--------------------------------------------------
+int ofGetHours(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ return local.tm_hour;
+}
+
+//--------------------------------------------------
+int ofGetYear(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ int year = local.tm_year + 1900;
+ return year;
+}
+
+//--------------------------------------------------
+int ofGetMonth(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ int month = local.tm_mon + 1;
+ return month;
+}
+
+//--------------------------------------------------
+int ofGetDay(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ return local.tm_mday;
+}
+
+//--------------------------------------------------
+int ofGetWeekday(){
+ time_t curr;
+ tm local;
+ time(&curr);
+ local =*(localtime(&curr));
+ return local.tm_wday;
+}
+
+//--------------------------------------------------
+void ofEnableDataPath(){
+ enableDataPath = true;
+}
+
+//--------------------------------------------------
+void ofDisableDataPath(){
+ enableDataPath = false;
+}
+
+//--------------------------------------------------
+//use ofSetDataPathRoot() to override this
+static string & dataPathRoot(){
+#if defined TARGET_OSX
+ static string * dataPathRoot = new string("../../../data/");
+#elif defined TARGET_ANDROID
+ static string * dataPathRoot = new string("sdcard/");
+#elif defined(TARGET_LINUX)
+ static string * dataPathRoot = new string(ofFilePath::join(ofFilePath::getCurrentExeDir(), "data/"));
+#else
+ static string * dataPathRoot = new string("data/");
+#endif
+ return *dataPathRoot;
+}
+
+static bool & isDataPathSet(){
+ static bool * dataPathSet = new bool(false);
+ return * dataPathSet;
+}
+
+//--------------------------------------------------
+void ofSetDataPathRoot(string newRoot){
+ string newPath = "";
+
+ #ifdef TARGET_OSX
+ #ifndef TARGET_OF_IPHONE
+ char path[MAXPATHLEN];
+ uint32_t size = sizeof(path);
+
+ if (_NSGetExecutablePath(path, &size) == 0){
+ //printf("executable path is %s\n", path);
+ string pathStr = string(path);
+
+ //theo: check this with having '/' as a character in a folder name - OSX treats the '/' as a ':'
+ //checked with spaces too!
+
+ vector < string> pathBrokenUp = ofSplitString( pathStr, "/");
+
+ newPath = "";
+
+ for(int i = 0; i < pathBrokenUp.size()-1; i++){
+ newPath += pathBrokenUp[i];
+ newPath += "/";
+ }
+
+ //cout << newPath << endl; // some sanity checks here
+ //system( "pwd" );
+
+ chdir ( newPath.c_str() );
+ //system("pwd");
+ }else{
+ ofLog(OF_LOG_FATAL_ERROR, "buffer too small; need size %u\n", size);
+ }
+ #endif
+ #endif
+
+ dataPathRoot() = newRoot;
+ isDataPathSet() = true;
+}
+
+//--------------------------------------------------
+string ofToDataPath(string path, bool makeAbsolute){
+
+ if (!isDataPathSet())
+ ofSetDataPathRoot(dataPathRoot());
+
+ if( enableDataPath ){
+
+ //check if absolute path has been passed or if data path has already been applied
+ //do we want to check for C: D: etc ?? like substr(1, 2) == ':' ??
+ if( path.length()==0 || (path.substr(0,1) != "/" && path.substr(1,1) != ":" && path.substr(0,dataPathRoot().length()) != dataPathRoot())){
+ path = dataPathRoot()+path;
+ }
+
+ if(makeAbsolute && (path.length()==0 || path.substr(0,1) != "/")){
+ /*
+ #if !defined( TARGET_OF_IPHONE) & !defined(TARGET_ANDROID)
+
+ #ifndef TARGET_WIN32
+ char currDir[1024];
+ path = "/"+path;
+ path = getcwd(currDir, 1024)+path;
+
+ #else
+
+ char currDir[1024];
+ path = "\\"+path;
+ path = _getcwd(currDir, 1024)+path;
+ std::replace( path.begin(), path.end(), '/', '\\' ); // fix any unixy paths...
+
+
+ #endif
+
+
+ #else
+ //do we need iphone specific code here?
+ #endif
+ */
+ }
+
+ }
+ return path;
+}
+
+//----------------------------------------
+template <>
+string ofToHex(const string& value) {
+ ostringstream out;
+ // how many bytes are in the string
+ int numBytes = value.size();
+ for(int i = 0; i < numBytes; i++) {
+ // print each byte as a 2-character wide hex value
+ out << setfill('0') << setw(2) << hex << (unsigned int) ((unsigned char)value[i]);
+ }
+ return out.str();
+}
+
+//----------------------------------------
+string ofToHex(const char* value) {
+ // this function is necessary if you want to print a string
+ // using a syntax like ofToHex("test")
+ return ofToHex((string) value);
+}
+
+//----------------------------------------
+int ofToInt(const string& intString) {
+ int x = 0;
+ istringstream cur(intString);
+ cur >> x;
+ return x;
+}
+
+//----------------------------------------
+int ofHexToInt(const string& intHexString) {
+ int x = 0;
+ istringstream cur(intHexString);
+ cur >> hex >> x;
+ return x;
+}
+
+//----------------------------------------
+char ofHexToChar(const string& charHexString) {
+ int x = 0;
+ istringstream cur(charHexString);
+ cur >> hex >> x;
+ return (char) x;
+}
+
+//----------------------------------------
+float ofHexToFloat(const string& floatHexString) {
+ union intFloatUnion {
+ int x;
+ float f;
+ } myUnion;
+ myUnion.x = 0;
+ istringstream cur(floatHexString);
+ cur >> hex >> myUnion.x;
+ return myUnion.f;
+}
+
+//----------------------------------------
+string ofHexToString(const string& stringHexString) {
+ stringstream out;
+ stringstream stream(stringHexString);
+ // a hex string has two characters per byte
+ int numBytes = stringHexString.size() / 2;
+ for(int i = 0; i < numBytes; i++) {
+ string curByte;
+ // grab two characters from the hex string
+ stream >> setw(2) >> curByte;
+ // prepare to parse the two characters
+ stringstream curByteStream(curByte);
+ int cur = 0;
+ // parse the two characters as a hex-encoded int
+ curByteStream >> hex >> cur;
+ // add the int as a char to our output stream
+ out << (char) cur;
+ }
+ return out.str();
+}
+
+//----------------------------------------
+float ofToFloat(const string& floatString) {
+ float x = 0;
+ istringstream cur(floatString);
+ cur >> x;
+ return x;
+}
+
+//----------------------------------------
+bool ofToBool(const string& boolString) {
+ static const string trueString = "true";
+ static const string falseString = "false";
+ string lower = Poco::toLower(boolString);
+ if(lower == trueString) {
+ return true;
+ }
+ if(lower == falseString) {
+ return false;
+ }
+ bool x = false;
+ istringstream cur(lower);
+ cur >> x;
+ return x;
+}
+
+//----------------------------------------
+char ofToChar(const string& charString) {
+ char x = '\0';
+ istringstream cur(charString);
+ cur >> x;
+ return x;
+}
+
+//----------------------------------------
+template <> string ofToBinary(const string& value) {
+ stringstream out;
+ int numBytes = value.size();
+ for(int i = 0; i < numBytes; i++) {
+ bitset<8> bitBuffer(value[i]);
+ out << bitBuffer;
+ }
+ return out.str();
+}
+
+//----------------------------------------
+string ofToBinary(const char* value) {
+ // this function is necessary if you want to print a string
+ // using a syntax like ofToBinary("test")
+ return ofToBinary((string) value);
+}
+
+//----------------------------------------
+int ofBinaryToInt(const string& value) {
+ const int intSize = sizeof(int) * 8;
+ bitset<intSize> binaryString(value);
+ return (int) binaryString.to_ulong();
+}
+
+//----------------------------------------
+char ofBinaryToChar(const string& value) {
+ const int charSize = sizeof(char) * 8;
+ bitset<charSize> binaryString(value);
+ return (char) binaryString.to_ulong();
+}
+
+//----------------------------------------
+float ofBinaryToFloat(const string& value) {
+ const int floatSize = sizeof(float) * 8;
+ bitset<floatSize> binaryString(value);
+ union ulongFloatUnion {
+ unsigned long result;
+ float f;
+ } myUFUnion;
+ myUFUnion.result = binaryString.to_ulong();
+ return myUFUnion.f;
+}
+//----------------------------------------
+string ofBinaryToString(const string& value) {
+ ostringstream out;
+ stringstream stream(value);
+ bitset<8> byteString;
+ int numBytes = value.size() / 8;
+ for(int i = 0; i < numBytes; i++) {
+ stream >> byteString;
+ out << (char) byteString.to_ulong();
+ }
+ return out.str();
+}
+
+//--------------------------------------------------
+vector <string> ofSplitString(const string & source, const string & delimiter, bool ignoreEmpty, bool trim) {
+ vector<string> result;
+ if (delimiter.empty()) {
+ result.push_back(source);
+ return result;
+ }
+ string::const_iterator substart = source.begin(), subend;
+ while (true) {
+ subend = search(substart, source.end(), delimiter.begin(), delimiter.end());
+ string sub(substart, subend);
+ if(trim) {
+ Poco::trimInPlace(sub);
+ }
+ if (!ignoreEmpty || !sub.empty()) {
+ result.push_back(sub);
+ }
+ if (subend == source.end()) {
+ break;
+ }
+ substart = subend + delimiter.size();
+ }
+ return result;
+}
+
+//--------------------------------------------------
+string ofJoinString(vector <string> stringElements, const string & delimiter){
+ string resultString = "";
+ int numElements = stringElements.size();
+
+ for(int k = 0; k < numElements; k++){
+ if( k < numElements-1 ){
+ resultString += stringElements[k] + delimiter;
+ } else {
+ resultString += stringElements[k];
+ }
+ }
+
+ return resultString;
+}
+
+//--------------------------------------------------
+void ofStringReplace(string& input, string searchStr, string replaceStr){
+ size_t uPos = 0;
+ size_t uFindLen = searchStr.length();
+ size_t uReplaceLen = replaceStr.length();
+
+ if( uFindLen == 0 ){
+ return;
+ }
+
+ for( ;(uPos = input.find( searchStr, uPos )) != std::string::npos; ){
+ input.replace( uPos, uFindLen, replaceStr );
+ uPos += uReplaceLen;
+ }
+}
+
+//--------------------------------------------------
+bool ofIsStringInString(string haystack, string needle){
+ return ( strstr(haystack.c_str(), needle.c_str() ) != NULL );
+}
+
+//--------------------------------------------------
+string ofToLower(const string & src){
+ string dst(src);
+ transform(src.begin(),src.end(),dst.begin(),::tolower);
+ return dst;
+}
+
+//--------------------------------------------------
+string ofToUpper(const string & src){
+ string dst(src);
+ transform(src.begin(),src.end(),dst.begin(),::toupper);
+ return dst;
+}
+
+//--------------------------------------------------
+string ofVAArgsToString(const char * format, ...){
+ // variadic args to string:
+ // http://www.codeproject.com/KB/string/string_format.aspx
+ static char aux_buffer[10000];
+ string retStr("");
+ if (NULL != format){
+
+ va_list marker;
+
+ // initialize variable arguments
+ va_start(marker, format);
+
+ // Get formatted string length adding one for NULL
+ size_t len = vsprintf(aux_buffer, format, marker) + 1;
+
+ // Reset variable arguments
+ va_end(marker);
+
+ if (len > 0)
+ {
+ va_list args;
+
+ // initialize variable arguments
+ va_start(args, format);
+
+ // Create a char vector to hold the formatted string.
+ vector<char> buffer(len, '\0');
+ vsprintf(&buffer[0], format, args);
+ retStr = &buffer[0];
+ va_end(args);
+ }
+
+ }
+ return retStr;
+}
+
+string ofVAArgsToString(const char * format, va_list args){
+ // variadic args to string:
+ // http://www.codeproject.com/KB/string/string_format.aspx
+ char aux_buffer[10000];
+ string retStr("");
+ if (NULL != format){
+
+ // Get formatted string length adding one for NULL
+ vsprintf(aux_buffer, format, args);
+ retStr = aux_buffer;
+
+ }
+ return retStr;
+}
+
+/*
+//--------------------------------------------------
+void ofLaunchBrowser(string url){
+
+ // http://support.microsoft.com/kb/224816
+
+ //make sure it is a properly formatted url
+ if(Poco::icompare(url.substr(0,7), "http://") != 0 &&
+ Poco::icompare(url.substr(0,8), "https://") != 0) {
+ ofLog(OF_LOG_WARNING, "ofLaunchBrowser: url must begin http:// or https://");
+ return;
+ }
+
+ //----------------------------
+ #ifdef TARGET_WIN32
+ //----------------------------
+
+ #if (_MSC_VER)
+ // microsoft visual studio yaks about strings, wide chars, unicode, etc
+ ShellExecuteA(NULL, "open", url.c_str(),
+ NULL, NULL, SW_SHOWNORMAL);
+ #else
+ ShellExecute(NULL, "open", url.c_str(),
+ NULL, NULL, SW_SHOWNORMAL);
+ #endif
+
+ //----------------------------
+ #endif
+ //----------------------------
+
+ //--------------------------------------
+ #ifdef TARGET_OSX
+ //--------------------------------------
+ // ok gotta be a better way then this,
+ // this is what I found...
+ string commandStr = "open "+url;
+ system(commandStr.c_str());
+ //----------------------------
+ #endif
+ //----------------------------
+
+ //--------------------------------------
+ #ifdef TARGET_LINUX
+ //--------------------------------------
+ string commandStr = "xdg-open "+url;
+ int ret = system(commandStr.c_str());
+ if(ret!=0) ofLog(OF_LOG_ERROR,"ofLaunchBrowser: couldn't open browser");
+ //----------------------------
+ #endif
+ //----------------------------
+}
+
+//--------------------------------------------------
+string ofGetVersionInfo(){
+ string version;
+ stringstream sstr;
+ sstr << "of version: " << OF_VERSION << endl;
+ return sstr.str();
+}
+*/
+//---- new to 006
+//from the forums http://www.openframeworks.cc/forum/viewtopic.php?t=1413
+/*
+//--------------------------------------------------
+void ofSaveScreen(string filename) {
+ ofImage screen;
+ screen.allocate(ofGetWidth(), ofGetHeight(), OF_IMAGE_COLOR);
+ screen.grabScreen(0, 0, ofGetWidth(), ofGetHeight());
+ screen.saveImage(filename);
+}
+
+//--------------------------------------------------
+void ofSaveViewport(string filename) {
+ // because ofSaveScreen doesn't related to viewports
+ ofImage screen;
+ ofRectangle view = ofGetCurrentViewport();
+ screen.allocate(view.width, view.height, OF_IMAGE_COLOR);
+ screen.grabScreen(0, 0, view.width, view.height);
+ screen.saveImage(filename);
+}
+
+//--------------------------------------------------
+int saveImageCounter = 0;
+void ofSaveFrame(bool bUseViewport){
+ string fileName = ofToString(saveImageCounter) + ".png";
+ if (bUseViewport){
+ ofSaveViewport(fileName);
+ } else {
+ ofSaveScreen(fileName);
+ }
+ saveImageCounter++;
+}
+
+//--------------------------------------------------
+string ofSystem(string command){
+ FILE * ret = NULL;
+#ifdef TARGET_WIN32
+ ret = _popen(command.c_str(),"r");
+#else
+ ret = popen(command.c_str(),"r");
+#endif
+
+ string strret;
+ char c;
+
+ if (ret == NULL){
+ ofLogError() << "ofSystem: error opening return file";
+ }else{
+ do {
+ c = fgetc (ret);
+ strret += c;
+ } while (c != EOF);
+ fclose (ret);
+ }
+
+ return strret;
+}
+
+//--------------------------------------------------
+ofTargetPlatform ofGetTargetPlatform(){
+#ifdef TARGET_LINUX
+ if(ofSystem("uname -m").find("x86_64")==0)
+ return OF_TARGET_LINUX64;
+ else
+ return OF_TARGET_LINUX;
+#elif defined(TARGET_OSX)
+ return OF_TARGET_OSX;
+#elif defined(TARGET_WIN32)
+ #if (_MSC_VER)
+ return OF_TARGET_WINVS;
+ #else
+ return OF_TARGET_WINGCC;
+ #endif
+#elif defined(TARGET_ANDROID)
+ return OF_TARGET_ANDROID;
+#elif defined(TARGET_OF_IPHONE)
+ return OF_TARGET_IPHONE;
+#endif
+}
+*/ \ No newline at end of file