Index: trunk/src/core/library.cc
===================================================================
--- trunk/src/core/library.cc	(revision 378)
+++ trunk/src/core/library.cc	(revision 380)
@@ -39,17 +39,17 @@
 }
 
-void library::open( const string& name )
+void library::open( string_ref name )
 {
-	m_name = name;
+	m_name.assign( name.data(), name.size() );
 	if ( !open() )
 	{
 		m_handle = nullptr;
-		NV_THROW( library_error, "Can't load library!", name );
+		NV_THROW( library_error, "Can't load library!", name.data() );
 	}
 }
 
-bool nv::library::try_open( const string& name )
+bool nv::library::try_open( string_ref name )
 {
-	m_name = name;
+	m_name.assign( name.data(), name.size() );
 	if ( !open() )
 	{
@@ -60,7 +60,7 @@
 }
 
-const string& library::get_name() const
+string_ref library::get_name() const
 {
-    return m_name;
+    return string_ref( m_name );
 }
 
@@ -73,11 +73,10 @@
     NV_LOG_NOTICE( "library : loading '", m_name, "'..." );
 
-    string name = m_name;
-    string ext  = NV_LIB_EXT;
-    size_t ext_len   = ext.length();
+	std::string name = m_name;
+	string_ref ext( NV_LIB_EXT );
 
-    if ( name.length() < ext_len || name.substr( name.length() - ext_len, ext_len ) != ext ) 
+	if ( name.length() < ext.length() || name.substr( name.length() - ext.length(), ext.length() ) != ext )
     {
-        name += ext;
+        name.append( ext.data(), ext.length() );
     }
 
@@ -93,17 +92,17 @@
 }
 
-void* library::get( const string& symbol )
+void* library::get( string_ref symbol )
 {
-	void* result = (void*) NV_LIB_GET( (NV_LIB_HANDLE) m_handle, symbol.c_str() );
+	void* result = (void*) NV_LIB_GET( (NV_LIB_HANDLE) m_handle, symbol.data() );
     if ( !result )
     {
-        NV_THROW( library_error, "Can't find symbol " + symbol + "!", m_name );
+        NV_THROW( library_error, "Can't find symbol " + std::string(symbol.data(),symbol.size()) + "!", m_name );
     }
 	return result;
 }
 
-void* nv::library::try_get( const string& symbol )
+void* nv::library::try_get( string_ref symbol )
 {
-	return (void*) NV_LIB_GET( (NV_LIB_HANDLE) m_handle, symbol.c_str() );
+	return (void*) NV_LIB_GET( (NV_LIB_HANDLE) m_handle, symbol.data() );
 }
 
@@ -130,5 +129,5 @@
 }
 
-string library::get_error()
+std::string library::get_error()
 {
 #if NV_PLATFORM == NV_WINDOWS
@@ -137,5 +136,5 @@
     FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
         NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buffer, 0, NULL );
-    string msg( (char*)buffer );
+    std::string msg( (char*)buffer );
     LocalFree( buffer );
     return msg;
Index: trunk/src/core/logger.cc
===================================================================
--- trunk/src/core/logger.cc	(revision 378)
+++ trunk/src/core/logger.cc	(revision 380)
@@ -163,5 +163,5 @@
 	{
 		const char* lcolor = log_color[( level ) / 10];
-		fwrite( lcolor, strlen(lcolor), 1, stdout );
+		fwrite( lcolor, nvstrlen(lcolor), 1, stdout );
 	}
 	fwrite( NV_LOG_LEVEL_NAME_PAD( level ), 8, 1, stdout );
Index: trunk/src/core/profiler.cc
===================================================================
--- trunk/src/core/profiler.cc	(revision 378)
+++ trunk/src/core/profiler.cc	(revision 380)
@@ -108,5 +108,5 @@
 	char buffer[128];
 	snprintf( buffer, 128, "%-23s %6s %6s %9s %6s", "TAG", "%PARNT", "CALLS", "TOTAL(ms)", "AVG(ms)" );
