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

Last change on this file since 440 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
Line 
1// Copyright (C) 2015 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
6//
7// TODO: speedup conversion by doing divisions by 100
8
9#include "nv/stl/string.hh"
10
11#include <cstdio>
12#include <cstdlib>
13#include <fstream> // for slurp only
14#include <sstream> // for slurp only
15
16using namespace nv;
17
18//static const double s_power_10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
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
31nv::size_t nv::sint32_to_buffer( array_ref< char > buffer, sint32 n )
32{
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 );
37        do
38        {
39                if ( s == last ) { *buffer.begin() = '\0'; return 0;  }
40                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
41                abs /= 10;
42        } while ( abs > 0 );
43        if ( n < 0 )
44        {
45                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
46                *s++ = '-';
47        }
48        *s = '\0';
49        string_reverse( buffer.begin(), s - 1 );
50        return static_cast<nv::size_t>( s - buffer.begin() );
51}
52
53nv::size_t nv::sint64_to_buffer( array_ref< char > buffer, sint64 n )
54{
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 );
59        do
60        {
61                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
62                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
63                abs /= 10;
64        } while ( abs > 0 );
65        if ( n < 0 )
66        {
67                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
68                *s++ = '-';
69        }
70        *s = '\0';
71        string_reverse( buffer.begin(), s - 1 );
72        return static_cast<nv::size_t>( s - buffer.begin() );
73}
74
75nv::size_t nv::uint32_to_buffer( array_ref< char > buffer, uint32 n )
76{
77        if ( buffer.size() < 2 ) return 0;
78        char* last = buffer.end() - 1;
79        char* s = buffer.begin();
80        do
81        {
82                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
83                *s++ = static_cast<char>( '0' + ( n % 10 ) );
84                n /= 10;
85        } while ( n > 0 );
86        *s = '\0';
87        string_reverse( buffer.begin(), s - 1 );
88        return static_cast<nv::size_t>( s - buffer.begin() );
89}
90
91nv::size_t nv::uint64_to_buffer( array_ref< char > buffer, uint64 n )
92{
93        if ( buffer.size() < 2 ) return 0;
94        char* last = buffer.end() - 1;
95        char* s = buffer.begin();
96        do
97        {
98                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
99                *s++ = static_cast<char>( '0' + ( n % 10 ) );
100                n /= 10;
101        } while ( n > 0 );
102        *s = '\0';
103        string_reverse( buffer.begin(), s - 1 );
104        return static_cast<nv::size_t>( s - buffer.begin() );
105}
106
107nv::size_t nv::f32_to_buffer( array_ref< char > buffer, f32 n )
108{
109#if NV_COMPILER == NV_MSVC
110        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
111#else
112        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
113#endif
114        return static_cast<nv::size_t>( result > 0 ? result : 0 );
115}
116
117nv::size_t nv::f64_to_buffer( array_ref< char > buffer, f64 n )
118{
119#if NV_COMPILER == NV_MSVC
120        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
121#else
122        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
123#endif
124        return static_cast<nv::size_t>( result > 0 ? result : 0 );
125}
126
127sint32 nv::buffer_to_sint32( const char* str, char** end )
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        }
144        if ( end != nullptr ) *end = const_cast<char*>( s );
145        return positive ? result : -result;
146}
147
148sint64 nv::buffer_to_sint64( const char* s, char** end )
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        }
164        if ( end != nullptr ) *end = const_cast<char*>( s );
165        return positive ? result : -result;
166}
167
168uint32 nv::buffer_to_uint32( const char* s, char** end )
169{
170        while ( *s == ' ' ) ++s;
171        uint32 result = 0;
172        while ( *s >= '0' && *s <= '9' )
173        {
174                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
175                ++s;
176        }
177        if ( end != nullptr ) *end = const_cast<char*>( s );
178        return result;
179}
180
181uint64 nv::buffer_to_uint64( const char* s, char** end )
182{
183        while ( *s == ' ' ) ++s;
184        uint64 result = 0;
185        while ( *s >= '0' && *s <= '9' )
186        {
187                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
188                ++s;
189        }
190        if ( end != nullptr ) *end = const_cast<char*>( s );
191        return result;
192}
193
194float nv::buffer_to_f32( const char* s, char** end )
195{
196        return strtof( s, end );
197}
198
199double nv::buffer_to_f64( const char* s, char** end )
200{
201        return strtod( s, end );
202}
Note: See TracBrowser for help on using the repository browser.