" Vim syntax file
" Language:         RFC 2614 - An API for Service Location registration file
" Maintainer:       Nikolai Weibull <now@bitwi.se>
" Latest Revision:  2006-04-19

if exists("b:current_syntax")
  finish
endif

let s:cpo_save = &cpo
set cpo&vim

syn keyword slpregTodo          contained TODO FIXME XXX NOTE

syn region  slpregComment       display oneline start='^[#;]' end='$'
                                \ contains=slpregTodo,@Spell

syn match   slpregBegin         display '^'
                                \ nextgroup=slpregServiceURL,
                                \ slpregComment

syn match   slpregServiceURL    contained display 'service:'
                                \ nextgroup=slpregServiceType

syn match   slpregServiceType   contained display '\a[[:alpha:][:digit:]+-]*\%(\.\a[[:alpha:][:digit:]+-]*\)\=\%(:\a[[:alpha:][:digit:]+-]*\)\='
                                \ nextgroup=slpregServiceSAPCol

syn match   slpregServiceSAPCol contained display ':'
                                \ nextgroup=slpregSAP

syn match   slpregSAP           contained '[^,]\+'
                                \ nextgroup=slpregLangSep
"syn match   slpregSAP           contained display '\%(//\%(\%([[:alpha:][:digit:]$-_.~!*\'(),+;&=]*@\)\=\%([[:alnum:]][[:alnum:]-]*[[:alnum:]]\|[[:alnum:]]\.\)*\%(\a[[:alnum:]-]*[[:alnum:]]\|\a\)\%(:\d\+\)\=\)\=\|/at/\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}:\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}\|/ipx/\x\{8}:\x\{12}:\x\{4}\)\%(/\%([[:alpha:][:digit:]$-_.~!*\'()+;?:@&=+]\|\\\x\x\)*\)*\%(;[^()\\!<=>~[:cntrl:]* \t_]\+\%(=[^()\\!<=>~[:cntrl:] ]\+\)\=\)*'

syn match   slpregLangSep       contained display ','
                                \ nextgroup=slpregLang

syn match   slpregLang          contained display '\a\{1,8}\%(-\a\{1,8\}\)\='
                                \ nextgroup=slpregLTimeSep

syn match   slpregLTimeSep      contained display ','
                                \ nextgroup=slpregLTime

syn match   slpregLTime         contained display '\d\{1,5}'
                                \ nextgroup=slpregType,slpregUNewline

syn match   slpregType          contained display '\a[[:alpha:][:digit:]+-]*'
                                \ nextgroup=slpregUNewLine

syn match   slpregUNewLine      contained '\s*\n'
                                \ nextgroup=slpregScopes,slpregAttrList skipnl

syn keyword slpregScopes        contained scopes
                                \ nextgroup=slpregScopesEq

syn match   slpregScopesEq      contained '=' nextgroup=slpregScopeName

syn match   slpregScopeName     contained '[^(),\\!<=>[:cntrl:];*+ ]\+'
                                \ nextgroup=slpregScopeNameSep,
                                \ slpregScopeNewline

syn match   slpregScopeNameSep  contained ','
                                \ nextgroup=slpregScopeName

syn match   slpregScopeNewline  contained '\s*\n'
                                \ nextgroup=slpregAttribute skipnl

syn match   slpregAttribute     contained '[^(),\\!<=>[:cntrl:]* \t_]\+'
                                \ nextgroup=slpregAttributeEq,
                                \ slpregScopeNewline

syn match   slpregAttributeEq   contained '='
                                \ nextgroup=@slpregAttrValue

syn cluster slpregAttrValueCon  contains=slpregAttribute,slpregAttrValueSep

syn cluster slpregAttrValue     contains=slpregAttrIValue,slpregAttrSValue,
                                \ slpregAttrBValue,slpregAttrSSValue

syn match   slpregAttrSValue    contained display '[^(),\\!<=>~[:cntrl:]]\+'
                                \ nextgroup=@slpregAttrValueCon skipwhite skipnl

syn match   slpregAttrSSValue   contained display '\\FF\%(\\\x\x\)\+'
                                \ nextgroup=@slpregAttrValueCon skipwhite skipnl

syn match   slpregAttrIValue    contained display '[-]\=\d\+\>'
                                \ nextgroup=@slpregAttrValueCon skipwhite skipnl

syn keyword slpregAttrBValue    contained true false
                                \ nextgroup=@slpregAttrValueCon skipwhite skipnl

syn match   slpregAttrValueSep  contained display ','
                                \ nextgroup=@slpregAttrValue skipwhite skipnl

hi def link slpregTodo          Todo
hi def link slpregComment       Comment
hi def link slpregServiceURL    Type
hi def link slpregServiceType   slpregServiceURL
hi def link slpregServiceSAPCol slpregServiceURL
hi def link slpregSAP           slpregServiceURL
hi def link slpregDelimiter     Delimiter
hi def link slpregLangSep       slpregDelimiter
hi def link slpregLang          String
hi def link slpregLTimeSep      slpregDelimiter
hi def link slpregLTime         Number
hi def link slpregType          Type
hi def link slpregScopes        Identifier
hi def link slpregScopesEq      Operator
hi def link slpregScopeName     String
hi def link slpregScopeNameSep  slpregDelimiter
hi def link slpregAttribute     Identifier
hi def link slpregAttributeEq   Operator
hi def link slpregAttrSValue    String
hi def link slpregAttrSSValue   slpregAttrSValue
hi def link slpregAttrIValue    Number
hi def link slpregAttrBValue    Boolean
hi def link slpregAttrValueSep  slpregDelimiter

let b:current_syntax = "slpreg"

let &cpo = s:cpo_save
unlet s:cpo_save
