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