Commit 79c4fad8 authored by Martin Möhrmann's avatar Martin Möhrmann Committed by Brad Fitzpatrick

os: replace itod on posix with general itoa and fix possible infinite recursion

Remove use of itod on posix systems and replace with call to itoa.
Build and use same itoa function on all systems.
Fix infinite recursion in iota function for the case -1<<63.

Change-Id: I89d7e742383c5c4aeef8780501c78a3e1af87a6f
Reviewed-on: https://go-review.googlesource.com/2213Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 307e2706
......@@ -81,33 +81,6 @@ func (p *ProcessState) sysUsage() interface{} {
return p.rusage
}
// Convert i to decimal string.
func itod(i int) string {
if i == 0 {
return "0"
}
u := uint64(i)
if i < 0 {
u = -u
}
// Assemble decimal in reverse order.
var b [32]byte
bp := len(b)
for ; u > 0; u /= 10 {
bp--
b[bp] = byte(u%10) + '0'
}
if i < 0 {
bp--
b[bp] = '-'
}
return string(b[bp:])
}
func (p *ProcessState) String() string {
if p == nil {
return "<nil>"
......@@ -116,13 +89,13 @@ func (p *ProcessState) String() string {
res := ""
switch {
case status.Exited():
res = "exit status " + itod(status.ExitStatus())
res = "exit status " + itoa(status.ExitStatus())
case status.Signaled():
res = "signal: " + status.Signal().String()
case status.Stopped():
res = "stop signal: " + status.StopSignal().String()
if status.StopSignal() == syscall.SIGTRAP && status.TrapCause() != 0 {
res += " (trap " + itod(status.TrapCause()) + ")"
res += " (trap " + itoa(status.TrapCause()) + ")"
}
case status.Continued():
res = "continued"
......
......@@ -2,21 +2,32 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build plan9
// Simple converions to avoid depending on strconv.
package os
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
// Convert integer to decimal string
func itoa(val int) string {
if val < 0 {
return "-" + itoa(-val)
return "-" + uitoa(uint(-val))
}
var buf [32]byte // big enough for int64
return uitoa(uint(val))
}
// Convert unsigned integer to decimal string
func uitoa(val uint) string {
if val == 0 { // avoid string allocation
return "0"
}
var buf [20]byte // big enough for 64bit value base 10
i := len(buf) - 1
for val >= 10 {
buf[i] = byte(val%10 + '0')
q := val / 10
buf[i] = byte('0' + val - q*10)
i--
val /= 10
val = q
}
buf[i] = byte(val + '0')
// val < 10
buf[i] = byte('0' + val)
return string(buf[i:])
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment