utils.go 1.5 KB

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