helper_internal.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright (c) 2012, 2013 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. // All non-std package dependencies live in this file,
  5. // so porting to different environment is easy (just update functions).
  6. import (
  7. "errors"
  8. "fmt"
  9. "reflect"
  10. )
  11. var (
  12. raisePanicAfterRecover = false
  13. debugging = true
  14. )
  15. func panicValToErr(panicVal interface{}, err *error) {
  16. switch xerr := panicVal.(type) {
  17. case error:
  18. *err = xerr
  19. case string:
  20. *err = errors.New(xerr)
  21. default:
  22. *err = fmt.Errorf("%v", panicVal)
  23. }
  24. if raisePanicAfterRecover {
  25. panic(panicVal)
  26. }
  27. return
  28. }
  29. func isEmptyValue(v reflect.Value) bool {
  30. switch v.Kind() {
  31. case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
  32. return v.Len() == 0
  33. case reflect.Bool:
  34. return !v.Bool()
  35. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  36. return v.Int() == 0
  37. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  38. return v.Uint() == 0
  39. case reflect.Float32, reflect.Float64:
  40. return v.Float() == 0
  41. case reflect.Interface, reflect.Ptr:
  42. return v.IsNil()
  43. }
  44. return false
  45. }
  46. func debugf(format string, args ...interface{}) {
  47. if debugging {
  48. if len(format) == 0 || format[len(format)-1] != '\n' {
  49. format = format + "\n"
  50. }
  51. fmt.Printf(format, args...)
  52. }
  53. }
  54. func pruneSignExt(v []byte) (n int) {
  55. l := len(v)
  56. if l < 2 {
  57. return
  58. }
  59. if v[0] == 0 {
  60. n2 := n + 1
  61. for v[n] == 0 && n2 < l && (v[n2]&(1<<7) == 0) {
  62. n++
  63. n2++
  64. }
  65. return
  66. }
  67. if v[0] == 0xff {
  68. n2 := n + 1
  69. for v[n] == 0xff && n2 < l && (v[n2]&(1<<7) != 0) {
  70. n++
  71. n2++
  72. }
  73. return
  74. }
  75. return
  76. }