summaryrefslogtreecommitdiff
path: root/src/lib/fmt/print.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/fmt/print.go')
-rw-r--r--src/lib/fmt/print.go51
1 files changed, 42 insertions, 9 deletions
diff --git a/src/lib/fmt/print.go b/src/lib/fmt/print.go
index 8fa337f80..ce7a4f2d3 100644
--- a/src/lib/fmt/print.go
+++ b/src/lib/fmt/print.go
@@ -230,12 +230,24 @@ func getString(v reflect.Value) (val string, ok bool) {
return "", false;
}
-func getFloat(v reflect.Value) (val float64, ok bool) {
+func getFloat32(v reflect.Value) (val float32, ok bool) {
switch v.Kind() {
- case reflect.FloatKind:
- return float64(v.(reflect.FloatValue).Get()), true;
case reflect.Float32Kind:
- return float64(v.(reflect.Float32Value).Get()), true;
+ return float32(v.(reflect.Float32Value).Get()), true;
+ case reflect.FloatKind:
+ if v.Type().Size()*8 == 32 {
+ return float32(v.(reflect.FloatValue).Get()), true;
+ }
+ }
+ return 0.0, false;
+}
+
+func getFloat64(v reflect.Value) (val float64, ok bool) {
+ switch v.Kind() {
+ case reflect.FloatKind:
+ if v.Type().Size()*8 == 64 {
+ return float64(v.(reflect.FloatValue).Get()), true;
+ }
case reflect.Float64Kind:
return float64(v.(reflect.Float64Value).Get()), true;
case reflect.Float80Kind:
@@ -299,9 +311,20 @@ func (p *P) printField(field reflect.Value) (was_string bool) {
case reflect.UintKind, reflect.Uint8Kind, reflect.Uint16Kind, reflect.Uint32Kind, reflect.Uint64Kind:
v, signed, ok := getInt(field);
s = p.fmt.ud64(uint64(v)).str();
- case reflect.FloatKind, reflect.Float32Kind, reflect.Float64Kind, reflect.Float80Kind:
- v, ok := getFloat(field);
+ case reflect.Float32Kind:
+ v, ok := getFloat32(field);
+ s = p.fmt.g32(v).str();
+ case reflect.Float64Kind, reflect.Float80Kind:
+ v, ok := getFloat64(field);
s = p.fmt.g64(v).str();
+ case reflect.FloatKind:
+ if field.Type().Size()*8 == 32 {
+ v, ok := getFloat32(field);
+ s = p.fmt.g32(v).str();
+ } else {
+ v, ok := getFloat64(field);
+ s = p.fmt.g64(v).str();
+ }
case reflect.StringKind:
v, ok := getString(field);
s = p.fmt.s(v).str();
@@ -400,6 +423,10 @@ func (p *P) doprintf(format string, v reflect.StructValue) {
case 'b':
if v, signed, ok := getInt(field); ok {
s = p.fmt.b64(uint64(v)).str() // always unsigned
+ } else if v, ok := getFloat32(field); ok {
+ s = p.fmt.fb32(v).str()
+ } else if v, ok := getFloat64(field); ok {
+ s = p.fmt.fb64(v).str()
} else {
goto badtype
}
@@ -442,19 +469,25 @@ func (p *P) doprintf(format string, v reflect.StructValue) {
// float
case 'e':
- if v, ok := getFloat(field); ok {
+ if v, ok := getFloat32(field); ok {
+ s = p.fmt.e32(v).str()
+ } else if v, ok := getFloat64(field); ok {
s = p.fmt.e64(v).str()
} else {
goto badtype
}
case 'f':
- if v, ok := getFloat(field); ok {
+ if v, ok := getFloat32(field); ok {
+ s = p.fmt.f32(v).str()
+ } else if v, ok := getFloat64(field); ok {
s = p.fmt.f64(v).str()
} else {
goto badtype
}
case 'g':
- if v, ok := getFloat(field); ok {
+ if v, ok := getFloat32(field); ok {
+ s = p.fmt.g32(v).str()
+ } else if v, ok := getFloat64(field); ok {
s = p.fmt.g64(v).str()
} else {
goto badtype