Compare commits

..

No commits in common. 'master' and 'v0.4.0' have entirely different histories.

3
.gitignore vendored

@ -1 +1,2 @@
kg/kg re

@ -5,13 +5,9 @@ fmt:
go fmt ./... go fmt ./...
vet: fmt vet: fmt
go vet ./... go vet ./...
buildLibUnopt: vet
go build -gcflags="all=-N -l" ./...
unopt: buildLibUnopt
go build -C kg/ -gcflags="all=-N -l" -o kg ./...
buildLib: vet buildLib: vet
go build ./... go build -gcflags="all=-N -l" ./...
buildCmd: buildLib buildCmd: buildLib
go build -C kg/ -o kg ./... go build -C cmd/ -gcflags="all=-N -l" -o re ./...
test: buildCmd test: buildCmd
go test -v ./... go test -v ./...

@ -15,7 +15,3 @@ It also includes features not present in regexp, such as lookarounds and backref
The syntax is, for the most part, a superset of Go's regexp. A full overview of the syntax can be found [here](https://pkg.go.dev/gitea.twomorecents.org/Rockingcool/kleingrep/regex#hdr-Syntax). The syntax is, for the most part, a superset of Go's regexp. A full overview of the syntax can be found [here](https://pkg.go.dev/gitea.twomorecents.org/Rockingcool/kleingrep/regex#hdr-Syntax).
__For more information, see https://pkg.go.dev/gitea.twomorecents.org/Rockingcool/kleingrep/regex__. __For more information, see https://pkg.go.dev/gitea.twomorecents.org/Rockingcool/kleingrep/regex__.
### How it works
I've written about the inner workings of the engine [on my blog](https://twomorecents.org/writing-regex-engine/index.html).

@ -1,11 +1,6 @@
package main package main
import ( import "slices"
"bufio"
"os"
"slices"
"strings"
)
type character interface { type character interface {
int | rune int | rune
@ -30,23 +25,3 @@ func genRange[T character](start, end T) []T {
} }
return toRet return toRet
} }
// Returns whether or not the given file contains a NULL character
func fileContainsNullChar(filename string) (bool, error) {
file, err := os.Open(filename)
if err != nil {
return true, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "\000") {
return true, nil
}
}
if err := scanner.Err(); err != nil {
return true, err
}
return false, nil
}

@ -91,7 +91,6 @@ func main() {
inputFilenames := flag.Args()[1:] inputFilenames := flag.Args()[1:]
for _, inputFilename := range inputFilenames { for _, inputFilename := range inputFilenames {
inputFile, err := os.Open(inputFilename) inputFile, err := os.Open(inputFilename)
defer inputFile.Close()
if err != nil { if err != nil {
fmt.Printf("%s: %s: No such file or directory\n", os.Args[0], inputFilename) fmt.Printf("%s: %s: No such file or directory\n", os.Args[0], inputFilename)
} else { } else {
@ -103,25 +102,12 @@ func main() {
if fileStat.Mode().IsDir() { if fileStat.Mode().IsDir() {
fmt.Printf("%s: %s: Is a directory\n", os.Args[0], inputFilename) fmt.Printf("%s: %s: Is a directory\n", os.Args[0], inputFilename)
} else { } else {
var nullCharPresent bool inputFiles = append(inputFiles, inputFile)
if nullCharPresent, err = fileContainsNullChar(inputFilename); nullCharPresent {
if err != nil {
fmt.Printf("%v\n", err)
os.Exit(1)
} else {
fmt.Printf("%s: %s: Is a binary file\n", os.Args[0], inputFilename)
}
} else {
inputFiles = append(inputFiles, inputFile)
}
} }
} }
} }
} }
} }
if len(inputFiles) == 0 { // No valid files given
os.Exit(2)
}
var test_str string var test_str string
var err error var err error

@ -131,9 +131,13 @@ func newEscapedNode(c rune, inCharClass bool) (postfixNode, error) {
case 'v': // Vertical tab case 'v': // Vertical tab
toReturn.nodetype = characterNode toReturn.nodetype = characterNode
toReturn.contents = append(toReturn.contents, rune(11)) toReturn.contents = append(toReturn.contents, rune(11))
case '-': // Literal hyphen case '-': // Literal hyphen - only in character class
toReturn.nodetype = characterNode if inCharClass {
toReturn.contents = append(toReturn.contents, '-') toReturn.nodetype = characterNode
toReturn.contents = append(toReturn.contents, '-')
} else {
return postfixNode{}, fmt.Errorf("invalid escape character")
}
default: // None of the above - append it as a regular character default: // None of the above - append it as a regular character
if isNormalChar(c) { // Normal characters cannot be escaped if isNormalChar(c) { // Normal characters cannot be escaped
return postfixNode{}, fmt.Errorf("invalid escape character") return postfixNode{}, fmt.Errorf("invalid escape character")

Loading…
Cancel
Save