-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathwriter.go
More file actions
148 lines (128 loc) · 3.09 KB
/
Copy pathwriter.go
File metadata and controls
148 lines (128 loc) · 3.09 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// 2019, Georg Sauthoff <mail@gms.tf>
// SPDX-License-Identifier: GPL-3.0-or-later
package main
import (
"bufio"
"io"
"log"
"os"
)
func open_input(filename string) io.Reader {
if filename == "-" {
return os.Stdin
} else {
f, err := os.OpenFile(filename, os.O_RDONLY, 0644)
if err != nil {
log.Fatal(err)
}
return f
// we don't need to a buffered file because we do the reads
// with an optimal block size
// return bufio.NewReader(f)
}
}
func open_output(filename string) io.WriteCloser {
h, err := new_buf_file_writer(filename)
if err != nil {
log.Fatal(err)
}
return h
}
func open_output_or_stdout(filename string) io.WriteCloser {
var out io.WriteCloser
if filename == "-" {
out = new_buf_fd_writer(os.Stdout)
} else {
out = open_output(filename)
}
return out
}
// i.e. to wrap the last stream - e.g. stdout
type keep_open_writer struct {
out io.WriteCloser
}
func (w *keep_open_writer) Write(block []byte) (int, error) {
return w.out.Write(block)
}
func (w *keep_open_writer) Close() error {
return nil
}
func new_keep_open_writer(out io.WriteCloser) *keep_open_writer {
return &keep_open_writer{out}
}
type close_writer struct {
out io.Writer
}
func (w *close_writer) Write(block []byte) (int, error) {
return w.out.Write(block)
}
func (w *close_writer) Close() error {
return nil
}
func new_close_writer(out io.Writer) *close_writer {
return &close_writer{out}
}
type dev_null_writer struct {
}
func new_dev_null_writer() *dev_null_writer {
return &dev_null_writer{}
}
func (w *dev_null_writer) Close() error {
return nil
}
func (w *dev_null_writer) Write(block []byte) (int, error) {
return len(block), nil
}
type buf_file_writer struct {
f *os.File
b *bufio.Writer
}
func (w *buf_file_writer) Write(block []byte) (int, error) {
return w.b.Write(block)
}
func (w *buf_file_writer) Close() error {
if err := w.b.Flush(); err != nil {
return err
}
return w.f.Close()
}
func new_buf_file_writer(filename string) (*buf_file_writer, error) {
r := new(buf_file_writer)
var err error
r.f, err = os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return nil, err
}
r.b = bufio.NewWriter(r.f)
return r, nil
}
func new_buf_fd_writer(f *os.File) *buf_file_writer {
r := new(buf_file_writer)
r.f = f
r.b = bufio.NewWriter(r.f)
return r
}
type multiWriteCloser struct {
writers []io.WriteCloser
}
func newMultiWriteCloser(writers ...io.WriteCloser) io.WriteCloser {
return &multiWriteCloser{writers}
}
func (w *multiWriteCloser) Write(block []byte) (int, error) {
for _, x := range w.writers {
n, err := x.Write(block)
if err != nil {
return n, err
}
}
return len(block), nil
}
func (w *multiWriteCloser) Close() error {
for _, x := range w.writers {
err := x.Close()
if err != nil {
return err
}
}
return nil
}