summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/strconv/atof.go32
-rw-r--r--src/lib/strconv/atoi.go49
-rw-r--r--src/lib/strconv/ftoa.go23
-rw-r--r--src/lib/strconv/itoa.go7
-rw-r--r--src/lib/strconv/quote.go6
5 files changed, 81 insertions, 36 deletions
diff --git a/src/lib/strconv/atof.go b/src/lib/strconv/atof.go
index 358594416..ec94b7c74 100644
--- a/src/lib/strconv/atof.go
+++ b/src/lib/strconv/atof.go
@@ -8,6 +8,8 @@
// 2) Multiply/divide decimal by powers of two until in range [0.5, 1)
// 3) Multiply by 2^precision and round to get mantissa.
+// The strconv package implements conversions to and from
+// string representations of basic data types.
package strconv
import (
@@ -308,53 +310,57 @@ func decimalAtof32(neg bool, d *decimal, trunc bool) (f float32, ok bool) {
return;
}
-// Convert string s to floating-point number.
+// Atof32 converts the string s to a 32-bit floating-point number.
//
// If s is well-formed and near a valid floating point number,
-// returns f, false, true, where f is the nearest floating point
-// number rounded using IEEE754 unbiased rounding.
+// Atof32 returns the nearest floating point number rounded
+// using IEEE754 unbiased rounding.
//
-// If s is not syntactically well-formed, returns err = os.EINVAL.
+// If s is not syntactically well-formed, Atof32 returns err = os.EINVAL.
//
// If s is syntactically well-formed but is more than 1/2 ULP
// away from the largest floating point number of the given size,
-// returns f = ±Inf, err = os.ERANGE.
-func Atof64(s string) (f float64, err *os.Error) {
+// Atof32 returns f = ±Inf, err = os.ERANGE.
+func Atof32(s string) (f float32, err *os.Error) {
neg, d, trunc, ok := stringToDecimal(s);
if !ok {
return 0, os.EINVAL;
}
if optimize {
- if f, ok := decimalAtof64(neg, d, trunc); ok {
+ if f, ok := decimalAtof32(neg, d, trunc); ok {
return f, nil;
}
}
- b, ovf := decimalToFloatBits(neg, d, trunc, &float64info);
- f = math.Float64frombits(b);
+ b, ovf := decimalToFloatBits(neg, d, trunc, &float32info);
+ f = math.Float32frombits(uint32(b));
if ovf {
err = os.ERANGE;
}
return f, err
}
-func Atof32(s string) (f float32, err *os.Error) {
+// Atof64 converts the string s to a 64-bit floating-point number.
+// Except for the type of its result, its definition is the same as that
+// of Atof32.
+func Atof64(s string) (f float64, err *os.Error) {
neg, d, trunc, ok := stringToDecimal(s);
if !ok {
return 0, os.EINVAL;
}
if optimize {
- if f, ok := decimalAtof32(neg, d, trunc); ok {
+ if f, ok := decimalAtof64(neg, d, trunc); ok {
return f, nil;
}
}
- b, ovf := decimalToFloatBits(neg, d, trunc, &float32info);
- f = math.Float32frombits(uint32(b));
+ b, ovf := decimalToFloatBits(neg, d, trunc, &float64info);
+ f = math.Float64frombits(b);
if ovf {
err = os.ERANGE;
}
return f, err
}
+// Atof is like Atof32 or Atof64, depending on the size of float.
func Atof(s string) (f float, err *os.Error) {
if FloatSize == 32 {
f1, err1 := Atof32(s);
diff --git a/src/lib/strconv/atoi.go b/src/lib/strconv/atoi.go
index 337c32777..467c37737 100644
--- a/src/lib/strconv/atoi.go
+++ b/src/lib/strconv/atoi.go
@@ -22,14 +22,20 @@ func cutoff64(base int) uint64 {
return (1<<64 - 1) / uint64(base) + 1;
}
-// Convert arbitrary base string to unsigned integer.
-func Btoui64(base int, s string) (n uint64, err *os.Error) {
- if base < 2 || base > 36 || len(s) < 1 {
+// Btoui64 interprets a string s in an arbitrary base b (2 to 36)
+// and returns the corresponding value n.
+//
+// Btoui64 returns err == os.EINVAL if b is out of
+// range or s is empty or contains invalid digits.
+// It returns err == os.ERANGE if the value corresponding
+// to s cannot be represented by a uint64.
+func Btoui64(s string, b int) (n uint64, err *os.Error) {
+ if b < 2 || b > 36 || len(s) < 1 {
return 0, os.EINVAL;
}
n = 0;
- cutoff := cutoff64(base);
+ cutoff := cutoff64(b);
for i := 0; i < len(s); i++ {
var v byte;
@@ -43,15 +49,15 @@ func Btoui64(base int, s string) (n uint64, err *os.Error) {
default:
return 0, os.EINVAL;
}
- if int(v) >= base {
+ if int(v) >= b {
return 0, os.EINVAL;
}
if n >= cutoff {
- // n*base overflows
+ // n*b overflows
return 1<<64-1, os.ERANGE;
}
- n *= uint64(base);
+ n *= uint64(b);
n1 := n+uint64(v);
if n1 < n {
@@ -64,10 +70,14 @@ func Btoui64(base int, s string) (n uint64, err *os.Error) {
return n, nil;
}
-
-// Convert string to uint64.
-// Use standard prefixes to signal octal, hexadecimal.
-func Atoui64(s string) (i uint64, err *os.Error) {
+// Atoui64 interprets a string s as an unsigned decimal, octal, or
+// hexadecimal number and returns the corresponding value n.
+// The default base is decimal. Strings beginning with 0x are
+// hexadecimal; strings beginning with 0 are octal.
+//
+// Atoui64 returns err == os.EINVAL if s is empty or contains invalid digits.
+// It returns err == os.ERANGE if s cannot be represented by a uint64.
+func Atoui64(s string) (n uint64, err *os.Error) {
// Empty string bad.
if len(s) == 0 {
return 0, os.EINVAL
@@ -77,17 +87,18 @@ func Atoui64(s string) (i uint64, err *os.Error) {
if s[0] == '0' && len(s) > 1 {
if s[1] == 'x' || s[1] == 'X' {
// hex
- return Btoui64(16, s[2:len(s)]);
+ return Btoui64(s[2:len(s)], 16);
}
// octal
- return Btoui64(8, s[1:len(s)]);
+ return Btoui64(s[1:len(s)], 8);
}
// decimal
- return Btoui64(10, s);
+ return Btoui64(s, 10);
}
-// Convert string to int64.
-// Use standard prefixes to signal octal, hexadecimal.
+
+// Atoi64 is like Atoui64 but allows signed numbers and
+// returns its result in an int64.
func Atoi64(s string) (i int64, err *os.Error) {
// Empty string bad.
if len(s) == 0 {
@@ -122,8 +133,7 @@ func Atoi64(s string) (i int64, err *os.Error) {
return n, nil
}
-// Convert string to uint.
-// Use standard prefixes to signal octal, hexadecimal.
+// Atoui is like Atoui64 but returns its result as a uint.
func Atoui(s string) (i uint, err *os.Error) {
i1, e1 := Atoui64(s);
if e1 != nil && e1 != os.ERANGE {
@@ -138,8 +148,7 @@ func Atoui(s string) (i uint, err *os.Error) {
return i, nil
}
-// Convert string to int.
-// Use standard prefixes to signal octal, hexadecimal.
+// Atoi is like Atoi64 but returns its result as an int.
func Atoi(s string) (i int, err *os.Error) {
i1, e1 := Atoi64(s);
if e1 != nil && e1 != os.ERANGE {
diff --git a/src/lib/strconv/ftoa.go b/src/lib/strconv/ftoa.go
index 52835c803..b17115175 100644
--- a/src/lib/strconv/ftoa.go
+++ b/src/lib/strconv/ftoa.go
@@ -41,16 +41,39 @@ func floatsize() int {
}
return 64;
}
+
+// Floatsize gives the size of the float type, either 32 or 64.
var FloatSize = floatsize()
+// Ftoa32 converts the 32-bit floating-point number f to a string,
+// according to the format fmt and precision prec.
+//
+// The format fmt is one of
+// 'b' (-ddddp±ddd, a binary exponent),
+// 'e' (-d.dddde±dd, a decimal exponent),
+// 'f' (-ddd.dddd, no exponent), or
+// 'g' ('e' for large exponents, 'f' otherwise).
+//
+// The precision prec controls the number of digits
+// (excluding the exponent) printed by the 'e', 'f', and 'g' formats.
+// For 'e' and 'f' it is the number of digits after the decimal point.
+// For 'g' it is the total number of digits.
+// The special precision -1 uses the smallest number of digits
+// necessary such that Atof32 will return f exactly.
+//
+// Ftoa32(f) is not the same as Ftoa64(float32(f)),
+// because correct rounding and the number of digits
+// needed to identify f depend on the precision of the representation.
func Ftoa32(f float32, fmt byte, prec int) string {
return genericFtoa(uint64(math.Float32bits(f)), fmt, prec, &float32info);
}
+// Ftoa64 is like Ftoa32 but converts a 64-bit floating-point number.
func Ftoa64(f float64, fmt byte, prec int) string {
return genericFtoa(math.Float64bits(f), fmt, prec, &float64info);
}
+// Ftoa behaves as Ftoa32 or Ftoa64, depending on the size of the float type.
func Ftoa(f float, fmt byte, prec int) string {
if FloatSize == 32 {
return Ftoa32(float32(f), fmt, prec);
diff --git a/src/lib/strconv/itoa.go b/src/lib/strconv/itoa.go
index d50e7887e..7f693ea8c 100644
--- a/src/lib/strconv/itoa.go
+++ b/src/lib/strconv/itoa.go
@@ -4,6 +4,7 @@
package strconv
+// Itob64 returns the string representation of i in the given base.
func Itob64(i int64, base uint) string {
if i == 0 {
return "0"
@@ -32,17 +33,17 @@ func Itob64(i int64, base uint) string {
return string(buf[j:len(buf)])
}
-
+// Itoa64 returns the decimal string representation of i.
func Itoa64(i int64) string {
return Itob64(i, 10);
}
-
+// Itob returns the string representation of i in the given base.
func Itob(i int, base uint) string {
return Itob64(int64(i), base);
}
-
+// Itoa returns the decimal string representation of i.
func Itoa(i int) string {
return Itob64(int64(i), 10);
}
diff --git a/src/lib/strconv/quote.go b/src/lib/strconv/quote.go
index b11d73817..442821a53 100644
--- a/src/lib/strconv/quote.go
+++ b/src/lib/strconv/quote.go
@@ -10,6 +10,10 @@ import (
const lowerhex = "0123456789abcdef"
+// Quote returns a double-quoted Go string literal
+// representing s. The returned string s uses Go escape
+// sequences (\t, \n, \xFF, \u0100) for control characters
+// and non-ASCII characters.
func Quote(s string) string {
t := `"`;
for i := 0; i < len(s); i++ {
@@ -67,6 +71,8 @@ func Quote(s string) string {
return t;
}
+// CanBackquote returns whether the string s would be
+// a valid Go string literal if enclosed in backquotes.
func CanBackquote(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] < ' ' || s[i] == '`' {