diff options
-rw-r--r-- | lib/std/bld.sub | 1 | ||||
-rw-r--r-- | lib/std/fmt.myr | 61 | ||||
-rw-r--r-- | lib/std/intfmt.myr | 79 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+Darwin-x86_64.sh | 1 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+FreeBSD-amd64.sh | 1 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+Linux-x86_64.sh | 5 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+NetBSD-amd64.sh | 1 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+OpenBSD-amd64.sh | 1 | ||||
-rwxr-xr-x | mk/bootstrap/bootstrap+Plan9-amd64.sh | 1 |
9 files changed, 89 insertions, 62 deletions
diff --git a/lib/std/bld.sub b/lib/std/bld.sub index 093e242..4ab703c 100644 --- a/lib/std/bld.sub +++ b/lib/std/bld.sub @@ -38,6 +38,7 @@ lib std = hasprefix.myr hassuffix.myr htab.myr + intfmt.myr intparse.myr introspect.myr ipparse.myr diff --git a/lib/std/fmt.myr b/lib/std/fmt.myr index 5dc3ba3..b981a74 100644 --- a/lib/std/fmt.myr +++ b/lib/std/fmt.myr @@ -7,6 +7,7 @@ use "fltfmt" use "hashfuncs" use "hasprefix" use "htab" +use "intfmt" use "intparse" use "introspect" use "memops" @@ -477,12 +478,6 @@ const fltparams = {params -> fp } -type intparams = struct - base : size - padto : size - padfill : char -;; - const intparams = {params var ip : intparams @@ -572,60 +567,6 @@ const isprint = {b -> b >= (' ' : byte) && b < ('~' : byte) } -const digitchars = "0123456789abcdef" -const intfmt = {sb, opts, signed, bits : uint64, nbits - var isneg - var sval, val - var b : byte[64] - var i, j, npad - var base - - base = (opts.base : uint64) - if signed && bits >= 1 << (nbits - 1) - sval = -(bits : int64) - val = (sval : uint64) - isneg = true - - /* if its negative after inverting, we have int64 min */ - if sval < 0 - std.sbputs(sb, "-9223372036854775808") - -> void - ;; - else - val = (bits : uint64) - val &= ~0 >> nbits - isneg = false - ;; - - i = 0 - if val == 0 - b[0] = ('0' : byte) - i++ - ;; - while val != 0 - b[i] = digitchars[val % base] - val /= base - i++ - ;; - - npad = clamp(opts.padto - i, 0, opts.padto) - if isneg - npad-- - ;; - if opts.padfill == '0' && isneg - sbputb(sb, ('-' : byte)) - ;; - for j = 0; j < npad; j++ - sbputc(sb, opts.padfill) - ;; - if opts.padfill != '0' && isneg - sbputb(sb, ('-' : byte)) - ;; - for j = i; j != 0; j-- - sbputb(sb, b[j - 1]) - ;; -} - /* would use std.get(), but that's a dependency loop */ const getint = {s, msg match std.intparse(s) diff --git a/lib/std/intfmt.myr b/lib/std/intfmt.myr new file mode 100644 index 0000000..7b9cfdf --- /dev/null +++ b/lib/std/intfmt.myr @@ -0,0 +1,79 @@ +use "die" +use "extremum" +use "intparse" +use "option" +use "strbuf" +use "striter" +use "types" + +pkg std = + pkglocal type intparams = struct + base : size + padto : size + padfill : char + ;; + + pkglocal const intfmt : (sb : strbuf#, opts : intparams, signed : bool, bits : uint64, nbits : uint64 -> void) +;; + +const digitchars = "0123456789abcdef" +const intfmt = {sb : strbuf#, opts : intparams, signed : bool, bits : uint64, nbits : uint64 + var isneg + var sval, val + var b : byte[64] + var i, j, npad + var base + + base = (opts.base : uint64) + if signed && bits >= 1 << (nbits - 1) + sval = -(bits : int64) + val = (sval : uint64) + isneg = true + + /* if its negative after inverting, we have int64 min */ + if sval < 0 + std.sbputs(sb, "-9223372036854775808") + -> void + ;; + else + val = (bits : uint64) + val &= ~0 >> nbits + isneg = false + ;; + + i = 0 + if val == 0 + b[0] = ('0' : byte) + i++ + ;; + while val != 0 + b[i] = digitchars[val % base] + val /= base + i++ + ;; + + npad = clamp(opts.padto - i, 0, opts.padto) + if isneg + npad-- + ;; + if opts.padfill == '0' && isneg + sbputb(sb, ('-' : byte)) + ;; + for j = 0; j < npad; j++ + sbputc(sb, opts.padfill) + ;; + if opts.padfill != '0' && isneg + sbputb(sb, ('-' : byte)) + ;; + for j = i; j != 0; j-- + sbputb(sb, b[j - 1]) + ;; +} + +/* would use std.get(), but that's a dependency loop */ +const getint = {s, msg + match std.intparse(s) + | `Some w: -> w; + | `None: die(msg) + ;; +} diff --git a/mk/bootstrap/bootstrap+Darwin-x86_64.sh b/mk/bootstrap/bootstrap+Darwin-x86_64.sh index a1be640..43c7e49 100755 --- a/mk/bootstrap/bootstrap+Darwin-x86_64.sh +++ b/mk/bootstrap/bootstrap+Darwin-x86_64.sh @@ -90,6 +90,7 @@ set -x $pwd/6/6m -O obj -I obj/lib/sys lib/std/intparse.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strsplit.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strbuf.myr + $pwd/6/6m -O obj -I obj/lib/sys lib/std/intfmt.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/sldup.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/bigint.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/fltparse.myr diff --git a/mk/bootstrap/bootstrap+FreeBSD-amd64.sh b/mk/bootstrap/bootstrap+FreeBSD-amd64.sh index a33ef64..f097d6e 100755 --- a/mk/bootstrap/bootstrap+FreeBSD-amd64.sh +++ b/mk/bootstrap/bootstrap+FreeBSD-amd64.sh @@ -90,6 +90,7 @@ set -x $pwd/6/6m -O obj -I obj/lib/sys lib/std/intparse.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strsplit.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strbuf.myr + $pwd/6/6m -O obj -I obj/lib/sys lib/std/intfmt.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/sldup.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/bigint.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/fltparse.myr diff --git a/mk/bootstrap/bootstrap+Linux-x86_64.sh b/mk/bootstrap/bootstrap+Linux-x86_64.sh index bf49b54..47b7117 100755 --- a/mk/bootstrap/bootstrap+Linux-x86_64.sh +++ b/mk/bootstrap/bootstrap+Linux-x86_64.sh @@ -90,6 +90,7 @@ set -x $pwd/6/6m -O obj -I obj/lib/sys lib/std/intparse.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strsplit.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strbuf.myr + $pwd/6/6m -O obj -I obj/lib/sys lib/std/intfmt.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/sldup.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/bigint.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/fltparse.myr @@ -127,8 +128,8 @@ set -x $pwd/6/6m -O obj -I obj/lib/sys lib/std/dial+posixy.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/listen+posixy.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/try.myr - ar -rcs obj/lib/std/libstd.a obj/lib/std/resolve.o obj/lib/std/result.o obj/lib/std/try.o obj/lib/std/ipparse.o obj/lib/std/alloc.o obj/lib/std/sleq.o obj/lib/std/putint.o obj/lib/std/sljoin.o obj/lib/std/slpop.o obj/lib/std/syswrap.o obj/lib/std/getint.o obj/lib/std/strsplit.o obj/lib/std/slfill.o obj/lib/std/writeall.o obj/lib/std/fltfmt.o obj/lib/std/hasprefix.o obj/lib/std/swap.o obj/lib/std/fmt.o obj/lib/std/netaddr.o obj/lib/std/varargs.o obj/lib/std/diriter.o obj/lib/std/getcwd.o obj/lib/std/blat.o obj/lib/std/optparse.o obj/lib/std/pathjoin.o obj/lib/std/readall.o obj/lib/std/strjoin.o obj/lib/std/threadhooks.o obj/lib/std/sjlj.o obj/lib/std/extremum.o obj/lib/std/endian.o obj/lib/std/rand.o obj/lib/std/sldup.o obj/lib/std/sleep.o obj/lib/std/wait.o obj/lib/std/introspect.o obj/lib/std/fltparse.o obj/lib/std/fndup.o obj/lib/std/strbuf.o obj/lib/std/strreplace.o obj/lib/std/assert.o obj/lib/std/spork.o obj/lib/std/slpush.o obj/lib/std/strstrip.o obj/lib/std/htab.o obj/lib/std/hashfuncs.o obj/lib/std/slput.o obj/lib/std/sjlj-impl.o obj/lib/std/fltbits.o obj/lib/std/striter.o obj/lib/std/types.o obj/lib/std/cstrconv.o obj/lib/std/units.o obj/lib/std/backtrace.o obj/lib/std/syswrap-ss.o obj/lib/std/die.o obj/lib/std/mk.o obj/lib/std/hassuffix.o obj/lib/std/memops-impl.o obj/lib/std/pledge.o obj/lib/std/utf.o obj/lib/std/slurp.o obj/lib/std/dialparse.o obj/lib/std/bytealloc.o obj/lib/std/mktemp.o obj/lib/std/consts.o obj/lib/std/chomp.o obj/lib/std/dir.o obj/lib/std/search.o obj/lib/std/memops.o obj/lib/std/fmtfuncs.o obj/lib/std/strfind.o obj/lib/std/env.o obj/lib/std/dirname.o obj/lib/std/clear.o obj/lib/std/listen.o obj/lib/std/sort.o obj/lib/std/cmp.o obj/lib/std/now.o obj/lib/std/intparse.o obj/lib/std/traits.o obj/lib/std/mkpath.o obj/lib/std/option.o obj/lib/std/dial.o obj/lib/std/errno.o obj/lib/std/chartype.o obj/lib/std/bigint.o obj/lib/std/bitset.o obj/lib/std/getbp.o obj/lib/std/slcp.o obj/lib/std/execvp.o - $pwd/muse/muse -o obj/lib/std/libstd.use -p std obj/lib/std/resolve.use obj/lib/std/result.use obj/lib/std/try.use obj/lib/std/ipparse.use obj/lib/std/alloc.use obj/lib/std/sleq.use obj/lib/std/putint.use obj/lib/std/sljoin.use obj/lib/std/slpop.use obj/lib/std/syswrap.use obj/lib/std/getint.use obj/lib/std/strsplit.use obj/lib/std/slfill.use obj/lib/std/writeall.use obj/lib/std/fltfmt.use obj/lib/std/hasprefix.use obj/lib/std/swap.use obj/lib/std/fmt.use obj/lib/std/netaddr.use obj/lib/std/varargs.use obj/lib/std/diriter.use obj/lib/std/getcwd.use obj/lib/std/blat.use obj/lib/std/optparse.use obj/lib/std/pathjoin.use obj/lib/std/readall.use obj/lib/std/strjoin.use obj/lib/std/threadhooks.use obj/lib/std/sjlj.use obj/lib/std/extremum.use obj/lib/std/endian.use obj/lib/std/rand.use obj/lib/std/sldup.use obj/lib/std/sleep.use obj/lib/std/wait.use obj/lib/std/introspect.use obj/lib/std/fltparse.use obj/lib/std/fndup.use obj/lib/std/strbuf.use obj/lib/std/strreplace.use obj/lib/std/assert.use obj/lib/std/spork.use obj/lib/std/slpush.use obj/lib/std/strstrip.use obj/lib/std/htab.use obj/lib/std/hashfuncs.use obj/lib/std/slput.use obj/lib/std/fltbits.use obj/lib/std/striter.use obj/lib/std/types.use obj/lib/std/cstrconv.use obj/lib/std/units.use obj/lib/std/backtrace.use obj/lib/std/syswrap-ss.use obj/lib/std/die.use obj/lib/std/mk.use obj/lib/std/hassuffix.use obj/lib/std/pledge.use obj/lib/std/utf.use obj/lib/std/slurp.use obj/lib/std/dialparse.use obj/lib/std/bytealloc.use obj/lib/std/mktemp.use obj/lib/std/consts.use obj/lib/std/chomp.use obj/lib/std/dir.use obj/lib/std/search.use obj/lib/std/memops.use obj/lib/std/fmtfuncs.use obj/lib/std/strfind.use obj/lib/std/env.use obj/lib/std/dirname.use obj/lib/std/clear.use obj/lib/std/listen.use obj/lib/std/sort.use obj/lib/std/cmp.use obj/lib/std/now.use obj/lib/std/intparse.use obj/lib/std/traits.use obj/lib/std/mkpath.use obj/lib/std/option.use obj/lib/std/dial.use obj/lib/std/errno.use obj/lib/std/chartype.use obj/lib/std/bigint.use obj/lib/std/bitset.use obj/lib/std/slcp.use obj/lib/std/execvp.use + ar -rcs obj/lib/std/libstd.a obj/lib/std/resolve.o obj/lib/std/intfmt.o obj/lib/std/result.o obj/lib/std/try.o obj/lib/std/ipparse.o obj/lib/std/alloc.o obj/lib/std/sleq.o obj/lib/std/putint.o obj/lib/std/sljoin.o obj/lib/std/slpop.o obj/lib/std/syswrap.o obj/lib/std/getint.o obj/lib/std/strsplit.o obj/lib/std/slfill.o obj/lib/std/writeall.o obj/lib/std/fltfmt.o obj/lib/std/hasprefix.o obj/lib/std/swap.o obj/lib/std/fmt.o obj/lib/std/netaddr.o obj/lib/std/varargs.o obj/lib/std/diriter.o obj/lib/std/getcwd.o obj/lib/std/blat.o obj/lib/std/optparse.o obj/lib/std/pathjoin.o obj/lib/std/readall.o obj/lib/std/strjoin.o obj/lib/std/threadhooks.o obj/lib/std/sjlj.o obj/lib/std/extremum.o obj/lib/std/endian.o obj/lib/std/rand.o obj/lib/std/sldup.o obj/lib/std/sleep.o obj/lib/std/wait.o obj/lib/std/introspect.o obj/lib/std/fltparse.o obj/lib/std/fndup.o obj/lib/std/strbuf.o obj/lib/std/strreplace.o obj/lib/std/assert.o obj/lib/std/spork.o obj/lib/std/slpush.o obj/lib/std/strstrip.o obj/lib/std/htab.o obj/lib/std/hashfuncs.o obj/lib/std/slput.o obj/lib/std/sjlj-impl.o obj/lib/std/fltbits.o obj/lib/std/striter.o obj/lib/std/types.o obj/lib/std/cstrconv.o obj/lib/std/units.o obj/lib/std/backtrace.o obj/lib/std/syswrap-ss.o obj/lib/std/die.o obj/lib/std/mk.o obj/lib/std/hassuffix.o obj/lib/std/memops-impl.o obj/lib/std/pledge.o obj/lib/std/utf.o obj/lib/std/slurp.o obj/lib/std/dialparse.o obj/lib/std/bytealloc.o obj/lib/std/mktemp.o obj/lib/std/consts.o obj/lib/std/chomp.o obj/lib/std/dir.o obj/lib/std/search.o obj/lib/std/memops.o obj/lib/std/fmtfuncs.o obj/lib/std/strfind.o obj/lib/std/env.o obj/lib/std/dirname.o obj/lib/std/clear.o obj/lib/std/listen.o obj/lib/std/sort.o obj/lib/std/cmp.o obj/lib/std/now.o obj/lib/std/intparse.o obj/lib/std/traits.o obj/lib/std/mkpath.o obj/lib/std/option.o obj/lib/std/dial.o obj/lib/std/errno.o obj/lib/std/chartype.o obj/lib/std/bigint.o obj/lib/std/bitset.o obj/lib/std/getbp.o obj/lib/std/slcp.o obj/lib/std/execvp.o + $pwd/muse/muse -o obj/lib/std/libstd.use -p std obj/lib/std/resolve.use obj/lib/std/intfmt.use obj/lib/std/result.use obj/lib/std/try.use obj/lib/std/ipparse.use obj/lib/std/alloc.use obj/lib/std/sleq.use obj/lib/std/putint.use obj/lib/std/sljoin.use obj/lib/std/slpop.use obj/lib/std/syswrap.use obj/lib/std/getint.use obj/lib/std/strsplit.use obj/lib/std/slfill.use obj/lib/std/writeall.use obj/lib/std/fltfmt.use obj/lib/std/hasprefix.use obj/lib/std/swap.use obj/lib/std/fmt.use obj/lib/std/netaddr.use obj/lib/std/varargs.use obj/lib/std/diriter.use obj/lib/std/getcwd.use obj/lib/std/blat.use obj/lib/std/optparse.use obj/lib/std/pathjoin.use obj/lib/std/readall.use obj/lib/std/strjoin.use obj/lib/std/threadhooks.use obj/lib/std/sjlj.use obj/lib/std/extremum.use obj/lib/std/endian.use obj/lib/std/rand.use obj/lib/std/sldup.use obj/lib/std/sleep.use obj/lib/std/wait.use obj/lib/std/introspect.use obj/lib/std/fltparse.use obj/lib/std/fndup.use obj/lib/std/strbuf.use obj/lib/std/strreplace.use obj/lib/std/assert.use obj/lib/std/spork.use obj/lib/std/slpush.use obj/lib/std/strstrip.use obj/lib/std/htab.use obj/lib/std/hashfuncs.use obj/lib/std/slput.use obj/lib/std/fltbits.use obj/lib/std/striter.use obj/lib/std/types.use obj/lib/std/cstrconv.use obj/lib/std/units.use obj/lib/std/backtrace.use obj/lib/std/syswrap-ss.use obj/lib/std/die.use obj/lib/std/mk.use obj/lib/std/hassuffix.use obj/lib/std/pledge.use obj/lib/std/utf.use obj/lib/std/slurp.use obj/lib/std/dialparse.use obj/lib/std/bytealloc.use obj/lib/std/mktemp.use obj/lib/std/consts.use obj/lib/std/chomp.use obj/lib/std/dir.use obj/lib/std/search.use obj/lib/std/memops.use obj/lib/std/fmtfuncs.use obj/lib/std/strfind.use obj/lib/std/env.use obj/lib/std/dirname.use obj/lib/std/clear.use obj/lib/std/listen.use obj/lib/std/sort.use obj/lib/std/cmp.use obj/lib/std/now.use obj/lib/std/intparse.use obj/lib/std/traits.use obj/lib/std/mkpath.use obj/lib/std/option.use obj/lib/std/dial.use obj/lib/std/errno.use obj/lib/std/chartype.use obj/lib/std/bigint.use obj/lib/std/bitset.use obj/lib/std/slcp.use obj/lib/std/execvp.use $pwd/6/6m -O obj -I obj/lib/sys -I obj/lib/std -I obj/lib/bio -I obj/lib/regex -I obj/lib/thread mbld/types.myr $pwd/6/6m -O obj -I obj/lib/sys -I obj/lib/std lib/regex/types.myr $pwd/6/6m -O obj -I obj/lib/sys -I obj/lib/std lib/regex/interp.myr diff --git a/mk/bootstrap/bootstrap+NetBSD-amd64.sh b/mk/bootstrap/bootstrap+NetBSD-amd64.sh index a81f8c3..7e41618 100755 --- a/mk/bootstrap/bootstrap+NetBSD-amd64.sh +++ b/mk/bootstrap/bootstrap+NetBSD-amd64.sh @@ -69,6 +69,7 @@ set -x $pwd/6/6m -I lib/sys lib/std/slpush.myr $pwd/6/6m -I lib/sys lib/std/strsplit.myr $pwd/6/6m -I lib/sys lib/std/strbuf.myr + $pwd/6/6m -I lib/sys lib/std/intfmt.myr $pwd/6/6m -I lib/sys lib/std/sldup.myr $pwd/6/6m -I lib/sys lib/std/bigint.myr $pwd/6/6m -I lib/sys lib/std/fltparse.myr diff --git a/mk/bootstrap/bootstrap+OpenBSD-amd64.sh b/mk/bootstrap/bootstrap+OpenBSD-amd64.sh index 62f4b0a..00b0328 100755 --- a/mk/bootstrap/bootstrap+OpenBSD-amd64.sh +++ b/mk/bootstrap/bootstrap+OpenBSD-amd64.sh @@ -89,6 +89,7 @@ set -x $pwd/6/6m -O obj -I obj/lib/sys lib/std/slpush.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/striter.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/intparse.myr + $pwd/6/6m -O obj -I obj/lib/sys lib/std/intfmt.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strsplit.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/strbuf.myr $pwd/6/6m -O obj -I obj/lib/sys lib/std/sldup.myr diff --git a/mk/bootstrap/bootstrap+Plan9-amd64.sh b/mk/bootstrap/bootstrap+Plan9-amd64.sh index 70fb6fc..4b6ad1a 100755 --- a/mk/bootstrap/bootstrap+Plan9-amd64.sh +++ b/mk/bootstrap/bootstrap+Plan9-amd64.sh @@ -85,6 +85,7 @@ set -x $pwd/6/6.out -O obj -I obj/lib/sys lib/std/slpush.myr $pwd/6/6.out -O obj -I obj/lib/sys lib/std/striter.myr $pwd/6/6.out -O obj -I obj/lib/sys lib/std/intparse.myr + $pwd/6/6.out -O obj -I obj/lib/sys lib/std/intfmt.myr $pwd/6/6.out -O obj -I obj/lib/sys lib/std/strsplit.myr $pwd/6/6.out -O obj -I obj/lib/sys lib/std/strbuf.myr $pwd/6/6.out -O obj -I obj/lib/sys lib/std/sldup.myr |