diff options
author | Paul Duncan <pabs@pablotron.org> | 2022-02-02 21:45:23 -0500 |
---|---|---|
committer | Paul Duncan <pabs@pablotron.org> | 2022-02-02 21:45:23 -0500 |
commit | e3a6bc8502a0366aee9040e938789a6016e2fa4a (patch) | |
tree | 1d0098dec135d77dd1c8d4a8b0c54bf2aa1141fa /internal/cpe/cpe.go | |
parent | b6496c2d20904e665116133a9e9bf9ae6e3b45b8 (diff) | |
download | cvez-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.go | 89 |
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 -} |