// never mind.) val is known to be unsigned. we could make things maybe
// marginally faster by splitting the 32-bit case out into a separate function
// but it's not worth the duplication, so val has 64 bits.
-func putint(buf *[nByte]byte, i int, base, val uint64, digits *string) int {
+func putint(buf []byte, base, val uint64, digits string) int {
+ i := len(buf) - 1;
for val >= base {
buf[i] = digits[val%base];
i--;
}
// integer; interprets prec but not wid.
-func (f *Fmt) integer(a int64, base uint, is_signed bool, digits *string) string {
+func (f *Fmt) integer(a int64, base uint, is_signed bool, digits string) string {
var buf [nByte]byte;
negative := is_signed && a < 0;
if negative {
}
}
- i := putint(&buf, nByte-1, uint64(base), uint64(a), digits);
+ i := putint(&buf, uint64(base), uint64(a), digits);
for i > 0 && prec > (nByte-1-i) {
buf[i] = '0';
i--;
// Fmt_d64 formats an int64 in decimal.
func (f *Fmt) Fmt_d64(v int64) *Fmt {
- f.pad(f.integer(v, 10, true, &ldigits));
+ f.pad(f.integer(v, 10, true, ldigits));
f.clearflags();
return f;
}
// Fmt_ud64 formats a uint64 in decimal.
func (f *Fmt) Fmt_ud64(v uint64) *Fmt {
- f.pad(f.integer(int64(v), 10, false, &ldigits));
+ f.pad(f.integer(int64(v), 10, false, ldigits));
f.clearflags();
return f;
}
// Fmt_x64 formats an int64 in hexadecimal.
func (f *Fmt) Fmt_x64(v int64) *Fmt {
- f.pad(f.integer(v, 16, true, &ldigits));
+ f.pad(f.integer(v, 16, true, ldigits));
f.clearflags();
return f;
}
// Fmt_ux64 formats a uint64 in hexadecimal.
func (f *Fmt) Fmt_ux64(v uint64) *Fmt {
- f.pad(f.integer(int64(v), 16, false, &ldigits));
+ f.pad(f.integer(int64(v), 16, false, ldigits));
f.clearflags();
return f;
}
// Fmt_X64 formats an int64 in upper case hexadecimal.
func (f *Fmt) Fmt_X64(v int64) *Fmt {
- f.pad(f.integer(v, 16, true, &udigits));
+ f.pad(f.integer(v, 16, true, udigits));
f.clearflags();
return f;
}
// Fmt_uX64 formats a uint64 in upper case hexadecimal.
func (f *Fmt) Fmt_uX64(v uint64) *Fmt {
- f.pad(f.integer(int64(v), 16, false, &udigits));
+ f.pad(f.integer(int64(v), 16, false, udigits));
f.clearflags();
return f;
}
// Fmt_o64 formats an int64 in octal.
func (f *Fmt) Fmt_o64(v int64) *Fmt {
- f.pad(f.integer(v, 8, true, &ldigits));
+ f.pad(f.integer(v, 8, true, ldigits));
f.clearflags();
return f;
}
// Fmt_uo64 formats a uint64 in octal.
func (f *Fmt) Fmt_uo64(v uint64) *Fmt {
- f.pad(f.integer(int64(v), 8, false, &ldigits));
+ f.pad(f.integer(int64(v), 8, false, ldigits));
f.clearflags();
return f;
}
// Fmt_b64 formats a uint64 in binary.
func (f *Fmt) Fmt_b64(v uint64) *Fmt {
- f.pad(f.integer(int64(v), 2, false, &ldigits));
+ f.pad(f.integer(int64(v), 2, false, ldigits));
f.clearflags();
return f;
}
if b == nil {
return
}
- if v := b.val; v.Kind() == reflect.PtrKind {
- pv := v.(reflect.PtrValue);
- psubtype := pv.Type().(reflect.PtrType).Sub();
- if pv.Get() == nil && psubtype.Kind() == reflect.ArrayKind {
- av := reflect.NewSliceValue(psubtype.(reflect.ArrayType), 0, 8);
- pv.SetSub(av);
+ if v := b.val; v.Kind() == reflect.ArrayKind {
+ av := v.(reflect.ArrayValue);
+ if av.IsSlice() && av.IsNil() {
+ av.Set(reflect.NewSliceValue(av.Type().(reflect.ArrayType), 0, 8));
}
}
}
return nobuilder
}
v := b.val;
- if v.Kind() == reflect.PtrKind {
- // If we have a pointer to an array, allocate or grow
- // the array as necessary. Then set v to the array itself.
- pv := v.(reflect.PtrValue);
- psub := pv.Sub();
- if psub.Kind() == reflect.ArrayKind {
- av := psub.(reflect.ArrayValue);
- if i > av.Cap() {
- n := av.Cap();
- if n < 8 {
- n = 8
- }
- for n <= i {
- n *= 2
- }
- av1 := reflect.NewSliceValue(av.Type().(reflect.ArrayType), av.Len(), n);
- av1.CopyFrom(av, av.Len());
- pv.SetSub(av1);
- av = av1;
- }
- }
- v = psub;
+ if v.Kind() != reflect.ArrayKind {
+ return nobuilder
}
- if v.Kind() == reflect.ArrayKind {
- // Array was grown above, or is fixed size.
- av := v.(reflect.ArrayValue);
- if av.Len() <= i && i < av.Cap() {
- av.SetLen(i+1);
+ av := v.(reflect.ArrayValue);
+ if av.IsSlice() && i > av.Cap() {
+ n := av.Cap();
+ if n < 8 {
+ n = 8
}
- if i < av.Len() {
- return &_StructBuilder{ av.Elem(i) }
+ for n <= i {
+ n *= 2
}
+ av1 := reflect.NewSliceValue(av.Type().(reflect.ArrayType), av.Len(), n);
+ av1.CopyFrom(av, av.Len());
+ av.Set(av1);
+ }
+ // Array was grown above, or is fixed size.
+ if av.Len() <= i && i < av.Cap() {
+ av.SetLen(i+1);
+ }
+ if i < av.Len() {
+ return &_StructBuilder{ av.Elem(i) }
}
return nobuilder
}