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

Last change on this file since 438 was 438, checked in by epyon, 10 years ago
  • massive amount of std::string removal
  • removed slurp, use filesystem::slurp instead
  • lua_values const_string support
  • several bugfixes
  • program_manager and shader loading without std::string/std::stream
File size: 5.0 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
[438]14#include <sstream> // for slurp only
[365]15
16using namespace nv;
17
[402]18//static const double s_power_10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
[365]19
20static inline void string_reverse( char* begin, char* end )
21{
22        char temp;
23        while ( end > begin )
24        {
25                temp = *end;
26                *end-- = *begin;
27                *begin++ = temp;
28        }
29}
30
[435]31nv::size_t nv::sint32_to_buffer( array_ref< char > buffer, sint32 n )
[365]32{
[435]33        if ( buffer.size() < 2 ) return 0;
34        char* last = buffer.end() - 1;
35        char* s = buffer.begin();
36        uint32 abs = static_cast<uint32>( n < 0 ? -n : n );
[365]37        do
38        {
[435]39                if ( s == last ) { *buffer.begin() = '\0'; return 0;  }
[402]40                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
[365]41                abs /= 10;
42        } while ( abs > 0 );
[435]43        if ( n < 0 )
44        {
45                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
46                *s++ = '-';
47        }
[365]48        *s = '\0';
[435]49        string_reverse( buffer.begin(), s - 1 );
50        return static_cast<nv::size_t>( s - buffer.begin() );
[365]51}
52
[435]53nv::size_t nv::sint64_to_buffer( array_ref< char > buffer, sint64 n )
[365]54{
[435]55        if ( buffer.size() < 2 ) return 0;
56        char* last = buffer.end() - 1;
57        char* s = buffer.begin();
58        uint64 abs = static_cast<uint64>( n < 0 ? -n : n );
[365]59        do
60        {
[435]61                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]62                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
[365]63                abs /= 10;
64        } while ( abs > 0 );
[435]65        if ( n < 0 )
66        {
67                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
68                *s++ = '-';
69        }
[365]70        *s = '\0';
[435]71        string_reverse( buffer.begin(), s - 1 );
72        return static_cast<nv::size_t>( s - buffer.begin() );
[365]73}
74
[435]75nv::size_t nv::uint32_to_buffer( array_ref< char > buffer, uint32 n )
[365]76{
[435]77        if ( buffer.size() < 2 ) return 0;
78        char* last = buffer.end() - 1;
79        char* s = buffer.begin();
[365]80        do
81        {
[435]82                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]83                *s++ = static_cast<char>( '0' + ( n % 10 ) );
[365]84                n /= 10;
85        } while ( n > 0 );
86        *s = '\0';
[435]87        string_reverse( buffer.begin(), s - 1 );
88        return static_cast<nv::size_t>( s - buffer.begin() );
[365]89}
90
[435]91nv::size_t nv::uint64_to_buffer( array_ref< char > buffer, uint64 n )
[365]92{
[435]93        if ( buffer.size() < 2 ) return 0;
94        char* last = buffer.end() - 1;
95        char* s = buffer.begin();
[365]96        do
97        {
[435]98                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
[402]99                *s++ = static_cast<char>( '0' + ( n % 10 ) );
[365]100                n /= 10;
101        } while ( n > 0 );
102        *s = '\0';
[435]103        string_reverse( buffer.begin(), s - 1 );
104        return static_cast<nv::size_t>( s - buffer.begin() );
[365]105}
106
[435]107nv::size_t nv::f32_to_buffer( array_ref< char > buffer, f32 n )
[365]108{
109#if NV_COMPILER == NV_MSVC
[435]110        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]111#else
[435]112        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]113#endif
[402]114        return static_cast<nv::size_t>( result > 0 ? result : 0 );
[365]115}
116
[435]117nv::size_t nv::f64_to_buffer( array_ref< char > buffer, f64 n )
[365]118{
119#if NV_COMPILER == NV_MSVC
[435]120        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]121#else
[435]122        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
[365]123#endif
[402]124        return static_cast<nv::size_t>( result > 0 ? result : 0 );
[365]125}
126
[402]127sint32 nv::buffer_to_sint32( const char* str, char** end )
[365]128{
129        const char* s = str;
130        while ( *s == ' ' ) ++s;
131        sint32 result = 0;
132        bool positive = true;
133        switch ( *s )
134        {
135        case '-': ++s; positive = false; break;
136        case '+': ++s; break;
137        default: break;
138        }
139        while ( *s >= '0' && *s <= '9' )
140        {
141                result = ( result * 10 ) + ( *s - '0' );
142                ++s;
143        }
[402]144        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]145        return positive ? result : -result;
146}
147
[402]148sint64 nv::buffer_to_sint64( const char* s, char** end )
[365]149{
150        while ( *s == ' ' ) ++s;
151        sint64 result = 0;
152        bool positive = true;
153        switch ( *s )
154        {
155        case '-': ++s; positive = false; break;
156        case '+': ++s; break;
157        default: break;
158        }
159        while ( *s >= '0' && *s <= '9' )
160        {
161                result = ( result * 10 ) + ( *s - '0' );
162                ++s;
163        }
[402]164        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]165        return positive ? result : -result;
166}
167
[402]168uint32 nv::buffer_to_uint32( const char* s, char** end )
[365]169{
170        while ( *s == ' ' ) ++s;
171        uint32 result = 0;
172        while ( *s >= '0' && *s <= '9' )
173        {
[402]174                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
[365]175                ++s;
176        }
[402]177        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]178        return result;
179}
180
[402]181uint64 nv::buffer_to_uint64( const char* s, char** end )
[365]182{
183        while ( *s == ' ' ) ++s;
184        uint64 result = 0;
185        while ( *s >= '0' && *s <= '9' )
186        {
[402]187                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
[365]188                ++s;
189        }
[402]190        if ( end != nullptr ) *end = const_cast<char*>( s );
[365]191        return result;
192}
193
[402]194float nv::buffer_to_f32( const char* s, char** end )
[365]195{
196        return strtof( s, end );
197}
198
[402]199double nv::buffer_to_f64( const char* s, char** end )
[365]200{
201        return strtod( s, end );
202}
Note: See TracBrowser for help on using the repository browser.