Source File: go-coreutils/grep/main.go

package main

import (
  "fmt"
  "regexp"
  "os"
  "bufio"
  "flag"
  "log"
  "io"
)

func ScanInput(input io.Reader, exp string, prefix string) {
  scan := bufio.NewScanner(input)
  re, err := regexp.Compile(exp)

  if err != nil { log.Fatal(err) }

  for scan.Scan() {
    line := scan.Text()

    if re.MatchString(line) {
      if prefix != "" {
        fmt.Print(prefix, ": ")
      }

      fmt.Println(line)
    }
  }
}

func main() {
  // NOTE: can we avoid flag here since it's just raw args?
  flag.Parse()

  args := flag.Args()

  if len(args) == 0 {
    log.Fatal("USAGE: grep <regex> [files...]")
  } else if len(args) == 1 {
    ScanInput(os.Stdin, args[0], "")
  } else {
    exp := args[0]
    files := args[1:]

    for _, file := range files {
      input, err := os.Open(file)
      if err != nil { log.Fatal(err) }

      ScanInput(input, exp, file)
    }
  }
}