Compare commits
7 Commits
v0.4.0
...
1d32865e76
Author | SHA1 | Date | |
---|---|---|---|
1d32865e76 | |||
66f4ca31d1 | |||
d81c72590a | |||
83632f2abc | |||
fc0af1ccc5 | |||
980fb77114 | |||
4c4d747a9c |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1 @@
|
|||||||
re
|
kg/kg
|
||||||
|
|
||||||
|
2
Makefile
2
Makefile
@@ -8,6 +8,6 @@ vet: fmt
|
|||||||
buildLib: vet
|
buildLib: vet
|
||||||
go build -gcflags="all=-N -l" ./...
|
go build -gcflags="all=-N -l" ./...
|
||||||
buildCmd: buildLib
|
buildCmd: buildLib
|
||||||
go build -C cmd/ -gcflags="all=-N -l" -o re ./...
|
go build -C kg/ -gcflags="all=-N -l" -o kg ./...
|
||||||
test: buildCmd
|
test: buildCmd
|
||||||
go test -v ./...
|
go test -v ./...
|
||||||
|
@@ -15,3 +15,7 @@ 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,6 +1,11 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "slices"
|
import (
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
type character interface {
|
type character interface {
|
||||||
int | rune
|
int | rune
|
||||||
@@ -25,3 +30,23 @@ 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,6 +91,7 @@ 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 {
|
||||||
@@ -101,6 +102,15 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
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 {
|
||||||
|
var nullCharPresent bool
|
||||||
|
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 {
|
} else {
|
||||||
inputFiles = append(inputFiles, inputFile)
|
inputFiles = append(inputFiles, inputFile)
|
||||||
}
|
}
|
||||||
@@ -108,6 +118,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
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
|
Reference in New Issue
Block a user