Started working on multiple filename arguments; prefix each line with filename containing the line; mostly indentation changes

master
Aadhavan Srinivasan 4 weeks ago
parent e79c19a929
commit 34149980a4

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"slices"
"github.com/fatih/color" "github.com/fatih/color"
@ -25,6 +26,7 @@ func main() {
multiLineFlag := flag.Bool("t", false, "Multi-line mode. Treats newline just like any character.") multiLineFlag := flag.Bool("t", false, "Multi-line mode. Treats newline just like any character.")
printMatchesFlag := flag.Bool("p", false, "Prints start and end index of each match. Can only be used with '-t' for multi-line mode.") printMatchesFlag := flag.Bool("p", false, "Prints start and end index of each match. Can only be used with '-t' for multi-line mode.")
caseInsensitiveFlag := flag.Bool("i", false, "Case-insensitive. Disregard the case of all characters.") caseInsensitiveFlag := flag.Bool("i", false, "Case-insensitive. Disregard the case of all characters.")
recursiveFlag := flag.Bool("r", false, "Recursively search all files in the given directory.")
matchNum := flag.Int("m", 0, "Print the match with the given index. Eg. -m 3 prints the third match.") matchNum := flag.Int("m", 0, "Print the match with the given index. Eg. -m 3 prints the third match.")
substituteText := flag.String("s", "", "Substitute the contents of each match with the given string. Overrides -o and -v") substituteText := flag.String("s", "", "Substitute the contents of each match with the given string. Overrides -o and -v")
flag.Parse() flag.Parse()
@ -64,38 +66,53 @@ func main() {
// 2. Build NFA from postfix representation (Thompson's algorithm) // 2. Build NFA from postfix representation (Thompson's algorithm)
// 3. Run the string against the NFA // 3. Run the string against the NFA
if len(flag.Args()) < 1 || len(flag.Args()) > 2 { // flag.Args() also strips out program name if len(flag.Args()) < 1 { // flag.Args() also strips out program name
fmt.Println("ERROR: Missing cmdline args")
os.Exit(22)
}
if *recursiveFlag && len(flag.Args()) < 2 { // File/Directory must be provided with '-r'
fmt.Println("ERROR: Missing cmdline args") fmt.Println("ERROR: Missing cmdline args")
os.Exit(22) os.Exit(22)
} }
var re string var re string
re = flag.Args()[0] re = flag.Args()[0]
var inputFile *os.File var inputFiles []*os.File
if len(flag.Args()) == 1 || flag.Args()[1] == "-" { // Either no file argument, or file argument is "-" if len(flag.Args()) == 1 || flag.Args()[1] == "-" { // Either no file argument, or file argument is "-"
inputFile = os.Stdin if !slices.Contains(inputFiles, os.Stdin) {
inputFiles = append(inputFiles, os.Stdin) // os.Stdin cannot be entered more than once into the file list
}
} else { } else {
var err error inputFilenames := flag.Args()[1:]
inputFile, err = os.Open(flag.Args()[1]) for _, inputFilename := range inputFilenames {
inputFile, err := os.Open(inputFilename)
if err != nil { if err != nil {
fmt.Printf("%s: No such file or directory\n", flag.Args()[1]) fmt.Printf("%s: No such file or directory\n", flag.Args()[1])
os.Exit(2) os.Exit(2)
} }
inputFiles = append(inputFiles, inputFile)
}
} }
var test_str string var test_str string
var err error var err error
var linesRead bool // Whether or not we have read the lines in the file var linesRead bool // Whether or not we have read the lines in the file
lineNum := 0 // Current line number lineNum := 0 // Current line number
// Create reader for stdin and writer for stdout // Create writer for stdout
reader := bufio.NewReader(inputFile)
out := bufio.NewWriter(os.Stdout) out := bufio.NewWriter(os.Stdout)
// Compile regex
regComp, err := reg.Compile(re, flagsToCompile...) regComp, err := reg.Compile(re, flagsToCompile...)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
} }
for _, inputFile := range inputFiles {
reader := bufio.NewReader(inputFile)
linesRead = false
for true { for true {
if !(*lineFlag) && (!*onlyFlag) {
color.New(color.FgMagenta).Fprintf(out, "%s: ", inputFile.Name()) // The filename should be printed for every line, _except_ if we're not printing every line. This is the case with the lineFlag and onlyFlag
}
if linesRead { if linesRead {
break break
} }
@ -186,6 +203,8 @@ func main() {
if *lineFlag { if *lineFlag {
if !(*invertFlag) && len(matchIndices) == 0 || *invertFlag && len(matchIndices) > 0 { if !(*invertFlag) && len(matchIndices) == 0 || *invertFlag && len(matchIndices) > 0 {
continue continue
} else {
color.New(color.FgMagenta).Fprintf(out, "%s: ", inputFile.Name()) // Print filename
} }
} }
@ -213,7 +232,7 @@ func main() {
} else { } else {
for i, c := range test_str_runes { for i, c := range test_str_runes {
if indicesToPrint.contains(i) { if indicesToPrint.contains(i) {
color.New(color.FgRed).Fprintf(out, "%c", c) color.New(color.FgRed, color.Bold).Fprintf(out, "%c", c)
// Newline after every match - only if -o is enabled and -v is disabled. // Newline after every match - only if -o is enabled and -v is disabled.
if *onlyFlag && !(*invertFlag) { if *onlyFlag && !(*invertFlag) {
for matchIdxNum, idx := range matchIndices { for matchIdxNum, idx := range matchIndices {
@ -243,3 +262,4 @@ func main() {
} }
} }
} }
}

Loading…
Cancel
Save