annotate dmdscript_tango/script.d @ 4:6d905019f7bf

some changes
author saaadel
date Thu, 28 Jan 2010 21:23:27 +0200
parents 8363a4bf6a8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2006 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
22 module dmdscript_tango.script;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.ctype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import std.c.stdlib;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import std.c.stdarg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 /* =================== Configuration ======================= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 const uint MAJOR_VERSION = 5; // ScriptEngineMajorVersion
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 const uint MINOR_VERSION = 5; // ScriptEngineMinorVersion
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 const uint BUILD_VERSION = 1; // ScriptEngineBuildVersion
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 const uint JSCRIPT_CATCH_BUG = 1; // emulate Jscript's bug in scoping of
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 // catch objects in violation of ECMA
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 const uint JSCRIPT_ESCAPEV_BUG = 0; // emulate Jscript's bug where \v is
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 // not recognized as vertical tab
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 alias char tchar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 alias ulong number_t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 alias double real_t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 alias uint Loc; // file location (line number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 struct ErrInfo
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 tchar[] message; // error message (null if no error)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 tchar[] srcline; // string of source line (null if not known)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 uint linnum; // source line number (1 based, 0 if not available)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 int charpos; // character position (1 based, 0 if not available)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 int code; // error code (0 if not known)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 class ScriptException : Exception
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 ErrInfo ei;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 this(tchar[] msg)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 { ei.message = msg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 super(msg);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 this(ErrInfo* pei)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 ei = *pei;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 super(ei.message);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 int logflag; // used for debugging
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 // Aliases for script primitive types
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 alias uint d_boolean;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 alias double d_number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 alias int d_int32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 alias uint d_uint32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 alias ushort d_uint16;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 alias tchar[] d_string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
86 import dmdscript_tango.value;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
87 import dmdscript_tango.dobject;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
88 import dmdscript_tango.program;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
89 import dmdscript_tango.text;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
90 import dmdscript_tango.functiondefinition;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 struct CallContext
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 Dobject[] scopex; // current scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 Dobject variable; // object for variable instantiation
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 Dobject global; // global object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 uint scoperoot; // number of entries in scope[] starting from 0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 // to copy onto new scopes
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 uint globalroot; // number of entries in scope[] starting from 0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 // that are in the "global" context. Always <= scoperoot
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 void* lastnamedfunc; // points to the last named function added as an event
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 Program prog;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 Dobject callerothis; // caller's othis
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 Dobject caller; // caller function object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 FunctionDefinition callerf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 char[16] value; // place to store exception; must be same size as Value
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 uint linnum; // source line number of exception (1 based, 0 if not available)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 int finallyret; // !=0 if IRfinallyret was executed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 int Interrupt; // !=0 if cancelled due to interrupt
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 struct Global
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 tchar[] copyright = "Copyright (c) 1999-2009 by Digital Mars";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 tchar[] written = "written by Walter Bright";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 Global global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 tchar[] banner()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 return std.string.format(
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 "Digital Mars DMDScript 1.15\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 "http://www.digitalmars.com\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 "Compiled by Digital Mars DMD D compiler\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 global.copyright, "\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 global.written);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 int isStrWhiteSpaceChar(dchar c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 case ' ':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 case '\t':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 case 0xA0: // <NBSP>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 case '\f':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 case '\v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 case 0x2028: // <LS>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 case 0x2029: // <PS>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 case 0x2001: // <USP>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 case 0x2000: // should we do this one?
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 return 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 /************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 * Convert d_string to an index, if it is one.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 * Returns:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 * true it's an index, and *index is set
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 * false it's not an index
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 int StringToIndex(d_string name, out d_uint32 index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 if (name.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 d_uint32 i = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 for (uint j = 0; j < name.length; j++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 { tchar c = name[j];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 case '0':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 case '1':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 case '2':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 case '3':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 case '4':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 case '5':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 case '6':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 case '7':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 case '8':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 case '9':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 if ((i == 0 && j) || // if leading zeros
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 i >= 0xFFFFFFFF / 10) // or overflow
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 goto Lnotindex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 i = i * 10 + c - '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 goto Lnotindex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 index = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 Lnotindex:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 /********************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 * Parse string numeric literal into a number.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 * Input:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 * parsefloat 0: convert per ECMA 9.3.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 * 1: convert per ECMA 15.1.2.3 (global.parseFloat())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 d_number StringNumericLiteral(d_string string, out size_t endidx, int parsefloat)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 // Convert StringNumericLiteral using ECMA 9.3.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 d_number number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 int sign = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 size_t i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 size_t len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 size_t eoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 // Skip leading whitespace
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 eoff = string.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 foreach (size_t j, dchar c; string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 if (!isStrWhiteSpaceChar(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 eoff = j;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 string = string[eoff .. length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 len = string.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 // Check for [+|-]
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 i = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 if (len)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 switch (string[0])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 { case '+':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 sign = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 i++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 case '-':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 sign = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 i++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 sign = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 size_t inflen = TEXT_Infinity.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 if (len - i >= inflen &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 string[i .. i + inflen] == TEXT_Infinity)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 number = sign ? -d_number.infinity : d_number.infinity;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 endidx = eoff + i + inflen;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 else if (len - i >= 2 &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 string[i] == '0' && (string[i + 1] == 'x' || string[i + 1] == 'X'))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 // Check for 0[x|X]HexDigit...
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 number = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 if (parsefloat)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 { // Do not recognize the 0x, treat it as if it's just a '0'
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 i += 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 i += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 for (; i < len; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 { tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 c = string[i]; // don't need to decode UTF here
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 if ('0' <= c && c <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 number = number * 16 + (c - '0');
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 else if ('a' <= c && c <= 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 number = number * 16 + (c - 'a' + 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 else if ('A' <= c && c <= 'F')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 number = number * 16 + (c - 'A' + 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 if (sign)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 number = -number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 endidx = eoff + i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 { char* endptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 char* s = std.string.toStringz(string[i .. len]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 endptr = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 number = std.c.stdlib.strtod(s, &endptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 endidx = (endptr - s) + i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 //printf("s = '%s', endidx = %d, eoff = %d, number = %g\n", s, endidx, eoff, number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 // Correctly produce a -0 for the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 // string "-1e-2000"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 if (sign)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 number = -number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 if (endidx == i && (parsefloat || i != 0))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 number = d_number.nan;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 endidx += eoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 return number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 int localeCompare(CallContext *cc, d_string s1, d_string s2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 { // no locale support here
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 return std.string.cmp(s1, s2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319