-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
132 lines (120 loc) · 2.01 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"bufio"
"fmt"
"io"
"os"
"os/user"
"path/filepath"
)
type Reader struct {
b *bufio.Reader
buf []byte
}
func NewReader(b *bufio.Reader) *Reader {
return &Reader{
b: b,
buf: make([]byte, 128),
}
}
func (r *Reader) ReadBytes(delim byte) ([]byte, error) {
var frag []byte
var err error
r.buf = r.buf[:0]
for {
var e error
frag, e = r.b.ReadSlice(delim)
if e == nil { // got final fragment
break
}
if e != bufio.ErrBufferFull { // unexpected error
err = e
break
}
r.buf = append(r.buf, frag...)
}
r.buf = append(r.buf, frag...)
// if len(r.buf) != 0 {
// r.buf = r.buf[:len(r.buf)-1]
// }
return r.buf, err
}
func isNumber(b []byte) bool {
for _, c := range b {
// HERE HERE HERE HERE
if c-'0' > '9' {
return false
}
// if c < '0' || c > '9' {
// return false
// }
}
return true
}
func readHistory(f *os.File) error {
r := Reader{
b: bufio.NewReader(f),
buf: make([]byte, 128),
}
w := bufio.NewWriter(os.Stdout)
var err error
for {
b, e := r.ReadBytes('\n')
if len(b) != 0 && b[0] != '#' {
if _, ew := w.Write(b); ew != nil {
if e == nil || e == io.EOF {
e = ew
}
}
}
if e != nil {
if e != io.EOF {
err = e
}
break
}
}
return err
}
func isDir(name string) bool {
fi, err := os.Stat(name)
return err == nil && fi.IsDir()
}
func homedir() (string, error) {
if s := os.Getenv("HOME"); s != "" && isDir(s) {
return s, nil
}
u, err := user.Current()
if err != nil {
return "", err
}
return u.HomeDir, nil
}
func realMain() error {
home, err := homedir()
if err != nil {
return err
}
path := filepath.Join(home, ".bash_history")
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()
return readHistory(f)
}
func isDigit(c byte) bool {
return c-'0' <= 9
}
func main() {
{
for i := '!'; i < '~'; i++ {
fmt.Printf("%c: %t\n", i, isDigit(byte(i)))
}
return
}
if err := realMain(); err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err)
os.Exit(1)
}
}