Index: trunk/src/gui/gui_gfx_renderer.cc
===================================================================
--- trunk/src/gui/gui_gfx_renderer.cc	(revision 433)
+++ trunk/src/gui/gui_gfx_renderer.cc	(revision 435)
@@ -147,5 +147,5 @@
 	size_t wsize = m_atlas.get_depth() * 4 * 4;
 	uint8* wfill = new uint8[m_atlas.get_depth() * 4 * 4];
-	std::fill( wfill, wfill + wsize, 255 );
+	raw_fill( wfill, wfill + wsize, 255 );
 	white.pos = ivec2();
 	m_atlas.set_region( white, wfill );
@@ -189,8 +189,6 @@
 nv::size_t gfx_renderer::load_font( const string_view& filename, nv::size_t size )
 {
-	std::string id_name( filename.data(), filename.size() );
-	char buffer[8]; size_t len = nv::sint32_to_buffer( sint32( size ), buffer );
-	id_name.append( std::string( buffer, len ) );
-	string_view id( id_name.c_str(), id_name.size() );
+	string128 id( filename );
+	id.append( size );
 	auto i = m_font_names.find( id );
 	if ( i != m_font_names.end() )
Index: trunk/src/lua/lua_path.cc
===================================================================
--- trunk/src/lua/lua_path.cc	(revision 433)
+++ trunk/src/lua/lua_path.cc	(revision 435)
@@ -88,5 +88,5 @@
 		{
 			*current++ = '[';
-			current += uint32_to_buffer( e.value, current );
+			current += uint32_to_buffer( array_ref< char >( current, current - start ), e.value );
 			*current++ = ']';
 			dot = false;
Index: trunk/src/lua/lua_raw.cc
===================================================================
--- trunk/src/lua/lua_raw.cc	(revision 433)
+++ trunk/src/lua/lua_raw.cc	(revision 435)
@@ -26,14 +26,15 @@
 	default : break; 
 	}
-	char buffer[64];
+	char buffer_data[64];
+	nv::array_ref< char > buffer( buffer_data, 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 );
+		size_t l = nv::uint64_to_buffer( buffer, nv::uint64( lua_touserdata( L, idx ) ) );
+		return std::string( buffer_data, l );
 	}
 	else if ( type == LUA_TNUMBER )
 	{
-		size_t l = nv::f64_to_buffer( lua_tonumber( L, idx ), buffer );
-		return std::string( buffer, l );
+		size_t l = nv::f64_to_buffer( buffer, lua_tonumber( L, idx ) );
+		return std::string( buffer_data, l );
 	}
 	return "UNKNOWN!";
Index: trunk/src/stl/string.cc
===================================================================
--- trunk/src/stl/string.cc	(revision 433)
+++ trunk/src/stl/string.cc	(revision 435)
@@ -37,76 +37,96 @@
 }
 
-nv::size_t nv::sint32_to_buffer( sint32 n, char* str )
-{
-	char* s = str;
-	uint32 abs = static_cast< uint32 >( n < 0 ? -n : n );
-	do
-	{
+nv::size_t nv::sint32_to_buffer( array_ref< char > buffer, sint32 n )
+{
+	if ( buffer.size() < 2 ) return 0;
+	char* last = buffer.end() - 1;
+	char* s = buffer.begin();
+	uint32 abs = static_cast<uint32>( n < 0 ? -n : n );
+	do
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0;  }
 		*s++ = static_cast<char>( '0' + ( abs % 10 ) );
 		abs /= 10;
 	} while ( abs > 0 );
-	if ( n < 0 ) *s++ = '-';
-	*s = '\0';
-	string_reverse( str, s - 1 );
-	return static_cast<nv::size_t>( s - str );
-}
-
-nv::size_t nv::sint64_to_buffer( sint64 n, char* str )
-{
-	char* s = str;
-	uint64 abs = static_cast< uint64 >( n < 0 ? -n : n );
-	do
-	{
+	if ( n < 0 )
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0; }
+		*s++ = '-';
+	}
+	*s = '\0';
+	string_reverse( buffer.begin(), s - 1 );
+	return static_cast<nv::size_t>( s - buffer.begin() );
+}
+
+nv::size_t nv::sint64_to_buffer( array_ref< char > buffer, sint64 n )
+{
+	if ( buffer.size() < 2 ) return 0;
+	char* last = buffer.end() - 1;
+	char* s = buffer.begin();
+	uint64 abs = static_cast<uint64>( n < 0 ? -n : n );
+	do
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0; }
 		*s++ = static_cast<char>( '0' + ( abs % 10 ) );
 		abs /= 10;
 	} while ( abs > 0 );
-	if ( n < 0 ) *s++ = '-';
-	*s = '\0';
-	string_reverse( str, s - 1 );
-	return static_cast<nv::size_t>( s - str );
-}
-
-nv::size_t nv::uint32_to_buffer( uint32 n, char* str )
-{
-	char* s = str;
-	do
-	{
+	if ( n < 0 )
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0; }
+		*s++ = '-';
+	}
+	*s = '\0';
+	string_reverse( buffer.begin(), s - 1 );
+	return static_cast<nv::size_t>( s - buffer.begin() );
+}
+
+nv::size_t nv::uint32_to_buffer( array_ref< char > buffer, uint32 n )
+{
+	if ( buffer.size() < 2 ) return 0;
+	char* last = buffer.end() - 1;
+	char* s = buffer.begin();
+	do
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0; }
 		*s++ = static_cast<char>( '0' + ( n % 10 ) );
 		n /= 10;
 	} while ( n > 0 );
 	*s = '\0';
-	string_reverse( str, s - 1 );
-	return static_cast<nv::size_t>( s - str );
-}
-
-nv::size_t nv::uint64_to_buffer( uint64 n, char* str )
-{
-	char* s = str;
-	do
-	{
+	string_reverse( buffer.begin(), s - 1 );
+	return static_cast<nv::size_t>( s - buffer.begin() );
+}
+
+nv::size_t nv::uint64_to_buffer( array_ref< char > buffer, uint64 n )
+{
+	if ( buffer.size() < 2 ) return 0;
+	char* last = buffer.end() - 1;
+	char* s = buffer.begin();
+	do
+	{
+		if ( s == last ) { *buffer.begin() = '\0'; return 0; }
 		*s++ = static_cast<char>( '0' + ( n % 10 ) );
 		n /= 10;
 	} while ( n > 0 );
 	*s = '\0';
-	string_reverse( str, s - 1 );
-	return static_cast<nv::size_t>( s - str );
-}
-
-nv::size_t nv::f32_to_buffer( f32 n, char* str )
+	string_reverse( buffer.begin(), s - 1 );
+	return static_cast<nv::size_t>( s - buffer.begin() );
+}
+
+nv::size_t nv::f32_to_buffer( array_ref< char > buffer, f32 n )
 {
 #if NV_COMPILER == NV_MSVC
-	int result = sprintf_s( str, 64, "%.*g", 6, n );
+	int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
 #else
-	int result = snprintf( str, 64, "%.*g", 6, n );
+	int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
 #endif
 	return static_cast<nv::size_t>( result > 0 ? result : 0 );
 }
 
-nv::size_t nv::f64_to_buffer( f64 n, char* str )
+nv::size_t nv::f64_to_buffer( array_ref< char > buffer, f64 n )
 {
 #if NV_COMPILER == NV_MSVC
-	int result = sprintf_s( str, 64, "%.*g", 6, n );
+	int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
 #else
-	int result = snprintf( str, 64, "%.*g", 6, n );
+	int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
 #endif
 	return static_cast<nv::size_t>( result > 0 ? result : 0 );
