Added 'line number' flag, and added check for empty file.
I added a 'line number' flag ('-n') which will print the line number
with padding before every line. To ensure that a line number isn't printed when
trying to 'ccat' an empty file, I added a check to see if the file is empty.
If it is, the program exits.
			
			
This commit is contained in:
		
							
								
								
									
										46
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								main.go
									
									
									
									
									
								
							@@ -1,9 +1,11 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/user"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
@@ -60,8 +62,19 @@ func printFile(fileName string) {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeLineNumDigits computes the number of digits in the number of lines
 | 
			
		||||
// in the given byte array.
 | 
			
		||||
func computeLineNumDigits(data []byte) int {
 | 
			
		||||
	numLines := bytes.Count(data, []byte{'\n'}) + 1
 | 
			
		||||
	return int(math.Round(math.Log10(float64(numLines))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	disableColorFlag := flag.Bool("d", false, "Disable color")
 | 
			
		||||
	lineNumberFlag := flag.Bool("n", false, "Print line numbers")
 | 
			
		||||
	// Used only if lineNumberFlag is true
 | 
			
		||||
	var lineNumDigits int
 | 
			
		||||
	var lineNum int
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	// Check if config exists. If it doesn't, generate the config files.
 | 
			
		||||
@@ -96,6 +109,18 @@ func main() {
 | 
			
		||||
		printFile(fileName)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// To save computing time, determine here if the file is empty. If it is, exit
 | 
			
		||||
	// the program.
 | 
			
		||||
	finfo, err := os.Stat(fileName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	if finfo.Size() == 0 {
 | 
			
		||||
		os.Exit(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Assuming the file is not empty...
 | 
			
		||||
	// If the given file has a config, load the config into a stack of regColors.
 | 
			
		||||
	regColorStack, err := loadConfig(configFilename)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -108,6 +133,11 @@ func main() {
 | 
			
		||||
		printErrAndExit(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the '-n' flag is set, compute the number of digits in the number of lines
 | 
			
		||||
	// in the file, to determine the padding for the line numbers.
 | 
			
		||||
	if *lineNumberFlag {
 | 
			
		||||
		lineNumDigits = computeLineNumDigits(data)
 | 
			
		||||
	}
 | 
			
		||||
	// For each regular expression in the stack, apply it to the byte slice. Find
 | 
			
		||||
	// the first and last index of all matches of the regex. Then apply the corresponding color
 | 
			
		||||
	// to every character within these indices.
 | 
			
		||||
@@ -136,7 +166,21 @@ func main() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// After all possible regexes have been matched, print out the contents of 'units'.
 | 
			
		||||
	for _, unit := range units {
 | 
			
		||||
 | 
			
		||||
	// If the line number flag is set, initialize the lineNum variable and print the first line number
 | 
			
		||||
	// with the appropriate padding.
 | 
			
		||||
	if *lineNumberFlag {
 | 
			
		||||
		lineNum = 1
 | 
			
		||||
		fmt.Printf("   %*d  ", lineNumDigits, lineNum)
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	for idx, unit := range units {
 | 
			
		||||
		unit.print()
 | 
			
		||||
		// If the flag is set and we encounter a newline (and the newline isn't a trailing newline),
 | 
			
		||||
		// then print the next line number.
 | 
			
		||||
		if *lineNumberFlag && unit.ch == '\n' && idx != len(units)-1 {
 | 
			
		||||
			fmt.Printf("   %*d  ", lineNumDigits, lineNum)
 | 
			
		||||
			lineNum++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user