" Vim syntax file
" Language: Essbase script
" Maintainer:	Raul Segura Acevedo <raul@turing.iquimica.unam.mx>
" Last change:	2001 May 10

" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

" folds
sy  region  EssFold start="\<Fix" end="EndFix" transparent fold
"sy region  EssFold start="/\*\([^*]*\*\(/\)\@!\)*[^*]*$" end="\*/" transparent fold

sy  keyword cscTodo contained TODO FIXME XXX

" cscCommentGroup allows adding matches for special things in comments
sy  cluster cscCommentGroup contains=cscTodo

" Strings in quotes
sy  match   cscError	'"'
sy  match   cscString	'"[^"]*"'

"when wanted, highlight trailing white space
if exists("csc_space_errors")
  if !exists("csc_no_trail_space_error")
    sy  match   cscSpaceE	"\s\+$"
  endif
  if !exists("csc_no_tab_space_error")
    sy  match   cscSpaceE	" \+\t"me=e-1
  endif
endif

"catch errors caused by wrong parenthesis and brackets
sy  cluster cscParenGroup   contains=cscParenE,@cscCommentGroup,cscUserCont,cscBitField,cscFormat,cscNumber,cscFloat,cscOctal,cscNumbers,cscIfError,cscComW,cscCom,cscFormula,cscBPMacro
sy  region  cscParen	    transparent start='(' end=')' contains=ALLBUT,@cscParenGroup
sy  match   cscParenE	")"

"integer number, or floating point number without a dot and with "f".
sy  case ignore
sy  match   cscNumbers	transparent "\<\d\|\.\d" contains=cscNumber,cscFloat,cscOctal
sy  match   cscNumber	contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
"hex number
syn match   cscNumber	contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
" Flag the first zero of an octal number as something special
sy  match   cscOctal	contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>"
sy  match   cscFloat	contained "\d\+f"
"floating point number, with dot, optional exponent
sy  match   cscFloat	contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
"floating point number, starting with a dot, optional exponent
sy  match   cscFloat	contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
sy  match   cscFloat	contained "\d\+e[-+]\=\d\+[fl]\=\>"
sy  case match

sy  region  cscComment	start="/\*" end="\*/" contains=@cscCommentGroup,cscSpaceE
sy  match   cscCommentE	"\*/"

