annotate mde/mergetag/parse/parseTo.d @ 70:7fc0a8295c83

Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
author Diggory Hardy <diggory.hardy@gmail.com>
date Fri, 04 Jul 2008 19:04:16 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
1 /**************************************************************************************************
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
2 * copyright: Copyright (c) 2007-2008 Diggory Hardy.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
3 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
4 * author: Diggory Hardy, diggory.hardy@gmail.com
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
5 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
6 * license: BSD style: $(LICENSE)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
7 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
8 * This contains templates for converting a char[] to various data-types.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
9 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
10 * parseTo is roughly the inverse of $(B parseFrom) and should read any data output by $(B parseFrom).
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
11 * It is also available in tango.scrapple.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
12 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
13 * This module basically implements the following templated function for most basic D types:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
14 * bool, byte, short, int, long, ubyte, ushort, uint, ulong, float, double, real, char.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
15 * It also supports arrays and associative arrays of any supported type (including of other arrays)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
16 * and has special handling for strings (char[]) and binary (ubyte[]) data-types.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
17 * -----------------------------
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
18 * T parseTo(T) (char[] source);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
19 * -----------------------------
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
20 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
21 * $(I source) is the string to parse, and data of the templated type that is read from the string
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
22 * is returned. See the examples to get a better idea of its use.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
23 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
24 * Syntax:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
25 * The syntax for parsing $(I source) is mostly the same used by D without any prefixes/suffixes
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
26 * (except 0x, 0b & 0o base specifiers). Also a special ubyte[] syntax is supported; see examples.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
27 * The following escape sequences are supported for strings and characters: \' \" \\
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
28 * \a \b \f \n \r \t \v . Associative array literals use the same syntax as D, described here:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
29 * $(LINK http://www.digitalmars.com/d/2.0/expression.html#AssocArrayLiteral). All whitespace is
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
30 * ignored (except of course within strings).
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
31 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
32 * There are also some public utility functions with their own documentation.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
33 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
34 * Throws:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
35 * On errors, a ParseException or a UnicodeException (both extend TextException) is thrown with a
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
36 * suitable message. No other exceptions should be thrown.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
37 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
38 * Remarks:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
39 * There is currently no support for reading wchar/dchar strings. There are, however, unicode
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
40 * conversions for converting UTF-8 to UTF-16/32. Be careful if converting on a char-by-char basis;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
41 * such conversions cannot be used for non-ascii characters.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
42 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
43 * Examples:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
44 * ------------------------------------------------------------------------------------------------
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
45 * // Basic examples:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
46 * ulong a = parseTo!(ulong) ("20350");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
47 * float d = parseTo!(float) (" 1.2e-9 ");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
48 * int[] b = parseTo!(int[]) ("[0,1,2,3]");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
49 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
50 * // String and char[] syntax:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
51 * char[] c = parseTo!(char[]) ("\"A string\"");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
52 * char[] e = parseTo!(char[]) ("['a','n','o','t','h','e','r', ' ' ,'s','t','r','i','n','g']");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
53 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
54 * // These be used interchangably; here's a more complex example of an associative array:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
55 * bool[char[]] f = parseTo!(bool[char[]]) ("[ \"one\":true, ['t','w','o']:false, \"three\":1, \"four\":000 ]");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
56 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
57 * // There is also a special notation for ubyte[] types:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
58 * // The digits following 0x must be in pairs and each specify one ubyte.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
59 * assert ( parseTo!(ubyte[]) (`0x01F2AC`) == parseTo!(ubyte[]) (`[01 ,0xF2, 0xAC]`) );
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
60 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
61 * // There's no limit to the complexity!
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
62 * char[char[][][][char]][bool] z = ...; // don't expect me to write this!
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
63 * ------------------------------------------------------------------------------------------------
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
64 *************************************************************************************************/
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
65
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
66 module mde.mergetag.parse.parseTo;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
67
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
68 // tango imports
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
69 import tango.core.Exception : TextException, UnicodeException;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
70 import cInt = tango.text.convert.Integer;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
71 import cFloat = tango.text.convert.Float;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
72 import Utf = tango.text.convert.Utf;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
73 import Util = tango.text.Util;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
74
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
75 /**
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
76 * Base class for parseTo exceptions.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
77 */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
78 class ParseException : TextException
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
79 {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
80 this( char[] msg )
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
81 {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
82 super( msg );
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
83 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
84 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
85
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
86
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
87 //BEGIN parseTo templates
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
88
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
89 // Associative arrays
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
90
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
91 const char[] AA_ERR = "Invalid associative array: ";
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
92 T[S] parseTo(T : T[S], S) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
93 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
94 if (src.length < 2 || src[0] != '[' || src[$-1] != ']')
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
95 throw new ParseException (AA_ERR ~ "not [ ... ]"); // bad braces.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
96
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
97 T[S] ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
98 foreach (char[] pair; split (src[1..$-1])) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
99 uint i = 0;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
100 while (i < pair.length) { // advance to the ':'
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
101 char c = pair[i];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
102 if (c == ':') break;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
103 if (c == '\'' || c == '"') { // string or character
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
104 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
105 while (i < pair.length && pair[i] != c) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
106 if (pair[i] == '\\') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
107 if (i+2 >= pair.length) throw new ParseException (AA_ERR ~ "unfinished escape sequence within string/char");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
108 ++i; // escape seq.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
109 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
110 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
111 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
112 if (i == pair.length) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
113 throw new ParseException (AA_ERR ~ "encountered [ ... KEY] (missing :DATA)");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
114 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
115 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
116 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
117 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
118 if (i == pair.length) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
119 throw new ParseException (AA_ERR ~ "encountered [ ... KEY:] (missing DATA)");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
120 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
121 ret[parseTo!(S) (pair[0..i])] = parseTo!(T) (pair[i+1..$]);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
122 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
123 return ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
124 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
125 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
126 char[][char] X = parseTo!(char[][char]) (`['a':"animal", 'b':['b','u','s']]`);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
127 char[][char] Y = ['a':cast(char[])"animal", 'b':['b','u','s']];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
128
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
129 //FIXME: when the compiler's fixed: http://d.puremagic.com/issues/show_bug.cgi?id=1671
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
130 // just assert (X == Y)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
131 assert (X.length == Y.length);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
132 assert (X.keys == Y.keys);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
133 assert (X.values == Y.values);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
134 //X.rehash; Y.rehash; // doesn't make a difference
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
135 //assert (X == Y); // fails (compiler bug)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
136 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
137
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
138
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
139 // Arrays
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
140
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
141 T[] parseTo(T : T[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
142 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
143 if (src.length >= 2 && src[0] == '[' && src[$-1] == ']') return toArray!(T[]) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
144 throw new ParseException ("Invalid array: not [x, ..., z]");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
145 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
146
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
147 // String (array special case)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
148 T parseTo(T : char[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
149 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
150 if (src.length >= 2 && src[0] == '"' && src[$-1] == '"') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
151 src = src[1..$-1];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
152 T ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
153 ret.length = src.length; // maximum length; retract to actual length later
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
154 uint i = 0;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
155 for (uint t = 0; t < src.length;) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
156 // process a block of non-escaped characters
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
157 uint s = t;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
158 while (t < src.length && src[t] != '\\') ++t; // non-escaped characters
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
159 uint j = i + t - s;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
160 ret[i..j] = src[s..t]; // copy a block
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
161 i = j;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
162
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
163 // process a block of escaped characters
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
164 while (t < src.length && src[t] == '\\') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
165 t++;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
166 if (t == src.length) throw new ParseException ("Invalid string: ends \\\" !"); // next char is "
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
167 ret[i++] = replaceEscapedChar (src[t++]); // throws if it's invalid
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
168 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
169 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
170 return ret[0..i];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
171 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
172 else if (src.length >= 2 && src[0] == '[' && src[$-1] == ']') return toArray!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
173 throw new ParseException ("Invalid string: not quoted (\"*\") or char array (['a',...,'c'])");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
174 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
175 // Unicode conversions for strings:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
176 T parseTo(T : wchar[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
177 // May throw a UnicodeException; don't bother catching and rethrowing:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
178 return Utf.toString16 (parseTo!(char[]) (src));
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
179 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
180 T parseTo(T : dchar[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
181 // May throw a UnicodeException; don't bother catching and rethrowing:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
182 return Utf.toString32 (parseTo!(char[]) (src));
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
183 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
184
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
185 // Binary (array special case)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
186 T parseTo(T : ubyte[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
187 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
188 // Standard case:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
189 if (src.length >= 2 && src[0] == '[' && src[$-1] == ']') return toArray!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
190 // Special case: sequence of hex digits, each pair of which is a ubyte
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
191 if (src.length >= 2 && src[0..2] == "0x") {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
192 src = src[2..$]; // strip down to actual digits
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
193
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
194 // Must be in pairs:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
195 if (src.length % 2 == 1) throw new ParseException ("Invalid binary: odd number of chars");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
196
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
197 T ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
198 ret.length = src.length / 2; // exact
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
199
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
200 for (uint i, pos; pos + 1 < src.length; ++i) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
201 ubyte x = readHexChar(src, pos) << 4;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
202 x |= readHexChar(src, pos);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
203 ret[i] = x;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
204 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
205 return ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
206 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
207 else throw new ParseException ("Invalid ubyte[]: not an array and doesn't start 0x");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
208 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
209
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
210 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
211 assert (parseTo!(double[]) (`[1.0,1.0e-10]`) == [1.0, 1.0e-10]); // generic array stuff
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
212 assert (parseTo!(double[]) (`[ ]`) == cast(double[]) []); // empty array
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
213
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
214 // char[] and char conversions, with commas, escape sequences and multichar UTF8 characters:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
215 assert (parseTo!(char[][]) (`[ ".\"", [',','\''] ,"!\b€" ]`) == [ ".\"".dup, [',','\''] ,"!\b€" ]);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
216
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
217 // wchar[] and dchar[] conversions:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
218 // The characters were pretty-much pulled at random from unicode tables.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
219 // The last few cause some wierd (display only) effects in my editor.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
220 assert (parseTo!(wchar[]) ("\"Test string: ¶α؟अกሀ搀\"") == "Test string: ¶α؟अกሀ搀"w);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
221 assert (parseTo!(dchar[]) ("\"Test string: ¶α؟अกሀ搀\"") == "Test string: ¶α؟अกሀ搀"d);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
222
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
223 assert (parseTo!(ubyte[]) (`0x01F2AC`) == cast(ubyte[]) [0x01, 0xF2, 0xAC]); // ubyte[] special notation
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
224 assert (parseTo!(ubyte[]) (`[01 ,0xF2, 0xAC]`) == cast(ubyte[]) [0x01, 0xF2, 0xAC]); // ubyte[] std notation
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
225 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
226
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
227
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
228 // Basic types
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
229
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
230 // Char
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
231 T parseTo(T : char) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
232 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
233 if (src.length < 3 || src[0] != '\'' || src[$-1] != '\'')
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
234 throw new ParseException ("Invalid char: not quoted (e.g. 'c')");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
235 if (src[1] != '\\' && src.length == 3) return src[1]; // Either non escaped
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
236 if (src.length == 4) return replaceEscapedChar (src[2]); // Or escaped
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
237
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
238 // Report various errors; warnings for likely and difficult to tell cases:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
239 // Warn in case it's a multibyte UTF-8 character:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
240 if (src[1] & 0xC0u) throw new UnicodeException ("Invalid char: too long (non-ASCII UTF-8 characters cannot be read as a single character)", 1);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
241 throw new ParseException ("Invalid char: too long");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
242 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
243 /* Basic unicode convertions for wide-chars.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
244 * NOTE: c > 127 signals the start of a multibyte UTF-8 sequence which must be converted for
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
245 * UTF-16/32. But since we don't know what the next bytes are we can't do the conversion. */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
246 const char[] WIDE_CHAR_ERROR = "Error: unicode non-ascii character cannot be converted from a single UTF-8 char";
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
247 T parseTo(T : wchar) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
248 char c = parseTo!(char) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
249 if (c <= 127u) return cast(wchar) c; // this char can be converted
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
250 else throw new UnicodeException (WIDE_CHAR_ERROR, 1);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
251 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
252 T parseTo(T : dchar) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
253 char c = parseTo!(char) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
254 if (c <= 127u) return cast(dchar) c; // this char can be converted
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
255 else throw new UnicodeException (WIDE_CHAR_ERROR, 1);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
256 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
257 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
258 assert (parseTo!(char) ("\'\\\'\'") == '\'');
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
259 assert (parseTo!(wchar) ("'X'") == 'X');
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
260 assert (parseTo!(dchar) ("'X'") == 'X');
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
261 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
262
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
263 // Bool
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
264 T parseTo(T : bool) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
265 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
266 if (src == "true") return true;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
267 if (src == "false") return false;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
268 uint pos;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
269 while (src.length > pos && src[pos] == '0') ++pos; // skip leading zeros
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
270 if (src.length == pos && pos > 0) return false;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
271 if (src.length == pos + 1 && src[pos] == '1') return true;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
272 throw new ParseException ("Invalid bool: not true or false and doesn't evaluate to 0 or 1");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
273 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
274 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
275 assert (parseTo!(bool[]) (`[true,false,01,00]`) == cast(bool[]) [1,0,1,0]);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
276 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
277
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
278 // Ints
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
279 T parseTo(T : byte) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
280 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
281 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
282 T parseTo(T : short) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
283 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
284 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
285 T parseTo(T : int) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
286 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
287 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
288 T parseTo(T : long) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
289 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
290 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
291 T parseTo(T : ubyte) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
292 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
293 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
294 T parseTo(T : ushort) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
295 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
296 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
297 T parseTo(T : uint) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
298 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
299 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
300 T parseTo(T : ulong) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
301 return toTInt!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
302 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
303 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
304 assert (parseTo!(byte) ("-5") == cast(byte) -5);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
305 // annoyingly, octal syntax differs from D (blame tango):
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
306 assert (parseTo!(uint[]) ("[0b0100,0o724,0xFa59c,0xFFFFFFFF,0]") == [0b0100u,0724,0xFa59c,0xFFFFFFFF,0]);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
307 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
308
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
309 // Floats
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
310 T parseTo(T : float) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
311 return toTFloat!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
312 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
313 T parseTo(T : double) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
314 return toTFloat!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
315 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
316 T parseTo(T : real) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
317 return toTFloat!(T) (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
318 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
319 debug (UnitTest) unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
320 assert (parseTo!(float) ("0.0") == 0.0f);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
321 assert (parseTo!(double) ("-1e25") == -1e25);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
322 assert (parseTo!(real) ("5.24e-269") == cast(real) 5.24e-269);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
323 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
324 //END parseTo templates
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
325
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
326 //BEGIN Utility funcs
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
327 /** Trims whitespace at ends of string and checks for and removes array brackets: []
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
328 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
329 * Throws:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
330 * ParseException if brackets aren't end non-whitespace characters.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
331 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
332 * Returns:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
333 * String without brackets (and whitespace outside those brackets). Useful for passing to split.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
334 */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
335 char[] stripBrackets (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
336 src = Util.trim(src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
337 if (src.length >= 2 && src[0] == '[' && src[$-1] == ']') return src[1..$-1];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
338 throw new ParseException ("Invalid bracketed string: not [...]");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
339 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
340
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
341 /** Splits a string into substrings separated by '$(B ,)' with support for characters and strings
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
342 * containing escape sequences and for embedded arrays ($(B [...])).
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
343 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
344 * Params:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
345 * src A string to separate on commas. Where used for parsing arrays, the brackets enclosing
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
346 * the array should be removed before calling this function (stripBrackets can do this).
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
347 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
348 * Returns:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
349 * An array of substrings within src, excluding commas. Whitespace is not stripped and
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
350 * empty strings may get returned.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
351 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
352 * Remarks:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
353 * This function is primarily intended for as a utility function for use by the templates
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
354 * parsing arrays and associative arrays, but it may be useful in other cases too. Hence the
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
355 * fact no brackets are stripped from src.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
356 */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
357 char[][] split (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
358 src = Util.trim (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
359 if (src == "") return []; // empty array: no elements when no data
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
360
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
361 uint depth = 0; // surface depth (embedded arrays)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
362 char[][] ret;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
363 ret.length = src.length / 3; // unlikely to need a longer array
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
364 uint k = 0; // current split piece
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
365 uint i = 0, j = 0; // current read location, start of current piece
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
366
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
367 while (i < src.length) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
368 char c = src[i];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
369 if (c == '\'' || c == '"') { // string or character
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
370 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
371 while (i < src.length && src[i] != c) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
372 if (src[i] == '\\') ++i; // escape seq.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
373 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
374 } // Doesn't throw if no terminal quote at end of src, but this should be caught later.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
375 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
376 else if (c == '[') ++depth;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
377 else if (c == ']') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
378 if (depth) --depth;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
379 else throw new ParseException ("Invalid array literal: closes before end of data item.");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
380 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
381 else if (c == ',' && depth == 0) { // only if not an embedded array
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
382 if (ret.length <= k) ret.length = ret.length * 2;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
383 ret[k++] = src[j..i]; // add this piece and increment k
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
384 j = i + 1;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
385 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
386 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
387 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
388 if (ret.length <= k) ret.length = k + 1;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
389 ret[k] = src[j..i]; // add final piece (i >= j)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
390 return ret[0..k+1];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
391 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
392
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
393 /* Templated read-int function to read (un)signed 1-4 byte integers.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
394 *
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
395 * Actually a reimplementation of tango.text.convert.Integer toLong and parse functions.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
396 */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
397 private TInt toTInt(TInt) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
398 const char[] INT_OUT_OF_RANGE = "Integer out of range";
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
399 bool sign;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
400 uint radix, ate, ate2;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
401
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
402 // Trim off whitespace.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
403 // NOTE: Cannot use tango.text.convert.Integer.trim to trim leading whitespace since it doesn't
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
404 // treat new-lines, etc. as whitespace which for our purposes is whitespace.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
405 src = Util.trim (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
406
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
407 ate = cInt.trim (src, sign, radix);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
408 if (ate == src.length) throw new ParseException ("Invalid integer: no digits");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
409 ulong val = cInt.convert (src[ate..$], radix, &ate2);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
410 ate += ate2;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
411
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
412 if (ate < src.length)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
413 throw new ParseException ("Invalid integer at marked character: \"" ~ src[0..ate] ~ "'" ~ src[ate] ~ "'" ~ src[ate+1..$] ~ "\"");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
414
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
415 if (val > TInt.max) throw new ParseException (INT_OUT_OF_RANGE);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
416 if (sign) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
417 long sval = cast(long) -val;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
418 if (sval > TInt.min) return cast(TInt) sval;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
419 else throw new ParseException (INT_OUT_OF_RANGE);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
420 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
421 return cast(TInt) val;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
422 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
423
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
424 /* Basically a reimplementation of tango.text.convert.Float.toFloat which checks for
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
425 * whitespace before throwing an exception for overlong input. */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
426 private TFloat toTFloat(TFloat) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
427 // NOTE: As for toTInt(), this needs to strip leading as well as trailing whitespace.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
428 src = Util.trim (src);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
429 if (src == "") throw new ParseException ("Invalid float: no digits");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
430 uint ate;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
431
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
432 TFloat x = cFloat.parse (src, &ate);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
433 return x;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
434 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
435
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
436 /* Throws an exception on invalid escape sequences. Supported escape sequences are the following
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
437 * subset of those supported by D: \" \' \\ \a \b \f \n \r \t \v
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
438 */
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
439 private char replaceEscapedChar (char c)
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
440 {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
441 // This code was generated:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
442 if (c <= 'b') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
443 if (c <= '\'') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
444 if (c == '\"') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
445 return '\"';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
446 } else if (c == '\'') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
447 return '\'';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
448 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
449 } else {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
450 if (c == '\\') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
451 return '\\';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
452 } else if (c == 'a') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
453 return '\a';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
454 } else if (c == 'b') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
455 return '\b';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
456 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
457 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
458 } else {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
459 if (c <= 'n') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
460 if (c == 'f') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
461 return '\f';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
462 } else if (c == 'n') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
463 return '\n';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
464 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
465 } else {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
466 if (c == 'r') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
467 return '\r';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
468 } else if (c == 't') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
469 return '\t';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
470 } else if (c == 'v') {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
471 return '\v';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
472 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
473 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
474 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
475
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
476 // if we haven't returned:
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
477 throw new ParseException ("Invalid escape sequence: \\"~c);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
478 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
479
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
480 // Reads one hex char: [0-9A-Fa-f]. Otherwise throws an exception. Doesn't check src.length.
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
481 private ubyte readHexChar (char[] src, inout uint pos) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
482 ubyte x;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
483 if (src[pos] >= '0' && src[pos] <= '9') x = src[pos] - '0';
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
484 else if (src[pos] >= 'A' && src[pos] <= 'F') x = src[pos] - 'A' + 10;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
485 else if (src[pos] >= 'a' && src[pos] <= 'f') x = src[pos] - 'a' + 10;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
486 else throw new ParseException ("Invalid hex digit.");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
487 ++pos;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
488 return x;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
489 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
490
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
491 // Generic array reader
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
492 // Assumes input is of form "[xxxxx]" (i.e. first and last chars are '[', ']' and length >= 2).
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
493 private T[] toArray(T : T[]) (char[] src) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
494 T[] ret = new T[16]; // avoid unnecessary allocations
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
495 uint i = 0;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
496 foreach (char[] element; split(src[1..$-1])) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
497 if (i == ret.length) ret.length = ret.length * 2;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
498 ret[i] = parseTo!(T) (element);
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
499 ++i;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
500 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
501 return ret[0..i];
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
502 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
503
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
504 debug (UnitTest) {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
505 import tango.io.Console;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
506
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
507 unittest {
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
508 Cout ("Running unittest: parseTo ...").flush;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
509
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
510 assert (parseTo!(char[]) ("\"\\a\\b\\t\\n\\v\\f\\r\\\"\\\'\\\\\"") == "\a\b\t\n\v\f\r\"\'\\");
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
511
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
512 Cout (" complete").newline;
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
513 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
514 }
7fc0a8295c83 Moved my parseTo and parseFrom modules from tango.scrapple to mde in order to reduce dependencies.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
515 //END Utility funcs