Ai
1 Star 0 Fork 0

张马良_16340291/ServiceComputing

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
selpg.go 3.50 KB
一键复制 编辑 原始数据 按行查看 历史
张马良_16340291 提交于 2018-10-12 00:53 +08:00 . 添加注释
package main
import (
"bufio"
flag "github.com/spf13/pflag"
"fmt"
"io"
"os"
"os/exec"
)
type selpgargs struct {
start_page int
end_page int
input_file string
destination string
page_len int
form_deli string
}
var progname string
func FlagInit(args *selpgargs) {
flag.IntVarP(&args.start_page, "startPage", "s", -1, "Start page number")
flag.IntVarP(&args.end_page, "endPage", "e", -1, "End page number")
flag.IntVarP(&args.page_len, "pageLength", "l", 72, "Line numbers for a page")
flag.StringVarP(&args.form_deli, "type", "f", "l", "Determine form-feed-delimited")
flag.StringVarP(&args.destination, "dest", "d", "", "set printer")
flag.Usage = func () {
fmt.Printf("%s is a tool to select pages from your chosen file\n\n", progname)
fmt.Printf("Usage:\n\n")
fmt.Printf("\tselpg -s start_page -e end_page [-f (speciy how the page is sperated)| -l lines_per_page_default_72] [-d dest] [filename]\n\n")
fmt.Printf("If no file specified, %s will read input from stdin, and use control-D to end.\n\n", progname)
}
flag.Parse()
}
func ProcessArgs(args *selpgargs) {
if len(os.Args)<3 {
fmt.Fprintf(os.Stderr, "%s: not enough arguments\n\n", progname)
flag.Usage()
os.Exit(1)
}
if os.Args[1]!= "-s" {
fmt.Fprintf(os.Stderr, "%s: 1st arg should be -s\n\n", progname)
flag.Usage()
os.Exit(1)
}
end_index := 2
//若default则为2
if len(os.Args[1]) == 2 {
end_index = 3
}
if os.Args[end_index] != "-e" {
fmt.Fprintf(os.Stderr, "%s: 2st arg should be -e\n\n", progname)
flag.Usage()
os.Exit(1)
}
if args.start_page > args.end_page || args.start_page < 0 ||
args.end_page < 0 {
fmt.Fprintln(os.Stderr, "Invalid arguments")
flag.Usage()
os.Exit(1)
}
}
func ProcessInput(args *selpgargs) {
var stdin io.WriteCloser
var err error
var cmd *exec.Cmd
if args.destination != "" {
cmd = exec.Command("cat", "-n")
stdin, err = cmd.StdinPipe()
if err != nil {
fmt.Println(err)
}
} else {
stdin = nil
}
if flag.NArg() > 0 {
args.input_file = flag.Arg(0)
output, err := os.Open(args.input_file)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
reader := bufio.NewReader(output)
if args.form_deli != "l" {
for pageNum := 0; pageNum <= args.end_page; pageNum++ {
line, err := reader.ReadString('\f')
if err != io.EOF && err != nil {
fmt.Println(err)
os.Exit(1)
}
if err == io.EOF {
break
}
printOrWrite(args, string(line), stdin)
}
} else {
count := 0
for {
line, _, err := reader.ReadLine()
if err != io.EOF && err != nil {
fmt.Println(err)
os.Exit(1)
}
if err == io.EOF {
break
}
if count/args.page_len >= args.start_page {
if count/args.page_len > args.end_page {
break
} else {
printOrWrite(args, string(line), stdin)
}
}
count++
}
}
} else {
scanner := bufio.NewScanner(os.Stdin)
count := 0
target := ""
for scanner.Scan() {
line := scanner.Text()
line += "\n"
if count/args.page_len >= args.start_page {
if count/args.page_len <= args.end_page {
target += line
}
}
count++
}
printOrWrite(args, string(target), stdin)
}
if args.destination != "" {
stdin.Close()
cmd.Stdout = os.Stdout
cmd.Run()
}
}
func printOrWrite(args *selpgargs, line string, stdin io.WriteCloser) {
if args.destination != "" {
stdin.Write([]byte(line + "\n"))
} else {
fmt.Println(line)
}
}
func main() {
progname = os.Args[0]
var args selpgargs
FlagInit(&args)
ProcessArgs(&args)
ProcessInput(&args)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/maliangzhang/ServiceComputing.git
git@gitee.com:maliangzhang/ServiceComputing.git
maliangzhang
ServiceComputing
ServiceComputing
master

搜索帮助