(buf []byte, tmp []byte, invert bool)
| 251 | } |
| 252 | |
| 253 | func decodeDecimal(buf []byte, tmp []byte, invert bool) ([]byte, apd.Decimal, error) { |
| 254 | // Handle the simplistic cases first. |
| 255 | switch buf[0] { |
| 256 | case decimalNaN, decimalNaNDesc: |
| 257 | return buf[1:], apd.Decimal{Form: apd.NaN}, nil |
| 258 | case decimalInfinity: |
| 259 | return buf[1:], apd.Decimal{Form: apd.Infinite, Negative: invert}, nil |
| 260 | case decimalNegativeInfinity: |
| 261 | return buf[1:], apd.Decimal{Form: apd.Infinite, Negative: !invert}, nil |
| 262 | case decimalZero: |
| 263 | return buf[1:], apd.Decimal{}, nil |
| 264 | } |
| 265 | tmp = tmp[len(tmp):cap(tmp)] |
| 266 | switch { |
| 267 | case buf[0] == decimalNegLarge: |
| 268 | // Negative large. |
| 269 | e, m, r, tmp2, err := decodeLargeNumber(true, buf, tmp) |
| 270 | if err != nil { |
| 271 | return nil, apd.Decimal{}, err |
| 272 | } |
| 273 | d, err := makeDecimalFromMandE(!invert, e, m, tmp2) |
| 274 | return r, d, err |
| 275 | case buf[0] > decimalNegLarge && buf[0] <= decimalNegMedium: |
| 276 | // Negative medium. |
| 277 | e, m, r, tmp2, err := decodeMediumNumber(true, buf, tmp) |
| 278 | if err != nil { |
| 279 | return nil, apd.Decimal{}, err |
| 280 | } |
| 281 | d, err := makeDecimalFromMandE(!invert, e, m, tmp2) |
| 282 | return r, d, err |
| 283 | case buf[0] == decimalNegSmall: |
| 284 | // Negative small. |
| 285 | e, m, r, tmp2, err := decodeSmallNumber(true, buf, tmp) |
| 286 | if err != nil { |
| 287 | return nil, apd.Decimal{}, err |
| 288 | } |
| 289 | d, err := makeDecimalFromMandE(!invert, e, m, tmp2) |
| 290 | return r, d, err |
| 291 | case buf[0] == decimalPosLarge: |
| 292 | // Positive large. |
| 293 | e, m, r, tmp2, err := decodeLargeNumber(false, buf, tmp) |
| 294 | if err != nil { |
| 295 | return nil, apd.Decimal{}, err |
| 296 | } |
| 297 | d, err := makeDecimalFromMandE(invert, e, m, tmp2) |
| 298 | return r, d, err |
| 299 | case buf[0] >= decimalPosMedium && buf[0] < decimalPosLarge: |
| 300 | // Positive medium. |
| 301 | e, m, r, tmp2, err := decodeMediumNumber(false, buf, tmp) |
| 302 | if err != nil { |
| 303 | return nil, apd.Decimal{}, err |
| 304 | } |
| 305 | d, err := makeDecimalFromMandE(invert, e, m, tmp2) |
| 306 | return r, d, err |
| 307 | case buf[0] == decimalPosSmall: |
| 308 | // Positive small. |
| 309 | e, m, r, tmp2, err := decodeSmallNumber(false, buf, tmp) |
| 310 | if err != nil { |
no test coverage detected
searching dependent graphs…