#ifdef __MINGW32__ # define __STDC_FORMAT_MACROS #endif #include #include #include #include #ifdef _WIN32 # include # include #else # include # include # include # include #endif #include #include "TracyStorage.hpp" namespace tracy { static bool CreateDirStruct( const std::string& path ) { struct stat buf; if( stat( path.c_str(), &buf ) == 0 ) return true; if( errno != ENOENT ) { return false; } size_t pos = 0; do { pos = path.find( '/', pos+1 ); #ifdef _WIN32 if( pos == 2 && path[1] == ':' ) continue; // Don't create drive name. if( _mkdir( path.substr( 0, pos ).c_str() ) != 0 ) #else if( mkdir( path.substr( 0, pos ).c_str(), S_IRWXU ) != 0 ) #endif { if( errno != EEXIST ) { return false; } } } while( pos != std::string::npos ); return true; } static void GetConfigDirectory( char* buf, size_t& sz ) { #ifdef _WIN32 auto path = getenv( "APPDATA" ); sz = strlen( path ); memcpy( buf, path, sz ); for( size_t i=0; i': case ':': case '"': case '/': case '\\': case '|': case '?': case '*': tmp[i] = '_'; break; default: break; } } // 604800 = 7 days sz += sprintf( buf+sz, "/tracy/user/%c/%s/%" PRIu64 "/%" PRIu64 "/", tmp[0], tmp, uint64_t( time / 604800 ), time ); if( create ) { auto status = CreateDirStruct( buf ); assert( status ); } if( file ) { const auto fsz = strlen( file ); assert( sz + fsz < MaxPath ); memcpy( buf+sz, file, fsz+1 ); } else { buf[sz] = '\0'; } return buf; } }