scanner.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package ini
  2. import (
  3. "fmt"
  4. )
  5. type scanState int
  6. type scanFunction func(c byte, e *element) scanState
  7. const (
  8. scanContinue scanState = 1 << iota
  9. scanEOL
  10. scanEOF
  11. scanBegin
  12. scanSection
  13. scanVariable
  14. scanVariableValue
  15. )
  16. var (
  17. EOF = fmt.Errorf("END OF FILE")
  18. EOL = fmt.Errorf("END OF LINE")
  19. )
  20. type SyntaxError struct {
  21. got byte
  22. exp byte
  23. msg string
  24. off int
  25. }
  26. func (s *SyntaxError) Error() string {
  27. if s.got == 0 {
  28. return fmt.Sprintf("Error on position '%d: %s'", s.off, s.msg)
  29. }
  30. if s.exp == 0 {
  31. return fmt.Sprintf("Error on position '%d': %s. Got '%c'.", s.off, s.msg, s.got)
  32. }
  33. return fmt.Sprintf("Error on position '%d': %s. Got '%c' while expecting '%c'.", s.off, s.msg, s.got, s.exp)
  34. }
  35. type scanner struct {
  36. data []byte
  37. prev byte
  38. scan scanFunction
  39. read int
  40. len int
  41. err error
  42. }
  43. func newScanner(d []byte) *scanner {
  44. s := &scanner{
  45. data: d,
  46. prev: 0,
  47. read: 0,
  48. len: len(d),
  49. }
  50. s.scan = s.begin
  51. return s
  52. }
  53. func (s *scanner) loop() (*element, error) {
  54. e := newElement()
  55. for _, c := range s.data[s.read:] {
  56. s.read++
  57. state := s.scan(c, e)
  58. s.prev = c
  59. if s.err != nil {
  60. return nil, s.err
  61. }
  62. switch state {
  63. case scanEOL:
  64. return e, EOL
  65. case scanEOF:
  66. return e, EOF
  67. }
  68. }
  69. return e, nil
  70. }
  71. func (s *scanner) valid() error {
  72. for _, err := s.next(); ; _, err = s.next() {
  73. if err != EOF && err != EOL {
  74. return err
  75. }
  76. }
  77. return nil
  78. }
  79. func (s *scanner) next() (*element, error) {
  80. e, err := s.loop()
  81. return e, err
  82. }
  83. func (s *scanner) ret(state scanState) scanState {
  84. if state != scanEOF && s.read == s.len {
  85. s.scan = s.begin
  86. return scanEOF
  87. }
  88. if state == scanEOL {
  89. s.scan = s.begin
  90. }
  91. return state
  92. }
  93. func (s *scanner) begin(c byte, e *element) scanState {
  94. switch c {
  95. case ' ', '\n', '\t', '\r':
  96. return s.ret(scanContinue)
  97. case '[':
  98. e.setType(section)
  99. s.scan = s.section
  100. return s.ret(scanContinue)
  101. default:
  102. e.setType(variable)
  103. s.scan = s.variable
  104. return s.scan(c, e)
  105. }
  106. }
  107. func (s *scanner) section(c byte, e *element) scanState {
  108. switch c {
  109. case '\n':
  110. s.err = &SyntaxError{
  111. msg: "Missing valid character",
  112. got: c,
  113. exp: ']',
  114. off: s.read,
  115. }
  116. fallthrough
  117. case ']':
  118. return s.ret(scanEOL)
  119. default:
  120. e.setKey(c)
  121. return s.ret(scanContinue)
  122. }
  123. }
  124. func (s *scanner) variable(c byte, e *element) scanState {
  125. switch c {
  126. case '\n', '\r':
  127. return s.ret(scanEOL)
  128. case '=':
  129. e.removeLastKeyByteMatching(' ')
  130. s.scan = s.variableValue
  131. return s.ret(scanContinue)
  132. default:
  133. e.setKey(c)
  134. return s.ret(scanContinue)
  135. }
  136. }
  137. func (s *scanner) variableValue(c byte, e *element) scanState {
  138. switch c {
  139. case '"', '\'':
  140. return s.ret(scanContinue)
  141. case '\n', '\r':
  142. if s.prev == '\\' {
  143. e.setValue(byte('n'))
  144. return s.ret(scanContinue)
  145. }
  146. return s.ret(scanEOL)
  147. default:
  148. if s.prev == '=' && c == ' ' {
  149. return scanContinue
  150. }
  151. e.setValue(c)
  152. return s.ret(scanContinue)
  153. }
  154. }