Home | History | Annotate | Download | only in obj
      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 // +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 
     11 package main
     12 
     13 import (
     14 	"bufio"
     15 	"flag"
     16 	"fmt"
     17 	"log"
     18 	"os"
     19 	"regexp"
     20 	"strings"
     21 )
     22 
     23 var (
     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 
     29 var Are = regexp.MustCompile(`^\tA([A-Z0-9]+)`)
     30 
     31 func 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 
     96 const header = `// Generated by stringer -i %s -o %s -p %s
     97 // Do not edit.
     98 
     99 package %s
    100 
    101 import "cmd/internal/obj"
    102 
    103 var Anames = []string{
    104 `
    105