• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build ignore
6
7// This is a mini version of the stringer tool customized for the Anames table
8// in the architecture support for obj.
9// This version just generates the slice of strings, not the String method.
10
11package main
12
13import (
14	"bufio"
15	"flag"
16	"fmt"
17	"log"
18	"os"
19	"regexp"
20	"strings"
21)
22
23var (
24	input  = flag.String("i", "", "input file name")
25	output = flag.String("o", "", "output file name")
26	pkg    = flag.String("p", "", "package name")
27)
28
29var Are = regexp.MustCompile(`^\tA([A-Za-z0-9]+)`)
30
31func main() {
32	flag.Parse()
33	if *input == "" || *output == "" || *pkg == "" {
34		flag.Usage()
35		os.Exit(2)
36	}
37	in, err := os.Open(*input)
38	if err != nil {
39		log.Fatal(err)
40	}
41	fd, err := os.Create(*output)
42	if err != nil {
43		log.Fatal(err)
44	}
45	out := bufio.NewWriter(fd)
46	defer out.Flush()
47	var on = false
48	s := bufio.NewScanner(in)
49	first := true
50	for s.Scan() {
51		line := s.Text()
52		if !on {
53			// First relevant line contains "= obj.ABase".
54			// If we find it, delete the = so we don't stop immediately.
55			const prefix = "= obj.ABase"
56			index := strings.Index(line, prefix)
57			if index < 0 {
58				continue
59			}
60			// It's on. Start with the header.
61			fmt.Fprintf(out, header, *input, *output, *pkg, *pkg)
62			on = true
63			line = line[:index]
64		}
65		// Strip comments so their text won't defeat our heuristic.
66		index := strings.Index(line, "//")
67		if index > 0 {
68			line = line[:index]
69		}
70		index = strings.Index(line, "/*")
71		if index > 0 {
72			line = line[:index]
73		}
74		// Termination condition: Any line with an = changes the sequence,
75		// so stop there, and stop at a closing brace.
76		if strings.HasPrefix(line, "}") || strings.ContainsRune(line, '=') {
77			break
78		}
79		sub := Are.FindStringSubmatch(line)
80		if len(sub) < 2 {
81			continue
82		}
83		if first {
84			fmt.Fprintf(out, "\tobj.A_ARCHSPECIFIC: %q,\n", sub[1])
85			first = false
86		} else {
87			fmt.Fprintf(out, "\t%q,\n", sub[1])
88		}
89	}
90	fmt.Fprintln(out, "}")
91	if s.Err() != nil {
92		log.Fatal(err)
93	}
94}
95
96const header = `// Code generated by stringer -i %s -o %s -p %s; DO NOT EDIT.
97
98package %s
99
100import "cmd/internal/obj"
101
102var Anames = []string{
103`
104