annotate lphobos/std/format.d @ 108:288fe1029e1f trunk

[svn r112] Fixed 'case 1,2,3:' style case statements. Fixed a bunch of bugs with return/break/continue in loops. Fixed support for the DMDFE hidden implicit return value variable. This can be needed for some foreach statements where the loop body is converted to a nested delegate, but also possibly returns from the function. Added std.math to phobos. Added AA runtime support code, done ground work for implementing AAs. Several other bugfixes.
author lindquist
date Tue, 20 Nov 2007 05:29:20 +0100
parents
children 5ce8ab11e75a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
2 // Written in the D programming language.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
3
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
4 /**
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
5 * This module implements the workhorse functionality for string and I/O formatting.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
6 * It's comparable to C99's vsprintf().
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
7 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
8 * Macros:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
9 * WIKI = Phobos/StdFormat
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
10 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
11
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
12 /*
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
13 * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
14 * Written by Walter Bright
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
15 * Modified for LLVMDC by Tomas Lindquist Olsen
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
16 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
17 * This software is provided 'as-is', without any express or implied
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
18 * warranty. In no event will the authors be held liable for any damages
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
19 * arising from the use of this software.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
20 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
21 * Permission is granted to anyone to use this software for any purpose,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
22 * including commercial applications, and to alter it and redistribute it
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
23 * freely, subject to the following restrictions:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
24 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
25 * o The origin of this software must not be misrepresented; you must not
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
26 * claim that you wrote the original software. If you use this software
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
27 * in a product, an acknowledgment in the product documentation would be
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
28 * appreciated but is not required.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
29 * o Altered source versions must be plainly marked as such, and must not
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
30 * be misrepresented as being the original software.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
31 * o This notice may not be removed or altered from any source
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
32 * distribution.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
33 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
34
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
35 module std.format;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
36
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
37 //debug=format; // uncomment to turn on debugging printf's
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
38
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
39 import std.stdarg; // caller will need va_list
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
40
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
41 private import std.utf;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
42 private import std.c.stdlib;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
43 private import std.c.string;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
44 private import std.string;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
45
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
46 version (Windows)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
47 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
48 version (DigitalMars)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
49 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
50 version = DigitalMarsC;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
51 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
52 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
53
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
54 version (DigitalMarsC)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
55 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
56 // This is DMC's internal floating point formatting function
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
57 extern (C)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
58 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
59 extern char* function(int c, int flags, int precision, real* pdval,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
60 char* buf, int* psl, int width) __pfloatfmt;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
61 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
62 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
63 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
64 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
65 // Use C99 snprintf
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
66 extern (C) int snprintf(char* s, size_t n, char* format, ...);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
67 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
68
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
69 /**********************************************************************
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
70 * Signals a mismatch between a format and its corresponding argument.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
71 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
72 class FormatError : Error
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
73 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
74 private:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
75
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
76 this()
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
77 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
78 super("std.format");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
79 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
80
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
81 this(char[] msg)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
82 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
83 super("std.format " ~ msg);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
84 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
85 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
86
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
87
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
88 enum Mangle : char
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
89 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
90 Tvoid = 'v',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
91 Tbool = 'b',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
92 Tbyte = 'g',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
93 Tubyte = 'h',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
94 Tshort = 's',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
95 Tushort = 't',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
96 Tint = 'i',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
97 Tuint = 'k',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
98 Tlong = 'l',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
99 Tulong = 'm',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
100 Tfloat = 'f',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
101 Tdouble = 'd',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
102 Treal = 'e',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
103
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
104 Tifloat = 'o',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
105 Tidouble = 'p',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
106 Tireal = 'j',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
107 Tcfloat = 'q',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
108 Tcdouble = 'r',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
109 Tcreal = 'c',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
110
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
111 Tchar = 'a',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
112 Twchar = 'u',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
113 Tdchar = 'w',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
114
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
115 Tarray = 'A',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
116 Tsarray = 'G',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
117 Taarray = 'H',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
118 Tpointer = 'P',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
119 Tfunction = 'F',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
120 Tident = 'I',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
121 Tclass = 'C',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
122 Tstruct = 'S',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
123 Tenum = 'E',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
124 Ttypedef = 'T',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
125 Tdelegate = 'D',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
126
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
127 Tconst = 'x',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
128 Tinvariant = 'y',
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
129 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
130
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
131 // return the TypeInfo for a primitive type and null otherwise.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
132 // This is required since for arrays of ints we only have the mangled
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
133 // char to work from. If arrays always subclassed TypeInfo_Array this
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
134 // routine could go away.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
135 private TypeInfo primitiveTypeInfo(Mangle m)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
136 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
137 TypeInfo ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
138
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
139 switch (m)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
140 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
141 case Mangle.Tvoid:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
142 ti = typeid(void);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
143 case Mangle.Tbool:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
144 ti = typeid(bool);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
145 case Mangle.Tbyte:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
146 ti = typeid(byte);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
147 case Mangle.Tubyte:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
148 ti = typeid(ubyte);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
149 case Mangle.Tshort:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
150 ti = typeid(short);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
151 case Mangle.Tushort:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
152 ti = typeid(ushort);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
153 case Mangle.Tint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
154 ti = typeid(int);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
155 case Mangle.Tuint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
156 ti = typeid(uint);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
157 case Mangle.Tlong:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
158 ti = typeid(long);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
159 case Mangle.Tulong:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
160 ti = typeid(ulong);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
161 case Mangle.Tfloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
162 ti = typeid(float);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
163 case Mangle.Tdouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
164 ti = typeid(double);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
165 case Mangle.Treal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
166 ti = typeid(real);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
167 case Mangle.Tifloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
168 ti = typeid(ifloat);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
169 case Mangle.Tidouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
170 ti = typeid(idouble);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
171 case Mangle.Tireal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
172 ti = typeid(ireal);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
173 /+
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
174 // No complex in LLVMDC yes
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
175 case Mangle.Tcfloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
176 ti = typeid(cfloat);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
177 case Mangle.Tcdouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
178 ti = typeid(cdouble);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
179 case Mangle.Tcreal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
180 ti = typeid(creal);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
181 +/
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
182 case Mangle.Tchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
183 ti = typeid(char);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
184 case Mangle.Twchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
185 ti = typeid(wchar);break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
186 case Mangle.Tdchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
187 ti = typeid(dchar);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
188 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
189 ti = null;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
190 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
191 return ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
192 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
193
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
194 /************************************
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
195 * Interprets variadic argument list pointed to by argptr whose types are given
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
196 * by arguments[], formats them according to embedded format strings in the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
197 * variadic argument list, and sends the resulting characters to putc.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
198 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
199 * The variadic arguments are consumed in order.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
200 * Each is formatted into a sequence of chars, using the default format
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
201 * specification for its type, and the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
202 * characters are sequentially passed to putc.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
203 * If a char[], wchar[], or dchar[]
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
204 * argument is encountered, it is interpreted as a format string. As many
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
205 * arguments as specified in the format string are consumed and formatted
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
206 * according to the format specifications in that string and passed to putc. If
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
207 * there are too few remaining arguments, a FormatError is thrown. If there are
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
208 * more remaining arguments than needed by the format specification, the default
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
209 * processing of arguments resumes until they are all consumed.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
210 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
211 * Params:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
212 * putc = Output is sent do this delegate, character by character.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
213 * arguments = Array of TypeInfo's, one for each argument to be formatted.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
214 * argptr = Points to variadic argument list.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
215 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
216 * Throws:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
217 * Mismatched arguments and formats result in a FormatError being thrown.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
218 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
219 * Format_String:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
220 * <a name="format-string">$(I Format strings)</a>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
221 * consist of characters interspersed with
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
222 * $(I format specifications). Characters are simply copied
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
223 * to the output (such as putc) after any necessary conversion
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
224 * to the corresponding UTF-8 sequence.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
225 *
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
226 * A $(I format specification) starts with a '%' character,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
227 * and has the following grammar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
228
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
229 <pre>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
230 $(I FormatSpecification):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
231 $(B '%%')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
232 $(B '%') $(I Flags) $(I Width) $(I Precision) $(I FormatChar)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
233
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
234 $(I Flags):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
235 $(I empty)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
236 $(B '-') $(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
237 $(B '+') $(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
238 $(B '#') $(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
239 $(B '0') $(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
240 $(B ' ') $(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
241
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
242 $(I Width):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
243 $(I empty)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
244 $(I Integer)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
245 $(B '*')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
246
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
247 $(I Precision):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
248 $(I empty)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
249 $(B '.')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
250 $(B '.') $(I Integer)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
251 $(B '.*')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
252
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
253 $(I Integer):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
254 $(I Digit)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
255 $(I Digit) $(I Integer)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
256
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
257 $(I Digit):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
258 $(B '0')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
259 $(B '1')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
260 $(B '2')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
261 $(B '3')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
262 $(B '4')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
263 $(B '5')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
264 $(B '6')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
265 $(B '7')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
266 $(B '8')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
267 $(B '9')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
268
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
269 $(I FormatChar):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
270 $(B 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
271 $(B 'b')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
272 $(B 'd')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
273 $(B 'o')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
274 $(B 'x')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
275 $(B 'X')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
276 $(B 'e')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
277 $(B 'E')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
278 $(B 'f')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
279 $(B 'F')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
280 $(B 'g')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
281 $(B 'G')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
282 $(B 'a')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
283 $(B 'A')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
284 </pre>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
285 <dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
286 <dt>$(I Flags)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
287 <dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
288 <dt>$(B '-')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
289 <dd>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
290 Left justify the result in the field.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
291 It overrides any $(B 0) flag.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
292
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
293 <dt>$(B '+')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
294 <dd>Prefix positive numbers in a signed conversion with a $(B +).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
295 It overrides any $(I space) flag.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
296
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
297 <dt>$(B '#')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
298 <dd>Use alternative formatting:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
299 <dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
300 <dt>For $(B 'o'):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
301 <dd> Add to precision as necessary so that the first digit
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
302 of the octal formatting is a '0', even if both the argument
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
303 and the $(I Precision) are zero.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
304 <dt> For $(B 'x') ($(B 'X')):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
305 <dd> If non-zero, prefix result with $(B 0x) ($(B 0X)).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
306 <dt> For floating point formatting:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
307 <dd> Always insert the decimal point.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
308 <dt> For $(B 'g') ($(B 'G')):
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
309 <dd> Do not elide trailing zeros.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
310 </dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
311
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
312 <dt>$(B '0')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
313 <dd> For integer and floating point formatting when not nan or
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
314 infinity, use leading zeros
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
315 to pad rather than spaces.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
316 Ignore if there's a $(I Precision).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
317
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
318 <dt>$(B ' ')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
319 <dd>Prefix positive numbers in a signed conversion with a space.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
320 </dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
321
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
322 <dt>$(I Width)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
323 <dd>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
324 Specifies the minimum field width.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
325 If the width is a $(B *), the next argument, which must be
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
326 of type $(B int), is taken as the width.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
327 If the width is negative, it is as if the $(B -) was given
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
328 as a $(I Flags) character.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
329
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
330 <dt>$(I Precision)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
331 <dd> Gives the precision for numeric conversions.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
332 If the precision is a $(B *), the next argument, which must be
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
333 of type $(B int), is taken as the precision. If it is negative,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
334 it is as if there was no $(I Precision).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
335
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
336 <dt>$(I FormatChar)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
337 <dd>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
338 <dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
339 <dt>$(B 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
340 <dd>The corresponding argument is formatted in a manner consistent
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
341 with its type:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
342 <dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
343 <dt>$(B bool)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
344 <dd>The result is <tt>'true'</tt> or <tt>'false'</tt>.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
345 <dt>integral types
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
346 <dd>The $(B %d) format is used.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
347 <dt>floating point types
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
348 <dd>The $(B %g) format is used.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
349 <dt>string types
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
350 <dd>The result is the string converted to UTF-8.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
351 A $(I Precision) specifies the maximum number of characters
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
352 to use in the result.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
353 <dt>classes derived from $(B Object)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
354 <dd>The result is the string returned from the class instance's
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
355 $(B .toString()) method.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
356 A $(I Precision) specifies the maximum number of characters
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
357 to use in the result.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
358 <dt>non-string static and dynamic arrays
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
359 <dd>The result is [s<sub>0</sub>, s<sub>1</sub>, ...]
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
360 where s<sub>k</sub> is the kth element
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
361 formatted with the default format.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
362 </dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
363
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
364 <dt>$(B 'b','d','o','x','X')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
365 <dd> The corresponding argument must be an integral type
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
366 and is formatted as an integer. If the argument is a signed type
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
367 and the $(I FormatChar) is $(B d) it is converted to
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
368 a signed string of characters, otherwise it is treated as
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
369 unsigned. An argument of type $(B bool) is formatted as '1'
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
370 or '0'. The base used is binary for $(B b), octal for $(B o),
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
371 decimal
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
372 for $(B d), and hexadecimal for $(B x) or $(B X).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
373 $(B x) formats using lower case letters, $(B X) uppercase.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
374 If there are fewer resulting digits than the $(I Precision),
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
375 leading zeros are used as necessary.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
376 If the $(I Precision) is 0 and the number is 0, no digits
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
377 result.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
378
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
379 <dt>$(B 'e','E')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
380 <dd> A floating point number is formatted as one digit before
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
381 the decimal point, $(I Precision) digits after, the $(I FormatChar),
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
382 &plusmn;, followed by at least a two digit exponent: $(I d.dddddd)e$(I &plusmn;dd).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
383 If there is no $(I Precision), six
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
384 digits are generated after the decimal point.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
385 If the $(I Precision) is 0, no decimal point is generated.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
386
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
387 <dt>$(B 'f','F')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
388 <dd> A floating point number is formatted in decimal notation.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
389 The $(I Precision) specifies the number of digits generated
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
390 after the decimal point. It defaults to six. At least one digit
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
391 is generated before the decimal point. If the $(I Precision)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
392 is zero, no decimal point is generated.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
393
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
394 <dt>$(B 'g','G')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
395 <dd> A floating point number is formatted in either $(B e) or
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
396 $(B f) format for $(B g); $(B E) or $(B F) format for
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
397 $(B G).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
398 The $(B f) format is used if the exponent for an $(B e) format
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
399 is greater than -5 and less than the $(I Precision).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
400 The $(I Precision) specifies the number of significant
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
401 digits, and defaults to six.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
402 Trailing zeros are elided after the decimal point, if the fractional
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
403 part is zero then no decimal point is generated.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
404
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
405 <dt>$(B 'a','A')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
406 <dd> A floating point number is formatted in hexadecimal
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
407 exponential notation 0x$(I h.hhhhhh)p$(I &plusmn;d).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
408 There is one hexadecimal digit before the decimal point, and as
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
409 many after as specified by the $(I Precision).
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
410 If the $(I Precision) is zero, no decimal point is generated.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
411 If there is no $(I Precision), as many hexadecimal digits as
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
412 necessary to exactly represent the mantissa are generated.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
413 The exponent is written in as few digits as possible,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
414 but at least one, is in decimal, and represents a power of 2 as in
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
415 $(I h.hhhhhh)*2<sup>$(I &plusmn;d)</sup>.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
416 The exponent for zero is zero.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
417 The hexadecimal digits, x and p are in upper case if the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
418 $(I FormatChar) is upper case.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
419 </dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
420
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
421 Floating point NaN's are formatted as $(B nan) if the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
422 $(I FormatChar) is lower case, or $(B NAN) if upper.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
423 Floating point infinities are formatted as $(B inf) or
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
424 $(B infinity) if the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
425 $(I FormatChar) is lower case, or $(B INF) or $(B INFINITY) if upper.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
426 </dl>
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
427
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
428 Example:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
429
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
430 -------------------------
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
431 import std.c.stdio;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
432 import std.format;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
433
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
434 void formattedPrint(...)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
435 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
436 void putc(char c)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
437 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
438 fputc(c, stdout);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
439 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
440
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
441 std.format.doFormat(&putc, _arguments, _argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
442 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
443
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
444 ...
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
445
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
446 int x = 27;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
447 // prints 'The answer is 27:6'
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
448 formattedPrint("The answer is %s:", x, 6);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
449 ------------------------
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
450 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
451
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
452 void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
453 { int j;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
454 TypeInfo ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
455 Mangle m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
456 uint flags;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
457 int field_width;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
458 int precision;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
459
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
460 enum : uint
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
461 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
462 FLdash = 1,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
463 FLplus = 2,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
464 FLspace = 4,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
465 FLhash = 8,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
466 FLlngdbl = 0x20,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
467 FL0pad = 0x40,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
468 FLprecision = 0x80,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
469 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
470
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
471 static TypeInfo skipCI(TypeInfo valti)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
472 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
473 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
474 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
475 if (valti.classinfo.name.length == 18 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
476 valti.classinfo.name[9..18] == "Invariant")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
477 valti = (cast(TypeInfo_Invariant)valti).next;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
478 else if (valti.classinfo.name.length == 14 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
479 valti.classinfo.name[9..14] == "Const")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
480 valti = (cast(TypeInfo_Const)valti).next;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
481 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
482 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
483 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
484 return valti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
485 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
486
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
487 void formatArg(char fc)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
488 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
489 bool vbit;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
490 ulong vnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
491 char vchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
492 dchar vdchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
493 Object vobject;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
494 real vreal;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
495 creal vcreal;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
496 Mangle m2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
497 int signed = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
498 uint base = 10;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
499 int uc;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
500 char[ulong.sizeof * 8] tmpbuf; // long enough to print long in binary
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
501 char* prefix = "";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
502 string s;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
503
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
504 void putstr(char[] s)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
505 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
506 //printf("flags = x%x\n", flags);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
507 int prepad = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
508 int postpad = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
509 int padding = field_width - (strlen(prefix) + s.length);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
510 if (padding > 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
511 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
512 if (flags & FLdash)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
513 postpad = padding;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
514 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
515 prepad = padding;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
516 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
517
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
518 if (flags & FL0pad)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
519 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
520 while (*prefix)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
521 putc(*prefix++);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
522 while (prepad--)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
523 putc('0');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
524 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
525 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
526 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
527 while (prepad--)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
528 putc(' ');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
529 while (*prefix)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
530 putc(*prefix++);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
531 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
532
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
533 foreach (dchar c; s)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
534 putc(c);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
535
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
536 while (postpad--)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
537 putc(' ');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
538 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
539
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
540 void putreal(real v)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
541 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
542 //printf("putreal %Lg\n", vreal);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
543
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
544 switch (fc)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
545 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
546 case 's':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
547 fc = 'g';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
548 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
549
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
550 case 'f', 'F', 'e', 'E', 'g', 'G', 'a', 'A':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
551 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
552
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
553 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
554 //printf("fc = '%c'\n", fc);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
555 Lerror:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
556 throw new FormatError("floating");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
557 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
558 version (DigitalMarsC)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
559 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
560 int sl;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
561 char[] fbuf = tmpbuf;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
562 if (!(flags & FLprecision))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
563 precision = 6;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
564 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
565 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
566 sl = fbuf.length;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
567 prefix = (*__pfloatfmt)(fc, flags | FLlngdbl,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
568 precision, &v, cast(char*)fbuf, &sl, field_width);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
569 if (sl != -1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
570 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
571 sl = fbuf.length * 2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
572 fbuf = (cast(char*)alloca(sl * char.sizeof))[0 .. sl];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
573 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
574 putstr(fbuf[0 .. sl]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
575 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
576 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
577 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
578 int sl;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
579 char[] fbuf = tmpbuf;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
580 char[12] format;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
581 format[0] = '%';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
582 int i = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
583 if (flags & FLdash)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
584 format[i++] = '-';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
585 if (flags & FLplus)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
586 format[i++] = '+';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
587 if (flags & FLspace)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
588 format[i++] = ' ';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
589 if (flags & FLhash)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
590 format[i++] = '#';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
591 if (flags & FL0pad)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
592 format[i++] = '0';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
593 format[i + 0] = '*';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
594 format[i + 1] = '.';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
595 format[i + 2] = '*';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
596 format[i + 3] = 'L';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
597 format[i + 4] = fc;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
598 format[i + 5] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
599 if (!(flags & FLprecision))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
600 precision = -1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
601 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
602 { int n;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
603
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
604 sl = fbuf.length;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
605 n = snprintf(fbuf.ptr, sl, format.ptr, field_width, precision, v);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
606 //printf("format = '%s', n = %d\n", cast(char*)format, n);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
607 if (n >= 0 && n < sl)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
608 { sl = n;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
609 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
610 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
611 if (n < 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
612 sl = sl * 2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
613 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
614 sl = n + 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
615 fbuf = (cast(char*)alloca(sl * char.sizeof))[0 .. sl];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
616 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
617 putstr(fbuf[0 .. sl]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
618 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
619 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
620 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
621
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
622 static Mangle getMan(TypeInfo ti)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
623 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
624 auto m = cast(Mangle)ti.classinfo.name[9];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
625 if (ti.classinfo.name.length == 20 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
626 ti.classinfo.name[9..20] == "StaticArray")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
627 m = cast(Mangle)'G';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
628 return m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
629 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
630
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
631 void putArray(void* p, size_t len, TypeInfo valti)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
632 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
633 //printf("\nputArray(len = %u), tsize = %u\n", len, valti.tsize());
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
634 putc('[');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
635 valti = skipCI(valti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
636 size_t tsize = valti.tsize();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
637 auto argptrSave = argptr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
638 auto tiSave = ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
639 auto mSave = m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
640 ti = valti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
641 //printf("\n%.*s\n", valti.classinfo.name);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
642 m = getMan(valti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
643 while (len--)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
644 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
645 //doFormat(putc, (&valti)[0 .. 1], p);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
646 argptr = p;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
647 formatArg('s');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
648
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
649 p += tsize;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
650 if (len > 0) putc(',');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
651 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
652 m = mSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
653 ti = tiSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
654 argptr = argptrSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
655 putc(']');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
656 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
657
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
658 void putAArray(ubyte[long] vaa, TypeInfo valti, TypeInfo keyti)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
659 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
660 putc('[');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
661 bool comma=false;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
662 auto argptrSave = argptr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
663 auto tiSave = ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
664 auto mSave = m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
665 valti = skipCI(valti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
666 keyti = skipCI(keyti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
667 foreach(inout fakevalue; vaa)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
668 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
669 if (comma) putc(',');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
670 comma = true;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
671 // the key comes before the value
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
672 ubyte* key = &fakevalue - long.sizeof;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
673
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
674 //doFormat(putc, (&keyti)[0..1], key);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
675 argptr = key;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
676 ti = keyti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
677 m = getMan(keyti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
678 formatArg('s');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
679
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
680 putc(':');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
681 auto keysize = keyti.tsize;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
682 keysize = (keysize + 3) & ~3;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
683 ubyte* value = key + keysize;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
684 //doFormat(putc, (&valti)[0..1], value);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
685 argptr = value;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
686 ti = valti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
687 m = getMan(valti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
688 formatArg('s');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
689 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
690 m = mSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
691 ti = tiSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
692 argptr = argptrSave;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
693 putc(']');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
694 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
695
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
696 //printf("formatArg(fc = '%c', m = '%c')\n", fc, m);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
697 switch (m)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
698 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
699 case Mangle.Tbool:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
700 vbit = va_arg!(bool)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
701 if (fc != 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
702 { vnumber = vbit;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
703 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
704 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
705 putstr(vbit ? "true" : "false");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
706 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
707
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
708
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
709 case Mangle.Tchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
710 vchar = va_arg!(char)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
711 if (fc != 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
712 { vnumber = vchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
713 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
714 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
715 L2:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
716 putstr((&vchar)[0 .. 1]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
717 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
718
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
719 case Mangle.Twchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
720 vdchar = va_arg!(wchar)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
721 goto L1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
722
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
723 case Mangle.Tdchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
724 vdchar = va_arg!(dchar)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
725 L1:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
726 if (fc != 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
727 { vnumber = vdchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
728 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
729 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
730 if (vdchar <= 0x7F)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
731 { vchar = cast(char)vdchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
732 goto L2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
733 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
734 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
735 { if (!isValidDchar(vdchar))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
736 throw new UtfException("invalid dchar in format", 0);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
737 char[4] vbuf;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
738 putstr(toUTF8(vbuf, vdchar));
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
739 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
740 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
741
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
742
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
743 case Mangle.Tbyte:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
744 signed = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
745 vnumber = va_arg!(byte)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
746 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
747
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
748 case Mangle.Tubyte:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
749 vnumber = va_arg!(ubyte)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
750 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
751
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
752 case Mangle.Tshort:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
753 signed = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
754 vnumber = va_arg!(short)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
755 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
756
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
757 case Mangle.Tushort:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
758 vnumber = va_arg!(ushort)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
759 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
760
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
761 case Mangle.Tint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
762 signed = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
763 vnumber = va_arg!(int)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
764 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
765
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
766 case Mangle.Tuint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
767 Luint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
768 vnumber = va_arg!(uint)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
769 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
770
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
771 case Mangle.Tlong:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
772 signed = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
773 vnumber = cast(ulong)va_arg!(long)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
774 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
775
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
776 case Mangle.Tulong:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
777 Lulong:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
778 vnumber = va_arg!(ulong)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
779 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
780
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
781 case Mangle.Tclass:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
782 vobject = va_arg!(Object)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
783 if (vobject is null)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
784 s = "null";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
785 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
786 s = vobject.toString();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
787 goto Lputstr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
788
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
789 case Mangle.Tpointer:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
790 vnumber = cast(ulong)va_arg!(void*)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
791 uc = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
792 flags |= FL0pad;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
793 if (!(flags & FLprecision))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
794 { flags |= FLprecision;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
795 precision = (void*).sizeof;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
796 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
797 base = 16;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
798 goto Lnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
799
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
800
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
801 case Mangle.Tfloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
802 case Mangle.Tifloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
803 if (fc == 'x' || fc == 'X')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
804 goto Luint;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
805 vreal = va_arg!(float)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
806 goto Lreal;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
807
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
808 case Mangle.Tdouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
809 case Mangle.Tidouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
810 if (fc == 'x' || fc == 'X')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
811 goto Lulong;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
812 vreal = va_arg!(double)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
813 goto Lreal;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
814
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
815 case Mangle.Treal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
816 case Mangle.Tireal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
817 vreal = va_arg!(real)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
818 goto Lreal;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
819
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
820
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
821 case Mangle.Tcfloat:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
822 vcreal = va_arg!(cfloat)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
823 goto Lcomplex;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
824
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
825 case Mangle.Tcdouble:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
826 vcreal = va_arg!(cdouble)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
827 goto Lcomplex;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
828
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
829 case Mangle.Tcreal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
830 vcreal = va_arg!(creal)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
831 goto Lcomplex;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
832
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
833 case Mangle.Tsarray:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
834 putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, (cast(TypeInfo_StaticArray)ti).next);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
835 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
836
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
837 case Mangle.Tarray:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
838 int mi = 10;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
839 if (ti.classinfo.name.length == 14 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
840 ti.classinfo.name[9..14] == "Array")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
841 { // array of non-primitive types
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
842 TypeInfo tn = (cast(TypeInfo_Array)ti).next;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
843 tn = skipCI(tn);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
844 switch (cast(Mangle)tn.classinfo.name[9])
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
845 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
846 case Mangle.Tchar: goto LarrayChar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
847 case Mangle.Twchar: goto LarrayWchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
848 case Mangle.Tdchar: goto LarrayDchar;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
849 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
850 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
851 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
852 void[] va = va_arg!(void[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
853 putArray(va.ptr, va.length, tn);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
854 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
855 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
856 if (ti.classinfo.name.length == 25 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
857 ti.classinfo.name[9..25] == "AssociativeArray")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
858 { // associative array
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
859 ubyte[long] vaa = va_arg!(ubyte[long])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
860 putAArray(vaa,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
861 (cast(TypeInfo_AssociativeArray)ti).next,
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
862 (cast(TypeInfo_AssociativeArray)ti).key);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
863 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
864 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
865
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
866 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
867 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
868 m2 = cast(Mangle)ti.classinfo.name[mi];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
869 switch (m2)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
870 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
871 case Mangle.Tchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
872 LarrayChar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
873 s = va_arg!(char[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
874 goto Lputstr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
875
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
876 case Mangle.Twchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
877 LarrayWchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
878 wchar[] sw = va_arg!(wchar[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
879 s = toUTF8(sw);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
880 goto Lputstr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
881
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
882 case Mangle.Tdchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
883 LarrayDchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
884 dchar[] sd = va_arg!(dchar[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
885 s = toUTF8(sd);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
886 Lputstr:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
887 if (fc != 's')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
888 throw new FormatError("string");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
889 if (flags & FLprecision && precision < s.length)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
890 s = s[0 .. precision];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
891 putstr(s);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
892 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
893
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
894 case Mangle.Tconst:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
895 case Mangle.Tinvariant:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
896 mi++;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
897 continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
898
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
899 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
900 TypeInfo ti2 = primitiveTypeInfo(m2);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
901 if (!ti2)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
902 goto Lerror;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
903 void[] va = va_arg!(void[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
904 putArray(va.ptr, va.length, ti2);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
905 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
906 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
907 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
908
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
909 case Mangle.Ttypedef:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
910 ti = (cast(TypeInfo_Typedef)ti).base;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
911 m = cast(Mangle)ti.classinfo.name[9];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
912 formatArg(fc);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
913 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
914
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
915 case Mangle.Tenum:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
916 ti = (cast(TypeInfo_Enum)ti).base;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
917 m = cast(Mangle)ti.classinfo.name[9];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
918 formatArg(fc);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
919 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
920
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
921 case Mangle.Tstruct:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
922 { TypeInfo_Struct tis = cast(TypeInfo_Struct)ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
923 if (tis.xtoString is null)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
924 throw new FormatError("Can't convert " ~ tis.toString() ~ " to string: \"string toString()\" not defined");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
925 s = tis.xtoString(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
926 argptr += (tis.tsize() + 3) & ~3;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
927 goto Lputstr;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
928 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
929
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
930 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
931 goto Lerror;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
932 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
933
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
934 Lnumber:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
935 switch (fc)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
936 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
937 case 's':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
938 case 'd':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
939 if (signed)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
940 { if (cast(long)vnumber < 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
941 { prefix = "-";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
942 vnumber = -vnumber;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
943 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
944 else if (flags & FLplus)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
945 prefix = "+";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
946 else if (flags & FLspace)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
947 prefix = " ";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
948 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
949 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
950
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
951 case 'b':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
952 signed = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
953 base = 2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
954 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
955
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
956 case 'o':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
957 signed = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
958 base = 8;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
959 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
960
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
961 case 'X':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
962 uc = 1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
963 if (flags & FLhash && vnumber)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
964 prefix = "0X";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
965 signed = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
966 base = 16;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
967 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
968
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
969 case 'x':
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
970 if (flags & FLhash && vnumber)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
971 prefix = "0x";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
972 signed = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
973 base = 16;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
974 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
975
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
976 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
977 goto Lerror;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
978 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
979
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
980 if (!signed)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
981 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
982 switch (m)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
983 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
984 case Mangle.Tbyte:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
985 vnumber &= 0xFF;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
986 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
987
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
988 case Mangle.Tshort:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
989 vnumber &= 0xFFFF;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
990 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
991
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
992 case Mangle.Tint:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
993 vnumber &= 0xFFFFFFFF;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
994 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
995
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
996 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
997 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
998 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
999 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1000
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1001 if (flags & FLprecision && fc != 'p')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1002 flags &= ~FL0pad;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1003
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1004 if (vnumber < base)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1005 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1006 if (vnumber == 0 && precision == 0 && flags & FLprecision &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1007 !(fc == 'o' && flags & FLhash))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1008 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1009 putstr(null);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1010 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1011 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1012 if (precision == 0 || !(flags & FLprecision))
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1013 { vchar = cast(char)('0' + vnumber);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1014 if (vnumber < 10)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1015 vchar = cast(char)('0' + vnumber);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1016 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1017 vchar = cast(char)((uc ? 'A' - 10 : 'a' - 10) + vnumber);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1018 goto L2;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1019 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1020 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1021
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1022 int n = tmpbuf.length;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1023 char c;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1024 int hexoffset = uc ? ('A' - ('9' + 1)) : ('a' - ('9' + 1));
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1025
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1026 while (vnumber)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1027 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1028 c = cast(char)((vnumber % base) + '0');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1029 if (c > '9')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1030 c += hexoffset;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1031 vnumber /= base;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1032 tmpbuf[--n] = c;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1033 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1034 if (tmpbuf.length - n < precision && precision < tmpbuf.length)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1035 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1036 int m = tmpbuf.length - precision;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1037 tmpbuf[m .. n] = '0';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1038 n = m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1039 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1040 else if (flags & FLhash && fc == 'o')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1041 prefix = "0";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1042 putstr(tmpbuf[n .. tmpbuf.length]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1043 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1044
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1045 Lreal:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1046 putreal(vreal);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1047 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1048
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1049 Lcomplex:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1050 putreal(vcreal.re);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1051 putc('+');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1052 putreal(vcreal.im);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1053 putc('i');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1054 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1055
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1056 Lerror:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1057 throw new FormatError("formatArg");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1058 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1059
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1060
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1061 for (j = 0; j < arguments.length; )
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1062 { ti = arguments[j++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1063 //printf("test1: '%.*s' %d\n", ti.classinfo.name, ti.classinfo.name.length);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1064 //ti.print();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1065
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1066 flags = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1067 precision = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1068 field_width = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1069
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1070 ti = skipCI(ti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1071 int mi = 9;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1072 do
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1073 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1074 if (ti.classinfo.name.length <= mi)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1075 goto Lerror;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1076 m = cast(Mangle)ti.classinfo.name[mi++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1077 } while (m == Mangle.Tconst || m == Mangle.Tinvariant);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1078
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1079 if (m == Mangle.Tarray)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1080 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1081 if (ti.classinfo.name.length == 14 &&
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1082 ti.classinfo.name[9..14] == "Array")
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1083 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1084 TypeInfo tn = (cast(TypeInfo_Array)ti).next;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1085 tn = skipCI(tn);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1086 switch (cast(Mangle)tn.classinfo.name[9])
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1087 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1088 case Mangle.Tchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1089 case Mangle.Twchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1090 case Mangle.Tdchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1091 ti = tn;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1092 mi = 9;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1093 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1094 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1095 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1096 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1097 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1098 L1:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1099 Mangle m2 = cast(Mangle)ti.classinfo.name[mi];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1100 string fmt; // format string
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1101 wstring wfmt;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1102 dstring dfmt;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1103
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1104 /* For performance reasons, this code takes advantage of the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1105 * fact that most format strings will be ASCII, and that the
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1106 * format specifiers are always ASCII. This means we only need
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1107 * to deal with UTF in a couple of isolated spots.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1108 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1109
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1110 switch (m2)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1111 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1112 case Mangle.Tchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1113 fmt = va_arg!(char[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1114 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1115
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1116 case Mangle.Twchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1117 wfmt = va_arg!(wchar[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1118 fmt = toUTF8(wfmt);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1119 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1120
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1121 case Mangle.Tdchar:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1122 dfmt = va_arg!(dchar[])(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1123 fmt = toUTF8(dfmt);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1124 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1125
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1126 case Mangle.Tconst:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1127 case Mangle.Tinvariant:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1128 mi++;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1129 goto L1;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1130
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1131 default:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1132 formatArg('s');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1133 continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1134 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1135
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1136 for (size_t i = 0; i < fmt.length; )
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1137 { dchar c = fmt[i++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1138
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1139 dchar getFmtChar()
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1140 { // Valid format specifier characters will never be UTF
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1141 if (i == fmt.length)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1142 throw new FormatError("invalid specifier");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1143 return fmt[i++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1144 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1145
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1146 int getFmtInt()
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1147 { int n;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1148
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1149 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1150 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1151 n = n * 10 + (c - '0');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1152 if (n < 0) // overflow
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1153 throw new FormatError("int overflow");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1154 c = getFmtChar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1155 if (c < '0' || c > '9')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1156 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1157 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1158 return n;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1159 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1160
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1161 int getFmtStar()
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1162 { Mangle m;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1163 TypeInfo ti;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1164
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1165 if (j == arguments.length)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1166 throw new FormatError("too few arguments");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1167 ti = arguments[j++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1168 m = cast(Mangle)ti.classinfo.name[9];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1169 if (m != Mangle.Tint)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1170 throw new FormatError("int argument expected");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1171 return va_arg!(int)(argptr);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1172 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1173
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1174 if (c != '%')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1175 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1176 if (c > 0x7F) // if UTF sequence
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1177 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1178 i--; // back up and decode UTF sequence
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1179 c = std.utf.decode(fmt, i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1180 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1181 Lputc:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1182 putc(c);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1183 continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1184 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1185
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1186 // Get flags {-+ #}
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1187 flags = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1188 while (1)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1189 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1190 c = getFmtChar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1191 switch (c)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1192 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1193 case '-': flags |= FLdash; continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1194 case '+': flags |= FLplus; continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1195 case ' ': flags |= FLspace; continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1196 case '#': flags |= FLhash; continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1197 case '0': flags |= FL0pad; continue;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1198
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1199 case '%': if (flags == 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1200 goto Lputc;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1201 default: break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1202 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1203 break;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1204 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1205
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1206 // Get field width
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1207 field_width = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1208 if (c == '*')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1209 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1210 field_width = getFmtStar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1211 if (field_width < 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1212 { flags |= FLdash;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1213 field_width = -field_width;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1214 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1215
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1216 c = getFmtChar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1217 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1218 else if (c >= '0' && c <= '9')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1219 field_width = getFmtInt();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1220
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1221 if (flags & FLplus)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1222 flags &= ~FLspace;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1223 if (flags & FLdash)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1224 flags &= ~FL0pad;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1225
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1226 // Get precision
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1227 precision = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1228 if (c == '.')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1229 { flags |= FLprecision;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1230 //flags &= ~FL0pad;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1231
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1232 c = getFmtChar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1233 if (c == '*')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1234 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1235 precision = getFmtStar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1236 if (precision < 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1237 { precision = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1238 flags &= ~FLprecision;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1239 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1240
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1241 c = getFmtChar();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1242 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1243 else if (c >= '0' && c <= '9')
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1244 precision = getFmtInt();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1245 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1246
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1247 if (j == arguments.length)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1248 goto Lerror;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1249 ti = arguments[j++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1250 ti = skipCI(ti);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1251 mi = 9;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1252 do
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1253 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1254 m = cast(Mangle)ti.classinfo.name[mi++];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1255 } while (m == Mangle.Tconst || m == Mangle.Tinvariant);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1256
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1257 if (c > 0x7F) // if UTF sequence
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1258 goto Lerror; // format specifiers can't be UTF
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1259 formatArg(cast(char)c);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1260 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1261 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1262 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1263 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1264 formatArg('s');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1265 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1266 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1267 return;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1268
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1269 Lerror:
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1270 throw new FormatError();
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1271 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1272
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1273 /* ======================== Unit Tests ====================================== */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1274
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1275 unittest
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1276 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1277 int i;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1278 string s;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1279
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1280 debug(format) printf("std.format.format.unittest\n");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1281
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1282 s = std.string.format("hello world! %s %s ", true, 57, 1_000_000_000, 'x', " foo");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1283 assert(s == "hello world! true 57 1000000000x foo");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1284
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1285 s = std.string.format(1.67, " %A ", -1.28, float.nan);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1286 /* The host C library is used to format floats.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1287 * C99 doesn't specify what the hex digit before the decimal point
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1288 * is for %A.
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1289 */
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1290 version (linux)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1291 assert(s == "1.67 -0XA.3D70A3D70A3D8P-3 nan");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1292 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1293 assert(s == "1.67 -0X1.47AE147AE147BP+0 nan");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1294
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1295 s = std.string.format("%x %X", 0x1234AF, 0xAFAFAFAF);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1296 assert(s == "1234af AFAFAFAF");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1297
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1298 s = std.string.format("%b %o", 0x1234AF, 0xAFAFAFAF);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1299 assert(s == "100100011010010101111 25753727657");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1300
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1301 s = std.string.format("%d %s", 0x1234AF, 0xAFAFAFAF);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1302 assert(s == "1193135 2947526575");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1303
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1304 s = std.string.format("%s", 1.2 + 3.4i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1305 assert(s == "1.2+3.4i");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1306
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1307 s = std.string.format("%x %X", 1.32, 6.78f);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1308 assert(s == "3ff51eb851eb851f 40D8F5C3");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1309
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1310 s = std.string.format("%#06.*f",2,12.345);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1311 assert(s == "012.35");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1312
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1313 s = std.string.format("%#0*.*f",6,2,12.345);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1314 assert(s == "012.35");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1315
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1316 s = std.string.format("%7.4g:", 12.678);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1317 assert(s == " 12.68:");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1318
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1319 s = std.string.format("%7.4g:", 12.678L);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1320 assert(s == " 12.68:");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1321
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1322 s = std.string.format("%04f|%05d|%#05x|%#5x",-4.,-10,1,1);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1323 assert(s == "-4.000000|-0010|0x001| 0x1");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1324
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1325 i = -10;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1326 s = std.string.format("%d|%3d|%03d|%1d|%01.4f",i,i,i,i,cast(double) i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1327 assert(s == "-10|-10|-10|-10|-10.0000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1328
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1329 i = -5;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1330 s = std.string.format("%d|%3d|%03d|%1d|%01.4f",i,i,i,i,cast(double) i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1331 assert(s == "-5| -5|-05|-5|-5.0000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1332
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1333 i = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1334 s = std.string.format("%d|%3d|%03d|%1d|%01.4f",i,i,i,i,cast(double) i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1335 assert(s == "0| 0|000|0|0.0000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1336
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1337 i = 5;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1338 s = std.string.format("%d|%3d|%03d|%1d|%01.4f",i,i,i,i,cast(double) i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1339 assert(s == "5| 5|005|5|5.0000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1340
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1341 i = 10;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1342 s = std.string.format("%d|%3d|%03d|%1d|%01.4f",i,i,i,i,cast(double) i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1343 assert(s == "10| 10|010|10|10.0000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1344
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1345 s = std.string.format("%.0d", 0);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1346 assert(s == "");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1347
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1348 s = std.string.format("%.g", .34);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1349 assert(s == "0.3");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1350
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1351 s = std.string.format("%.0g", .34);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1352 assert(s == "0.3");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1353
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1354 s = std.string.format("%.2g", .34);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1355 assert(s == "0.34");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1356
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1357 s = std.string.format("%0.0008f", 1e-08);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1358 assert(s == "0.00000001");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1359
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1360 s = std.string.format("%0.0008f", 1e-05);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1361 assert(s == "0.00001000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1362
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1363 s = "helloworld";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1364 string r;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1365 r = std.string.format("%.2s", s[0..5]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1366 assert(r == "he");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1367 r = std.string.format("%.20s", s[0..5]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1368 assert(r == "hello");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1369 r = std.string.format("%8s", s[0..5]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1370 assert(r == " hello");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1371
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1372 byte[] arrbyte = new byte[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1373 arrbyte[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1374 arrbyte[1] = -99;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1375 arrbyte[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1376 r = std.string.format(arrbyte);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1377 assert(r == "[100,-99,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1378
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1379 ubyte[] arrubyte = new ubyte[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1380 arrubyte[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1381 arrubyte[1] = 200;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1382 arrubyte[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1383 r = std.string.format(arrubyte);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1384 assert(r == "[100,200,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1385
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1386 short[] arrshort = new short[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1387 arrshort[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1388 arrshort[1] = -999;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1389 arrshort[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1390 r = std.string.format(arrshort);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1391 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1392 r = std.string.format("%s",arrshort);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1393 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1394
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1395 ushort[] arrushort = new ushort[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1396 arrushort[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1397 arrushort[1] = 20_000;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1398 arrushort[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1399 r = std.string.format(arrushort);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1400 assert(r == "[100,20000,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1401
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1402 int[] arrint = new int[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1403 arrint[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1404 arrint[1] = -999;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1405 arrint[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1406 r = std.string.format(arrint);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1407 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1408 r = std.string.format("%s",arrint);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1409 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1410
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1411 long[] arrlong = new long[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1412 arrlong[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1413 arrlong[1] = -999;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1414 arrlong[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1415 r = std.string.format(arrlong);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1416 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1417 r = std.string.format("%s",arrlong);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1418 assert(r == "[100,-999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1419
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1420 ulong[] arrulong = new ulong[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1421 arrulong[0] = 100;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1422 arrulong[1] = 999;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1423 arrulong[3] = 0;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1424 r = std.string.format(arrulong);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1425 assert(r == "[100,999,0,0]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1426
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1427 string[] arr2 = new string[4];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1428 arr2[0] = "hello";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1429 arr2[1] = "world";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1430 arr2[3] = "foo";
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1431 r = std.string.format(arr2);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1432 assert(r == "[hello,world,,foo]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1433
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1434 r = std.string.format("%.8d", 7);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1435 assert(r == "00000007");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1436 r = std.string.format("%.8x", 10);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1437 assert(r == "0000000a");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1438
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1439 r = std.string.format("%-3d", 7);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1440 assert(r == "7 ");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1441
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1442 r = std.string.format("%*d", -3, 7);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1443 assert(r == "7 ");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1444
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1445 r = std.string.format("%.*d", -3, 7);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1446 assert(r == "7");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1447
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1448 typedef int myint;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1449 myint m = -7;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1450 r = std.string.format(m);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1451 assert(r == "-7");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1452
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1453 r = std.string.format("abc"c);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1454 assert(r == "abc");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1455 r = std.string.format("def"w);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1456 assert(r == "def");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1457 r = std.string.format("ghi"d);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1458 assert(r == "ghi");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1459
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1460 void* p = cast(void*)0xDEADBEEF;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1461 r = std.string.format(p);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1462 assert(r == "DEADBEEF");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1463
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1464 r = std.string.format("%#x", 0xabcd);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1465 assert(r == "0xabcd");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1466 r = std.string.format("%#X", 0xABCD);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1467 assert(r == "0XABCD");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1468
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1469 r = std.string.format("%#o", 012345);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1470 assert(r == "012345");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1471 r = std.string.format("%o", 9);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1472 assert(r == "11");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1473
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1474 r = std.string.format("%+d", 123);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1475 assert(r == "+123");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1476 r = std.string.format("%+d", -123);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1477 assert(r == "-123");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1478 r = std.string.format("% d", 123);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1479 assert(r == " 123");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1480 r = std.string.format("% d", -123);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1481 assert(r == "-123");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1482
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1483 r = std.string.format("%%");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1484 assert(r == "%");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1485
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1486 r = std.string.format("%d", true);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1487 assert(r == "1");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1488 r = std.string.format("%d", false);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1489 assert(r == "0");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1490
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1491 r = std.string.format("%d", 'a');
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1492 assert(r == "97");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1493 wchar wc = 'a';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1494 r = std.string.format("%d", wc);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1495 assert(r == "97");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1496 dchar dc = 'a';
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1497 r = std.string.format("%d", dc);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1498 assert(r == "97");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1499
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1500 byte b = byte.max;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1501 r = std.string.format("%x", b);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1502 assert(r == "7f");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1503 r = std.string.format("%x", ++b);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1504 assert(r == "80");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1505 r = std.string.format("%x", ++b);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1506 assert(r == "81");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1507
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1508 short sh = short.max;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1509 r = std.string.format("%x", sh);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1510 assert(r == "7fff");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1511 r = std.string.format("%x", ++sh);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1512 assert(r == "8000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1513 r = std.string.format("%x", ++sh);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1514 assert(r == "8001");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1515
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1516 i = int.max;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1517 r = std.string.format("%x", i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1518 assert(r == "7fffffff");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1519 r = std.string.format("%x", ++i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1520 assert(r == "80000000");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1521 r = std.string.format("%x", ++i);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1522 assert(r == "80000001");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1523
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1524 r = std.string.format("%x", 10);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1525 assert(r == "a");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1526 r = std.string.format("%X", 10);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1527 assert(r == "A");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1528 r = std.string.format("%x", 15);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1529 assert(r == "f");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1530 r = std.string.format("%X", 15);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1531 assert(r == "F");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1532
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1533 Object c = null;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1534 r = std.string.format(c);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1535 assert(r == "null");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1536
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1537 enum TestEnum
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1538 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1539 Value1, Value2
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1540 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1541 r = std.string.format("%s", TestEnum.Value2);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1542 assert(r == "1");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1543
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1544 char[5][int] aa = ([3:"hello", 4:"betty"]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1545 r = std.string.format("%s", aa.values);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1546 assert(r == "[[h,e,l,l,o],[b,e,t,t,y]]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1547 r = std.string.format("%s", aa);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1548 assert(r == "[3:[h,e,l,l,o],4:[b,e,t,t,y]]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1549
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1550 static const dchar[] ds = ['a','b'];
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1551 for (int j = 0; j < ds.length; ++j)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1552 {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1553 r = std.string.format(" %d", ds[j]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1554 if (j == 0)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1555 assert(r == " 97");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1556 else
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1557 assert(r == " 98");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1558 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1559
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1560 r = std.string.format(">%14d<, ", 15, [1,2,3]);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1561 assert(r == "> 15<, [1,2,3]");
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1562 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents:
diff changeset
1563