/
commons.go
115 lines (84 loc) · 2.44 KB
/
commons.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
/*
Copyright 2019 Jerome Delvigne
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package dsx contains code for the dsxutl command
package dsx
import (
"bufio"
"fmt"
"os"
"strings"
"golang.org/x/text/encoding"
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/transform"
)
// Some Constants
const (
beginHeader string = "BEGIN HEADER"
endHeader string = "END HEADER"
characterSet string = " CharacterSet"
beginDSJOB string = "BEGIN DSJOB"
endDSJOB string = "END DSJOB"
beginDSEXECJOB string = "BEGIN DSEXECJOB"
endDSEXECJOB string = "END DSEXECJOB"
beginDSROUTINES string = "BEGIN DSROUTINES"
endDSROUTINES string = "END DSROUTINES"
dsroutineIDENTIFIER string = " Identifier"
dsroutineCATEGORY string = " Category"
beginDSRECORD string = " BEGIN DSRECORD"
endDSRECORD string = " END DSRECORD"
toolInstanceID string = " ToolInstanceID"
dsjobIDENTIFIER string = " Identifier"
dsjobCATEGORY string = " Category"
bufferSize = 1024 * 1024
)
// Command ...
type Command interface {
Process()
}
var csMap = map[string]encoding.Encoding{
"CP1252": charmap.Windows1252,
}
// Check error returned by I/O functions
func check(e error) {
if e != nil {
if os.IsNotExist(e) {
fmt.Fprintln(os.Stderr, e)
os.Exit(1)
}
panic(e)
}
}
// open a file
// TODO: check the DSX charset here and return the appropriate scanner
func openFile(fileName string) (*os.File, *transform.Reader) {
cs, err := extractCharset(fileName)
check(err)
f, err := os.Open(fileName)
check(err)
r := transform.NewReader(f, csMap[cs].NewDecoder())
return f, r
}
func extractCharset(fileName string) (charset string, err error) {
f, err := os.Open(fileName)
check(err)
defer f.Close()
check(err)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, characterSet) {
return strings.Split(line, "\"")[1], nil
}
}
return "", fmt.Errorf("CharacterSet not found in %s", f.Name())
}