@@ -23,7 +23,7 @@ namespace Sass {
23
23
// there is a small chance that the search prefix
24
24
// is longer than the rest of the string to look at
25
25
while (*pre && *src == *pre) {
26
- ++src, ++pre;
26
+ ++src, ++pre;
27
27
}
28
28
return *pre ? 0 : src;
29
29
}
@@ -202,142 +202,26 @@ namespace Sass {
202
202
return src;
203
203
}
204
204
205
- // Tries the matchers in sequence and returns the first match (or none)
206
- template <prelexer mx1, prelexer mx2>
207
- const char * alternatives (const char * src) {
208
- const char * rslt;
209
- (rslt = mx1 (src)) || (rslt = mx2 (src));
210
- return rslt;
211
- }
212
-
213
- // Same as above, but with 3 arguments.
214
- template <prelexer mx1, prelexer mx2, prelexer mx3>
215
- const char * alternatives (const char * src) {
216
- const char * rslt;
217
- (rslt = mx1 (src)) || (rslt = mx2 (src)) || (rslt = mx3 (src));
218
- return rslt;
219
- }
220
-
221
- // Same as above, but with 4 arguments.
222
- template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
223
- const char * alternatives (const char * src) {
224
- const char * rslt;
225
- (rslt = mx1 (src)) || (rslt = mx2 (src)) ||
226
- (rslt = mx3 (src)) || (rslt = mx4 (src));
227
- return rslt;
228
- }
229
-
230
- // Same as above, but with 5 arguments.
231
- template <prelexer mx1, prelexer mx2, prelexer mx3,
232
- prelexer mx4, prelexer mx5>
233
- const char * alternatives (const char * src) {
234
- const char * rslt;
235
- (rslt = mx1 (src)) || (rslt = mx2 (src)) || (rslt = mx3 (src)) ||
236
- (rslt = mx4 (src)) || (rslt = mx5 (src));
237
- return rslt;
238
- }
239
-
240
- // Same as above, but with 6 arguments.
241
- template <prelexer mx1, prelexer mx2, prelexer mx3,
242
- prelexer mx4, prelexer mx5, prelexer mx6>
243
- const char * alternatives (const char * src) {
244
- const char * rslt;
245
- (rslt = mx1 (src)) || (rslt = mx2 (src)) || (rslt = mx3 (src)) ||
246
- (rslt = mx4 (src)) || (rslt = mx5 (src)) || (rslt = mx6 (src));
247
- return rslt;
248
- }
249
-
250
- // Same as above, but with 7 arguments.
251
- template <prelexer mx1, prelexer mx2,
252
- prelexer mx3, prelexer mx4,
253
- prelexer mx5, prelexer mx6,
254
- prelexer mx7>
255
- const char * alternatives (const char * src) {
256
- const char * rslt;
257
- (rslt = mx1 (src)) || (rslt = mx2 (src)) ||
258
- (rslt = mx3 (src)) || (rslt = mx4 (src)) ||
259
- (rslt = mx5 (src)) || (rslt = mx6 (src)) ||
260
- (rslt = mx7 (src));
261
- return rslt;
262
- }
263
-
264
- // Same as above, but with 8 arguments.
265
- template <prelexer mx1, prelexer mx2,
266
- prelexer mx3, prelexer mx4,
267
- prelexer mx5, prelexer mx6,
268
- prelexer mx7, prelexer mx8>
205
+ // Tries the matchers in sequence and succeeds if they all succeed.
206
+ template <prelexer... mxs>
269
207
const char * alternatives (const char * src) {
270
208
const char * rslt;
271
- (rslt = mx1 (src)) || (rslt = mx2 (src)) ||
272
- (rslt = mx3 (src)) || (rslt = mx4 (src)) ||
273
- (rslt = mx5 (src)) || (rslt = mx6 (src)) ||
274
- (rslt = mx7 (src)) || (rslt = mx8 (src));
275
- return rslt;
209
+ for (prelexer mx : { mxs... }) {
210
+ if ((rslt = mx (src))) return rslt;
211
+ }
212
+ return 0 ;
276
213
}
277
214
278
215
// Tries the matchers in sequence and succeeds if they all succeed.
279
- template <prelexer mx1, prelexer mx2>
280
- const char * sequence (const char * src) {
281
- const char * rslt = src;
282
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt));
283
- return rslt;
284
- }
285
-
286
- // Same as above, but with 3 arguments.
287
- template <prelexer mx1, prelexer mx2, prelexer mx3>
288
- const char * sequence (const char * src) {
289
- const char * rslt = src;
290
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt)) && (rslt = mx3 (rslt));
291
- return rslt;
292
- }
293
-
294
- // Same as above, but with 4 arguments.
295
- template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
296
- const char * sequence (const char * src) {
297
- const char * rslt = src;
298
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt)) &&
299
- (rslt = mx3 (rslt)) && (rslt = mx4 (rslt));
300
- return rslt;
301
- }
302
-
303
- // Same as above, but with 5 arguments.
304
- template <prelexer mx1, prelexer mx2,
305
- prelexer mx3, prelexer mx4,
306
- prelexer mx5>
307
- const char * sequence (const char * src) {
308
- const char * rslt = src;
309
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt)) &&
310
- (rslt = mx3 (rslt)) && (rslt = mx4 (rslt)) &&
311
- (rslt = mx5 (rslt));
312
- return rslt;
313
- }
314
-
315
- // Same as above, but with 6 arguments.
316
- template <prelexer mx1, prelexer mx2,
317
- prelexer mx3, prelexer mx4,
318
- prelexer mx5, prelexer mx6>
216
+ template <prelexer... mxs>
319
217
const char * sequence (const char * src) {
320
218
const char * rslt = src;
321
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt)) &&
322
- (rslt = mx3 (rslt)) && (rslt = mx4 (rslt)) &&
323
- (rslt = mx5 (rslt)) && (rslt = mx6 (rslt));
324
- return rslt;
325
- }
326
-
327
- // Same as above, but with 7 arguments.
328
- template <prelexer mx1, prelexer mx2,
329
- prelexer mx3, prelexer mx4,
330
- prelexer mx5, prelexer mx6,
331
- prelexer mx7>
332
- const char * sequence (const char * src) {
333
- const char * rslt = src;
334
- (rslt = mx1 (rslt)) && (rslt = mx2 (rslt)) &&
335
- (rslt = mx3 (rslt)) && (rslt = mx4 (rslt)) &&
336
- (rslt = mx5 (rslt)) && (rslt = mx6 (rslt)) &&
337
- (rslt = mx7 (rslt));
219
+ for (prelexer mx : { mxs... }) {
220
+ if (!(rslt = mx (rslt))) return 0 ;
221
+ }
338
222
return rslt;
339
223
}
340
-
224
+
341
225
// Match a pattern or not. Always succeeds.
342
226
template <prelexer mx>
343
227
const char * optional (const char * src) {
0 commit comments