You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.7 KiB
83 lines
1.7 KiB
5 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"flag"
|
||
|
"log"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
targetFile = "code"
|
||
|
snippetEnding = ".snippet"
|
||
|
lineNumberEnding = ".lineno"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
start := flag.String("start", "", "the starting delimiter, uncommented")
|
||
|
end := flag.String("end", "", "the ending delimiter, uncommented")
|
||
|
sourceFile := flag.String("file", "", "the source file")
|
||
|
|
||
|
flag.Parse()
|
||
|
|
||
|
// this could be parameterised at some point
|
||
|
*start = "// " + *start
|
||
|
*end = "// " + *end
|
||
|
|
||
|
file, err := os.Open(*sourceFile)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
codeDest, err := os.Create(targetFile + snippetEnding)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer codeDest.Close()
|
||
|
|
||
|
lineDest, err := os.Create(targetFile + lineNumberEnding)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer lineDest.Close()
|
||
|
|
||
|
scanner := bufio.NewScanner(file)
|
||
|
|
||
|
// find start
|
||
|
for lineno := gotoStart(scanner, *start); lineno != -1; lineno = gotoStart(scanner, *start) {
|
||
|
// write line number
|
||
|
_, _ = lineDest.WriteString(strconv.Itoa(lineno))
|
||
|
// write source cod
|
||
|
_, _ = codeDest.WriteString(strings.ReplaceAll(scanner.Text(), *start, "// ...") + "\n")
|
||
|
|
||
|
// scan until end and write
|
||
|
for scanner.Scan() {
|
||
|
if strings.TrimSpace(scanner.Text()) == *end {
|
||
|
_, _ = codeDest.WriteString(strings.ReplaceAll(scanner.Text(), *end, "// ...") + "\n")
|
||
|
break
|
||
|
}
|
||
|
_, _ = codeDest.WriteString(scanner.Text() + "\n")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := scanner.Err(); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
_ = codeDest.Sync()
|
||
|
_ = lineDest.Sync()
|
||
|
}
|
||
|
|
||
|
func gotoStart(s *bufio.Scanner, start string) (linenumber int) {
|
||
|
for s.Scan() {
|
||
|
if strings.TrimSpace(s.Text()) == start {
|
||
|
return linenumber
|
||
|
}
|
||
|
linenumber++
|
||
|
}
|
||
|
return -1
|
||
|
}
|