-	NV_LOG_INFO( string_ref( buffer, strlen(buffer) ) );
+	NV_LOG_INFO( string_ref( buffer, nvstrlen( buffer ) ) );
  	log_node_children( 0, m_root );
 	NV_LOG_INFO( "-- PROFILER REPORT END ---------------------------------" );
@@ -122,12 +122,12 @@
 		if ( c->m_calls > 0 )
 		{
-			double pparent  = ( (double)c->m_total_time_us / (double)c->m_parent->m_total_time_us ) * 100.f;
-			int calls       = c->m_calls;
-			double total_ms = c->m_total_time_us / 1000.f;
-			double avg_ms   = ( (double)c->m_total_time_us / (double)c->m_calls ) / 1000.f;
-			if ( indent > 0 ) memset( buffer, '-', indent );
+			f64 pparent = ( (f64)c->m_total_time_us / (f64)c->m_parent->m_total_time_us ) * 100.f;
+			uint32 calls       = c->m_calls;
+			f64 total_ms = c->m_total_time_us / 1000.f;
+			f64 avg_ms = ( (f64)c->m_total_time_us / (f64)c->m_calls ) / 1000.f;
+			if ( indent > 0 ) nvmemset( buffer, '-', indent );
 			snprintf( buffer + indent, 128 - indent, "%*.*s %6.2f %6d %9.2f %6.2f", indent - 23, 23 - indent,
 				c->m_tag.c_str(), pparent, calls, total_ms, avg_ms );
-			NV_LOG_INFO( string_ref( buffer, strlen( buffer ) ) );
+			NV_LOG_INFO( string_ref( buffer, nvstrlen( buffer ) ) );
 			if ( c->m_children.size() > 0 )
 			{
Index: trunk/src/core/time.cc
===================================================================
--- trunk/src/core/time.cc	(revision 378)
+++ trunk/src/core/time.cc	(revision 380)
@@ -74,5 +74,5 @@
 	struct timespec ts;
 	ts.tv_sec = 0;
-	ts.tv_nsec = ms * 1000000;
+	ts.tv_nsec = (long)ms * 1000000;
 	nanosleep(&ts, NULL);
 //	usleep( ms * 1000 );
Index: trunk/src/engine/program_manager.cc
===================================================================
--- trunk/src/engine/program_manager.cc	(revision 378)
+++ trunk/src/engine/program_manager.cc	(revision 380)
@@ -46,5 +46,5 @@
 }
 
-void nv::program_manager::load_source( lua::table_guard& table, string& out, const string& append )
+void nv::program_manager::load_source( lua::table_guard& table, std::string& out, const std::string& append )
 {
 	out = append;
Index: trunk/src/engine/resource_system.cc
===================================================================
--- trunk/src/engine/resource_system.cc	(revision 378)
+++ trunk/src/engine/resource_system.cc	(revision 380)
@@ -36,10 +36,10 @@
 }
 
-nv::resource_type_id nv::resource_system::register_resource_type( const string& /*name*/, resource_manager_base* /*manager*/ )
+nv::resource_type_id nv::resource_system::register_resource_type( const std::string& /*name*/, resource_manager_base* /*manager*/ )
 {
 	return 0;
 }
 
-nv::resource_type_id nv::resource_system::get_resource_type_id( const string& /*name*/ ) const
+nv::resource_type_id nv::resource_system::get_resource_type_id( const std::string& /*name*/ ) const
 {
 	return 0;
Index: trunk/src/formats/assimp_loader.cc
===================================================================
--- trunk/src/formats/assimp_loader.cc	(revision 378)
+++ trunk/src/formats/assimp_loader.cc	(revision 380)
@@ -57,5 +57,5 @@
 
 
-nv::assimp_loader::assimp_loader( const string& a_ext, uint32 a_assimp_flags /*= 0 */ ) 
+nv::assimp_loader::assimp_loader( const std::string& a_ext, uint32 a_assimp_flags /*= 0 */ )
 	: m_scene( nullptr ), m_mesh_count(0)
 {
@@ -374,5 +374,5 @@
 	const aiScene* scene = (const aiScene*)m_scene;
 	const aiNode*  node  = (const aiNode*)vnode;
-	string name( node->mName.data );
+	std::string name( node->mName.data );
 	const aiAnimation* anim  = scene->mAnimations[anim_id];
 	const aiNodeAnim*  anode = nullptr;
Index: trunk/src/gfx/texture_font.cc
===================================================================
--- trunk/src/gfx/texture_font.cc	(revision 378)
+++ trunk/src/gfx/texture_font.cc	(revision 380)
@@ -91,5 +91,5 @@
 }
 
-bool texture_font::load_glyphs( const string& codes )
+bool texture_font::load_glyphs( string_ref codes )
 {
 	FT_Face face     = (FT_Face)(m_rface);
Index: trunk/src/gl/gl_device.cc
===================================================================
--- trunk/src/gl/gl_device.cc	(revision 378)
+++ trunk/src/gl/gl_device.cc	(revision 380)
@@ -217,5 +217,5 @@
 }
 
-uniform_base* nv::gl_device::get_uniform( program p, const string& name, bool fatal /*= true */ ) const
+uniform_base* nv::gl_device::get_uniform( program p, const std::string& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -235,5 +235,5 @@
 }
 
-int nv::gl_device::get_attribute_location( program p, const string& name, bool fatal /*= true */ ) const
+int nv::gl_device::get_attribute_location( program p, const std::string& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -347,5 +347,5 @@
 		glGetActiveAttrib( p->glid, i, 128, &attr_nlen, &attr_len, &attr_type, name_buffer );
 
-		string name( name_buffer, size_t(attr_nlen) );
+		std::string name( name_buffer, size_t( attr_nlen ) );
 
 		// skip built-ins
@@ -376,5 +376,5 @@
 		glGetActiveUniform( p->glid, i, 128, &uni_nlen, &uni_len, &uni_type, name_buffer );
 
-		string name( name_buffer, size_t(uni_nlen) );
+		std::string name( name_buffer, size_t( uni_nlen ) );
 
 		// skip built-ins
@@ -385,6 +385,6 @@
 
 		// check for array
-		string::size_type arrchar = name.find('[');
-		if ( arrchar != string::npos )
+		std::string::size_type arrchar = name.find( '[' );
+		if ( arrchar != std::string::npos )
 		{
 			name = name.substr( 0, arrchar );
Index: trunk/src/gui/gui_environment.cc
===================================================================
--- trunk/src/gui/gui_environment.cc	(revision 378)
+++ trunk/src/gui/gui_environment.cc	(revision 380)
@@ -311,5 +311,5 @@
 }
 
-void nv::gui::environment::set_class( handle e, const string& text )
+void nv::gui::environment::set_class( handle e, const std::string& text )
 {
 	element* ep = m_elements.get(e);
@@ -321,5 +321,5 @@
 }
 
-void nv::gui::environment::set_text( handle e, const string& text )
+void nv::gui::environment::set_text( handle e, const std::string& text )
 {
 	element* ep = m_elements.get(e);
Index: trunk/src/gui/gui_gfx_renderer.cc
===================================================================
--- trunk/src/gui/gui_gfx_renderer.cc	(revision 378)
+++ trunk/src/gui/gui_gfx_renderer.cc	(revision 380)
@@ -190,5 +190,6 @@
 {
 	std::string id_name( filename );
-	id_name.append( std::to_string( size ) );
+	char buffer[8]; size_t len = nv::sint32_to_buffer( (sint32)size, buffer );
+	id_name.append( std::string( buffer, len ) );
 	auto i = m_font_names.find( id_name );
 	if ( i != m_font_names.end() )
Index: trunk/src/lua/lua_glm.cc
===================================================================
--- trunk/src/lua/lua_glm.cc	(revision 378)
+++ trunk/src/lua/lua_glm.cc	(revision 380)
@@ -295,8 +295,8 @@
 	switch ( v.length() )
 	{
-	case 1: lua_pushfstring( L, ( fl ? "(%f)"          : "(%d)" ),          v[0] );
-	case 2: lua_pushfstring( L, ( fl ? "(%f,%f)"       : "(%d,%d)" ),       v[0], v[1] );
-	case 3: lua_pushfstring( L, ( fl ? "(%f,%f,%f)"    : "(%d,%d,%d)" ),    v[0], v[1], v[2] );
-	case 4: lua_pushfstring( L, ( fl ? "(%f,%f,%f,%f)" : "(%d,%d,%d,%d)" ), v[0], v[1], v[2], v[3] );
+	case 1: lua_pushfstring( L, ( fl ? "(%f)"          : "(%d)" ),          v[0] ); break;
+	case 2: lua_pushfstring( L, ( fl ? "(%f,%f)"       : "(%d,%d)" ),       v[0], v[1] ); break;
+	case 3: lua_pushfstring( L, ( fl ? "(%f,%f,%f)"    : "(%d,%d,%d)" ),    v[0], v[1], v[2] ); break;
+	case 4: lua_pushfstring( L, ( fl ? "(%f,%f,%f,%f)" : "(%d,%d,%d,%d)" ), v[0], v[1], v[2], v[3] ); break;
 	default:
 		lua_pushliteral( L, "(vector?)" ); break;
Index: trunk/src/lua/lua_path.cc
===================================================================
--- trunk/src/lua/lua_path.cc	(revision 378)
+++ trunk/src/lua/lua_path.cc	(revision 380)
@@ -32,5 +32,5 @@
 }
 
-void lua::path::push( nv::size_t value )
+void lua::path::push( nv::uint32 value )
 {
 	m_elements[ m_count ].value  = value;
@@ -50,5 +50,5 @@
 	if (m_count == 0) return false;
 	if (global) lua_pushglobaltable( L );
-	for (int i = 0; i < m_count; ++i )
+	for ( uint32 i = 0; i < m_count; ++i )
 	{
 		if ( lua_istable( L, -1 ) )
@@ -76,21 +76,35 @@
 std::string nv::lua::path::to_string() const
 {
-	std::string result;
-	result.reserve( 64 );
+	char buffer[64];
+	char* start   = buffer;
+	char* current = buffer;
 	bool dot = false;
+	bool oos = false;
 	for ( const element& e : m_elements )
 	{
-		if ( dot ) result.append(".");
+		if ( current - start > 48 ) { oos = true; break; }
+		if ( dot ) *current++ = '.';
 		if ( e.length == 0 )
 		{
-			result.append("[" + nv::to_string( e.value ) + "]" );
+			*current++ = '[';
+			current += uint32_to_buffer( e.value, current );
+			*current++ = ']';
 			dot = false;
 		}
 		else
 		{
-			result.append( e.str, e.length );
+			if ( size_t(current - start) + e.length > 60 ) { oos = true; break; }
+			nvmemcpy( current, e.str, e.length );
+			current += e.length;
 			dot = true;
 		}
 	}
-	return result;
+	if (oos) 
+	{ 
+		*current++ = '.';
+		*current++ = '.';
+		*current++ = '.';
+	}
+	*current++ = '\0';
+	return std::string( buffer, size_t(current - start - 1) );
 }
Index: trunk/src/lua/lua_raw.cc
===================================================================
--- trunk/src/lua/lua_raw.cc	(revision 378)
+++ trunk/src/lua/lua_raw.cc	(revision 380)
@@ -11,18 +11,31 @@
 std::string nlua_typecontent( lua_State* L, int idx )
 {
-	switch ( lua_type( L, idx ) )
+	int type = lua_type( L, idx );
+	switch ( type )
 	{
 	case LUA_TNONE          : return "NONE"; 
 	case LUA_TNIL		    : return "NIL"; 
 	case LUA_TBOOLEAN		: return lua_toboolean( L, idx ) == 0 ? "false" : "true"; 
-	case LUA_TLIGHTUSERDATA	: return nv::to_string( nv::uint64( lua_touserdata( L, idx ) ) ); 
-	case LUA_TNUMBER		: return nv::to_string( lua_tonumber( L, idx ) ); 
+	//case LUA_TLIGHTUSERDATA	: return std::to_string( nv::uint64( lua_touserdata( L, idx ) ) ); 
+	//case LUA_TNUMBER		: return std::to_string( lua_tonumber( L, idx ) ); 
 	case LUA_TSTRING		: return lua_tostring( L, idx ); 
 	case LUA_TTABLE		    : return "TABLE"; 
 	case LUA_TFUNCTION		: return "FUNCTION"; 
-	case LUA_TUSERDATA		: return nv::to_string( nv::uint64( lua_touserdata( L, idx ) ) ); 
+//	case LUA_TUSERDATA		: return std::to_string( nv::uint64( lua_touserdata( L, idx ) ) ); 
 	case LUA_TTHREAD		: return "THREAD"; 
-	default : return "UNKNOWN!"; 
-	}
+	default : break; 
+	}
+	char buffer[64];
+	if ( type == LUA_TLIGHTUSERDATA || type == LUA_TUSERDATA )
+	{
+		size_t l = nv::uint64_to_buffer( nv::uint64( lua_touserdata( L, idx ) ), buffer );
+		return std::string( buffer, l );
+	}
+	else if ( type == LUA_TNUMBER )
+	{
+		size_t l = nv::f64_to_buffer( lua_tonumber( L, idx ), buffer );
+		return std::string( buffer, l );
+	}
+	return "UNKNOWN!";
 }
 
Index: trunk/src/lua/lua_state.cc
===================================================================
--- trunk/src/lua/lua_state.cc	(revision 378)
+++ trunk/src/lua/lua_state.cc	(revision 380)
@@ -179,5 +179,5 @@
 }
 
-string lua::table_guard::get_std_string( string_ref element, string_ref defval /*= string_ref() */ )
+std::string lua::table_guard::get_std_string( string_ref element, string_ref defval /*= string_ref() */ )
 {
 	lua_getfield( m_state, -1, element.data() );
Index: trunk/src/sdl/sdl_window.cc
===================================================================
--- trunk/src/sdl/sdl_window.cc	(revision 378)
+++ trunk/src/sdl/sdl_window.cc	(revision 380)
@@ -75,5 +75,5 @@
 }
 
-void sdl::window::set_title( const string& title )
+void sdl::window::set_title( const std::string& title )
 {
 	SDL_SetWindowTitle( static_cast<SDL_Window*>( m_handle ), title.c_str() );
Index: trunk/src/stl/string.cc
===================================================================
--- trunk/src/stl/string.cc	(revision 378)
+++ trunk/src/stl/string.cc	(revision 380)
@@ -97,10 +97,9 @@
 {
 #if NV_COMPILER == NV_MSVC
-	sprintf_s( str, 64, "%.*g", 6, n );
+	int result = sprintf_s( str, 64, "%.*g", 6, n );
 #else
-	snprintf( str, 64, "%.*g", 6, n );
+	int result = snprintf( str, 64, "%.*g", 6, n );
 #endif
-	sprintf( str, "%g", n );
-	return strlen( str );
+	return result > 0 ? ( nv::size_t )result : 0;
 }
 
@@ -108,9 +107,9 @@
 {
 #if NV_COMPILER == NV_MSVC
-	sprintf_s( str, 64, "%.*g", 6, n );
+	int result = sprintf_s( str, 64, "%.*g", 6, n );
 #else
-	snprintf( str, 64, "%.*g", 6, n );
+	int result = snprintf( str, 64, "%.*g", 6, n );
 #endif
-	return strlen( str );
+	return result > 0 ? ( nv::size_t )result : 0;
 }
 
@@ -162,5 +161,5 @@
 	while ( *s >= '0' && *s <= '9' )
 	{
-		result = ( result * 10 ) + ( *s - '0' );
+		result = ( result * 10 ) + (uint32)( *s - '0' );
 		++s;
 	}
@@ -175,5 +174,5 @@
 	while ( *s >= '0' && *s <= '9' )
 	{
-		result = ( result * 10 ) + ( *s - '0' );
+		result = ( result * 10 ) + (uint32)( *s - '0' );
 		++s;
 	}
