annotate lphobos/std/conv.d @ 1137:45d73f0a9b43

Automated merge with http://hg.dsource.org/projects/ldc
author Christian Kamm <kamm incasoftware de>
date Tue, 24 Mar 2009 14:34:16 +0100
parents 5825d48b27d1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
2 // Written in the D programming language.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
3
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
4 /*
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
5 * Copyright (C) 2002-2006 by Digital Mars, www.digitalmars.com
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
6 * Written by Walter Bright
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
7 * Some parts contributed by David L. Davis
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
8 *
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
9 * This software is provided 'as-is', without any express or implied
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
10 * warranty. In no event will the authors be held liable for any damages
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
11 * arising from the use of this software.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
12 *
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
13 * Permission is granted to anyone to use this software for any purpose,
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
14 * including commercial applications, and to alter it and redistribute it
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
15 * freely, subject to the following restrictions:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
16 *
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
17 * o The origin of this software must not be misrepresented; you must not
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
18 * claim that you wrote the original software. If you use this software
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
19 * in a product, an acknowledgment in the product documentation would be
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
20 * appreciated but is not required.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
21 * o Altered source versions must be plainly marked as such, and must not
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
22 * be misrepresented as being the original software.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
23 * o This notice may not be removed or altered from any source
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
24 * distribution.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
25 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
26
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
27 /***********
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
28 * Conversion building blocks. These differ from the C equivalents
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
29 * <tt>atoi()</tt> and <tt>atol()</tt> by
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
30 * checking for overflow and not allowing whitespace.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
31 *
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
32 * For conversion to signed types, the grammar recognized is:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
33 * <pre>
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
34 $(I Integer):
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
35 $(I Sign UnsignedInteger)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
36 $(I UnsignedInteger)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
37
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
38 $(I Sign):
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
39 $(B +)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
40 $(B -)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
41 * </pre>
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
42 * For conversion to signed types, the grammar recognized is:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
43 * <pre>
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
44 $(I UnsignedInteger):
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
45 $(I DecimalDigit)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
46 $(I DecimalDigit) $(I UnsignedInteger)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
47 * </pre>
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
48 * Macros:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
49 * WIKI=Phobos/StdConv
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
50 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
51
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
52 module std.conv;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
53
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
54 private import std.string; // for atof(), toString()
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
55 private import std.c.stdlib;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
56 private import std.math; // for fabs(), isnan()
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
57 private import std.stdio; // for writefln() and printf()
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
58
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
59
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
60 //debug=conv; // uncomment to turn on debugging printf's
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
61
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
62 /* ************* Exceptions *************** */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
63
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
64 /**
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
65 * Thrown on conversion errors, which happens on deviation from the grammar.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
66 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
67 class ConvError : Error
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
68 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
69 this(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
70 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
71 super("conversion " ~ s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
72 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
73 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
74
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
75 private void conv_error(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
76 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
77 throw new ConvError(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
78 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
79
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
80 /**
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
81 * Thrown on conversion overflow errors.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
82 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
83 class ConvOverflowError : Error
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
84 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
85 this(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
86 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
87 super("Error: overflow " ~ s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
88 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
89 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
90
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
91 private void conv_overflow(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
92 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
93 throw new ConvOverflowError(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
94 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
95
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
96 /***************************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
97 * Convert character string to the return type.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
98 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
99
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
100 int toInt(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
101 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
102 int length = s.length;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
103
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
104 if (!length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
105 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
106
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
107 int sign = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
108 int v = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
109
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
110 for (int i = 0; i < length; i++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
111 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
112 char c = s[i];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
113 if (c >= '0' && c <= '9')
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
114 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
115 if (v < int.max/10 || (v == int.max/10 && c + sign <= '7'))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
116 v = v * 10 + (c - '0');
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
117 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
118 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
119 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
120 else if (c == '-' && i == 0)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
121 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
122 sign = -1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
123 if (length == 1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
124 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
125 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
126 else if (c == '+' && i == 0)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
127 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
128 if (length == 1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
129 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
130 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
131 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
132 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
133 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
134 if (sign == -1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
135 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
136 if (cast(uint)v > 0x80000000)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
137 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
138 v = -v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
139 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
140 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
141 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
142 if (cast(uint)v > 0x7FFFFFFF)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
143 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
144 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
145 return v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
146
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
147 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
148 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
149
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
150 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
151 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
152 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
153 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
154
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
155 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
156 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
157 debug(conv) printf("conv.toInt.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
158
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
159 int i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
160
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
161 i = toInt("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
162 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
163
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
164 i = toInt("+0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
165 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
166
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
167 i = toInt("-0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
168 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
169
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
170 i = toInt("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
171 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
172
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
173 i = toInt("+23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
174 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
175
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
176 i = toInt("-468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
177 assert(i == -468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
178
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
179 i = toInt("2147483647");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
180 assert(i == 0x7FFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
181
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
182 i = toInt("-2147483648");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
183 assert(i == 0x80000000);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
184
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
185 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
186 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
187 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
188 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
189 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
190 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
191 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
192 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
193 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
194 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
195 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
196 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
197 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
198 "2147483648",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
199 "-2147483649",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
200 "5656566565",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
201 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
202
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
203 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
204 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
205 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
206 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
207 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
208 i = toInt(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
209 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
210 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
211 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
212 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
213 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
214 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
215 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
216 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
217 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
218 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
219
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
220
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
221 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
222 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
223 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
224
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
225 uint toUint(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
226 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
227 int length = s.length;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
228
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
229 if (!length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
230 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
231
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
232 uint v = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
233
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
234 for (int i = 0; i < length; i++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
235 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
236 char c = s[i];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
237 if (c >= '0' && c <= '9')
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
238 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
239 if (v < uint.max/10 || (v == uint.max/10 && c <= '5'))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
240 v = v * 10 + (c - '0');
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
241 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
242 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
243 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
244 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
245 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
246 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
247 return v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
248
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
249 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
250 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
251
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
252 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
253 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
254 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
255 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
256
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
257 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
258 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
259 debug(conv) printf("conv.toUint.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
260
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
261 uint i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
262
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
263 i = toUint("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
264 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
265
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
266 i = toUint("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
267 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
268
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
269 i = toUint("23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
270 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
271
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
272 i = toUint("468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
273 assert(i == 468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
274
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
275 i = toUint("2147483647");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
276 assert(i == 0x7FFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
277
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
278 i = toUint("4294967295");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
279 assert(i == 0xFFFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
280
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
281 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
282 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
283 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
284 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
285 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
286 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
287 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
288 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
289 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
290 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
291 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
292 "+5",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
293 "-78",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
294 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
295 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
296 "4294967296",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
297 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
298
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
299 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
300 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
301 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
302 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
303 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
304 i = toUint(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
305 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
306 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
307 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
308 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
309 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
310 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
311 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
312 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
313 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
314 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
315
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
316 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
317 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
318 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
319
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
320 long toLong(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
321 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
322 int length = s.length;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
323
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
324 if (!length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
325 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
326
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
327 int sign = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
328 long v = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
329
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
330 for (int i = 0; i < length; i++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
331 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
332 char c = s[i];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
333 if (c >= '0' && c <= '9')
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
334 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
335 if (v < long.max/10 || (v == long.max/10 && c + sign <= '7'))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
336 v = v * 10 + (c - '0');
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
337 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
338 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
339 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
340 else if (c == '-' && i == 0)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
341 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
342 sign = -1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
343 if (length == 1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
344 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
345 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
346 else if (c == '+' && i == 0)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
347 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
348 if (length == 1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
349 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
350 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
351 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
352 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
353 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
354 if (sign == -1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
355 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
356 if (cast(ulong)v > 0x8000000000000000)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
357 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
358 v = -v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
359 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
360 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
361 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
362 if (cast(ulong)v > 0x7FFFFFFFFFFFFFFF)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
363 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
364 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
365 return v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
366
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
367 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
368 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
369
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
370 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
371 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
372 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
373 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
374
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
375 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
376 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
377 debug(conv) printf("conv.toLong.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
378
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
379 long i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
380
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
381 i = toLong("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
382 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
383
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
384 i = toLong("+0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
385 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
386
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
387 i = toLong("-0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
388 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
389
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
390 i = toLong("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
391 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
392
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
393 i = toLong("+23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
394 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
395
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
396 i = toLong("-468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
397 assert(i == -468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
398
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
399 i = toLong("2147483647");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
400 assert(i == 0x7FFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
401
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
402 i = toLong("-2147483648");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
403 assert(i == -0x80000000L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
404
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
405 i = toLong("9223372036854775807");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
406 assert(i == 0x7FFFFFFFFFFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
407
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
408 i = toLong("-9223372036854775808");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
409 assert(i == 0x8000000000000000);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
410
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
411 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
412 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
413 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
414 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
415 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
416 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
417 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
418 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
419 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
420 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
421 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
422 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
423 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
424 "9223372036854775808",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
425 "-9223372036854775809",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
426 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
427
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
428 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
429 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
430 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
431 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
432 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
433 i = toLong(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
434 printf("l = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
435 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
436 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
437 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
438 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
439 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
440 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
441 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
442 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
443 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
444
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
445
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
446 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
447 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
448 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
449
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
450 ulong toUlong(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
451 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
452 int length = s.length;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
453
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
454 if (!length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
455 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
456
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
457 ulong v = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
458
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
459 for (int i = 0; i < length; i++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
460 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
461 char c = s[i];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
462 if (c >= '0' && c <= '9')
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
463 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
464 if (v < ulong.max/10 || (v == ulong.max/10 && c <= '5'))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
465 v = v * 10 + (c - '0');
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
466 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
467 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
468 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
469 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
470 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
471 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
472 return v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
473
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
474 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
475 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
476
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
477 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
478 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
479 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
480 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
481
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
482 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
483 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
484 debug(conv) printf("conv.toUlong.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
485
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
486 ulong i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
487
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
488 i = toUlong("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
489 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
490
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
491 i = toUlong("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
492 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
493
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
494 i = toUlong("23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
495 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
496
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
497 i = toUlong("468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
498 assert(i == 468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
499
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
500 i = toUlong("2147483647");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
501 assert(i == 0x7FFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
502
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
503 i = toUlong("4294967295");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
504 assert(i == 0xFFFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
505
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
506 i = toUlong("9223372036854775807");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
507 assert(i == 0x7FFFFFFFFFFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
508
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
509 i = toUlong("18446744073709551615");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
510 assert(i == 0xFFFFFFFFFFFFFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
511
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
512
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
513 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
514 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
515 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
516 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
517 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
518 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
519 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
520 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
521 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
522 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
523 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
524 "+5",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
525 "-78",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
526 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
527 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
528 "18446744073709551616",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
529 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
530
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
531 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
532 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
533 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
534 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
535 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
536 i = toUlong(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
537 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
538 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
539 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
540 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
541 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
542 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
543 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
544 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
545 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
546 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
547
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
548
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
549 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
550 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
551 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
552
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
553 short toShort(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
554 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
555 int v = toInt(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
556
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
557 if (v != cast(short)v)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
558 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
559
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
560 return cast(short)v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
561
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
562 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
563 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
564 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
565 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
566
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
567 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
568 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
569 debug(conv) printf("conv.toShort.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
570
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
571 short i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
572
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
573 i = toShort("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
574 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
575
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
576 i = toShort("+0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
577 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
578
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
579 i = toShort("-0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
580 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
581
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
582 i = toShort("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
583 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
584
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
585 i = toShort("+23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
586 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
587
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
588 i = toShort("-468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
589 assert(i == -468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
590
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
591 i = toShort("32767");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
592 assert(i == 0x7FFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
593
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
594 i = toShort("-32768");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
595 assert(i == cast(short)0x8000);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
596
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
597 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
598 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
599 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
600 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
601 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
602 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
603 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
604 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
605 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
606 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
607 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
608 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
609 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
610 "32768",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
611 "-32769",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
612 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
613
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
614 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
615 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
616 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
617 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
618 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
619 i = toShort(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
620 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
621 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
622 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
623 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
624 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
625 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
626 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
627 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
628 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
629 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
630
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
631
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
632 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
633 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
634 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
635
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
636 ushort toUshort(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
637 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
638 uint v = toUint(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
639
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
640 if (v != cast(ushort)v)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
641 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
642
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
643 return cast(ushort)v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
644
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
645 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
646 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
647 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
648 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
649
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
650 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
651 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
652 debug(conv) printf("conv.toUshort.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
653
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
654 ushort i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
655
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
656 i = toUshort("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
657 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
658
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
659 i = toUshort("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
660 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
661
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
662 i = toUshort("23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
663 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
664
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
665 i = toUshort("468");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
666 assert(i == 468);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
667
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
668 i = toUshort("32767");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
669 assert(i == 0x7FFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
670
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
671 i = toUshort("65535");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
672 assert(i == 0xFFFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
673
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
674 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
675 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
676 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
677 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
678 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
679 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
680 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
681 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
682 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
683 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
684 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
685 "+5",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
686 "-78",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
687 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
688 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
689 "65536",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
690 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
691
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
692 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
693 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
694 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
695 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
696 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
697 i = toUshort(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
698 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
699 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
700 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
701 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
702 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
703 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
704 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
705 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
706 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
707 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
708
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
709
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
710 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
711 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
712 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
713
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
714 byte toByte(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
715 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
716 int v = toInt(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
717
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
718 if (v != cast(byte)v)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
719 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
720
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
721 return cast(byte)v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
722
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
723 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
724 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
725 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
726 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
727
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
728 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
729 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
730 debug(conv) printf("conv.toByte.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
731
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
732 byte i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
733
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
734 i = toByte("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
735 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
736
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
737 i = toByte("+0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
738 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
739
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
740 i = toByte("-0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
741 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
742
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
743 i = toByte("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
744 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
745
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
746 i = toByte("+23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
747 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
748
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
749 i = toByte("-68");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
750 assert(i == -68);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
751
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
752 i = toByte("127");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
753 assert(i == 0x7F);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
754
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
755 i = toByte("-128");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
756 assert(i == cast(byte)0x80);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
757
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
758 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
759 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
760 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
761 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
762 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
763 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
764 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
765 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
766 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
767 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
768 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
769 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
770 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
771 "128",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
772 "-129",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
773 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
774
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
775 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
776 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
777 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
778 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
779 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
780 i = toByte(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
781 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
782 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
783 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
784 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
785 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
786 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
787 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
788 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
789 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
790 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
791
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
792
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
793 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
794 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
795 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
796
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
797 ubyte toUbyte(char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
798 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
799 uint v = toUint(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
800
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
801 if (v != cast(ubyte)v)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
802 goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
803
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
804 return cast(ubyte)v;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
805
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
806 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
807 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
808 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
809 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
810
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
811 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
812 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
813 debug(conv) printf("conv.toUbyte.unittest\n");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
814
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
815 ubyte i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
816
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
817 i = toUbyte("0");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
818 assert(i == 0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
819
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
820 i = toUbyte("6");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
821 assert(i == 6);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
822
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
823 i = toUbyte("23");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
824 assert(i == 23);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
825
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
826 i = toUbyte("68");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
827 assert(i == 68);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
828
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
829 i = toUbyte("127");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
830 assert(i == 0x7F);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
831
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
832 i = toUbyte("255");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
833 assert(i == 0xFF);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
834
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
835 static char[][] errors =
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
836 [
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
837 "",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
838 "-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
839 "+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
840 "-+",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
841 " ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
842 " 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
843 "0 ",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
844 "- 0",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
845 "1-",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
846 "+5",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
847 "-78",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
848 "xx",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
849 "123h",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
850 "256",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
851 ];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
852
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
853 for (int j = 0; j < errors.length; j++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
854 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
855 i = 47;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
856 try
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
857 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
858 i = toUbyte(errors[j]);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
859 printf("i = %d\n", i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
860 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
861 catch (Error e)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
862 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
863 debug(conv) e.print();
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
864 i = 3;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
865 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
866 assert(i == 3);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
867 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
868 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
869
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
870
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
871 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
872 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
873 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
874
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
875 float toFloat(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
876 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
877 float f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
878 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
879 char* sz;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
880
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
881 //writefln("toFloat('%s')", s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
882 sz = toStringz(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
883 if (std.ctype.isspace(*sz))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
884 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
885
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
886 // BUG: should set __locale_decpoint to "." for DMC
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
887
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
888 setErrno(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
889 f = strtof(sz, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
890 if (getErrno() == ERANGE)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
891 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
892 if (endptr && (endptr == s.ptr || *endptr != 0))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
893 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
894
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
895 return f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
896
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
897 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
898 conv_error(s ~ " not representable as a float");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
899 assert(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
900 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
901
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
902 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
903 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
904 debug( conv ) writefln( "conv.toFloat.unittest" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
905 float f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
906
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
907 f = toFloat( "123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
908 assert( f == 123f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
909 f = toFloat( "+123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
910 assert( f == +123f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
911 f = toFloat( "-123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
912 assert( f == -123f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
913 f = toFloat( "123e+2" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
914 assert( f == 123e+2f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
915
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
916 f = toFloat( "123e-2" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
917 assert( f == 123e-2f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
918 f = toFloat( "123." );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
919 assert( f == 123.f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
920 f = toFloat( ".456" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
921 assert( f == .456f );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
922
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
923 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
924 f = toFloat("1.17549e-38");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
925 assert(feq(cast(real)f, cast(real)1.17549e-38));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
926 assert(feq(cast(real)f, cast(real)float.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
927 f = toFloat("3.40282e+38");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
928 assert(toString(f) == toString(3.40282e+38));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
929
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
930 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
931 f = toFloat("nan");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
932 assert(toString(f) == toString(float.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
933 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
934
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
935 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
936 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
937 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
938
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
939 double toDouble(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
940 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
941 double f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
942 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
943 char* sz;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
944
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
945 //writefln("toDouble('%s')", s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
946 sz = toStringz(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
947 if (std.ctype.isspace(*sz))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
948 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
949
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
950 // BUG: should set __locale_decpoint to "." for DMC
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
951
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
952 setErrno(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
953 f = strtod(sz, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
954 if (getErrno() == ERANGE)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
955 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
956 if (endptr && (endptr == s.ptr || *endptr != 0))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
957 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
958
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
959 return f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
960
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
961 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
962 conv_error(s ~ " not representable as a double");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
963 assert(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
964 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
965
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
966 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
967 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
968 debug( conv ) writefln( "conv.toDouble.unittest" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
969 double d;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
970
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
971 d = toDouble( "123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
972 assert( d == 123 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
973 d = toDouble( "+123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
974 assert( d == +123 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
975 d = toDouble( "-123" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
976 assert( d == -123 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
977 d = toDouble( "123e2" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
978 assert( d == 123e2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
979 d = toDouble( "123e-2" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
980 assert( d == 123e-2 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
981 d = toDouble( "123." );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
982 assert( d == 123. );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
983 d = toDouble( ".456" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
984 assert( d == .456 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
985 d = toDouble( "1.23456E+2" );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
986 assert( d == 1.23456E+2 );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
987
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
988 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
989 d = toDouble("2.22507e-308");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
990 assert(feq(cast(real)d, cast(real)2.22507e-308));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
991 assert(feq(cast(real)d, cast(real)double.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
992 d = toDouble("1.79769e+308");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
993 assert(toString(d) == toString(1.79769e+308));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
994 assert(toString(d) == toString(double.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
995
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
996 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
997 d = toDouble("nan");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
998 assert(toString(d) == toString(double.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
999 //assert(cast(real)d == cast(real)double.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1000 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1001
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1002 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1003 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1004 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1005 real toReal(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1006 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1007 real f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1008 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1009 char* sz;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1010
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1011 //writefln("toReal('%s')", s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1012 sz = toStringz(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1013 if (std.ctype.isspace(*sz))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1014 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1015
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1016 // BUG: should set __locale_decpoint to "." for DMC
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1017
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1018 setErrno(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1019 f = strtold(sz, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1020 if (getErrno() == ERANGE)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1021 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1022 if (endptr && (endptr == s.ptr || *endptr != 0))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1023 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1024
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1025 return f;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1026
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1027 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1028 conv_error(s ~ " not representable as a real");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1029 assert(0);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1030 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1031
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1032 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1033 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1034 debug(conv) writefln("conv.toReal.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1035 real r;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1036
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1037 r = toReal("123");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1038 assert(r == 123L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1039 r = toReal("+123");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1040 assert(r == 123L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1041 r = toReal("-123");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1042 assert(r == -123L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1043 r = toReal("123e2");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1044 assert(feq(r, 123e2L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1045 r = toReal("123e-2");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1046 assert(feq(r, 1.23L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1047 r = toReal("123.");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1048 assert(r == 123L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1049 r = toReal(".456");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1050 assert(r == .456L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1051
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1052 r = toReal("1.23456e+2");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1053 assert(feq(r, 1.23456e+2L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1054 r = toReal(toString(real.max / 2L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1055 assert(toString(r) == toString(real.max / 2L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1056
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1057 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1058 r = toReal(toString(real.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1059 assert(toString(r) == toString(real.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1060 r = toReal(toString(real.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1061 assert(toString(r) == toString(real.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1062
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1063 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1064 r = toReal("nan");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1065 assert(toString(r) == toString(real.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1066 //assert(r == real.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1067
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1068 r = toReal(toString(real.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1069 assert(toString(r) == toString(real.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1070 //assert(r == real.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1071 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1072
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1073 version (none)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1074 { /* These are removed for the moment because of concern about
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1075 * what to do about the 'i' suffix. Should it be there?
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1076 * Should it not? What about 'nan', should it be 'nani'?
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1077 * 'infinity' or 'infinityi'?
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1078 * Should it match what toString(ifloat) does with the 'i' suffix?
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1079 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1080
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1081 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1082 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1083 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1084
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1085 ifloat toIfloat(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1086 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1087 return toFloat(s) * 1.0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1088 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1089
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1090 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1091 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1092 debug(conv) writefln("conv.toIfloat.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1093 ifloat ift;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1094
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1095 ift = toIfloat(toString(123.45));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1096 assert(toString(ift) == toString(123.45i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1097
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1098 ift = toIfloat(toString(456.77i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1099 assert(toString(ift) == toString(456.77i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1100
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1101 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1102 ift = toIfloat(toString(ifloat.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1103 assert(toString(ift) == toString(ifloat.min) );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1104 assert(feq(cast(ireal)ift, cast(ireal)ifloat.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1105
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1106 ift = toIfloat(toString(ifloat.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1107 assert(toString(ift) == toString(ifloat.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1108 assert(feq(cast(ireal)ift, cast(ireal)ifloat.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1109
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1110 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1111 ift = toIfloat("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1112 assert(cast(real)ift == cast(real)ifloat.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1113
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1114 ift = toIfloat(toString(ifloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1115 assert(toString(ift) == toString(ifloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1116 assert(feq(cast(ireal)ift, cast(ireal)ifloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1117 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1118
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1119 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1120 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1121 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1122
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1123 idouble toIdouble(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1124 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1125 return toDouble(s) * 1.0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1126 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1127
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1128 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1129 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1130 debug(conv) writefln("conv.toIdouble.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1131 idouble id;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1132
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1133 id = toIdouble(toString("123.45"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1134 assert(id == 123.45i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1135
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1136 id = toIdouble(toString("123.45e+302i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1137 assert(id == 123.45e+302i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1138
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1139 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1140 id = toIdouble(toString(idouble.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1141 assert(toString( id ) == toString(idouble.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1142 assert(feq(cast(ireal)id.re, cast(ireal)idouble.min.re));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1143 assert(feq(cast(ireal)id.im, cast(ireal)idouble.min.im));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1144
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1145 id = toIdouble(toString(idouble.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1146 assert(toString(id) == toString(idouble.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1147 assert(feq(cast(ireal)id.re, cast(ireal)idouble.max.re));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1148 assert(feq(cast(ireal)id.im, cast(ireal)idouble.max.im));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1149
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1150 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1151 id = toIdouble("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1152 assert(cast(real)id == cast(real)idouble.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1153
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1154 id = toIdouble(toString(idouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1155 assert(toString(id) == toString(idouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1156 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1157
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1158 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1159 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1160 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1161
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1162 ireal toIreal(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1163 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1164 return toReal(s) * 1.0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1165 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1166
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1167 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1168 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1169 debug(conv) writefln("conv.toIreal.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1170 ireal ir;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1171
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1172 ir = toIreal(toString("123.45"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1173 assert(feq(cast(real)ir.re, cast(real)123.45i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1174
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1175 ir = toIreal(toString("123.45e+82i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1176 assert(toString(ir) == toString(123.45e+82i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1177 //assert(ir == 123.45e+82i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1178
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1179 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1180 ir = toIreal(toString(ireal.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1181 assert(toString(ir) == toString(ireal.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1182 assert(feq(cast(real)ir.re, cast(real)ireal.min.re));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1183 assert(feq(cast(real)ir.im, cast(real)ireal.min.im));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1184
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1185 ir = toIreal(toString(ireal.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1186 assert(toString(ir) == toString(ireal.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1187 assert(feq(cast(real)ir.re, cast(real)ireal.max.re));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1188 //assert(feq(cast(real)ir.im, cast(real)ireal.max.im));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1189
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1190 // nan
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1191 ir = toIreal("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1192 assert(cast(real)ir == cast(real)ireal.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1193
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1194 ir = toIreal(toString(ireal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1195 assert(toString(ir) == toString(ireal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1196 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1197
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1198
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1199 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1200 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1201 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1202 cfloat toCfloat(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1203 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1204 char[] s1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1205 char[] s2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1206 real r1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1207 real r2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1208 cfloat cf;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1209 bool b = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1210 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1211
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1212 if (!s.length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1213 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1214
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1215 b = getComplexStrings(s, s1, s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1216
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1217 if (!b)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1218 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1219
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1220 // atof(s1);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1221 endptr = &s1[s1.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1222 r1 = strtold(s1, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1223
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1224 // atof(s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1225 endptr = &s2[s2.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1226 r2 = strtold(s2, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1227
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1228 cf = cast(cfloat)(r1 + (r2 * 1.0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1229
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1230 //writefln( "toCfloat() r1=%g, r2=%g, cf=%g, max=%g",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1231 // r1, r2, cf, cfloat.max);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1232 // Currently disabled due to a posted bug where a
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1233 // complex float greater-than compare to .max compares
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1234 // incorrectly.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1235 //if (cf > cfloat.max)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1236 // goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1237
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1238 return cf;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1239
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1240 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1241 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1242
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1243 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1244 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1245 return cast(cfloat)0.0e-0+0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1246 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1247
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1248 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1249 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1250 debug(conv) writefln("conv.toCfloat.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1251 cfloat cf;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1252
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1253 cf = toCfloat(toString("1.2345e-5+0i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1254 assert(toString(cf) == toString(1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1255 assert(feq(cf, 1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1256
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1257 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1258 cf = toCfloat(toString(cfloat.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1259 assert(toString(cf) == toString(cfloat.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1260
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1261 cf = toCfloat(toString(cfloat.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1262 assert(toString(cf) == toString(cfloat.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1263
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1264 // nan ( nan+nani )
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1265 cf = toCfloat("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1266 //writefln("toCfloat() cf=%g, cf=\"%s\", nan=%s",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1267 // cf, toString(cf), toString(cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1268 assert(toString(cf) == toString(cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1269
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1270 cf = toCdouble("nan+nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1271 assert(toString(cf) == toString(cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1272
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1273 cf = toCfloat(toString(cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1274 assert(toString(cf) == toString(cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1275 assert(feq(cast(creal)cf, cast(creal)cfloat.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1276 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1277
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1278 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1279 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1280 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1281 cdouble toCdouble(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1282 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1283 char[] s1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1284 char[] s2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1285 real r1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1286 real r2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1287 cdouble cd;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1288 bool b = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1289 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1290
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1291 if (!s.length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1292 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1293
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1294 b = getComplexStrings(s, s1, s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1295
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1296 if (!b)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1297 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1298
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1299 // atof(s1);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1300 endptr = &s1[s1.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1301 r1 = strtold(s1, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1302
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1303 // atof(s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1304 endptr = &s2[s2.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1305 r2 = strtold(s2, &endptr); //atof(s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1306
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1307 cd = cast(cdouble)(r1 + (r2 * 1.0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1308
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1309 //Disabled, waiting on a bug fix.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1310 //if (cd > cdouble.max) //same problem the toCfloat() having
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1311 // goto Loverflow;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1312
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1313 return cd;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1314
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1315 Loverflow:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1316 conv_overflow(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1317
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1318 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1319 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1320 return cast(cdouble)0.0e-0+0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1321 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1322
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1323 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1324 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1325 debug(conv) writefln("conv.toCdouble.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1326 cdouble cd;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1327
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1328 cd = toCdouble(toString("1.2345e-5+0i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1329 assert(toString( cd ) == toString(1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1330 assert(feq(cd, 1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1331
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1332 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1333 cd = toCdouble(toString(cdouble.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1334 assert(toString(cd) == toString(cdouble.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1335 assert(feq(cast(creal)cd, cast(creal)cdouble.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1336
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1337 cd = toCdouble(toString(cdouble.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1338 assert(toString( cd ) == toString(cdouble.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1339 assert(feq(cast(creal)cd, cast(creal)cdouble.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1340
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1341 // nan ( nan+nani )
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1342 cd = toCdouble("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1343 assert(toString(cd) == toString(cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1344
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1345 cd = toCdouble("nan+nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1346 assert(toString(cd) == toString(cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1347
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1348 cd = toCdouble(toString(cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1349 assert(toString(cd) == toString(cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1350 assert(feq(cast(creal)cd, cast(creal)cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1351 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1352
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1353 /*******************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1354 * ditto
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1355 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1356 creal toCreal(in char[] s)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1357 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1358 char[] s1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1359 char[] s2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1360 real r1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1361 real r2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1362 creal cr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1363 bool b = 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1364 char* endptr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1365
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1366 if (!s.length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1367 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1368
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1369 b = getComplexStrings(s, s1, s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1370
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1371 if (!b)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1372 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1373
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1374 // atof(s1);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1375 endptr = &s1[s1.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1376 r1 = strtold(s1, &endptr);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1377
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1378 // atof(s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1379 endptr = &s2[s2.length - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1380 r2 = strtold(s2, &endptr); //atof(s2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1381
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1382 //writefln("toCreal() r1=%g, r2=%g, s1=\"%s\", s2=\"%s\", nan=%g",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1383 // r1, r2, s1, s2, creal.nan);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1384
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1385 if (s1 =="nan" && s2 == "nani")
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1386 cr = creal.nan;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1387 else if (r2 != 0.0)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1388 cr = cast(creal)(r1 + (r2 * 1.0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1389 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1390 cr = cast(creal)(r1 + 0.0i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1391
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1392 return cr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1393
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1394 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1395 conv_error(s);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1396 return cast(creal)0.0e-0+0i;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1397 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1398
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1399 unittest
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1400 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1401 debug(conv) writefln("conv.toCreal.unittest");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1402 creal cr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1403
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1404 cr = toCreal(toString("1.2345e-5+0i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1405 assert(toString(cr) == toString(1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1406 assert(feq(cr, 1.2345e-5+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1407
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1408 cr = toCreal(toString("0.0e-0+0i"));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1409 assert(toString(cr) == toString(0.0e-0+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1410 assert(cr == 0.0e-0+0i);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1411 assert(feq(cr, 0.0e-0+0i));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1412
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1413 cr = toCreal("123");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1414 assert(cr == 123);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1415
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1416 cr = toCreal("+5");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1417 assert(cr == 5);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1418
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1419 cr = toCreal("-78");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1420 assert(cr == -78);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1421
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1422 // min and max
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1423 cr = toCreal(toString(creal.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1424 assert(toString(cr) == toString(creal.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1425 assert(feq(cr, creal.min));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1426
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1427 cr = toCreal(toString(creal.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1428 assert(toString(cr) == toString(creal.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1429 assert(feq(cr, creal.max));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1430
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1431 // nan ( nan+nani )
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1432 cr = toCreal("nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1433 assert(toString(cr) == toString(creal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1434
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1435 cr = toCreal("nan+nani");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1436 assert(toString(cr) == toString(creal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1437
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1438 cr = toCreal(toString(cdouble.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1439 assert(toString(cr) == toString(creal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1440 assert(feq(cr, creal.nan));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1441 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1442
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1443 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1444
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1445 /* **************************************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1446 * Splits a complex float (cfloat, cdouble, and creal) into two workable strings.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1447 * Grammar:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1448 * ['+'|'-'] string floating-point digit {digit}
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1449 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1450 private bool getComplexStrings(in char[] s, out char[] s1, out char[] s2)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1451 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1452 int len = s.length;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1453
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1454 if (!len)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1455 goto Lerr;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1456
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1457 // When "nan" or "nani" just return them.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1458 if (s == "nan" || s == "nani" || s == "nan+nani")
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1459 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1460 s1 = "nan";
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1461 s2 = "nani";
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1462 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1463 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1464
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1465 // Split the original string out into two strings.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1466 for (int i = 1; i < len; i++)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1467 if ((s[i - 1] != 'e' && s[i - 1] != 'E') && s[i] == '+')
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1468 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1469 s1 = s[0..i];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1470 if (i + 1 < len - 1)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1471 s2 = s[i + 1..len - 1];
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1472 else
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1473 s2 = "0e+0i";
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1474
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1475 break;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1476 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1477
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1478 // Handle the case when there's only a single value
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1479 // to work with, and set the other string to zero.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1480 if (!s1.length)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1481 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1482 s1 = s;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1483 s2 = "0e+0i";
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1484 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1485
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1486 //writefln( "getComplexStrings() s=\"%s\", s1=\"%s\", s2=\"%s\", len=%d",
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1487 // s, s1, s2, len );
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1488
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1489 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1490
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1491 Lerr:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1492 // Display the original string in the error message.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1493 conv_error("getComplexStrings() \"" ~ s ~ "\"" ~ " s1=\"" ~ s1 ~ "\"" ~ " s2=\"" ~ s2 ~ "\"");
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1494 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1495 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1496
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1497 // feq() functions now used only in unittesting
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1498
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1499 /* ***************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1500 * Main function to compare reals with given precision
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1501 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1502 private bool feq(in real rx, in real ry, in real precision)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1503 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1504 if (rx == ry)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1505 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1506
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1507 if (isnan(rx))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1508 return cast(bool)isnan(ry);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1509
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1510 if (isnan(ry))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1511 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1512
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1513 return cast(bool)(fabs(rx - ry) <= precision);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1514 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1515
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1516 /* ***************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1517 * (Note: Copied here from std.math's mfeq() function for unittesting)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1518 * Simple function to compare two floating point values
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1519 * to a specified precision.
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1520 * Returns:
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1521 * 1 match
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1522 * 0 nomatch
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1523 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1524 private bool feq(in real r1, in real r2)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1525 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1526 if (r1 == r2)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1527 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1528
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1529 if (isnan(r1))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1530 return cast(bool)isnan(r2);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1531
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1532 if (isnan(r2))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1533 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1534
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1535 return cast(bool)(feq(r1, r2, 0.000001L));
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1536 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1537
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1538 /* ***************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1539 * compare ireals with given precision
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1540 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1541 private bool feq(in ireal r1, in ireal r2)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1542 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1543 real rx = cast(real)r1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1544 real ry = cast(real)r2;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1545
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1546 if (rx == ry)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1547 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1548
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1549 if (isnan(rx))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1550 return cast(bool)isnan(ry);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1551
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1552 if (isnan(ry))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1553 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1554
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1555 return feq(rx, ry, 0.000001L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1556 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1557
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1558 /* ***************************************
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1559 * compare creals with given precision
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1560 */
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1561 private bool feq(in creal r1, in creal r2)
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1562 {
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1563 real r1a = fabs(cast(real)r1.re - cast(real)r2.re);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1564 real r2b = fabs(cast(real)r1.im - cast(real)r2.im);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1565
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1566 if ((cast(real)r1.re == cast(real)r2.re) &&
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1567 (cast(real)r1.im == cast(real)r2.im))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1568 return 1;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1569
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1570 if (isnan(r1a))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1571 return cast(bool)isnan(r2b);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1572
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1573 if (isnan(r2b))
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1574 return 0;
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1575
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1576 return feq(r1a, r2b, 0.000001L);
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1577 }
5825d48b27d1 [svn r135] * Merged DMD 1.025 *
lindquist
parents:
diff changeset
1578