parent
a0d1313b7f
commit
f3423e3b85
@ -0,0 +1,2 @@ |
||||
wc.exe |
||||
wc |
||||
@ -0,0 +1,4 @@ |
||||
|
||||
|
||||
build: |
||||
go build .
|
||||
@ -0,0 +1,113 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"log" |
||||
"flag" |
||||
"bufio" |
||||
"strings" |
||||
"unicode/utf8" |
||||
) |
||||
|
||||
type Opts struct { |
||||
Bytes bool |
||||
Chars bool |
||||
Words bool |
||||
Lines bool |
||||
} |
||||
|
||||
type Counts struct { |
||||
Bytes int |
||||
Chars int |
||||
Words int |
||||
Lines int |
||||
Filename string |
||||
} |
||||
|
||||
|
||||
func parse_opts() (Opts, []string) { |
||||
var opts Opts |
||||
|
||||
flag.BoolVar(&opts.Bytes, "c", false, "Count bytes") |
||||
flag.BoolVar(&opts.Chars, "m", false, "Count chars") |
||||
flag.BoolVar(&opts.Words, "w", false, "Count words") |
||||
flag.BoolVar(&opts.Lines, "l", false, "Count lines") |
||||
|
||||
flag.Parse() |
||||
|
||||
if flag.NArg() == 0 { |
||||
log.Fatal("USAGE: wc [-l] [-w] [-m] [-c] <files>") |
||||
} |
||||
|
||||
if !opts.Bytes && !opts.Chars && !opts.Words && !opts.Lines { |
||||
opts.Lines = true |
||||
} |
||||
|
||||
return opts, flag.Args() |
||||
} |
||||
|
||||
|
||||
func count_file(opts *Opts, filename string) Counts { |
||||
var counts Counts |
||||
|
||||
in_file, err := os.Open(filename) |
||||
if err != nil { log.Fatal(err) } |
||||
defer in_file.Close() |
||||
|
||||
scan := bufio.NewScanner(in_file) |
||||
for scan.Scan() { |
||||
line := scan.Text() |
||||
|
||||
if opts.Lines { |
||||
counts.Lines++ |
||||
} |
||||
|
||||
if opts.Words { |
||||
counts.Words += len(strings.Fields(line)) |
||||
} |
||||
|
||||
if opts.Chars { |
||||
counts.Chars += utf8.RuneCountInString(line) + 1 |
||||
} |
||||
|
||||
if opts.Bytes { |
||||
counts.Bytes += len(line) + 1 |
||||
} |
||||
} |
||||
|
||||
if scan.Err() != nil { |
||||
log.Fatal(scan.Err()) |
||||
} |
||||
|
||||
return counts |
||||
} |
||||
|
||||
func print_count(opts *Opts, count *Counts, file string) { |
||||
if opts.Lines { |
||||
fmt.Print(count.Lines, " ") |
||||
} |
||||
|
||||
if opts.Words { |
||||
fmt.Print(count.Words, " ") |
||||
} |
||||
|
||||
if opts.Chars { |
||||
fmt.Print(count.Chars, " ") |
||||
} |
||||
|
||||
if opts.Bytes { |
||||
fmt.Print(count.Bytes, " ") |
||||
} |
||||
|
||||
fmt.Println(" ", file) |
||||
} |
||||
|
||||
func main() { |
||||
opts, files := parse_opts() |
||||
|
||||
for _, file := range files { |
||||
count := count_file(&opts, file) |
||||
print_count(&opts, &count, file) |
||||
} |
||||
} |
||||
Loading…
Reference in new issue