package uritemplate
import (
"bytes"
"strconv"
)
type progOpcode uint16
const (
opRune progOpcode = iota
opRuneClass
opLineBegin
opLineEnd
opCapStart
opCapEnd
opSplit
opJmp
opJmpIfNotDefined
opJmpIfNotEmpty
opJmpIfNotFirst
opEnd
opNoop
opcodeMax
)
var opcodeNames = []string {
"opRune" ,
"opRuneClass" ,
"opLineBegin" ,
"opLineEnd" ,
"opCapStart" ,
"opCapEnd" ,
"opSplit" ,
"opJmp" ,
"opJmpIfNotDefined" ,
"opJmpIfNotEmpty" ,
"opJmpIfNotFirst" ,
"opEnd" ,
}
func (code progOpcode ) String () string {
if code >= opcodeMax {
return ""
}
return opcodeNames [code ]
}
type progOp struct {
code progOpcode
r rune
rc runeClass
i uint32
name string
}
func dumpProgOp(b *bytes .Buffer , op *progOp ) {
b .WriteString (op .code .String ())
switch op .code {
case opRune :
b .WriteString ("(" )
b .WriteString (strconv .QuoteToASCII (string (op .r )))
b .WriteString (")" )
case opRuneClass :
b .WriteString ("(" )
b .WriteString (op .rc .String ())
b .WriteString (")" )
case opCapStart , opCapEnd :
b .WriteString ("(" )
b .WriteString (strconv .QuoteToASCII (op .name ))
b .WriteString (")" )
case opSplit :
b .WriteString (" -> " )
b .WriteString (strconv .FormatInt (int64 (op .i ), 10 ))
case opJmp , opJmpIfNotFirst :
b .WriteString (" -> " )
b .WriteString (strconv .FormatInt (int64 (op .i ), 10 ))
case opJmpIfNotDefined , opJmpIfNotEmpty :
b .WriteString ("(" )
b .WriteString (strconv .QuoteToASCII (op .name ))
b .WriteString (")" )
b .WriteString (" -> " )
b .WriteString (strconv .FormatInt (int64 (op .i ), 10 ))
}
}
type prog struct {
op []progOp
numCap int
}
func dumpProg(b *bytes .Buffer , prog *prog , pc uint32 ) {
for i := range prog .op {
op := prog .op [i ]
pos := strconv .Itoa (i )
if uint32 (i ) == pc {
pos = "*" + pos
}
b .WriteString (" " [len (pos ):])
b .WriteString (pos )
b .WriteByte ('\t' )
dumpProgOp (b , &op )
b .WriteByte ('\n' )
}
}
func (p *prog ) String () string {
b := bytes .Buffer {}
dumpProg (&b , p , 0 )
return b .String ()
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .