diff options
| author | Rutger Broekhoff | 2023-12-29 21:31:53 +0100 |
|---|---|---|
| committer | Rutger Broekhoff | 2023-12-29 21:31:53 +0100 |
| commit | 404aeae4545d2426c089a5f8d5e82dae56f5212b (patch) | |
| tree | 2d84e00af272b39fc04f3795ae06bc48970e57b5 /vendor/github.com/dustin/go-humanize/bigbytes.go | |
| parent | 209d8b0187ed025dec9ac149ebcced3462877bff (diff) | |
| download | gitolfs3-404aeae4545d2426c089a5f8d5e82dae56f5212b.tar.gz gitolfs3-404aeae4545d2426c089a5f8d5e82dae56f5212b.zip | |
Make Nix builds work
Diffstat (limited to 'vendor/github.com/dustin/go-humanize/bigbytes.go')
| -rw-r--r-- | vendor/github.com/dustin/go-humanize/bigbytes.go | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/vendor/github.com/dustin/go-humanize/bigbytes.go b/vendor/github.com/dustin/go-humanize/bigbytes.go new file mode 100644 index 0000000..3b015fd --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/bigbytes.go | |||
| @@ -0,0 +1,189 @@ | |||
| 1 | package humanize | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "fmt" | ||
| 5 | "math/big" | ||
| 6 | "strings" | ||
| 7 | "unicode" | ||
| 8 | ) | ||
| 9 | |||
| 10 | var ( | ||
| 11 | bigIECExp = big.NewInt(1024) | ||
| 12 | |||
| 13 | // BigByte is one byte in bit.Ints | ||
| 14 | BigByte = big.NewInt(1) | ||
| 15 | // BigKiByte is 1,024 bytes in bit.Ints | ||
| 16 | BigKiByte = (&big.Int{}).Mul(BigByte, bigIECExp) | ||
| 17 | // BigMiByte is 1,024 k bytes in bit.Ints | ||
| 18 | BigMiByte = (&big.Int{}).Mul(BigKiByte, bigIECExp) | ||
| 19 | // BigGiByte is 1,024 m bytes in bit.Ints | ||
| 20 | BigGiByte = (&big.Int{}).Mul(BigMiByte, bigIECExp) | ||
| 21 | // BigTiByte is 1,024 g bytes in bit.Ints | ||
| 22 | BigTiByte = (&big.Int{}).Mul(BigGiByte, bigIECExp) | ||
| 23 | // BigPiByte is 1,024 t bytes in bit.Ints | ||
| 24 | BigPiByte = (&big.Int{}).Mul(BigTiByte, bigIECExp) | ||
| 25 | // BigEiByte is 1,024 p bytes in bit.Ints | ||
| 26 | BigEiByte = (&big.Int{}).Mul(BigPiByte, bigIECExp) | ||
| 27 | // BigZiByte is 1,024 e bytes in bit.Ints | ||
| 28 | BigZiByte = (&big.Int{}).Mul(BigEiByte, bigIECExp) | ||
| 29 | // BigYiByte is 1,024 z bytes in bit.Ints | ||
| 30 | BigYiByte = (&big.Int{}).Mul(BigZiByte, bigIECExp) | ||
| 31 | // BigRiByte is 1,024 y bytes in bit.Ints | ||
| 32 | BigRiByte = (&big.Int{}).Mul(BigYiByte, bigIECExp) | ||
| 33 | // BigQiByte is 1,024 r bytes in bit.Ints | ||
| 34 | BigQiByte = (&big.Int{}).Mul(BigRiByte, bigIECExp) | ||
| 35 | ) | ||
| 36 | |||
| 37 | var ( | ||
| 38 | bigSIExp = big.NewInt(1000) | ||
| 39 | |||
| 40 | // BigSIByte is one SI byte in big.Ints | ||
| 41 | BigSIByte = big.NewInt(1) | ||
| 42 | // BigKByte is 1,000 SI bytes in big.Ints | ||
| 43 | BigKByte = (&big.Int{}).Mul(BigSIByte, bigSIExp) | ||
| 44 | // BigMByte is 1,000 SI k bytes in big.Ints | ||
| 45 | BigMByte = (&big.Int{}).Mul(BigKByte, bigSIExp) | ||
| 46 | // BigGByte is 1,000 SI m bytes in big.Ints | ||
| 47 | BigGByte = (&big.Int{}).Mul(BigMByte, bigSIExp) | ||
| 48 | // BigTByte is 1,000 SI g bytes in big.Ints | ||
| 49 | BigTByte = (&big.Int{}).Mul(BigGByte, bigSIExp) | ||
| 50 | // BigPByte is 1,000 SI t bytes in big.Ints | ||
| 51 | BigPByte = (&big.Int{}).Mul(BigTByte, bigSIExp) | ||
| 52 | // BigEByte is 1,000 SI p bytes in big.Ints | ||
| 53 | BigEByte = (&big.Int{}).Mul(BigPByte, bigSIExp) | ||
| 54 | // BigZByte is 1,000 SI e bytes in big.Ints | ||
| 55 | BigZByte = (&big.Int{}).Mul(BigEByte, bigSIExp) | ||
| 56 | // BigYByte is 1,000 SI z bytes in big.Ints | ||
| 57 | BigYByte = (&big.Int{}).Mul(BigZByte, bigSIExp) | ||
| 58 | // BigRByte is 1,000 SI y bytes in big.Ints | ||
| 59 | BigRByte = (&big.Int{}).Mul(BigYByte, bigSIExp) | ||
| 60 | // BigQByte is 1,000 SI r bytes in big.Ints | ||
| 61 | BigQByte = (&big.Int{}).Mul(BigRByte, bigSIExp) | ||
| 62 | ) | ||
| 63 | |||
| 64 | var bigBytesSizeTable = map[string]*big.Int{ | ||
| 65 | "b": BigByte, | ||
| 66 | "kib": BigKiByte, | ||
| 67 | "kb": BigKByte, | ||
| 68 | "mib": BigMiByte, | ||
| 69 | "mb": BigMByte, | ||
| 70 | "gib": BigGiByte, | ||
| 71 | "gb": BigGByte, | ||
| 72 | "tib": BigTiByte, | ||
| 73 | "tb": BigTByte, | ||
| 74 | "pib": BigPiByte, | ||
| 75 | "pb": BigPByte, | ||
| 76 | "eib": BigEiByte, | ||
| 77 | "eb": BigEByte, | ||
| 78 | "zib": BigZiByte, | ||
| 79 | "zb": BigZByte, | ||
| 80 | "yib": BigYiByte, | ||
| 81 | "yb": BigYByte, | ||
| 82 | "rib": BigRiByte, | ||
| 83 | "rb": BigRByte, | ||
| 84 | "qib": BigQiByte, | ||
| 85 | "qb": BigQByte, | ||
| 86 | // Without suffix | ||
| 87 | "": BigByte, | ||
| 88 | "ki": BigKiByte, | ||
| 89 | "k": BigKByte, | ||
| 90 | "mi": BigMiByte, | ||
| 91 | "m": BigMByte, | ||
| 92 | "gi": BigGiByte, | ||
| 93 | "g": BigGByte, | ||
| 94 | "ti": BigTiByte, | ||
| 95 | "t": BigTByte, | ||
| 96 | "pi": BigPiByte, | ||
| 97 | "p": BigPByte, | ||
| 98 | "ei": BigEiByte, | ||
| 99 | "e": BigEByte, | ||
| 100 | "z": BigZByte, | ||
| 101 | "zi": BigZiByte, | ||
| 102 | "y": BigYByte, | ||
| 103 | "yi": BigYiByte, | ||
| 104 | "r": BigRByte, | ||
| 105 | "ri": BigRiByte, | ||
| 106 | "q": BigQByte, | ||
| 107 | "qi": BigQiByte, | ||
| 108 | } | ||
| 109 | |||
| 110 | var ten = big.NewInt(10) | ||
| 111 | |||
| 112 | func humanateBigBytes(s, base *big.Int, sizes []string) string { | ||
| 113 | if s.Cmp(ten) < 0 { | ||
| 114 | return fmt.Sprintf("%d B", s) | ||
| 115 | } | ||
| 116 | c := (&big.Int{}).Set(s) | ||
| 117 | val, mag := oomm(c, base, len(sizes)-1) | ||
| 118 | suffix := sizes[mag] | ||
| 119 | f := "%.0f %s" | ||
| 120 | if val < 10 { | ||
| 121 | f = "%.1f %s" | ||
| 122 | } | ||
| 123 | |||
| 124 | return fmt.Sprintf(f, val, suffix) | ||
| 125 | |||
| 126 | } | ||
| 127 | |||
| 128 | // BigBytes produces a human readable representation of an SI size. | ||
| 129 | // | ||
| 130 | // See also: ParseBigBytes. | ||
| 131 | // | ||
| 132 | // BigBytes(82854982) -> 83 MB | ||
| 133 | func BigBytes(s *big.Int) string { | ||
| 134 | sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "RB", "QB"} | ||
| 135 | return humanateBigBytes(s, bigSIExp, sizes) | ||
| 136 | } | ||
| 137 | |||
| 138 | // BigIBytes produces a human readable representation of an IEC size. | ||
| 139 | // | ||
| 140 | // See also: ParseBigBytes. | ||
| 141 | // | ||
| 142 | // BigIBytes(82854982) -> 79 MiB | ||
| 143 | func BigIBytes(s *big.Int) string { | ||
| 144 | sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB"} | ||
| 145 | return humanateBigBytes(s, bigIECExp, sizes) | ||
| 146 | } | ||
| 147 | |||
| 148 | // ParseBigBytes parses a string representation of bytes into the number | ||
| 149 | // of bytes it represents. | ||
| 150 | // | ||
| 151 | // See also: BigBytes, BigIBytes. | ||
| 152 | // | ||
| 153 | // ParseBigBytes("42 MB") -> 42000000, nil | ||
| 154 | // ParseBigBytes("42 mib") -> 44040192, nil | ||
| 155 | func ParseBigBytes(s string) (*big.Int, error) { | ||
| 156 | lastDigit := 0 | ||
| 157 | hasComma := false | ||
| 158 | for _, r := range s { | ||
| 159 | if !(unicode.IsDigit(r) || r == '.' || r == ',') { | ||
| 160 | break | ||
| 161 | } | ||
| 162 | if r == ',' { | ||
| 163 | hasComma = true | ||
| 164 | } | ||
| 165 | lastDigit++ | ||
| 166 | } | ||
| 167 | |||
| 168 | num := s[:lastDigit] | ||
| 169 | if hasComma { | ||
| 170 | num = strings.Replace(num, ",", "", -1) | ||
| 171 | } | ||
| 172 | |||
| 173 | val := &big.Rat{} | ||
| 174 | _, err := fmt.Sscanf(num, "%f", val) | ||
| 175 | if err != nil { | ||
| 176 | return nil, err | ||
| 177 | } | ||
| 178 | |||
| 179 | extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) | ||
| 180 | if m, ok := bigBytesSizeTable[extra]; ok { | ||
| 181 | mv := (&big.Rat{}).SetInt(m) | ||
| 182 | val.Mul(val, mv) | ||
| 183 | rv := &big.Int{} | ||
| 184 | rv.Div(val.Num(), val.Denom()) | ||
| 185 | return rv, nil | ||
| 186 | } | ||
| 187 | |||
| 188 | return nil, fmt.Errorf("unhandled size name: %v", extra) | ||
| 189 | } | ||