annotate src/basic/conv.d @ 207:e0551773a005

Added the correct version.
author Anders Johnsen <skabet@gmail.com>
date Tue, 12 Aug 2008 18:19:34 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
1
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
2 // Written in the D programming language.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
3
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
4 /*
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
5 * Copyright (C) 2002-2006 by Digital Mars, www.digitalmars.com
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
6 * Written by Walter Bright
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
7 * Some parts contributed by David L. Davis
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
8 *
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
9 * This software is provided 'as-is', without any express or implied
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
10 * warranty. In no event will the authors be held liable for any damages
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
11 * arising from the use of this software.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
12 *
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
13 * Permission is granted to anyone to use this software for any purpose,
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
14 * including commercial applications, and to alter it and redistribute it
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
15 * freely, subject to the following restrictions:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
16 *
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
17 * o The origin of this software must not be misrepresented; you must not
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
18 * claim that you wrote the original software. If you use this software
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
19 * in a product, an acknowledgment in the product documentation would be
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
20 * appreciated but is not required.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
21 * o Altered source versions must be plainly marked as such, and must not
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
22 * be misrepresented as being the original software.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
23 * o This notice may not be removed or altered from any source
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
24 * distribution.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
25 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
26
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
27 /***********
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
28 * Conversion building blocks. These differ from the C equivalents
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
29 * <tt>atoi()</tt> and <tt>atol()</tt> by
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
30 * checking for overflow and not allowing whitespace.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
31 *
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
32 * For conversion to signed types, the grammar recognized is:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
33 * <pre>
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
34 $(I Integer):
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
35 $(I Sign UnsignedInteger)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
36 $(I UnsignedInteger)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
37
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
38 $(I Sign):
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
39 $(B +)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
40 $(B -)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
41 * </pre>
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
42 * For conversion to signed types, the grammar recognized is:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
43 * <pre>
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
44 $(I UnsignedInteger):
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
45 $(I DecimalDigit)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
46 $(I DecimalDigit) $(I UnsignedInteger)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
47 * </pre>
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
48 * Macros:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
49 * WIKI=Phobos/StdConv
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
50 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
51
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
52
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
53 /*************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
54 Changed to be used next to tango.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
55
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
56 Unittests removed.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
57 *************************/
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
58
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
59 module basic.conv;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
60
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
61 private import tango.text.Util; // for atof(), toString()
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
62 private import tango.stdc.stringz;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
63 private import tango.stdc.ctype;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
64 private import tango.stdc.stdlib;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
65 private import tango.stdc.errno;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
66 //private import std.c.stdlib;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
67 //private import std.math; // for fabs(), isnan()
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
68
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
69 private
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
70 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
71 extern (C) int getErrno();
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
72 extern (C) int setErrno(int);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
73 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
74
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
75 //debug=conv; // uncomment to turn on debugging printf's
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
76
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
77 /* ************* Exceptions *************** */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
78
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
79 /**
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
80 * Thrown on conversion errors, which happens on deviation from the grammar.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
81 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
82 class ConvError : Exception
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
83 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
84 this(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
85 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
86 super("conversion " ~ s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
87 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
88 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
89
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
90 private void conv_error(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
91 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
92 throw new ConvError(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
93 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
94
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
95 /**
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
96 * Thrown on conversion overflow errors.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
97 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
98 class ConvOverflowError : Exception
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
99 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
100 this(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
101 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
102 super("Error: overflow " ~ s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
103 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
104 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
105
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
106 private void conv_overflow(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
107 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
108 throw new ConvOverflowError(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
109 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
110
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
111 /***************************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
112 * Convert character string to the return type.
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
113 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
114
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
115 int toInt(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
116 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
117 int length = s.length;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
118
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
119 if (!length)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
120 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
121
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
122 int sign = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
123 int v = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
124
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
125 for (int i = 0; i < length; i++)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
126 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
127 char c = s[i];
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
128 if (c >= '0' && c <= '9')
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
129 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
130 if (v < int.max/10 || (v == int.max/10 && c + sign <= '7'))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
131 v = v * 10 + (c - '0');
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
132 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
133 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
134 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
135 else if (c == '-' && i == 0)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
136 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
137 sign = -1;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
138 if (length == 1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
139 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
140 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
141 else if (c == '+' && i == 0)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
142 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
143 if (length == 1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
144 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
145 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
146 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
147 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
148 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
149 if (sign == -1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
150 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
151 if (cast(uint)v > 0x80000000)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
152 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
153 v = -v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
154 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
155 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
156 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
157 if (cast(uint)v > 0x7FFFFFFF)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
158 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
159 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
160 return v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
161
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
162 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
163 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
164
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
165 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
166 conv_error(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
167 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
168 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
169
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
170 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
171 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
172 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
173
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
174 uint toUint(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
175 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
176 int length = s.length;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
177
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
178 if (!length)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
179 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
180
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
181 uint v = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
182
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
183 for (int i = 0; i < length; i++)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
184 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
185 char c = s[i];
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
186 if (c >= '0' && c <= '9')
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
187 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
188 if (v < uint.max/10 || (v == uint.max/10 && c <= '5'))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
189 v = v * 10 + (c - '0');
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
190 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
191 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
192 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
193 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
194 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
195 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
196 return v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
197
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
198 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
199 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
200
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
201 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
202 conv_error(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
203 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
204 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
205
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
206 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
207 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
208 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
209
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
210 long toLong(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
211 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
212 int length = s.length;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
213
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
214 if (!length)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
215 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
216
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
217 int sign = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
218 long v = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
219
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
220 for (int i = 0; i < length; i++)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
221 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
222 char c = s[i];
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
223 if (c >= '0' && c <= '9')
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
224 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
225 if (v < long.max/10 || (v == long.max/10 && c + sign <= '7'))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
226 v = v * 10 + (c - '0');
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
227 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
228 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
229 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
230 else if (c == '-' && i == 0)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
231 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
232 sign = -1;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
233 if (length == 1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
234 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
235 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
236 else if (c == '+' && i == 0)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
237 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
238 if (length == 1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
239 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
240 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
241 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
242 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
243 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
244 if (sign == -1)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
245 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
246 if (cast(ulong)v > 0x8000000000000000)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
247 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
248 v = -v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
249 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
250 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
251 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
252 if (cast(ulong)v > 0x7FFFFFFFFFFFFFFF)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
253 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
254 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
255 return v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
256
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
257 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
258 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
259
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
260 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
261 conv_error(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
262 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
263 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
264
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
265 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
266 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
267 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
268
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
269 ulong toUlong(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
270 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
271 int length = s.length;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
272
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
273 if (!length)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
274 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
275
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
276 ulong v = 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
277
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
278 for (int i = 0; i < length; i++)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
279 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
280 char c = s[i];
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
281 if (c >= '0' && c <= '9')
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
282 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
283 if (v < ulong.max/10 || (v == ulong.max/10 && c <= '5'))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
284 v = v * 10 + (c - '0');
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
285 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
286 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
287 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
288 else
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
289 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
290 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
291 return v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
292
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
293 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
294 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
295
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
296 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
297 conv_error(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
298 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
299 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
300
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
301 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
302 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
303 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
304
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
305 short toShort(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
306 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
307 int v = toInt(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
308
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
309 if (v != cast(short)v)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
310 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
311
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
312 return cast(short)v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
313
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
314 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
315 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
316 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
317 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
318
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
319 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
320 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
321 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
322
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
323 ushort toUshort(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
324 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
325 uint v = toUint(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
326
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
327 if (v != cast(ushort)v)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
328 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
329
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
330 return cast(ushort)v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
331
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
332 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
333 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
334 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
335 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
336
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
337 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
338 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
339 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
340
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
341 byte toByte(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
342 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
343 int v = toInt(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
344
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
345 if (v != cast(byte)v)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
346 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
347
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
348 return cast(byte)v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
349
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
350 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
351 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
352 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
353 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
354
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
355 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
356 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
357 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
358
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
359 ubyte toUbyte(char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
360 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
361 uint v = toUint(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
362
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
363 if (v != cast(ubyte)v)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
364 goto Loverflow;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
365
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
366 return cast(ubyte)v;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
367
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
368 Loverflow:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
369 conv_overflow(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
370 return 0;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
371 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
372
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
373 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
374 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
375 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
376
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
377 float toFloat(in char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
378 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
379 float f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
380 char* endptr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
381 char* sz;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
382
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
383 //writefln("toFloat('%s')", s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
384 sz = toStringz(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
385 if (tango.stdc.ctype.isspace(*sz))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
386 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
387
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
388 // BUG: should set __locale_decpoint to "." for DMC
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
389
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
390 setErrno(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
391 f = strtof(sz, &endptr);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
392 if (getErrno() == ERANGE)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
393 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
394 if (endptr && (endptr == sz || *endptr != 0))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
395 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
396
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
397 return f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
398
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
399 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
400 conv_error(s ~ " not representable as a float");
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
401 assert(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
402 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
403
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
404 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
405 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
406 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
407
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
408 double toDouble(in char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
409 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
410 double f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
411 char* endptr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
412 char* sz;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
413
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
414 //writefln("toDouble('%s')", s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
415 sz = toStringz(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
416 if (tango.stdc.ctype.isspace(*sz))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
417 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
418
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
419 // BUG: should set __locale_decpoint to "." for DMC
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
420
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
421 setErrno(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
422 f = strtod(sz, &endptr);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
423 if (getErrno() == ERANGE)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
424 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
425 if (endptr && (endptr == sz || *endptr != 0))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
426 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
427
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
428 return f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
429
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
430 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
431 conv_error(s ~ " not representable as a double");
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
432 assert(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
433 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
434
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
435 /*******************************************************
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
436 * ditto
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
437 */
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
438 real toReal(in char[] s)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
439 {
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
440 real f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
441 char* endptr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
442 char* sz;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
443
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
444 //writefln("toReal('%s')", s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
445 sz = toStringz(s);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
446 if (tango.stdc.ctype.isspace(*sz))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
447 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
448
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
449 // BUG: should set __locale_decpoint to "." for DMC
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
450
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
451 setErrno(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
452 f = strtold(sz, &endptr);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
453 if (getErrno() == ERANGE)
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
454 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
455 if (endptr && (endptr == sz || *endptr != 0))
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
456 goto Lerr;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
457
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
458 return f;
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
459
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
460 Lerr:
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
461 conv_error(s ~ " not representable as a real");
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
462 assert(0);
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
463 }
e0551773a005 Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
464