A port of the irrlicht XML parser library.

Committer:
hlipka
Date:
Wed Nov 17 20:19:41 2010 +0000
Revision:
0:41a49a73580c
initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 0:41a49a73580c 1 // Copyright (C) 2002-2005 Nikolaus Gebhardt
hlipka 0:41a49a73580c 2 // This file is part of the "Irrlicht Engine" and the "irrXML" project.
hlipka 0:41a49a73580c 3 // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
hlipka 0:41a49a73580c 4
hlipka 0:41a49a73580c 5 #ifndef __FAST_A_TO_F_H_INCLUDED__
hlipka 0:41a49a73580c 6 #define __FAST_A_TO_F_H_INCLUDED__
hlipka 0:41a49a73580c 7
hlipka 0:41a49a73580c 8 #include <stdlib.h>
hlipka 0:41a49a73580c 9 #include <math.h>
hlipka 0:41a49a73580c 10
hlipka 0:41a49a73580c 11 namespace irr
hlipka 0:41a49a73580c 12 {
hlipka 0:41a49a73580c 13 namespace core
hlipka 0:41a49a73580c 14 {
hlipka 0:41a49a73580c 15
hlipka 0:41a49a73580c 16 const float fast_atof_table[] = {
hlipka 0:41a49a73580c 17 0.f,
hlipka 0:41a49a73580c 18 0.1f,
hlipka 0:41a49a73580c 19 0.01f,
hlipka 0:41a49a73580c 20 0.001f,
hlipka 0:41a49a73580c 21 0.0001f,
hlipka 0:41a49a73580c 22 0.00001f,
hlipka 0:41a49a73580c 23 0.000001f,
hlipka 0:41a49a73580c 24 0.0000001f,
hlipka 0:41a49a73580c 25 0.00000001f,
hlipka 0:41a49a73580c 26 0.000000001f,
hlipka 0:41a49a73580c 27 0.0000000001f,
hlipka 0:41a49a73580c 28 0.00000000001f,
hlipka 0:41a49a73580c 29 0.000000000001f,
hlipka 0:41a49a73580c 30 0.0000000000001f,
hlipka 0:41a49a73580c 31 0.00000000000001f,
hlipka 0:41a49a73580c 32 0.000000000000001f
hlipka 0:41a49a73580c 33 };
hlipka 0:41a49a73580c 34
hlipka 0:41a49a73580c 35 //! Provides a fast function for converting a string into a float,
hlipka 0:41a49a73580c 36 //! about 6 times faster than atof in win32.
hlipka 0:41a49a73580c 37 // If you find any bugs, please send them to me, niko (at) irrlicht3d.org.
hlipka 0:41a49a73580c 38 inline char* fast_atof_move(char* c, float& out)
hlipka 0:41a49a73580c 39 {
hlipka 0:41a49a73580c 40 bool inv = false;
hlipka 0:41a49a73580c 41 char *t;
hlipka 0:41a49a73580c 42 float f;
hlipka 0:41a49a73580c 43
hlipka 0:41a49a73580c 44 if (*c=='-')
hlipka 0:41a49a73580c 45 {
hlipka 0:41a49a73580c 46 c++;
hlipka 0:41a49a73580c 47 inv = true;
hlipka 0:41a49a73580c 48 }
hlipka 0:41a49a73580c 49
hlipka 0:41a49a73580c 50 f = (float)strtol(c, &t, 10);
hlipka 0:41a49a73580c 51
hlipka 0:41a49a73580c 52 c = t;
hlipka 0:41a49a73580c 53
hlipka 0:41a49a73580c 54 if (*c == '.')
hlipka 0:41a49a73580c 55 {
hlipka 0:41a49a73580c 56 c++;
hlipka 0:41a49a73580c 57
hlipka 0:41a49a73580c 58 float pl = (float)strtol(c, &t, 10);
hlipka 0:41a49a73580c 59 pl *= fast_atof_table[t-c];
hlipka 0:41a49a73580c 60
hlipka 0:41a49a73580c 61 f += pl;
hlipka 0:41a49a73580c 62
hlipka 0:41a49a73580c 63 c = t;
hlipka 0:41a49a73580c 64
hlipka 0:41a49a73580c 65 if (*c == 'e')
hlipka 0:41a49a73580c 66 {
hlipka 0:41a49a73580c 67 ++c;
hlipka 0:41a49a73580c 68 float exp = (float)strtol(c, &t, 10);
hlipka 0:41a49a73580c 69 f *= (float)pow(10.0f, exp);
hlipka 0:41a49a73580c 70 c = t;
hlipka 0:41a49a73580c 71 }
hlipka 0:41a49a73580c 72 }
hlipka 0:41a49a73580c 73
hlipka 0:41a49a73580c 74 if (inv)
hlipka 0:41a49a73580c 75 f *= -1.0f;
hlipka 0:41a49a73580c 76
hlipka 0:41a49a73580c 77 out = f;
hlipka 0:41a49a73580c 78 return c;
hlipka 0:41a49a73580c 79 }
hlipka 0:41a49a73580c 80
hlipka 0:41a49a73580c 81 //! Provides a fast function for converting a string into a float,
hlipka 0:41a49a73580c 82 //! about 6 times faster than atof in win32.
hlipka 0:41a49a73580c 83 // If you find any bugs, please send them to me, niko (at) irrlicht3d.org.
hlipka 0:41a49a73580c 84 inline const char* fast_atof_move_const(const char* c, float& out)
hlipka 0:41a49a73580c 85 {
hlipka 0:41a49a73580c 86 bool inv = false;
hlipka 0:41a49a73580c 87 char *t;
hlipka 0:41a49a73580c 88 float f;
hlipka 0:41a49a73580c 89
hlipka 0:41a49a73580c 90 if (*c=='-')
hlipka 0:41a49a73580c 91 {
hlipka 0:41a49a73580c 92 c++;
hlipka 0:41a49a73580c 93 inv = true;
hlipka 0:41a49a73580c 94 }
hlipka 0:41a49a73580c 95
hlipka 0:41a49a73580c 96 f = (float)strtol(c, &t, 10);
hlipka 0:41a49a73580c 97
hlipka 0:41a49a73580c 98 c = t;
hlipka 0:41a49a73580c 99
hlipka 0:41a49a73580c 100 if (*c == '.')
hlipka 0:41a49a73580c 101 {
hlipka 0:41a49a73580c 102 c++;
hlipka 0:41a49a73580c 103
hlipka 0:41a49a73580c 104 float pl = (float)strtol(c, &t, 10);
hlipka 0:41a49a73580c 105 pl *= fast_atof_table[t-c];
hlipka 0:41a49a73580c 106
hlipka 0:41a49a73580c 107 f += pl;
hlipka 0:41a49a73580c 108
hlipka 0:41a49a73580c 109 c = t;
hlipka 0:41a49a73580c 110
hlipka 0:41a49a73580c 111 if (*c == 'e')
hlipka 0:41a49a73580c 112 {
hlipka 0:41a49a73580c 113 ++c;
hlipka 0:41a49a73580c 114 f32 exp = (f32)strtol(c, &t, 10);
hlipka 0:41a49a73580c 115 f *= (f32)powf(10.0f, exp);
hlipka 0:41a49a73580c 116 c = t;
hlipka 0:41a49a73580c 117 }
hlipka 0:41a49a73580c 118 }
hlipka 0:41a49a73580c 119
hlipka 0:41a49a73580c 120 if (inv)
hlipka 0:41a49a73580c 121 f *= -1.0f;
hlipka 0:41a49a73580c 122
hlipka 0:41a49a73580c 123 out = f;
hlipka 0:41a49a73580c 124 return c;
hlipka 0:41a49a73580c 125 }
hlipka 0:41a49a73580c 126
hlipka 0:41a49a73580c 127
hlipka 0:41a49a73580c 128 inline float fast_atof(const char* c)
hlipka 0:41a49a73580c 129 {
hlipka 0:41a49a73580c 130 float ret;
hlipka 0:41a49a73580c 131 fast_atof_move_const(c, ret);
hlipka 0:41a49a73580c 132 return ret;
hlipka 0:41a49a73580c 133 }
hlipka 0:41a49a73580c 134
hlipka 0:41a49a73580c 135 } // end namespace core
hlipka 0:41a49a73580c 136 }// end namespace irr
hlipka 0:41a49a73580c 137
hlipka 0:41a49a73580c 138 #endif