Skip to content

Commit ae6a969

Browse files
committed
Add -d command-line flag for pre-defining variables
Compare the -D flag in Clang
1 parent c7bbdcf commit ae6a969

File tree

3 files changed

+76
-16
lines changed

3 files changed

+76
-16
lines changed

cmd/ascii2der/main.go

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,70 @@ import (
2020
"fmt"
2121
"io/ioutil"
2222
"os"
23+
"strings"
2324
)
2425

26+
// pairs conforms to flag.Value. Each time Set() is called, it collects another
27+
// k=v pair into itself.
28+
type pairs map[string]string
29+
30+
func (p pairs) String() string {
31+
return ""
32+
}
33+
34+
func (p pairs) Set(pair string) error {
35+
if pair == "" || p == nil {
36+
return nil
37+
}
38+
39+
split := strings.SplitN(pair, "=", 2)
40+
if len(split) != 2 {
41+
return fmt.Errorf("missing \"=\": %q", pair)
42+
}
43+
44+
p[split[0]] = split[1]
45+
return nil
46+
}
47+
48+
var defines = make(map[string]string)
49+
var fileDefines = make(map[string]string)
50+
51+
func init() {
52+
flag.Var(pairs(defines), "d",
53+
`pair of the form a=b; define("a", "b") is inserted at the start of the input`+
54+
"\nmay occur multiple times")
55+
flag.Var(pairs(fileDefines), "df",
56+
`like -d, except the second value is interpreted as a binary file to read`+
57+
"\nmay occur multiple times")
58+
}
59+
2560
var inPath = flag.String("i", "", "input file to use (defaults to stdin)")
2661
var outPath = flag.String("o", "", "output file to use (defaults to stdout)")
2762
var pemType = flag.String("pem", "", "if provided, format the output as a PEM block with this type")
2863

64+
func readAll(path string) []byte {
65+
var file *os.File
66+
if path == "" {
67+
file = os.Stdin
68+
} else {
69+
var err error
70+
file, err = os.Open(path)
71+
if err != nil {
72+
fmt.Fprintf(os.Stderr, "Error opening %s: %s\n", path, err)
73+
os.Exit(1)
74+
}
75+
defer file.Close()
76+
}
77+
78+
buf, err := ioutil.ReadAll(file)
79+
if err != nil {
80+
fmt.Fprintf(os.Stderr, "Error reading %s: %s\n", path, err)
81+
os.Exit(1)
82+
}
83+
84+
return buf
85+
}
86+
2987
func main() {
3088
flag.Parse()
3189

@@ -35,24 +93,25 @@ func main() {
3593
os.Exit(1)
3694
}
3795

38-
inFile := os.Stdin
39-
if *inPath != "" {
40-
var err error
41-
inFile, err = os.Open(*inPath)
42-
if err != nil {
43-
fmt.Fprintf(os.Stderr, "Error opening %s: %s\n", *inPath, err)
96+
inBytes := readAll(*inPath)
97+
98+
vars := make(map[string][]byte)
99+
for k, v := range defines {
100+
if _, ok := vars[k]; ok {
101+
fmt.Fprintf(os.Stderr, "Error: tried to define %q with flags twice\n", k)
44102
os.Exit(1)
45103
}
46-
defer inFile.Close()
104+
vars[k] = []byte(v)
47105
}
48-
49-
inBytes, err := ioutil.ReadAll(inFile)
50-
if err != nil {
51-
fmt.Fprintf(os.Stderr, "Error reading input: %s\n", err)
52-
os.Exit(1)
106+
for k, v := range fileDefines {
107+
if _, ok := vars[k]; ok {
108+
fmt.Fprintf(os.Stderr, "Error: tried to define %q with flags twice\n", k)
109+
os.Exit(1)
110+
}
111+
vars[k] = readAll(v)
53112
}
54113

55-
outBytes, err := asciiToDER(string(inBytes))
114+
outBytes, err := asciiToDER(string(inBytes), vars)
56115
if err != nil {
57116
fmt.Fprintf(os.Stderr, "Syntax error: %s\n", err)
58117
os.Exit(1)

cmd/ascii2der/scanner.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,9 @@ func asciiToDERImpl(scanner *scanner, left *token) ([]byte, []token, error) {
594594
}
595595
}
596596

597-
func asciiToDER(input string) ([]byte, error) {
597+
func asciiToDER(input string, vars map[string][]byte) ([]byte, error) {
598598
scanner := newScanner(input)
599+
scanner.vars = vars
599600
bytes, _, err := asciiToDERImpl(scanner, nil)
600601
return bytes, err
601602
}

cmd/ascii2der/scanner_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ var asciiToDERTests = []struct {
426426
{"1...2", nil, false},
427427
{"true", nil, false},
428428
{"false", nil, false},
429-
// Mismatched curlies.
429+
// Mismatched brackets.
430430
{"{", nil, false},
431431
{"}", nil, false},
432432
{"(", nil, false},
@@ -472,7 +472,7 @@ var asciiToDERTests = []struct {
472472

473473
func TestASCIIToDER(t *testing.T) {
474474
for i, tt := range asciiToDERTests {
475-
out, err := asciiToDER(tt.in)
475+
out, err := asciiToDER(tt.in, make(map[string][]byte))
476476
ok := err == nil
477477
if !tt.ok {
478478
if ok {

0 commit comments

Comments
 (0)