Started working on multiple filename arguments; prefix each line with filename containing the line; mostly indentation changes
This commit is contained in:
		
							
								
								
									
										38
									
								
								cmd/main.go
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								cmd/main.go
									
									
									
									
									
								
							| @@ -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() { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user