diff --git a/src/os/exec_posix.go b/src/os/exec_posix.go index 7ecddaed374d8a..39f11c7ec1b7be 100644 --- a/src/os/exec_posix.go +++ b/src/os/exec_posix.go @@ -102,7 +102,12 @@ func (p *ProcessState) String() string { res := "" switch { case status.Exited(): - res = "exit status " + itoa(status.ExitStatus()) + code := status.ExitStatus() + if runtime.GOOS == "windows" && code >= 1<<16 { // windows uses large hex numbers + res = "exit status " + uitox(uint(code)) + } else { // unix systems use small decimal integers + res = "exit status " + itoa(code) // unix + } case status.Signaled(): res = "signal: " + status.Signal().String() case status.Stopped(): diff --git a/src/os/str.go b/src/os/str.go index cba9fa3e8d41de..9bfcc15aa82b88 100644 --- a/src/os/str.go +++ b/src/os/str.go @@ -6,7 +6,7 @@ package os -// Convert integer to decimal string +// itoa converts val (an int) to a decimal string. func itoa(val int) string { if val < 0 { return "-" + uitoa(uint(-val)) @@ -14,7 +14,7 @@ func itoa(val int) string { return uitoa(uint(val)) } -// Convert unsigned integer to decimal string +// uitoa converts val (a uint) to a decimal string. func uitoa(val uint) string { if val == 0 { // avoid string allocation return "0" @@ -31,3 +31,35 @@ func uitoa(val uint) string { buf[i] = byte('0' + val) return string(buf[i:]) } + +// itox converts val (an int) to a hexdecimal string. +func itox(val int) string { + if val < 0 { + return "-" + uitox(uint(-val)) + } + return uitox(uint(val)) +} + +const hex = "0123456789abcdef" + +// uitox converts val (a uint) to a hexdecimal string. +func uitox(val uint) string { + if val == 0 { // avoid string allocation + return "0x0" + } + var buf [20]byte // big enough for 64bit value base 16 + 0x + i := len(buf) - 1 + for val >= 16 { + q := val / 16 + buf[i] = hex[val%16] + i-- + val = q + } + // val < 16 + buf[i] = hex[val%16] + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + return string(buf[i:]) +}