utils.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package main
  2. import (
  3. "io/ioutil"
  4. "path/filepath"
  5. "strings"
  6. "unicode"
  7. )
  8. type mapStringSlice map[string][]string
  9. type mapStringSet map[string]stringSet
  10. type intRange struct {
  11. min int
  12. max int
  13. }
  14. func makeIntRange(min, max int) intRange {
  15. return intRange{
  16. min,
  17. max,
  18. }
  19. }
  20. func (r intRange) get(n int) bool {
  21. return n >= r.min && n <= r.max
  22. }
  23. type intRanges []intRange
  24. func (rs intRanges) get(n int) bool {
  25. for _, r := range rs {
  26. if r.get(n) {
  27. return true
  28. }
  29. }
  30. return false
  31. }
  32. func min(a, b int) int {
  33. if a < b {
  34. return a
  35. }
  36. return b
  37. }
  38. func max(a, b int) int {
  39. if a < b {
  40. return b
  41. }
  42. return a
  43. }
  44. func (mss mapStringSet) Add(n string, v string) {
  45. _, ok := mss[n]
  46. if !ok {
  47. mss[n] = make(stringSet)
  48. }
  49. mss[n].set(v)
  50. }
  51. func (mss mapStringSlice) Add(n string, v string) {
  52. _, ok := mss[n]
  53. if !ok {
  54. mss[n] = make([]string, 0, 1)
  55. }
  56. mss[n] = append(mss[n], v)
  57. }
  58. func completeFileName(dir, name string) (string, error) {
  59. files, err := ioutil.ReadDir(dir)
  60. if err != nil {
  61. return "", err
  62. }
  63. for _, file := range files {
  64. if file.IsDir() {
  65. continue
  66. }
  67. if strings.HasPrefix(file.Name(), name) {
  68. return filepath.Join(dir, file.Name()), nil
  69. }
  70. }
  71. return "", nil
  72. }
  73. func lessRunes(iRunes, jRunes []rune) bool {
  74. max := len(iRunes)
  75. if max > len(jRunes) {
  76. max = len(jRunes)
  77. }
  78. for idx := 0; idx < max; idx++ {
  79. ir := iRunes[idx]
  80. jr := jRunes[idx]
  81. lir := unicode.ToLower(ir)
  82. ljr := unicode.ToLower(jr)
  83. if lir != ljr {
  84. return lir < ljr
  85. }
  86. // the lowercase runes are the same, so compare the original
  87. if ir != jr {
  88. return ir < jr
  89. }
  90. }
  91. return len(iRunes) < len(jRunes)
  92. }
  93. func stringSliceEqual(a, b []string) bool {
  94. if a == nil && b == nil {
  95. return true
  96. }
  97. if a == nil || b == nil {
  98. return false
  99. }
  100. if len(a) != len(b) {
  101. return false
  102. }
  103. for i := 0; i < len(a); i++ {
  104. if a[i] != b[i] {
  105. return false
  106. }
  107. }
  108. return true
  109. }