utils.go 1.7 KB

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