if polyglot#init#is_disabled(expand('<sfile>:p'), 'cmod', 'syntax/cmod.vim')
  finish
endif

" Vim syntax file
" Language:		Cmod
" Current Maintainer:	Stephen R. van den Berg <srb@cuci.nl>
" Last Change:		2018 Jan 23
" Version:      	2.9
" Remark: Is used to edit Cmod files for Pike development.
" Remark: Includes a highlighter for any embedded Autodoc format.

" quit when a syntax file was already loaded
if exists("b:current_syntax")
  finish
endif

let s:cpo_save = &cpo
set cpo&vim

" Read the C syntax to start with
runtime! syntax/c.vim
unlet b:current_syntax

if !exists("c_autodoc")
  " For embedded Autodoc documentation
  syn include @cmodAutodoc <sfile>:p:h/autodoc.vim
  unlet b:current_syntax
endif

" Supports rotating amongst several same-level preprocessor conditionals
packadd! matchit
let b:match_words = "({:}\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>"

" Cmod extensions
syn keyword cmodStatement	__INIT INIT EXIT GC_RECURSE GC_CHECK
syn keyword cmodStatement	EXTRA OPTIMIZE RETURN
syn keyword cmodStatement	ADD_EFUN ADD_EFUN2 ADD_FUNCTION
syn keyword cmodStatement	MK_STRING MK_STRING_SVALUE CONSTANT_STRLEN

syn keyword cmodStatement	SET_SVAL pop_n_elems pop_stack
syn keyword cmodStatement	SIMPLE_ARG_TYPE_ERROR Pike_sp Pike_fp MKPCHARP
syn keyword cmodStatement	SET_SVAL_TYPE REF_MAKE_CONST_STRING INC_PCHARP
syn keyword cmodStatement	PTR_FROM_INT INHERIT_FROM_PTR
syn keyword cmodStatement	DECLARE_CYCLIC BEGIN_CYCLIC END_CYCLIC
syn keyword cmodStatement	UPDATE_LOCATION UNSAFE_IS_ZERO SAFE_IS_ZERO
syn keyword cmodStatement	MKPCHARP_STR APPLY_MASTER current_storage
syn keyword cmodStatement	PIKE_MAP_VARIABLE size_shift
syn keyword cmodStatement	THREADS_ALLOW THREADS_DISALLOW

syn keyword cmodStatement	add_integer_constant ref_push_object
syn keyword cmodStatement	push_string apply_svalue free_svalue
syn keyword cmodStatement	get_inherit_storage get_storage
syn keyword cmodStatement	make_shared_binary_string push_int64
syn keyword cmodStatement	begin_shared_string end_shared_string
syn keyword cmodStatement	add_ref fast_clone_object clone_object
syn keyword cmodStatement	push_undefined push_int ref_push_string
syn keyword cmodStatement	free_string push_ulongest free_object
syn keyword cmodStatement	convert_stack_top_to_bignum push_array
syn keyword cmodStatement	push_object reduce_stack_top_bignum
syn keyword cmodStatement	push_static_text apply_current
syn keyword cmodStatement	assign_svalue free_program destruct_object
syn keyword cmodStatement	start_new_program low_inherit stack_swap
syn keyword cmodStatement	generic_error_program end_program
syn keyword cmodStatement	free_array apply_external copy_mapping
syn keyword cmodStatement	push_constant_text ref_push_mapping
syn keyword cmodStatement	mapping_insert mapping_string_insert_string
syn keyword cmodStatement	f_aggregate_mapping f_aggregate apply
syn keyword cmodStatement	push_mapping push_svalue low_mapping_lookup
syn keyword cmodStatement	assign_svalues_no_free f_add
syn keyword cmodStatement	push_empty_string stack_dup assign_lvalue
syn keyword cmodStatement	low_mapping_string_lookup allocate_mapping
syn keyword cmodStatement	copy_shared_string make_shared_binary_string0
syn keyword cmodStatement	f_call_function f_index f_utf8_to_string
syn keyword cmodStatement	finish_string_builder init_string_builder
syn keyword cmodStatement	reset_string_builder free_string_builder
syn keyword cmodStatement	string_builder_putchar get_all_args
syn keyword cmodStatement	add_shared_strings check_all_args
syn keyword cmodStatement	do_inherit add_string_constant
syn keyword cmodStatement	add_program_constant set_init_callback
syn keyword cmodStatement	simple_mapping_string_lookup
syn keyword cmodStatement	f_sprintf push_text string_has_null
syn keyword cmodStatement	end_and_resize_shared_string

