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