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

Last change on this file since 437 was 435, checked in by epyon, 10 years ago
  • short_string implementation - first usages
File size: 5.2 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
15using namespace nv;
16
17//static const double s_power_10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
18
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
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
39nv::size_t nv::sint32_to_buffer( array_ref< char > buffer, sint32 n )
40{
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 );
45        do
46        {
47                if ( s == last ) { *buffer.begin() = '\0'; return 0;  }
48                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
49                abs /= 10;
50        } while ( abs > 0 );
51        if ( n < 0 )
52        {
53                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
54                *s++ = '-';
55        }
56        *s = '\0';
57        string_reverse( buffer.begin(), s - 1 );
58        return static_cast<nv::size_t>( s - buffer.begin() );
59}
60
61nv::size_t nv::sint64_to_buffer( array_ref< char > buffer, sint64 n )
62{
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 );
67        do
68        {
69                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
70                *s++ = static_cast<char>( '0' + ( abs % 10 ) );
71                abs /= 10;
72        } while ( abs > 0 );
73        if ( n < 0 )
74        {
75                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
76                *s++ = '-';
77        }
78        *s = '\0';
79        string_reverse( buffer.begin(), s - 1 );
80        return static_cast<nv::size_t>( s - buffer.begin() );
81}
82
83nv::size_t nv::uint32_to_buffer( array_ref< char > buffer, uint32 n )
84{
85        if ( buffer.size() < 2 ) return 0;
86        char* last = buffer.end() - 1;
87        char* s = buffer.begin();
88        do
89        {
90                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
91                *s++ = static_cast<char>( '0' + ( n % 10 ) );
92                n /= 10;
93        } while ( n > 0 );
94        *s = '\0';
95        string_reverse( buffer.begin(), s - 1 );
96        return static_cast<nv::size_t>( s - buffer.begin() );
97}
98
99nv::size_t nv::uint64_to_buffer( array_ref< char > buffer, uint64 n )
100{
101        if ( buffer.size() < 2 ) return 0;
102        char* last = buffer.end() - 1;
103        char* s = buffer.begin();
104        do
105        {
106                if ( s == last ) { *buffer.begin() = '\0'; return 0; }
107                *s++ = static_cast<char>( '0' + ( n % 10 ) );
108                n /= 10;
109        } while ( n > 0 );
110        *s = '\0';
111        string_reverse( buffer.begin(), s - 1 );
112        return static_cast<nv::size_t>( s - buffer.begin() );
113}
114
115nv::size_t nv::f32_to_buffer( array_ref< char > buffer, f32 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
125nv::size_t nv::f64_to_buffer( array_ref< char > buffer, f64 n )
126{
127#if NV_COMPILER == NV_MSVC
128        int result = sprintf_s( buffer.data(), buffer.size(), "%.*g", 6, n );
129#else
130        int result = snprintf( buffer.data(), buffer.size(), "%.*g", 6, n );
131#endif
132        return static_cast<nv::size_t>( result > 0 ? result : 0 );
133}
134
135sint32 nv::buffer_to_sint32( const char* str, char** end )
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        }
152        if ( end != nullptr ) *end = const_cast<char*>( s );
153        return positive ? result : -result;
154}
155
156sint64 nv::buffer_to_sint64( const char* s, char** end )
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        }
172        if ( end != nullptr ) *end = const_cast<char*>( s );
173        return positive ? result : -result;
174}
175
176uint32 nv::buffer_to_uint32( const char* s, char** end )
177{
178        while ( *s == ' ' ) ++s;
179        uint32 result = 0;
180        while ( *s >= '0' && *s <= '9' )
181        {
182                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
183                ++s;
184        }
185        if ( end != nullptr ) *end = const_cast<char*>( s );
186        return result;
187}
188
189uint64 nv::buffer_to_uint64( const char* s, char** end )
190{
191        while ( *s == ' ' ) ++s;
192        uint64 result = 0;
193        while ( *s >= '0' && *s <= '9' )
194        {
195                result = ( result * 10 ) + static_cast<uint32>( *s - '0' );
196                ++s;
197        }
198        if ( end != nullptr ) *end = const_cast<char*>( s );
199        return result;
200}
201
202float nv::buffer_to_f32( const char* s, char** end )
203{
204        return strtof( s, end );
205}
206
207double nv::buffer_to_f64( const char* s, char** end )
208{
209        return strtod( s, end );
210}
Note: See TracBrowser for help on using the repository browser.