source: trunk/src/stl/string.cc @ 435

Last change on this file since 435 was 435, checked in by epyon, 10 years ago
  • short_string implementation - first usages
File size: 5.2 KB
RevLine 
[365]1// Copyright (C) 2015 ChaosForge Ltd
2// http://chaosforge.org/
3//
[395]4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
[365]6//
7// TODO: speedup conversion by doing divisions by 100
8
[368]9#include "nv/stl/string.hh"
[365]10
11#include <cstdio>
12#include <cstdlib>
[378]13#include <fstream> // for slurp only
[365]14
15using namespace nv;
16
[402]17//static const double s_power_10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
[365]18
[378]19std::string nv::slurp( const std::string& filename )
20{
21        std::ifstream input( filename );
22        //              if ( !input.is_open() ) NV_THROW( std::runtime_error, "File "+filename+" not found!");
23        std::stringstream sstr;
24        while ( input >> sstr.rdbuf() );
25        return sstr.str();
26}
27
[365]28static inline void string_reverse( char* begin, char* end )
29{
30        char temp;
31        while ( end > begin )
32        {
33                temp = *end;
34                *end-- = *begin;
35                *begin++ = temp;
36        }
37}
38
[435]39nv::size_t nv::sint32_to_buffer( array_ref< char > buffer, sint32 n )
[365]40{
[435]41        if ( buffer.size() < 2 ) return 0;
42        char* last = buffer.end() - 1;
43        char* s = buffer.begin();
44        uint32 abs = static_cast<uint32>( n < 0 ? -n : n );
[365]45        do
46        {
[435]47                if ( s == last ) { *buffer.begin() = '\0'; return 0;  }
[402]48                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
[365]49                abs /= 10;
50        } while ( abs > 0 );
[435]51        if ( n < 0 )
52        {
53                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
54                *s++ = '-';
55        }
[365]56        *s = '\0';
[435]57        string_reverse( buffer.begin(), s - 1 );
58        return static_cast<nv::size_t>( s - buffer.begin() );
[365]59}
60
[435]61nv::size_t nv::sint64_to_buffer( array_ref< char > buffer, sint64 n )
[365]62{
[435]63        if ( buffer.size() < 2 ) return 0;
64        char* last = buffer.end() - 1;
65        char* s = buffer.begin();
66        uint64 abs = static_cast<uint64>( n < 0 ? -n : n );
[365]67        do
68        {
[435]69                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]70                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
[365]71                abs /= 10;
72        } while ( abs > 0 );
[435]73        if ( n < 0 )
74        {
75                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
76                *s++ = '-';
77        }
[365]78        *s = '\0';
[435]79        string_reverse( buffer.begin(), s - 1 );
80        return static_cast<nv::size_t>( s - buffer.begin() );
[365]81}
82
[435]83nv::size_t nv::uint32_to_buffer( array_ref< char > buffer, uint32 n )
[365]84{
[435]85        if ( buffer.size() < 2 ) return 0;
86        char* last = buffer.end() - 1;
87        char* s = buffer.begin();
[365]88        do
89        {
[435]90                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]91                *s++ = static_cast<char>( '0' + ( n % 10 ) );
[365]92                n /= 10;
93        } while ( n > 0 );
94        *s = '\0';
[435]95        string_reverse( buffer.begin(), s - 1 );
96        return static_cast<nv::size_t>( s - buffer.begin() );
[365]97}
98
[435]99nv::size_t nv::uint64_to_buffer( array_ref< char > buffer, uint64 n )
[365]100{
[435]101        if ( buffer.size() < 2 ) return 0;
102        char* last = buffer.end() - 1;
103        char* s = buffer.begin();
[365]104        do
105        {
[435]106                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]107                *s++ = static_cast<char>( '0' + ( n % 10 ) );
[365]108                n /= 10;
109        } while ( n > 0 );
110        *s = '\0';
[435]111        string_reverse( buffer.begin(), s - 1 );
112        return static_cast<nv::size_t>( s - buffer.begin() );
[365]113}
114
[435]115nv::size_t nv::f32_to_buffer( array_ref< char > buffer, f32 n )
[365]116{
117#if NV_COMPILER == NV_MSVC
[435]118        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]119#else
[435]120        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]121#endif
[402]122        return static_cast<nv::size_t>( result > 0 ? result : 0 );
[365]123}
124
[435]125nv::size_t nv::f64_to_buffer( array_ref< char > buffer, f64 n )
[365]126{
127#if NV_COMPILER == NV_MSVC
[435]128        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]129#else
[435]130        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]131#endif
[402]132        return static_cast<nv::size_t>( result > 0 ? result : 0 );
[365]133}
134
[402]135sint32 nv::buffer_to_sint32( const char* str, char** end )
[365]136{
137        const char* s = str;
138        while ( *s == ' ' ) ++s;
139        sint32 result = 0;
140        bool positive = true;
141        switch ( *s )
142        {
143        case '-': ++s; positive = false; break;
144        case '+': ++s; break;
145        default: break;
146        }
147        while ( *s >= '0' && *s <= '9' )
148        {
149                result = ( result * 10 ) + ( *s - '0' );
150                ++s;
151        }
[402]152        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]153        return positive ? result : -result;
154}
155
[402]156sint64 nv::buffer_to_sint64( const char* s, char** end )
[365]157{
158        while ( *s == ' ' ) ++s;
159        sint64 result = 0;
160        bool positive = true;
161        switch ( *s )
162        {
163        case '-': ++s; positive = false; break;
164        case '+': ++s; break;
165        default: break;
166        }
167        while ( *s >= '0' && *s <= '9' )
168        {
169                result = ( result * 10 ) + ( *s - '0' );
170                ++s;
171        }
[402]172        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]173        return positive ? result : -result;
174}
175
[402]176uint32 nv::buffer_to_uint32( const char* s, char** end )
[365]177{
178        while ( *s == ' ' ) ++s;
179        uint32 result = 0;
180        while ( *s >= '0' && *s <= '9' )
181        {
[402]182                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
[365]183                ++s;
184        }
[402]185        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]186        return result;
187}
188
[402]189uint64 nv::buffer_to_uint64( const char* s, char** end )
[365]190{
191        while ( *s == ' ' ) ++s;
192        uint64 result = 0;
193        while ( *s >= '0' && *s <= '9' )
194        {
[402]195                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
[365]196                ++s;
197        }
[402]198        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]199        return result;
200}
201
[402]202float nv::buffer_to_f32( const char* s, char** end )
[365]203{
204        return strtof( s, end );
205}
206
[402]207double nv::buffer_to_f64( const char* s, char** end )
[365]208{
209        return strtod( s, end );
210}
Note: See TracBrowser for help on using the repository browser.