aboutsummaryrefslogtreecommitdiff
path: root/internal/cpe/cpe.go
diff options
context:
space:
mode:
authorPaul Duncan <pabs@pablotron.org>2022-02-02 21:45:23 -0500
committerPaul Duncan <pabs@pablotron.org>2022-02-02 21:45:23 -0500
commite3a6bc8502a0366aee9040e938789a6016e2fa4a (patch)
tree1d0098dec135d77dd1c8d4a8b0c54bf2aa1141fa /internal/cpe/cpe.go
parentb6496c2d20904e665116133a9e9bf9ae6e3b45b8 (diff)
downloadcvez-e3a6bc8502a0366aee9040e938789a6016e2fa4a.tar.bz2
cvez-e3a6bc8502a0366aee9040e938789a6016e2fa4a.zip
internal/cpe: add token.go, part.go, and tests
Diffstat (limited to 'internal/cpe/cpe.go')
-rw-r--r--internal/cpe/cpe.go89
1 files changed, 0 insertions, 89 deletions
diff --git a/internal/cpe/cpe.go b/internal/cpe/cpe.go
index 73930e8..331f315 100644
--- a/internal/cpe/cpe.go
+++ b/internal/cpe/cpe.go
@@ -3,92 +3,3 @@
// Source: NISTIR 7605, figure 6-3:
// https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7695.pdf
package cpe
-
-import (
- "fmt"
-)
-
-//go:generate stringer -linecomment -type=tokenType
-
-// token type
-type tokenType byte
-
-const (
- anyToken tokenType = iota // any
- naToken // na
- valToken // val
-)
-
-// token
-type token struct {
- Type tokenType // token type
- Val string // token value
-}
-
-// parse buffer into token.
-func newToken(val []byte) token {
- if len(val) > 0 {
- switch val[0] {
- case '*':
- return token { Type: anyToken }
- case '-':
- return token { Type: naToken }
- default:
- return token { Type: valToken, Val: string(val) }
- }
- } else {
- // empty value
- return token { Type: valToken, Val: "" }
- }
-}
-
-// Parse buffer into slice of tokens.
-func tokenize(buf []byte) ([]token, error) {
- // build result
- var r []token
-
- // current token and escape state
- var curr []byte
- esc := false
-
- // build result
- for _, b := range(buf) {
- if esc {
- switch b {
- // valid escaped characters
- case '\\', '*', '-', '!', '"', '#', '$', '%', '&', '\'', '(', ')',
- '+', ',', '/', ':', ';', '<', '=', '>', '@', '[', ']', '^', '`',
- '{', '|', '}', '~':
- curr = append(curr, b)
- esc = false
- default:
- return r, fmt.Errorf("invalid escape byte: 0x%02x", b)
- }
- } else {
- switch b {
- case '\\':
- esc = true
- case ':':
- // push token, clear buffer
- r = append(r, newToken(curr))
- curr = nil
- case 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
- 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '-', '.', '_', '*', '?':
- curr = append(curr, b)
- default:
- return r, fmt.Errorf("invalid byte: 0x%02x", b)
- }
- }
- }
-
- if len(curr) > 0 {
- // push token, clear buffer
- r = append(r, newToken(curr))
- curr = nil
- }
-
- // return success
- return r, nil
-}