|
Revision 13041, 3.4 kB
(checked in by robert, 14 months ago)
|
|
Ran script to remove trailing spaces and tabs
|
-
Property svn:eol-style set to
native
|
| Line | |
|---|
| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | #include <osg/Math> |
|---|
| 15 | |
|---|
| 16 | #include <string.h> |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | double osg::asciiToDouble(const char* str) |
|---|
| 20 | { |
|---|
| 21 | const char* ptr = str; |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | if (strncmp(ptr,"0x",2)==0) |
|---|
| 25 | { |
|---|
| 26 | |
|---|
| 27 | double value = 0.0; |
|---|
| 28 | |
|---|
| 29 | |
|---|
| 30 | |
|---|
| 31 | ptr+=2; |
|---|
| 32 | while ( |
|---|
| 33 | *ptr!=0 && |
|---|
| 34 | ((*ptr>='0' && *ptr<='9') || |
|---|
| 35 | (*ptr>='a' && *ptr<='f') || |
|---|
| 36 | (*ptr>='A' && *ptr<='F')) |
|---|
| 37 | ) |
|---|
| 38 | { |
|---|
| 39 | if (*ptr>='0' && *ptr<='9') value = value*16.0 + double(*ptr-'0'); |
|---|
| 40 | else if (*ptr>='a' && *ptr<='f') value = value*16.0 + double(*ptr-'a'+10); |
|---|
| 41 | else if (*ptr>='A' && *ptr<='F') value = value*16.0 + double(*ptr-'A'+10); |
|---|
| 42 | ++ptr; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | |
|---|
| 46 | return value; |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | ptr = str; |
|---|
| 50 | |
|---|
| 51 | bool hadDecimal[2]; |
|---|
| 52 | double value[2]; |
|---|
| 53 | double sign[2]; |
|---|
| 54 | double decimalMultiplier[2]; |
|---|
| 55 | |
|---|
| 56 | hadDecimal[0] = hadDecimal[1] = false; |
|---|
| 57 | sign[0] = sign[1] = 1.0; |
|---|
| 58 | value[0] = value[1] = 0.0; |
|---|
| 59 | decimalMultiplier[0] = decimalMultiplier[1] = 0.1; |
|---|
| 60 | int pos = 0; |
|---|
| 61 | |
|---|
| 62 | |
|---|
| 63 | while (*ptr!=0 && pos<2) |
|---|
| 64 | { |
|---|
| 65 | if (*ptr=='+') |
|---|
| 66 | { |
|---|
| 67 | sign[pos] = 1.0; |
|---|
| 68 | } |
|---|
| 69 | else if (*ptr=='-') |
|---|
| 70 | { |
|---|
| 71 | sign[pos] = -1.0; |
|---|
| 72 | } |
|---|
| 73 | else if (*ptr>='0' && *ptr<='9') |
|---|
| 74 | { |
|---|
| 75 | if (!hadDecimal[pos]) |
|---|
| 76 | { |
|---|
| 77 | value[pos] = value[pos]*10.0 + double(*ptr-'0'); |
|---|
| 78 | } |
|---|
| 79 | else |
|---|
| 80 | { |
|---|
| 81 | value[pos] = value[pos] + decimalMultiplier[pos] * double(*ptr-'0'); |
|---|
| 82 | decimalMultiplier[pos] *= 0.1; |
|---|
| 83 | } |
|---|
| 84 | } |
|---|
| 85 | else if (*ptr=='.') |
|---|
| 86 | { |
|---|
| 87 | hadDecimal[pos] = true; |
|---|
| 88 | } |
|---|
| 89 | else if (*ptr=='e' || *ptr=='E') |
|---|
| 90 | { |
|---|
| 91 | if (pos==1) break; |
|---|
| 92 | |
|---|
| 93 | pos = 1; |
|---|
| 94 | } |
|---|
| 95 | else |
|---|
| 96 | { |
|---|
| 97 | break; |
|---|
| 98 | } |
|---|
| 99 | ++ptr; |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | if (pos==0) |
|---|
| 103 | { |
|---|
| 104 | |
|---|
| 105 | return value[0]*sign[0]; |
|---|
| 106 | } |
|---|
| 107 | else |
|---|
| 108 | { |
|---|
| 109 | double mantissa = value[0]*sign[0]; |
|---|
| 110 | double exponent = value[1]*sign[1]; |
|---|
| 111 | |
|---|
| 112 | return mantissa*pow(10.0,exponent); |
|---|
| 113 | } |
|---|
| 114 | } |
|---|
| 115 | |
|---|
| 116 | double osg::findAsciiToDouble(const char* str) |
|---|
| 117 | { |
|---|
| 118 | const char* ptr = str; |
|---|
| 119 | double value = 0.0; |
|---|
| 120 | |
|---|
| 121 | while(*ptr != 0) { |
|---|
| 122 | |
|---|
| 123 | if(*ptr>='0' && *ptr<='9') { |
|---|
| 124 | value = asciiToDouble(ptr); |
|---|
| 125 | return value; |
|---|
| 126 | } |
|---|
| 127 | |
|---|
| 128 | ++ptr; |
|---|
| 129 | } |
|---|
| 130 | |
|---|
| 131 | return 0.0; |
|---|
| 132 | } |
|---|