package phcformat
import (
)
func ( string) Hash {
, := Parse()
if ! {
panic(fmt.Sprintf("phcformat.MustParse(%q)", ))
}
return
}
func ( string) (Hash, bool) {
if == "" {
return Hash{}, false
}
if [0] != '$' {
return Hash{}, false
}
, := , [1:]
var bool
var string
for := 0; < len(); ++ {
:= []
if == '$' {
, = [:], [+1:]
= true
break
}
if >= 32 {
return Hash{}, false
}
if validID() {
continue
}
return Hash{}, false
}
if ! {
=
return Hash{
ID: ,
Raw: ,
}, true
}
= false
var , , option.Of[string]
var bool
var int
if := "v="; strings.HasPrefix(, ) {
:= len()
for = ; < len(); ++ {
:= []
if == '$' {
, = option.Value([:]), [+1:]
= true
= 0
break
}
if validVersion() {
continue
}
if == ',' {
++
goto
}
if validParamValue() {
++
goto
}
return Hash{}, false
}
if ! {
= option.Value([:])
return Hash{
ID: ,
Version: ,
Raw: ,
}, true
}
= false
}
= true
:
for ; < len(); ++ {
:= []
if validParamName() {
continue
}
if == '=' {
++
= false
goto
}
if {
if == '$' {
, = option.Value([:]), [+1:]
goto
}
if validSalt() {
++
goto
}
}
return Hash{}, false
}
if {
= option.Value()
return Hash{
ID: ,
Version: ,
Salt: ,
Raw: ,
}, true
}
return Hash{}, false
:
for ; < len(); ++ {
:= []
if validParamValue() {
continue
}
if == ',' {
++
goto
}
if == '$' {
, = option.Value([:]), [+1:]
= true
= 0
break
}
return Hash{}, false
}
if ! {
= option.Value()
return Hash{
ID: ,
Version: ,
Params: ,
Raw: ,
}, true
}
= false
:
for ; < len(); ++ {
:= []
if validSalt() {
continue
}
if == '$' {
, = option.Value([:]), [+1:]
= true
break
}
return Hash{}, false
}
if ! {
= option.Value()
return Hash{
ID: ,
Version: ,
Params: ,
Salt: ,
Raw: ,
}, true
}
:
for := 0; < len(); ++ {
:= []
if validOutput() {
continue
}
return Hash{}, false
}
return Hash{
ID: ,
Version: ,
Params: ,
Salt: ,
Output: option.Value(),
Raw: ,
}, true
}