internal/main.go
func Main() error {
	aggressive := flag.Bool("aggressive", false, "Aggressive deduplication including non pointers")
	parse := flag.Bool("parse", true, "Parses source files to deduct types; use -parse=false to work around bugs in source parser")
	rebase := flag.Bool("rebase", true, "Guess GOROOT and GOPATH")
	verboseFlag := flag.Bool("v", false, "Enables verbose logging output")
	filterFlag := flag.String("f", "", "Regexp to filter out headers that match, ex: -f 'IO wait|syscall'")
	matchFlag := flag.String("m", "", "Regexp to filter by only headers that match, ex: -m 'semacquire'")
	// Console only.
	fullPath := flag.Bool("full-path", false, "Print full sources path")
	noColor := flag.Bool("no-color", !isatty.IsTerminal(os.Stdout.Fd()) || os.Getenv("TERM") == "dumb", "Disable coloring")
	forceColor := flag.Bool("force-color", false, "Forcibly enable coloring when with stdout is redirected")
	// HTML only.
	html := flag.String("html", "", "Output an HTML file")
	flag.Parse()

	log.SetFlags(log.Lmicroseconds)
	if !*verboseFlag {
		log.SetOutput(ioutil.Discard)
	}

	var err error
	var filter *regexp.Regexp
	if *filterFlag != "" {
		if filter, err = regexp.Compile(*filterFlag); err != nil {
			return err
		}
	}

	var match *regexp.Regexp
	if *matchFlag != "" {
		if match, err = regexp.Compile(*matchFlag); err != nil {
			return err
		}
	}

	s := stack.AnyPointer
	if *aggressive {
		s = stack.AnyValue
	}

	var out io.Writer = os.Stdout
	p := &defaultPalette
	if *html == "" {
		if *noColor && !*forceColor {
			p = &Palette{}
		} else {
			out = colorable.NewColorableStdout()
		}
	}

	var in *os.File
	switch flag.NArg() {
	case 0:
		in = os.Stdin
		// Explicitly silence SIGQUIT, as it is useful to gather the stack dump
		// from the piped command..
		signals := make(chan os.Signal)
		go func() {
			for {
				<-signals
			}
		}()
		signal.Notify(signals, os.Interrupt, syscall.SIGQUIT)

	case 1:
		// Do not handle SIGQUIT when passed a file to process.
		name := flag.Arg(0)
		if in, err = os.Open(name); err != nil {
			return fmt.Errorf("did you mean to specify a valid stack dump file name? %s", err)
		}
		defer in.Close()

	default:
		return errors.New("pipe from stdin or specify a single file")
	}
	return process(in, out, p, s, *fullPath, *parse, *rebase, *html, filter, match)
}
func Main() error {
	aggressive := flag.Bool("aggressive", false, "Aggressive deduplication including non pointers")
	parse := flag.Bool("parse", true, "Parses source files to deduct types; use -parse=false to work around bugs in source parser")
	rebase := flag.Bool("rebase", true, "Guess GOROOT and GOPATH")
	verboseFlag := flag.Bool("v", false, "Enables verbose logging output")
	filterFlag := flag.String("f", "", "Regexp to filter out headers that match, ex: -f 'IO wait|syscall'")
	matchFlag := flag.String("m", "", "Regexp to filter by only headers that match, ex: -m 'semacquire'")
	// Console only.
	fullPath := flag.Bool("full-path", false, "Print full sources path")
	noColor := flag.Bool("no-color", !isatty.IsTerminal(os.Stdout.Fd()) || os.Getenv("TERM") == "dumb", "Disable coloring")
	forceColor := flag.Bool("force-color", false, "Forcibly enable coloring when with stdout is redirected")
	// HTML only.
	html := flag.String("html", "", "Output an HTML file")
	flag.Parse()

	log.SetFlags(log.Lmicroseconds)
	if !*verboseFlag {
		log.SetOutput(ioutil.Discard)
	}

	var err error
	var filter *regexp.Regexp
	if *filterFlag != "" {
		if filter, err = regexp.Compile(*filterFlag); err != nil {
			return err
		}
	}

	var match *regexp.Regexp
	if *matchFlag != "" {
		if match, err = regexp.Compile(*matchFlag); err != nil {
			return err
		}
	}

	s := stack.AnyPointer
	if *aggressive {
		s = stack.AnyValue
	}

	var out io.Writer = os.Stdout
	p := &defaultPalette
	if *html == "" {
		if *noColor && !*forceColor {
			p = &Palette{}
		} else {
			out = colorable.NewColorableStdout()
		}
	}

	var in *os.File
	switch flag.NArg() {
	case 0:
		in = os.Stdin
		// Explicitly silence SIGQUIT, as it is useful to gather the stack dump
		// from the piped command..
		signals := make(chan os.Signal)
		go func() {
			for {
				<-signals
			}
		}()
		signal.Notify(signals, os.Interrupt, syscall.SIGQUIT)

	case 1:
		// Do not handle SIGQUIT when passed a file to process.
		name := flag.Arg(0)
		if in, err = os.Open(name); err != nil {
			return fmt.Errorf("did you mean to specify a valid stack dump file name? %s", err)
		}
		defer in.Close()

	default:
		return errors.New("pipe from stdin or specify a single file")
	}
	return process(in, out, p, s, *fullPath, *parse, *rebase, *html, filter, match)
}
func Main ( ) error { aggressive := flag . Bool ( " " , false , " " ) parse := flag . Bool ( " " , true , " " ) rebase := flag . Bool ( " " , true , " " ) verboseFlag := flag . Bool ( " " , false , " " ) filterFlag := flag . String ( " " , " " , " " ) matchFlag := flag . String ( " " , " " , " " ) // Console only. fullPath := flag . Bool ( " " , false , " " ) noColor := flag . Bool ( " " , ! isatty . IsTerminal ( os . Stdout . Fd ( ) ) || os . Getenv ( " " ) == " " , " " ) forceColor := flag . Bool ( " " , false , " " ) // HTML only. html := flag . String ( " " , " " , " " ) flag . Parse ( ) log . SetFlags ( log . Lmicroseconds ) if ! * verboseFlag { log . SetOutput ( ioutil . Discard ) } var err error var filter * regexp . Regexp if * filterFlag != " " { if filter , err = regexp . Compile ( * filterFlag ) ; err != nil { return err } } var match * regexp . Regexp if * matchFlag != " " { if match , err = regexp . Compile ( * matchFlag ) ; err != nil { return err } } s := stack . AnyPointer if * aggressive { s = stack . AnyValue } var out io . Writer = os . Stdout p := & defaultPalette if * html == " " { if * noColor && ! * forceColor { p = & Palette { } } else { out = colorable . NewColorableStdout ( ) } } var in * os . File switch flag . NArg ( ) { case 0 : in = os . Stdin // Explicitly silence SIGQUIT, as it is useful to gather the stack dump // from the piped command.. signals := make ( chan os . Signal ) go func ( ) { for { <- signals } } ( ) signal . Notify ( signals , os . Interrupt , syscall . SIGQUIT ) case 1 : // Do not handle SIGQUIT when passed a file to process. name := flag . Arg ( 0 ) if in , err = os . Open ( name ) ; err != nil { return fmt . Errorf ( " " , err ) } defer in . Close ( ) default : return errors . New ( " " ) } return process ( in , out , p , s , * fullPath , * parse , * rebase , * html , filter , match ) }
// Main is implemented here so both 'pp' and 'panicparse' executables can be
// compiled. This is to work around the Perl Package manager 'pp' that is
// preinstalled on some OSes.
Main is implemented here so both pp and panicparse executables can be compiled . This is to work around the Perl Package manager pp that is preinstalled on some OSes .