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

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