sy  case    ignore
sy  keyword cscIfError	IF ELSE ENDIF ELSEIF
sy  keyword cscCondition    contained IF ELSE ENDIF ELSEIF
sy  keyword cscFunction	contained VARPER VAR UDA TRUNCATE SYD SUMRANGE SUM
sy  keyword cscFunction	contained STDDEVRANGE STDDEV SPARENTVAL SLN SIBLINGS SHIFT
sy  keyword cscFunction	contained SANCESTVAL RSIBLINGS ROUND REMAINDER RELATIVE PTD
sy  keyword cscFunction	contained PRIOR POWER PARENTVAL NPV NEXT MOD MINRANGE MIN
sy  keyword cscFunction	contained MDSHIFT MDPARENTVAL MDANCESTVAL MAXRANGE MAX MATCH
sy  keyword cscFunction	contained LSIBLINGS LEVMBRS LEV
sy  keyword cscFunction	contained ISUDA ISSIBLING ISSAMELEV ISSAMEGEN ISPARENT ISMBR
sy  keyword cscFunction	contained ISLEV ISISIBLING ISIPARENT ISIDESC ISICHILD ISIBLINGS
sy  keyword cscFunction	contained ISIANCEST ISGEN ISDESC ISCHILD ISANCEST ISACCTYPE
sy  keyword cscFunction	contained IRSIBLINGS IRR INTEREST INT ILSIBLINGS IDESCENDANTS
sy  keyword cscFunction	contained ICHILDREN IANCESTORS IALLANCESTORS
sy  keyword cscFunction	contained GROWTH GENMBRS GEN FACTORIAL DISCOUNT DESCENDANTS
sy  keyword cscFunction	contained DECLINE CHILDREN CURRMBRRANGE CURLEV CURGEN
sy  keyword cscFunction	contained COMPOUNDGROWTH COMPOUND AVGRANGE AVG ANCESTVAL
sy  keyword cscFunction	contained ANCESTORS ALLANCESTORS ACCUM ABS
sy  keyword cscFunction	contained @VARPER @VAR @UDA @TRUNCATE @SYD @SUMRANGE @SUM
sy  keyword cscFunction	contained @STDDEVRANGE @STDDEV @SPARENTVAL @SLN @SIBLINGS @SHIFT
sy  keyword cscFunction	contained @SANCESTVAL @RSIBLINGS @ROUND @REMAINDER @RELATIVE @PTD
sy  keyword cscFunction	contained @PRIOR @POWER @PARENTVAL @NPV @NEXT @MOD @MINRANGE @MIN
sy  keyword cscFunction	contained @MDSHIFT @MDPARENTVAL @MDANCESTVAL @MAXRANGE @MAX @MATCH
sy  keyword cscFunction	contained @LSIBLINGS @LEVMBRS @LEV
sy  keyword cscFunction	contained @ISUDA @ISSIBLING @ISSAMELEV @ISSAMEGEN @ISPARENT @ISMBR
sy  keyword cscFunction	contained @ISLEV @ISISIBLING @ISIPARENT @ISIDESC @ISICHILD @ISIBLINGS
sy  keyword cscFunction	contained @ISIANCEST @ISGEN @ISDESC @ISCHILD @ISANCEST @ISACCTYPE
sy  keyword cscFunction	contained @IRSIBLINGS @IRR @INTEREST @INT @ILSIBLINGS @IDESCENDANTS
sy  keyword cscFunction	contained @ICHILDREN @IANCESTORS @IALLANCESTORS
sy  keyword cscFunction	contained @GROWTH @GENMBRS @GEN @FACTORIAL @DISCOUNT @DESCENDANTS
sy  keyword cscFunction	contained @DECLINE @CHILDREN @CURRMBRRANGE @CURLEV @CURGEN
sy  keyword cscFunction	contained @COMPOUNDGROWTH @COMPOUND @AVGRANGE @AVG @ANCESTVAL
sy  keyword cscFunction	contained @ANCESTORS @ALLANCESTORS @ACCUM @ABS
sy  match   cscFunction	contained "@"
sy  match   cscError	"@\s*\a*" contains=cscFunction

sy  match   cscStatement    "&"
sy  keyword cscStatement    AGG ARRAY VAR
sy  keyword cscStatement    CCONV CLEARDATA DATACOPY

sy  match   cscComE contained "^\s*CALC.*"
sy  match   cscComE contained "^\s*CLEARBLOCK.*"
sy  match   cscComE contained "^\s*SET.*"
sy  match   cscComE contained "^\s*FIX"
sy  match   cscComE contained "^\s*ENDFIX"
sy  match   cscComE contained "^\s*ENDLOOP"
sy  match   cscComE contained "^\s*LOOP"
" sy	keyword cscCom FIX ENDFIX
" sy	keyword cscCom LOOP ENDLOOP

sy  match   cscComW "^\s*CALC.*"
sy  match   cscCom  "^\s*CALC\s*ALL"
sy  match   cscCom  "^\s*CALC\s*AVERAGE"
sy  match   cscCom  "^\s*CALC\s*DIM"
sy  match   cscCom  "^\s*CALC\s*FIRST"
sy  match   cscCom  "^\s*CALC\s*LAST"
sy  match   cscCom  "^\s*CALC\s*TWOPASS"

sy  match   cscComW "^\s*CLEARBLOCK.*"
sy  match   cscCom  "^\s*CLEARBLOCK\s\+ALL"
sy  match   cscCom  "^\s*CLEARBLOCK\s\+UPPER"
sy  match   cscCom  "^\s*CLEARBLOCK\s\+NONINPUT"

