modernc.org/z@v1.7.4/addport.go (about)

     1  // Copyright 2021 The Z 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  // +build ignore
     7  
     8  package main
     9  
    10  import (
    11  	"fmt"
    12  	"os"
    13  	"path/filepath"
    14  	"strings"
    15  )
    16  
    17  func fail(rc int, msg string, args ...interface{}) {
    18  	fmt.Fprintf(os.Stderr, msg, args...)
    19  	os.Exit(rc)
    20  }
    21  
    22  func main() {
    23  	if len(os.Args) != 3 {
    24  		fail(1, "expected 2 args: pattern and replacement\n")
    25  	}
    26  
    27  	pattern := os.Args[1]
    28  	replacement := os.Args[2]
    29  	if err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
    30  		if err != nil {
    31  			return err
    32  		}
    33  
    34  		if info.IsDir() {
    35  			return nil
    36  		}
    37  
    38  		dir, file := filepath.Split(path)
    39  		if x := strings.Index(file, pattern); x >= 0 {
    40  			// pattern      freebsd
    41  			// replacement  netbsd
    42  			// file         libc_freebsd_amd64.go
    43  			// replaced     libc_netbsd_amd64.go
    44  			//              01234567890123456789
    45  			//                        1
    46  			// x            5
    47  			file = file[:x] + replacement + file[x+len(pattern):]
    48  			dst := filepath.Join(dir, file)
    49  			b, err := os.ReadFile(path)
    50  			if err != nil {
    51  				return fmt.Errorf("reading %s: %v", path, err)
    52  			}
    53  
    54  			if err := os.WriteFile(dst, b, 0640); err != nil {
    55  				return fmt.Errorf("writing %s: %v", dst, err)
    56  			}
    57  			fmt.Printf("%s -> %s\n", path, dst)
    58  		}
    59  
    60  		return nil
    61  	}); err != nil {
    62  		fail(1, "%s", err)
    63  	}
    64  }