syn keyword cmodStatement	args sp

syn keyword cmodStatement	free

syn keyword cmodConstant	ID_PROTECTED ID_FINAL PIKE_DEBUG
syn keyword cmodConstant	NUMBER_NUMBER
syn keyword cmodConstant	PIKE_T_INT PIKE_T_STRING PIKE_T_ARRAY
syn keyword cmodConstant	PIKE_T_MULTISET PIKE_T_OBJECT PIKE_T_MAPPING
syn keyword cmodConstant	NUMBER_UNDEFINED PIKE_T_PROGRAM PIKE_T_FUNCTION
syn keyword cmodConstant	T_OBJECT T_STRING T_ARRAY T_MAPPING

syn keyword cmodException	SET_ONERROR UNSET_ONERROR ONERROR
syn keyword cmodException	CALL_AND_UNSET_ONERROR

syn keyword cmodDebug		Pike_fatal Pike_error check_stack

syn keyword cmodAccess		public protected private INHERIT
syn keyword cmodAccess		CTYPE CVAR PIKEVAR PIKEFUN

syn keyword cmodModifier	efun export flags optflags optfunc
syn keyword cmodModifier	type rawtype errname name c_name prototype
syn keyword cmodModifier	program_flags gc_trivial PMOD_EXPORT
syn keyword cmodModifier	ATTRIBUTE noclone noinline
syn keyword cmodModifier	tOr tFuncV tInt tMix tVoid tStr tMap tPrg
syn keyword cmodModifier	tSetvar tArr tMult tMultiset
syn keyword cmodModifier	tArray tMapping tString tSetvar tVar

syn keyword cmodType		bool mapping string multiset array mixed
syn keyword cmodType		object function program auto svalue
syn keyword cmodType		bignum longest zero pike_string
syn keyword cmodType		this this_program THIS INT_TYPE INT64 INT32
syn keyword cmodType		p_wchar2 PCHARP p_wchar1 p_wchar0 MP_INT

syn keyword cmodOperator	_destruct create __hash _sizeof _indices _values
syn keyword cmodOperator	_is_type _sprintf _equal _m_delete _get_iterator
syn keyword cmodOperator	_search _types _serialize _deserialize
syn keyword cmodOperator	_size_object _random _sqrt TYPEOF SUBTYPEOF
syn keyword cmodOperator	LIKELY UNLIKELY

syn keyword cmodStructure	DECLARATIONS PIKECLASS DECLARE_STORAGE

if !exists("c_autodoc")
  syn match cmodAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cmodAutodoc containedin=cComment,cCommentL
  syn cluster cCommentGroup add=cmodAutodocReal
  syn cluster cPreProcGroup add=cmodAutodocReal
endif

" Default highlighting
hi def link cmodAccess		Statement
hi def link cmodOperator	Operator
hi def link cmodStatement	Statement
hi def link cmodConstant	Constant
hi def link cmodModifier	Type
hi def link cmodType		Type
hi def link cmodStorageClass	StorageClass
hi def link cmodStructure	Structure
hi def link cmodException	Exception
hi def link cmodDebug		Debug

let b:current_syntax = "cmod"

let &cpo = s:cpo_save
unlet s:cpo_save
" vim: ts=8
