base_lexer.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package sdp
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. )
  7. var errDocumentStart = errors.New("already on document start")
  8. type syntaxError struct {
  9. s string
  10. i int
  11. }
  12. func (e syntaxError) Error() string {
  13. if e.i < 0 {
  14. e.i = 0
  15. }
  16. head, middle, tail := e.s[:e.i], e.s[e.i:e.i+1], e.s[e.i+1:]
  17. return fmt.Sprintf("%s --> %s <-- %s", head, middle, tail)
  18. }
  19. type baseLexer struct {
  20. value []byte
  21. pos int
  22. }
  23. func (l baseLexer) syntaxError() error {
  24. return syntaxError{s: string(l.value), i: l.pos - 1}
  25. }
  26. func (l *baseLexer) unreadByte() error {
  27. if l.pos <= 0 {
  28. return errDocumentStart
  29. }
  30. l.pos--
  31. return nil
  32. }
  33. func (l *baseLexer) readByte() (byte, error) {
  34. if l.pos >= len(l.value) {
  35. return byte(0), io.EOF
  36. }
  37. ch := l.value[l.pos]
  38. l.pos++
  39. return ch, nil
  40. }
  41. func (l *baseLexer) nextLine() error {
  42. for {
  43. ch, err := l.readByte()
  44. if errors.Is(err, io.EOF) {
  45. return nil
  46. } else if err != nil {
  47. return err
  48. }
  49. if !isNewline(ch) {
  50. return l.unreadByte()
  51. }
  52. }
  53. }
  54. func (l *baseLexer) readWhitespace() error {
  55. for {
  56. ch, err := l.readByte()
  57. if errors.Is(err, io.EOF) {
  58. return nil
  59. } else if err != nil {
  60. return err
  61. }
  62. if !isWhitespace(ch) {
  63. return l.unreadByte()
  64. }
  65. }
  66. }
  67. func (l *baseLexer) readUint64Field() (i uint64, err error) {
  68. for {
  69. ch, err := l.readByte()
  70. if errors.Is(err, io.EOF) && i > 0 {
  71. break
  72. } else if err != nil {
  73. return i, err
  74. }
  75. if isNewline(ch) {
  76. if err := l.unreadByte(); err != nil {
  77. return i, err
  78. }
  79. break
  80. }
  81. if isWhitespace(ch) {
  82. if err := l.readWhitespace(); err != nil {
  83. return i, err
  84. }
  85. break
  86. }
  87. switch ch {
  88. case '0':
  89. i *= 10
  90. case '1':
  91. i = i*10 + 1
  92. case '2':
  93. i = i*10 + 2
  94. case '3':
  95. i = i*10 + 3
  96. case '4':
  97. i = i*10 + 4
  98. case '5':
  99. i = i*10 + 5
  100. case '6':
  101. i = i*10 + 6
  102. case '7':
  103. i = i*10 + 7
  104. case '8':
  105. i = i*10 + 8
  106. case '9':
  107. i = i*10 + 9
  108. default:
  109. return i, l.syntaxError()
  110. }
  111. }
  112. return i, nil
  113. }
  114. // Returns next field on this line or empty string if no more fields on line
  115. func (l *baseLexer) readField() (string, error) {
  116. start := l.pos
  117. var stop int
  118. for {
  119. stop = l.pos
  120. ch, err := l.readByte()
  121. if errors.Is(err, io.EOF) && stop > start {
  122. break
  123. } else if err != nil {
  124. return "", err
  125. }
  126. if isNewline(ch) {
  127. if err := l.unreadByte(); err != nil {
  128. return "", err
  129. }
  130. break
  131. }
  132. if isWhitespace(ch) {
  133. if err := l.readWhitespace(); err != nil {
  134. return "", err
  135. }
  136. break
  137. }
  138. }
  139. return string(l.value[start:stop]), nil
  140. }
  141. // Returns symbols until line end
  142. func (l *baseLexer) readLine() (string, error) {
  143. start := l.pos
  144. trim := 1
  145. for {
  146. ch, err := l.readByte()
  147. if err != nil {
  148. return "", err
  149. }
  150. if ch == '\r' {
  151. trim++
  152. }
  153. if ch == '\n' {
  154. return string(l.value[start : l.pos-trim]), nil
  155. }
  156. }
  157. }
  158. func (l *baseLexer) readString(until byte) (string, error) {
  159. start := l.pos
  160. for {
  161. ch, err := l.readByte()
  162. if err != nil {
  163. return "", err
  164. }
  165. if ch == until {
  166. return string(l.value[start:l.pos]), nil
  167. }
  168. }
  169. }
  170. func (l *baseLexer) readType() (string, error) {
  171. for {
  172. b, err := l.readByte()
  173. if err != nil {
  174. return "", err
  175. }
  176. if isNewline(b) {
  177. continue
  178. }
  179. err = l.unreadByte()
  180. if err != nil {
  181. return "", err
  182. }
  183. key, err := l.readString('=')
  184. if err != nil {
  185. return key, err
  186. }
  187. if len(key) == 2 {
  188. return key, nil
  189. }
  190. return key, l.syntaxError()
  191. }
  192. }
  193. func isNewline(ch byte) bool { return ch == '\n' || ch == '\r' }
  194. func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' }
  195. func anyOf(element string, data ...string) bool {
  196. for _, v := range data {
  197. if element == v {
  198. return true
  199. }
  200. }
  201. return false
  202. }