annotate lphobos/internal/switch.d @ 883:b52d5de7783f

GC defines and linkage changes.
author Christian Kamm <kamm incasoftware de>
date Thu, 08 Jan 2009 18:20:02 +0100
parents 373489eeaf90
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
122
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
1 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
2 * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
3 * Written by Walter Bright
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
4 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
5 * This software is provided 'as-is', without any express or implied
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
6 * warranty. In no event will the authors be held liable for any damages
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
7 * arising from the use of this software.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
8 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
9 * Permission is granted to anyone to use this software for any purpose,
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
10 * including commercial applications, and to alter it and redistribute it
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
11 * freely, in both source and binary form, subject to the following
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
12 * restrictions:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
13 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
14 * o The origin of this software must not be misrepresented; you must not
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
15 * claim that you wrote the original software. If you use this software
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
16 * in a product, an acknowledgment in the product documentation would be
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
17 * appreciated but is not required.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
18 * o Altered source versions must be plainly marked as such, and must not
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
19 * be misrepresented as being the original software.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
20 * o This notice may not be removed or altered from any source
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
21 * distribution.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
22 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
23
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
24
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
25 import std.c.stdio;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
26 import std.c.string;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
27 import std.string;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
28
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
29 /******************************************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
30 * Support for switch statements switching on strings.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
31 * Input:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
32 * table[] sorted array of strings generated by compiler
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
33 * ca string to look up in table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
34 * Output:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
35 * result index of match in table[]
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
36 * -1 if not in table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
37 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
38
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
39 extern (C):
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
40
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
41 int _d_switch_string(char[][] table, char[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
42 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
43 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
44 //printf("in _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
45 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
46 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
47
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
48 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
49 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
50
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
51 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
52 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
53 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
54 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
55
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
56 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
57 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
58 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
59 int ci;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
60
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
61 ci = memcmp(table[j - 1].ptr, table[j].ptr, len1);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
62 assert(ci < 0); // ci==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
63 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
64 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
65 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
66 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
67 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
68 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
69 int cj;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
70
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
71 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
72 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
73 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
74 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
75 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
76 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
77 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
78 { cj = memcmp(table[i].ptr, ca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
79 assert(cj != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
80 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
81 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
82 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
83 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
84 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
85 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
86 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
87 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
88 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
89 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
90 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
91 cj = memcmp(table[i].ptr, ca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
92 if (cj == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
93 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
94 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
95 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
96 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
97 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
98 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
99 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
100 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
101 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
102 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
103 //printf("body _d_switch_string(%.*s)\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
104 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
105 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
106 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
107 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
108 char[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
109
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
110 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
111 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
112
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
113 version (none)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
114 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
115 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
116 printf("ca[] = '%s'\n", cast(char *)ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
117 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
118 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
119 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
120 printf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
121 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
122 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
123 if (high &&
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
124 ca.length >= table[0].length &&
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
125 ca.length <= table[high - 1].length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
126 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
127 // Looking for 0 length string, which would only be at the beginning
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
128 if (ca.length == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
129 return 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
130
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
131 char c1 = ca[0];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
132
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
133 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
134 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
135 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
136 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
137 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
138 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
139 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
140 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
141 c = cast(ubyte)c1 - cast(ubyte)pca[0];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
142 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
143 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
144 c = memcmp(ca.ptr, pca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
145 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
146 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
147 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
148 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
149 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
150 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
151 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
152 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
153 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
154 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
155 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
156 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
157 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
158 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
159 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
160 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
161
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
162 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
163 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
164 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
165
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
166 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
167 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
168 switch (cast(char []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
169 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
170 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
171 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
172 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
173 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
174 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
175
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
176 /**********************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
177 * Same thing, but for wide chars.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
178 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
179
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
180 int _d_switch_ustring(wchar[][] table, wchar[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
181 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
182 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
183 //printf("in _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
184 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
185 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
186
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
187 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
188 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
189
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
190 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
191 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
192 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
193 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
194
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
195 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
196 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
197 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
198 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
199
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
200 c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
201 assert(c < 0); // c==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
202 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
203 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
204 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
205 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
206 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
207 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
208 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
209
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
210 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
211 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
212 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
213 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
214 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
215 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
216 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
217 { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
218 assert(c != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
219 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
220 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
221 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
222 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
223 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
224 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
225 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
226 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
227 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
228 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
229 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
230 c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
231 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
232 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
233 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
234 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
235 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
236 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
237 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
238 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
239 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
240 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
241 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
242 //printf("body _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
243 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
244 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
245 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
246 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
247 wchar[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
248
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
249 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
250 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
251
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
252 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
253 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
254 wprintf("ca[] = '%.*s'\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
255 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
256 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
257 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
258 wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
259 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
260 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
261
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
262 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
263 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
264 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
265 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
266 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
267 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
268 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
269 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
270 c = memcmp(ca.ptr, pca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
271 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
272 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
273 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
274 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
275 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
276 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
277 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
278 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
279 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
280 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
281 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
282 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
283 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
284 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
285 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
286 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
287 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
288
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
289
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
290 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
291 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
292 switch (cast(wchar []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
293 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
294 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
295 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
296 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
297 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
298 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
299
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
300
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
301 /**********************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
302 * Same thing, but for wide chars.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
303 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
304
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
305 int _d_switch_dstring(dchar[][] table, dchar[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
306 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
307 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
308 //printf("in _d_switch_dstring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
309 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
310 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
311
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
312 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
313 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
314
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
315 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
316 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
317 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
318 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
319
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
320 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
321 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
322 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
323 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
324
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
325 c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
326 assert(c < 0); // c==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
327 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
328 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
329 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
330 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
331 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
332 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
333 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
334
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
335 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
336 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
337 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
338 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
339 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
340 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
341 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
342 { c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
343 assert(c != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
344 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
345 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
346 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
347 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
348 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
349 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
350 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
351 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
352 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
353 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
354 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
355 c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
356 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
357 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
358 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
359 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
360 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
361 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
362 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
363 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
364 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
365 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
366 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
367 //printf("body _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
368 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
369 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
370 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
371 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
372 dchar[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
373
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
374 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
375 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
376
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
377 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
378 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
379 wprintf("ca[] = '%.*s'\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
380 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
381 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
382 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
383 wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
384 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
385 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
386
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
387 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
388 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
389 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
390 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
391 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
392 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
393 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
394 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
395 c = memcmp(ca.ptr, pca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
396 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
397 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
398 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
399 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
400 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
401 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
402 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
403 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
404 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
405 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
406 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
407 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
408 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
409 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
410 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
411 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
412 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
413
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
414
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
415 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
416 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
417 switch (cast(dchar []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
418 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
419 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
420 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
421 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
422 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
423 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
424
473
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
425 void _d_switch_error(string fn, int line)
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
426 {
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
427 throw new Exception(fn~toString(line)~": switch missing default");
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
428 }