105 lines
2.2 KiB
Go
105 lines
2.2 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build ignore
|
|
|
|
// This is a mini version of the stringer tool customized for the Anames table
|
|
// in the architecture support for obj.
|
|
// This version just generates the slice of strings, not the String method.
|
|
|
|
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
input = flag.String("i", "", "input file name")
|
|
output = flag.String("o", "", "output file name")
|
|
pkg = flag.String("p", "", "package name")
|
|
)
|
|
|
|
var Are = regexp.MustCompile(`^\tA([A-Z0-9]+)`)
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
if *input == "" || *output == "" || *pkg == "" {
|
|
flag.Usage()
|
|
os.Exit(2)
|
|
}
|
|
in, err := os.Open(*input)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fd, err := os.Create(*output)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
out := bufio.NewWriter(fd)
|
|
defer out.Flush()
|
|
var on = false
|
|
s := bufio.NewScanner(in)
|
|
first := true
|
|
for s.Scan() {
|
|
line := s.Text()
|
|
if !on {
|
|
// First relevant line contains "= obj.ABase".
|
|
// If we find it, delete the = so we don't stop immediately.
|
|
const prefix = "= obj.ABase"
|
|
index := strings.Index(line, prefix)
|
|
if index < 0 {
|
|
continue
|
|
}
|
|
// It's on. Start with the header.
|
|
fmt.Fprintf(out, header, *input, *output, *pkg, *pkg)
|
|
on = true
|
|
line = line[:index]
|
|
}
|
|
// Strip comments so their text won't defeat our heuristic.
|
|
index := strings.Index(line, "//")
|
|
if index > 0 {
|
|
line = line[:index]
|
|
}
|
|
index = strings.Index(line, "/*")
|
|
if index > 0 {
|
|
line = line[:index]
|
|
}
|
|
// Termination condition: Any line with an = changes the sequence,
|
|
// so stop there, and stop at a closing brace.
|
|
if strings.HasPrefix(line, "}") || strings.ContainsRune(line, '=') {
|
|
break
|
|
}
|
|
sub := Are.FindStringSubmatch(line)
|
|
if len(sub) < 2 {
|
|
continue
|
|
}
|
|
if first {
|
|
fmt.Fprintf(out, "\tobj.A_ARCHSPECIFIC: %q,\n", sub[1])
|
|
first = false
|
|
} else {
|
|
fmt.Fprintf(out, "\t%q,\n", sub[1])
|
|
}
|
|
}
|
|
fmt.Fprintln(out, "}")
|
|
if s.Err() != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
const header = `// Generated by stringer -i %s -o %s -p %s
|
|
// Do not edit.
|
|
|
|
package %s
|
|
|
|
import "github.com/google/gops/internal/obj"
|
|
|
|
var Anames = []string{
|
|
`
|