annotate dmdscript_tango/dstring.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.dstring;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.regexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.utf;
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.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.dobject;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.dregexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.darray;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.threadcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 import dmdscript.dfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 import dmdscript.text;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 import dmdscript.property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 import dmdscript.dnative;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 //alias script.tchar tchar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 /* ===================== Dstring_fromCharCode ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 void* Dstring_fromCharCode(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 // ECMA 15.5.3.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 for (size_t i = 0; i < arglist.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 { Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 v = &arglist[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 u = v.toUint16();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 //writefln("string.fromCharCode(%x)", u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 if (!std.utf.isValidDchar(u))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 return pthis.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 errmsgtbl[ERR_NOT_VALID_UTF],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 "String", "fromCharCode()",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 std.utf.encode(s, u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 //writefln("s[0] = %x, s = '%s'", s[0], s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 return null;
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 /* ===================== Dstring_constructor ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 class Dstring_constructor : Dfunction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 super(1, tc.Dfunction_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 name = "String";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 { &TEXT_fromCharCode, &Dstring_fromCharCode, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 DnativeFunction.init(this, nfd, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 void *Construct(CallContext *cc, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 // ECMA 15.5.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 s = (arglist.length) ? arglist[0].toString() : TEXT_;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 o = new Dstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 ret.putVobject(o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 void *Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 // ECMA 15.5.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 s = (arglist.length) ? arglist[0].toString() : TEXT_;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 }
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 /* ===================== Dstring_prototype_toString =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 void* Dstring_prototype_toString(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 //writef("Dstring.prototype.toString()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 // othis must be a String
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 if (!othis.isClass(TEXT_String))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 return pthis.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 errmsgtbl[ERR_FUNCTION_WANTS_STRING],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 TEXT_toString,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 othis.classname);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 { Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 v = &(cast(Dstring)othis).value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 Value.copy(ret, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 /* ===================== Dstring_prototype_valueOf =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 void* Dstring_prototype_valueOf(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 // Does same thing as String.prototype.toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 //writef("string.prototype.valueOf()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 // othis must be a String
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 if (!othis.isClass(TEXT_String))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 return pthis.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 errmsgtbl[ERR_FUNCTION_WANTS_STRING],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 TEXT_valueOf,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 othis.classname);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 { Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 v = &(cast(Dstring)othis).value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 Value.copy(ret, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 /* ===================== Dstring_prototype_charAt =============== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 void* Dstring_prototype_charAt(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 // ECMA 15.5.4.4
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 int pos; // ECMA says pos should be a d_number,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 // but int should behave the same
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 d_string result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 s = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 v = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 pos = cast(int) v.toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 result = TEXT_;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 if (pos >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 { size_t idx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 while (1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 if (idx == s.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 if (pos == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 result = s[idx .. idx + std.utf.stride(s, idx)];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 idx += std.utf.stride(s, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 pos--;
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 ret.putVstring(result);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 /* ===================== Dstring_prototype_charCodeAt ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 void* Dstring_prototype_charCodeAt(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 // ECMA 15.5.4.5
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 int pos; // ECMA says pos should be a d_number,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 // but int should behave the same
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 uint len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 d_number result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 s = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 v = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 pos = cast(int) v.toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 result = d_number.nan;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 if (pos >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 { size_t idx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 while (1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 assert(idx <= s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 if (idx == s.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 if (pos == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 result = std.utf.decode(s, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 idx += std.utf.stride(s, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 pos--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 ret.putVnumber(result);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 /* ===================== Dstring_prototype_concat ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 void* Dstring_prototype_concat(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 // ECMA v3 15.5.4.6
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 //writefln("Dstring.prototype.concat()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 s = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 for (size_t a = 0; a < arglist.length; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 s ~= arglist[a].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 /* ===================== Dstring_prototype_indexOf ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 void* Dstring_prototype_indexOf(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 // ECMA 15.5.4.6
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 // String.prototype.indexOf(searchString, position)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 Value* v1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 Value* v2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 int pos; // ECMA says pos should be a d_number,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 // but I can't find a reason.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 size_t sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 d_string searchString;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 int k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 Value xx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 xx.putVobject(othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 s = xx.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 sUCSdim = std.utf.toUCSindex(s, s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 v1 = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 v2 = (arglist.length >= 2) ? &arglist[1] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 searchString = v1.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 pos = cast(int) v2.toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 if (pos < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 pos = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 else if (pos > sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 pos = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 if (searchString.length == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 k = pos;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 { pos = std.utf.toUTFindex(s, pos);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 k = std.string.find(s[pos .. length], searchString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 if (k != -1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 k = std.utf.toUCSindex(s, pos + k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 ret.putVnumber(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 return null;
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 /* ===================== Dstring_prototype_lastIndexOf ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 void* Dstring_prototype_lastIndexOf(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 // ECMA v3 15.5.4.8
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 // String.prototype.lastIndexOf(searchString, position)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 Value *v1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 int pos; // ECMA says pos should be a d_number,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 // but I can't find a reason.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 size_t sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 d_string searchString;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 int k;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 // This is the 'transferable' version
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 void *a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 v = othis.Get(TEXT_toString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 a = v.Call(cc, othis, ret, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 if (a) // if exception was thrown
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 return a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 s = ret.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 // the 'builtin' version
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 s = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 sUCSdim = std.utf.toUCSindex(s, s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 v1 = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 searchString = v1.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 if (arglist.length >= 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 { d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 Value *v = &arglist[1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 if (std.math.isnan(n) || n > sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 pos = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 else if (n < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 pos = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 pos = cast(int) n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 pos = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 //writef("len = %d, p = '%ls'\n", len, p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 //writef("pos = %d, sslen = %d, ssptr = '%ls'\n", pos, sslen, ssptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 //writefln("s = '%s', pos = %s, searchString = '%s'", s, pos, searchString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 if (searchString.length == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 k = pos;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 pos = std.utf.toUTFindex(s, pos);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 pos += searchString.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 if (pos > s.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 pos = s.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 k = std.string.rfind(s[0 .. pos], searchString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 //writefln("s = '%s', pos = %s, searchString = '%s', k = %d", s, pos, searchString, k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 if (k != -1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 k = std.utf.toUCSindex(s, k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 ret.putVnumber(k);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 /* ===================== Dstring_prototype_localeCompare ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 void* Dstring_prototype_localeCompare(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 // ECMA v3 15.5.4.9
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 d_string s1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 d_string s2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 s1 = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 s2 = arglist.length ? arglist[0].toString() : vundefined.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 n = localeCompare(cc, s1, s2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 ret.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 /* ===================== Dstring_prototype_match ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 void* Dstring_prototype_match(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 // ECMA v3 15.5.4.10
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 if (arglist.length && !arglist[0].isPrimitive() &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 (o = arglist[0].toObject()).isDregexp())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 ;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 Value regret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 regret.putVobject(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 Dregexp.getConstructor().Construct(cc, &regret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 o = regret.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 r = cast(Dregexp)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 if (r.global.dbool)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 Darray a = new Darray;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 d_int32 n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 d_int32 i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 d_int32 lasti;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 i = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 lasti = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 for (n = 0; ; n++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 r.lastIndex.putVnumber(i);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 Dregexp.exec(r, ret, (&othis.value)[0 .. 1], EXEC_STRING);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 if (!ret.string) // if match failed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 r.lastIndex.putVnumber(i);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 lasti = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 i = cast(d_int32) r.lastIndex.toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 if (i == lasti) // if no source was consumed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 i++; // consume a character
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 a.Put(n, ret, 0); // a[n] = ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 ret.putVobject(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 Dregexp.exec(r, ret, (&othis.value)[0 .. 1], EXEC_ARRAY);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 /* ===================== Dstring_prototype_replace ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 void* Dstring_prototype_replace(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 // ECMA v3 15.5.4.11
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 // String.prototype.replace(searchValue, replaceValue)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 d_string string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 d_string searchString;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 d_string newstring;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 Value *searchValue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 Value *replaceValue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 RegExp re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 tchar[] replacement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 d_string result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 int m;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 int i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 int lasti;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 std.regexp.regmatch_t[1] pmatch;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 Dfunction f;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 string = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 searchValue = (arglist.length >= 1) ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 replaceValue = (arglist.length >= 2) ? &arglist[1] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 r = Dregexp.isRegExp(searchValue);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 f = Dfunction.isFunction(replaceValue);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 if (r)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 { int offset = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 re = r.re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 i = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 result = string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 r.lastIndex.putVnumber(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 Dregexp.exec(r, ret, (&othis.value)[0 .. 1], EXEC_STRING);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 if (!ret.string) // if match failed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 m = re.re_nsub;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 if (f)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 Value* alist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 alist = cast(Value *)alloca((m + 3) * Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 assert(alist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 alist[0].putVstring(ret.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 for (i = 0; i < m; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 alist[1 + i].putVstring(
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 string[re.pmatch[1 + i].rm_so .. re.pmatch[1 + i].rm_eo]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 alist[m + 1].putVnumber(re.pmatch[0].rm_so);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 alist[m + 2].putVstring(string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 f.Call(cc, f, ret, alist[0 .. m + 3]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 replacement = ret.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 newstring = replaceValue.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 replacement = re.replace(newstring);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 int starti = re.pmatch[0].rm_so + offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 int endi = re.pmatch[0].rm_eo + offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 result = string[0 .. starti] ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 replacement ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 string[endi .. length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 if (re.attributes & RegExp.REA.global)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 offset += replacement.length - (endi - starti);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 // If no source was consumed, consume a character
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 lasti = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 i = cast(d_int32) r.lastIndex.toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 if (i == lasti)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 { i++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 r.lastIndex.putVnumber(i);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 { int match;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 searchString = searchValue.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 match = std.string.find(string, searchString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 if (match >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 pmatch[0].rm_so = match;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 pmatch[0].rm_eo = match + searchString.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 if (f)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 Value[3] alist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 alist[0].putVstring(searchString);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 alist[1].putVnumber(pmatch[0].rm_so);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 alist[2].putVstring(string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 f.Call(cc, f, ret, alist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565 replacement = ret.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 newstring = replaceValue.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 replacement = RegExp.replace3(newstring, string, pmatch);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 result = string[0 .. match] ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 replacement ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 string[match + searchString.length .. length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 result = string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 ret.putVstring(result);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 /* ===================== Dstring_prototype_search ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 void* Dstring_prototype_search(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 // ECMA v3 15.5.4.12
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 Dregexp r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 //writef("String.prototype.search()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 if (arglist.length && !arglist[0].isPrimitive() &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 (o = arglist[0].toObject()).isDregexp())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 ;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 { Value regret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 regret.putVobject(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 Dregexp.getConstructor().Construct(cc, &regret, arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 o = regret.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 r = cast(Dregexp)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 Dregexp.exec(r, ret, (&othis.value)[0 .. 1], EXEC_INDEX);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 /* ===================== Dstring_prototype_slice ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615 void* Dstring_prototype_slice(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 // ECMA v3 15.5.4.13
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 d_int32 start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 d_int32 end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 d_int32 sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 d_string r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 s = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 sUCSdim = std.utf.toUCSindex(s, s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 end = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 start = arglist[0].toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 end = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 start = arglist[0].toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 end = arglist[1].toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 start += sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649 if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 else if (start >= sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 start = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 if (end < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 end += sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 if (end < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 end = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 else if (end >= sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 end = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 if (start > end)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 end = start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 start = toUTFindex(s, start);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 end = toUTFindex(s, end);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 r = s[start .. end];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 ret.putVstring(r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 /* ===================== Dstring_prototype_split ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 void* Dstring_prototype_split(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 // ECMA v3 15.5.4.14
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 // String.prototype.split(separator, limit)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 d_uint32 lim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 d_uint32 p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 d_uint32 q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 d_uint32 e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 Value* separator = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 Value* limit = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688 Dregexp R;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 RegExp re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 d_string rs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 d_string T;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 d_string S;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 Darray A;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 int str;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 //writefln("Dstring_prototype_split()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 switch (arglist.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 limit = &arglist[1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 case 1:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 separator = &arglist[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 Value *v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 v = &othis.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 S = v.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 A = new Darray;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 if (limit.isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 lim = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 lim = limit.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 p = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 R = Dregexp.isRegExp(separator);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 if (R) // regular expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 { re = R.re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 assert(re);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 rs = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 str = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 else // string
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 { re = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725 rs = separator.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 str = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 if (lim == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 // ECMA v3 15.5.4.14 is specific: "If separator is undefined, then the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 // result array contains just one string, which is the this value
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 // (converted to a string)." However, neither Javascript nor Jscript
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 // do that, they regard an undefined as being the string "undefined".
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 // We match Javascript/Jscript behavior here, not ECMA.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 // Uncomment for ECMA compatibility
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 //if (!separator.isUndefined())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 //writefln("test1 S = '%s', rs = '%s'", S, rs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741 if (S.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 L10:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 for (q = p; q != S.length; q++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 if (str) // string
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748 if (q + rs.length <= S.length && !memcmp(S.ptr + q, rs.ptr, rs.length * tchar.sizeof))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750 e = q + rs.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 if (e != p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 T = S[p .. q];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754 A.Put(cast(uint) A.length.number, T, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 if (A.length.number == lim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 p = e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 goto L10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 else // regular expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 if (re.test(S, q))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 { q = re.pmatch[0].rm_so;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 e = re.pmatch[0].rm_eo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 if (e != p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769 T = S[p .. q];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 //writefln("S = '%s', T = '%s', p = %d, q = %d, e = %d\n", S, T, p, q, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 A.Put(cast(uint) A.length.number, T, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 if (A.length.number == lim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 p = e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 for (uint i = 0; i < re.re_nsub; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 int so = re.pmatch[1 + i].rm_so;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 int eo = re.pmatch[1 + i].rm_eo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780 //writefln("i = %d, nsub = %s, so = %s, eo = %s, S.length = %s", i, re.re_nsub, so, eo, S.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 if (so != -1 && eo != -1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 T = S[so .. eo];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784 T = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785 A.Put(cast(uint) A.length.number, T, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 if (A.length.number == lim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789 goto L10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 T = S[p .. S.length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 A.Put(cast(uint) A.length.number, T, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798 if (str) // string
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800 if (rs.length <= S.length && S[0 .. rs.length] == rs[])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 else // regular expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805 if (re.test(S, 0))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806 goto Lret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 A.Put(0u, S, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811 Lret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812 ret.putVobject(A);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817 /* ===================== Dstring_prototype_substr ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 void *dstring_substring(d_string s, size_t sUCSdim, d_number start, d_number end, Value *ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821 d_string sb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 d_int32 sb_len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824 if (std.math.isnan(start))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826 else if (start > sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 start = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 else if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 if (std.math.isnan(end))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 end = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833 else if (end > sUCSdim)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 end = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835 else if (end < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836 end = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 if (end < start) // swap
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839 { d_number t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 t = start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842 start = end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843 end = t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846 size_t st = std.utf.toUTFindex(s, cast(size_t)start);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 size_t en = std.utf.toUTFindex(s, cast(size_t)end);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 sb = s[st .. en];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850 ret.putVstring(sb);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 void* Dstring_prototype_substr(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856 // Javascript: TDG pg. 689
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857 // String.prototype.substr(start, length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 d_number start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859 d_number length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 s = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 size_t sUCSdim = std.utf.toUCSindex(s, s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 length = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 if (arglist.length >= 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869 if (start < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 start = sUCSdim + start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 if (arglist.length >= 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 length = arglist[1].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 if (std.math.isnan(length) || length < 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 length = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878 length = sUCSdim - start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 return dstring_substring(s, sUCSdim, start, start + length, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884 /* ===================== Dstring_prototype_substring ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 void* Dstring_prototype_substring(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 // ECMA 15.5.4.9
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889 // String.prototype.substring(start)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 // String.prototype.substring(start, end)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891 d_number start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 d_number end;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895 //writefln("String.prototype.substring()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896 s = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897 size_t sUCSdim = std.utf.toUCSindex(s, s.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898 start = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 end = sUCSdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 if (arglist.length >= 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902 start = arglist[0].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903 if (arglist.length >= 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 end = arglist[1].toInteger();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905 //writef("s = '%ls', start = %d, end = %d\n", s, start, end);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 void* p = dstring_substring(s, sUCSdim, start, end, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909 return p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912 /* ===================== Dstring_prototype_toLowerCase ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 enum CASE
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 Lower,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 Upper,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918 LocaleLower,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919 LocaleUpper
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 };
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922 void *tocase(Dobject othis, Value *ret, CASE caseflag)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 s = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 switch (caseflag)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929 case CASE.Lower:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 s = std.string.tolower(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 case CASE.Upper:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 s = std.string.toupper(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 case CASE.LocaleLower:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936 s = std.string.tolower(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938 case CASE.LocaleUpper:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939 s = std.string.toupper(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949 void* Dstring_prototype_toLowerCase(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951 // ECMA 15.5.4.11
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 // String.prototype.toLowerCase()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 //writef("Dstring_prototype_toLowerCase()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 return tocase(othis, ret, CASE.Lower);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958 /* ===================== Dstring_prototype_toLocaleLowerCase ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 void* Dstring_prototype_toLocaleLowerCase(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962 // ECMA v3 15.5.4.17
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 //writef("Dstring_prototype_toLocaleLowerCase()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965 return tocase(othis, ret, CASE.LocaleLower);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 /* ===================== Dstring_prototype_toUpperCase ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970 void* Dstring_prototype_toUpperCase(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 // ECMA 15.5.4.12
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 // String.prototype.toUpperCase()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975 return tocase(othis, ret, CASE.Upper);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 /* ===================== Dstring_prototype_toLocaleUpperCase ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980 void* Dstring_prototype_toLocaleUpperCase(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982 // ECMA v3 15.5.4.18
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984 return tocase(othis, ret, CASE.LocaleUpper);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 /* ===================== Dstring_prototype_anchor ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 void *dstring_anchor(Dobject othis, Value* ret, tchar[] tag, tchar[] name, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 // For example:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992 // "foo".anchor("bar")
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 // produces:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994 // <tag name="bar">foo</tag>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996 d_string foo = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 Value* va = arglist.length ? &arglist[0] : &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998 d_string bar = va.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 s = "<" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 tag ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004 " " ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005 name ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006 "=\"" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 bar ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008 "\">" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 foo ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010 "</" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 tag ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012 ">";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 void* Dstring_prototype_anchor(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 // Non-standard extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022 // String.prototype.anchor(anchor)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023 // For example:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 // "foo".anchor("bar")
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 // produces:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026 // <A NAME="bar">foo</A>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028 return dstring_anchor(othis, ret, "A", "NAME", arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031 void* Dstring_prototype_fontcolor(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033 return dstring_anchor(othis, ret, "FONT", "COLOR", arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 void* Dstring_prototype_fontsize(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038 return dstring_anchor(othis, ret, "FONT", "SIZE", arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041 void* Dstring_prototype_link(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043 return dstring_anchor(othis, ret, "A", "HREF", arglist);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 /* ===================== Dstring_prototype bracketing ============= */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049 /***************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050 * Produce <tag>othis</tag>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053 void *dstring_bracket(Dobject othis, Value* ret, char[] tag)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 d_string foo = othis.value.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 s = "<" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 tag ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060 ">" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 foo ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062 "</" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063 tag ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 ">";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 ret.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070 void* Dstring_prototype_big(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 // Non-standard extension
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 // String.prototype.big()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 // For example:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075 // "foo".big()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 // produces:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077 // <BIG>foo</BIG>
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 return dstring_bracket(othis, ret, "BIG");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082 void* Dstring_prototype_blink(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084 return dstring_bracket(othis, ret, "BLINK");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 void* Dstring_prototype_bold(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089 return dstring_bracket(othis, ret, "B");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092 void* Dstring_prototype_fixed(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 return dstring_bracket(othis, ret, "TT");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 void* Dstring_prototype_italics(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099 return dstring_bracket(othis, ret, "I");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 void* Dstring_prototype_small(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104 return dstring_bracket(othis, ret, "SMALL");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1106
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1107 void* Dstring_prototype_strike(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1108 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1109 return dstring_bracket(othis, ret, "STRIKE");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1110 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1111
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1112 void* Dstring_prototype_sub(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1113 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1114 return dstring_bracket(othis, ret, "SUB");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1115 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1116
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1117 void* Dstring_prototype_sup(Dobject pthis, CallContext *cc, Dobject othis, Value *ret, Value[] arglist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1118 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1119 return dstring_bracket(othis, ret, "SUP");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1120 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1122
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1123
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1124 /* ===================== Dstring_prototype ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1126 class Dstring_prototype : Dstring
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1127 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1128 this(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1129 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1130 super(tc.Dobject_prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1131
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1132 Put(TEXT_constructor, tc.Dstring_constructor, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1133
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1134 static NativeFunctionData nfd[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1135 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1136 { &TEXT_toString, &Dstring_prototype_toString, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1137 { &TEXT_valueOf, &Dstring_prototype_valueOf, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1138 { &TEXT_charAt, &Dstring_prototype_charAt, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1139 { &TEXT_charCodeAt, &Dstring_prototype_charCodeAt, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1140 { &TEXT_concat, &Dstring_prototype_concat, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1141 { &TEXT_indexOf, &Dstring_prototype_indexOf, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1142 { &TEXT_lastIndexOf, &Dstring_prototype_lastIndexOf, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1143 { &TEXT_localeCompare, &Dstring_prototype_localeCompare, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1144 { &TEXT_match, &Dstring_prototype_match, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1145 { &TEXT_replace, &Dstring_prototype_replace, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1146 { &TEXT_search, &Dstring_prototype_search, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1147 { &TEXT_slice, &Dstring_prototype_slice, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1148 { &TEXT_split, &Dstring_prototype_split, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1149 { &TEXT_substr, &Dstring_prototype_substr, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1150 { &TEXT_substring, &Dstring_prototype_substring, 2 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1151 { &TEXT_toLowerCase, &Dstring_prototype_toLowerCase, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1152 { &TEXT_toLocaleLowerCase, &Dstring_prototype_toLocaleLowerCase, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1153 { &TEXT_toUpperCase, &Dstring_prototype_toUpperCase, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1154 { &TEXT_toLocaleUpperCase, &Dstring_prototype_toLocaleUpperCase, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1155 { &TEXT_anchor, &Dstring_prototype_anchor, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1156 { &TEXT_fontcolor, &Dstring_prototype_fontcolor, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1157 { &TEXT_fontsize, &Dstring_prototype_fontsize, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1158 { &TEXT_link, &Dstring_prototype_link, 1 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1159 { &TEXT_big, &Dstring_prototype_big, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1160 { &TEXT_blink, &Dstring_prototype_blink, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1161 { &TEXT_bold, &Dstring_prototype_bold, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1162 { &TEXT_fixed, &Dstring_prototype_fixed, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1163 { &TEXT_italics, &Dstring_prototype_italics, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1164 { &TEXT_small, &Dstring_prototype_small, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1165 { &TEXT_strike, &Dstring_prototype_strike, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1166 { &TEXT_sub, &Dstring_prototype_sub, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1167 { &TEXT_sup, &Dstring_prototype_sup, 0 },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1168 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1170 DnativeFunction.init(this, nfd, DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1171 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1172 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1173
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1174 /* ===================== Dstring ==================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1175
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1176 class Dstring : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1177 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1178 this(d_string s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1179 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1180 super(getPrototype());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1181 classname = TEXT_String;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1182
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1183 Put(TEXT_length, std.utf.toUCSindex(s, s.length), DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1184 value.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1185 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1186
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1187 this(Dobject prototype)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1188 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1189 super(prototype);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1190
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1191 classname = TEXT_String;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1192 Put(TEXT_length, 0, DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1193 value.putVstring(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1194 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1195
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1196 static void init(ThreadContext *tc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1197 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1198 tc.Dstring_constructor = new Dstring_constructor(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1199 tc.Dstring_prototype = new Dstring_prototype(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1200
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1201 tc.Dstring_constructor.Put(TEXT_prototype, tc.Dstring_prototype, DontEnum | DontDelete | ReadOnly);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1202 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1203
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1204 static Dfunction getConstructor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1205 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1206 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1207 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1208 return tc.Dstring_constructor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1209 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1210
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1211 static Dobject getPrototype()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1212 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1213 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1214 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1215 return tc.Dstring_prototype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1216 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1217 }