func (p *printer) escape(s string) string {
	p.litbuf.Reset()
	p.litbuf.WriteByte(tabwriter.Escape)
	p.litbuf.WriteString(s)
	p.litbuf.WriteByte(tabwriter.Escape)
	return p.litbuf.String()
}
escape escapes string s by bracketing it with tabwriter.Escape.
Escaped strings pass through tabwriter unchanged. (Note that
valid Go programs cannot contain tabwriter.Escape bytes since
they do not appear in legal UTF-8 sequences).
package printer
import (
	"bytes"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"runtime"
	"text/tabwriter"
	"github.com/rogpeppe/godef/go/ast"
	"github.com/rogpeppe/godef/go/token"
)
const debug = false  
type whiteSpace int
const (
	ignore   = whiteSpace(0)
	blank    = whiteSpace(' ')
	vtab     = whiteSpace('\v')
	newline  = whiteSpace('\n')
	formfeed = whiteSpace('\f')
	indent   = whiteSpace('>')
	unindent = whiteSpace('<')
)
var (
	esc       = []byte{tabwriter.Escape}
	htab      = []byte{'\t'}
	htabs     = []byte("\t\t\t\t\t\t\t\t")
	newlines  = []byte("\n\n\n\n\n\n\n\n")  
	formfeeds = []byte("\f\f\f\f\f\f\f\f")  
)
var noPos token.Position  
var infinity = 1 << 30
var ignoreMultiLine = new(bool)
type pmode int
const (
	inLiteral pmode = 1 << iota
	noExtraLinebreak
)
type printer struct {
	output io.Writer
	Config
	fset   *token.FileSet
	errors chan error
	written int          
	indent  int          
	mode    pmode        
	lastTok token.Token  
	wsbuf  []whiteSpace  
	litbuf bytes.Buffer  
	pos token.Position
	last token.Position
	comments        []*ast.CommentGroup  
	cindex          int                  
	useNodeComments bool                 
	nodeSizes map[ast.Node]int
}
func (p *printer) init(output io.Writer, cfg *Config, fset *token.FileSet, nodeSizes map[ast.Node]int) {
	p.output = output
	p.Config = *cfg
	p.fset = fset
	p.errors = make(chan error)
	p.wsbuf = make([]whiteSpace, 0, 16)  
	p.nodeSizes = nodeSizes
}
func (p *printer) internalError(msg ...interface{}) {
	if debug {
		fmt.Print(p.pos.String() + ": ")
		fmt.Println(msg...)
		panic("go/printer")
	}
}