sy  match   cscComW "^\s*\<SET.*"
sy  match   cscCom  "^\s*\<SET\s\+Commands"
sy  match   cscCom  "^\s*\<SET\s\+AGGMISSG"
sy  match   cscCom  "^\s*\<SET\s\+CACHE"
sy  match   cscCom  "^\s*\<SET\s\+CALCHASHTBL"
sy  match   cscCom  "^\s*\<SET\s\+CLEARUPDATESTATUS"
sy  match   cscCom  "^\s*\<SET\s\+FRMLBOTTOMUP"
sy  match   cscCom  "^\s*\<SET\s\+LOCKBLOCK"
sy  match   cscCom  "^\s*\<SET\s\+MSG"
sy  match   cscCom  "^\s*\<SET\s\+NOTICE"
sy  match   cscCom  "^\s*\<SET\s\+UPDATECALC"
sy  match   cscCom  "^\s*\<SET\s\+UPTOLOCAL"

sy  keyword cscBPMacro	contained   !LoopOnAll !LoopOnLevel !LoopOnSelected
sy  keyword cscBPMacro	contained   !CurrentMember !LoopOnDimensions !CurrentDimension
sy  keyword cscBPMacro	contained   !CurrentOtherLoopDimension !LoopOnOtherLoopDimensions
sy  keyword cscBPMacro	contained   !EndLoop !AllMembers !SelectedMembers !If !Else !EndIf
sy  keyword cscBPMacro	contained   LoopOnAll LoopOnLevel LoopOnSelected
sy  keyword cscBPMacro	contained   CurrentMember LoopOnDimensions CurrentDimension
sy  keyword cscBPMacro	contained   CurrentOtherLoopDimension LoopOnOtherLoopDimensions
sy  keyword cscBPMacro	contained   EndLoop AllMembers SelectedMembers If Else EndIf
sy  match   cscBPMacro	contained   "!"
sy  match   cscBPW  "!\s*\a*"	contains=cscBPmacro

sy  match   cscEqError	'\("[^"]*"\|[^][     !%()*+,--/:;<=>{}~]\+\|->\)*\s*=\([^=]\@=\|$\)'
sy  region  cscFormula	transparent matchgroup=VarName start='\("[^"]*"\|[^][	!%()*+,--/:;<=>{}~]\+\)\s*=\([^=]\@=\|\n\)' skip='"[^"]*"' end=';' contains=ALLBUT,cscFormula,cscFormulaIn,cscBPMacro,cscCondition
sy  region  cscFormulaIn matchgroup=VarName transparent start='\("[^"]*"\|[^][	!%()*+,--/:;<=>{}~]\+\)\(->\("[^"]*"\|[^][  !%()*+,--/:;<=>{}~]\+\)\)*\s*=\([^=]\@=\|$\)' skip='"[^"]*"' end=';' contains=ALLBUT,cscFormula,cscFormulaIn,cscBPMacro,cscCondition contained
sy  match   cscEq "=="

if !exists("csc_minlines")
    let csc_minlines = 50	" mostly for () constructs
endif
exec "sy    sync ccomment cscComment minlines=" . csc_minlines

" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_csc_syntax_inits")
  if version < 508
    let did_csc_syntax_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  hi cscVarName term=bold ctermfg=9 gui=bold guifg=blue

  HiLink cscNumber	Number
  HiLink cscOctal	Number
  HiLink cscFloat	Float
  HiLink cscParenE	Error
  HiLink cscCommentE	Error
  HiLink cscSpaceE	Error
  HiLink cscError	Error
  HiLink cscString	String
  HiLink cscComment	Comment
  HiLink cscTodo	Todo
  HiLink cscStatement	Statement
  HiLink cscIfError	Error
  HiLink cscEqError	Error
  HiLink cscFunction	Statement
  HiLink cscCondition	Statement
  HiLink cscWarn	WarningMsg

  HiLink cscComE	Error
  HiLink cscCom		Statement
  HiLink cscComW	WarningMsg

  HiLink cscBPMacro	Identifier
  HiLink cscBPW		WarningMsg

  delcommand HiLink
endif

let b:current_syntax = "csc"

" vim: ts=8
