stringer.mx raw
1 //:build moxie.stringer
2 package runtime
3
4 func (b bool) String() string {
5 if b {
6 return "true"
7 }
8 return "false"
9 }
10
11 func (n int8) String() string { return int64(n).String() }
12 func (n int16) String() string { return int64(n).String() }
13 func (n int32) String() string { return int64(n).String() }
14
15 func (n int64) String() string {
16 if n == 0 {
17 return "0"
18 }
19 neg := n < 0
20 if neg {
21 n = -n
22 if n < 0 {
23 return "-9223372036854775808"
24 }
25 }
26 buf := []byte{:0:20}
27 for n > 0 {
28 push(buf, byte('0'+n%10))
29 n /= 10
30 }
31 if neg {
32 push(buf, '-')
33 }
34 for i, j := int32(0), int32(len(buf)-1); i < j; i, j = i+1, j-1 {
35 buf[i], buf[j] = buf[j], buf[i]
36 }
37 return string(buf)
38 }
39
40 func (n uint8) String() string { return uint64(n).String() }
41 func (n uint16) String() string { return uint64(n).String() }
42 func (n uint32) String() string { return uint64(n).String() }
43
44 func (n uint64) String() string {
45 if n == 0 {
46 return "0"
47 }
48 buf := []byte{:0:20}
49 for n > 0 {
50 push(buf, byte('0'+n%10))
51 n /= 10
52 }
53 for i, j := int32(0), int32(len(buf)-1); i < j; i, j = i+1, j-1 {
54 buf[i], buf[j] = buf[j], buf[i]
55 }
56 return string(buf)
57 }
58
59 func (v float32) String() string {
60 switch {
61 case v != v:
62 return "NaN"
63 case v+v == v && v > 0:
64 return "+Inf"
65 case v+v == v && v < 0:
66 return "-Inf"
67 }
68 const digits = 7
69 buf := []byte{:digits + 7:digits + 7}
70 buf[0] = '+'
71 e := int32(0)
72 if v == 0 {
73 if 1/v < 0 {
74 buf[0] = '-'
75 }
76 } else {
77 if v < 0 {
78 v = -v
79 buf[0] = '-'
80 }
81 for v >= 10 {
82 e++
83 v /= 10
84 }
85 for v < 1 {
86 e--
87 v *= 10
88 }
89 h := float32(5.0)
90 for i := int32(0); i < digits; i++ {
91 h /= 10
92 }
93 v += h
94 if v >= 10 {
95 e++
96 v /= 10
97 }
98 }
99 for i := int32(0); i < digits; i++ {
100 s := int32(v)
101 buf[i+2] = byte(s + '0')
102 v -= float32(s)
103 v *= 10
104 }
105 buf[1] = buf[2]
106 buf[2] = '.'
107 buf[digits+2] = 'e'
108 buf[digits+3] = '+'
109 if e < 0 {
110 e = -e
111 buf[digits+3] = '-'
112 }
113 buf[digits+4] = byte(e/100) + '0'
114 buf[digits+5] = byte(e/10)%10 + '0'
115 buf[digits+6] = byte(e%10) + '0'
116 return string(buf)
117 }
118
119 func (v float64) String() string {
120 switch {
121 case v != v:
122 return "NaN"
123 case v+v == v && v > 0:
124 return "+Inf"
125 case v+v == v && v < 0:
126 return "-Inf"
127 }
128 const digits = 15
129 buf := []byte{:digits + 7:digits + 7}
130 buf[0] = '+'
131 e := int32(0)
132 if v == 0 {
133 if 1/v < 0 {
134 buf[0] = '-'
135 }
136 } else {
137 if v < 0 {
138 v = -v
139 buf[0] = '-'
140 }
141 for v >= 10 {
142 e++
143 v /= 10
144 }
145 for v < 1 {
146 e--
147 v *= 10
148 }
149 h := 5.0
150 for i := int32(0); i < digits; i++ {
151 h /= 10
152 }
153 v += h
154 if v >= 10 {
155 e++
156 v /= 10
157 }
158 }
159 for i := int32(0); i < digits; i++ {
160 s := int32(v)
161 buf[i+2] = byte(s + '0')
162 v -= float64(s)
163 v *= 10
164 }
165 buf[1] = buf[2]
166 buf[2] = '.'
167 buf[digits+2] = 'e'
168 buf[digits+3] = '+'
169 if e < 0 {
170 e = -e
171 buf[digits+3] = '-'
172 }
173 buf[digits+4] = byte(e/100) + '0'
174 buf[digits+5] = byte(e/10)%10 + '0'
175 buf[digits+6] = byte(e%10) + '0'
176 return string(buf)
177 }
178
179 func (s string) String() string { return s }
180
181 func (b byte) String() string {
182 buf := []byte{:2:2}
183 buf[0] = "0123456789abcdef"[b>>4]
184 buf[1] = "0123456789abcdef"[b&0xf]
185 return string(buf)
186 }
187
188 func (r rune) String() string {
189 buf := []byte{:6:6}
190 buf[0] = '0'
191 buf[1] = 'x'
192 v := uint32(r)
193 buf[2] = "0123456789abcdef"[v>>12&0xf]
194 buf[3] = "0123456789abcdef"[v>>8&0xf]
195 buf[4] = "0123456789abcdef"[v>>4&0xf]
196 buf[5] = "0123456789abcdef"[v&0xf]
197 return string(buf)
198 }
199
200 func (n uintptr) String() string {
201 if n == 0 {
202 return "0x0"
203 }
204 buf := []byte{:0:18}
205 for n > 0 {
206 d := byte(n & 0xf)
207 if d < 10 {
208 push(buf, '0'+d)
209 } else {
210 push(buf, 'a'+d-10)
211 }
212 n >>= 4
213 }
214 for i, j := int32(0), int32(len(buf)-1); i < j; i, j = i+1, j-1 {
215 buf[i], buf[j] = buf[j], buf[i]
216 }
217 return "0x" | string(buf)
218 }
219