| " DTrace D script syntax file. To avoid confusion with the D programming |
| " language, I call this script dtrace.vim instead of d.vim. |
| " Language: D script as described in "Solaris Dynamic Tracing Guide", |
| " http://docs.sun.com/app/docs/doc/817-6223 |
| " Version: 1.5 |
| " Last Change: 2008/04/05 |
| " Maintainer: Nicolas Weber <nicolasweber@gmx.de> |
| |
| " dtrace lexer and parser are at |
| " http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_lex.l |
| " http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_grammar.y |
| |
| if version < 600 |
| syntax clear |
| elseif exists("b:current_syntax") |
| finish |
| endif |
| |
| " Read the C syntax to start with |
| if version < 600 |
| so <sfile>:p:h/c.vim |
| else |
| runtime! syntax/c.vim |
| unlet b:current_syntax |
| endif |
| |
| syn clear cCommentL " dtrace doesn't support // style comments |
| |
| " First line may start with #!, also make sure a '-s' flag is somewhere in |
| " that line. |
| syn match dtraceComment "\%^#!.*-s.*" |
| |
| " Probe descriptors need explicit matches, so that keywords in probe |
| " descriptors don't show up as errors. Note that this regex detects probes |
| " as "something with three ':' in it". This works in practice, but it's not |
| " really correct. Also add special case code for BEGIN, END and ERROR, since |
| " they are common. |
| " Be careful not to detect '/*some:::node*/\n/**/' as probe, as it's |
| " commented out. |
| " XXX: This allows a probe description to end with ',', even if it's not |
| " followed by another probe. |
| " XXX: This doesn't work if followed by a comment. |
| let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S\{-}\)\_s*' |
| exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s\%({\|\/[^*]\|\%$\)"' |
| |
| " Note: We have to be careful to not make this match /* */ comments. |
| " Also be careful not to eat `c = a / b; b = a / 2;`. We use the same |
| " technique as the dtrace lexer: a predicate has to be followed by {, ;, or |
| " EOF. Also note that dtrace doesn't allow an empty predicate // (we do). |
| " This regex doesn't allow a divison operator in the predicate. |
| " Make sure that this matches the empty predicate as well. |
| " XXX: This doesn't work if followed by a comment. |
| syn match dtracePredicate "/\*\@!\_[^/]*/\ze\_s*\%({\|;\|\%$\)" |
| "contains=ALLBUT,dtraceOption " this lets the region contain too much stuff |
| |
| " Pragmas. |
| " dtrace seems not to support whitespace before or after the '='. dtrace |
| " supports only one option per #pragma, and no continuations of #pragma over |
| " several lines with '\'. |
| " Note that dtrace treats units (Hz etc) as case-insenstive, we allow only |
| " sane unit capitalization in this script (ie 'ns', 'us', 'ms', 's' have to be |
| " small, Hertz can be 'Hz' or 'hz') |
| " XXX: "cpu" is always highlighted as builtin var, not as option |
| |
| " auto or manual: bufresize |
| syn match dtraceOption contained "bufresize=\%(auto\|manual\)\s*$" |
| |
| " scalar: cpu jstackframes jstackstrsize nspec stackframes stackindent ustackframes |
| syn match dtraceOption contained "\%(cpu\|jstackframes\|jstackstrsize\|nspec\|stackframes\|stackindent\|ustackframes\)=\d\+\s*$" |
| |
| " size: aggsize bufsize dynvarsize specsize strsize |
| " size defaults to something if no unit is given (ie., having no unit is ok) |
| syn match dtraceOption contained "\%(aggsize\|bufsize\|dynvarsize\|specsize\|strsize\)=\d\+\%(k\|m\|g\|t\|K\|M\|G\|T\)\=\s*$" |
| |
| " time: aggrate cleanrate statusrate switchrate |
| " time defaults to hz if no unit is given |
| syn match dtraceOption contained "\%(aggrate\|cleanrate\|statusrate\|switchrate\)=\d\+\%(hz\|Hz\|ns\|us\|ms\|s\)\=\s*$" |
| |
| " No type: defaultargs destructive flowindent grabanon quiet rawbytes |
| syn match dtraceOption contained "\%(defaultargs\|destructive\|flowindent\|grabanon\|quiet\|rawbytes\)\s*$" |
| |
| |
| " Turn reserved but unspecified keywords into errors |
| syn keyword dtraceReservedKeyword auto break case continue counter default do |
| syn keyword dtraceReservedKeyword else for goto if import probe provider |
| syn keyword dtraceReservedKeyword register restrict return static switch while |
| |
| " Add dtrace-specific stuff |
| syn keyword dtraceOperator sizeof offsetof stringof xlate |
| syn keyword dtraceStatement self inline xlate this translator |
| |
| " Builtin variables |
| syn keyword dtraceIdentifier arg0 arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 |
| syn keyword dtraceIdentifier args caller chip cpu curcpu curlwpsinfo curpsinfo |
| syn keyword dtraceIdentifier curthread cwd epid errno execname gid id ipl lgrp |
| syn keyword dtraceIdentifier pid ppid probefunc probemod probename probeprov |
| syn keyword dtraceIdentifier pset root stackdepth tid timestamp uid uregs |
| syn keyword dtraceIdentifier vtimestamp walltimestamp |
| syn keyword dtraceIdentifier ustackdepth |
| |
| " Macro Variables |
| syn match dtraceConstant "$[0-9]\+" |
| syn match dtraceConstant "$\(egid\|euid\|gid\|pgid\|ppid\)" |
| syn match dtraceConstant "$\(projid\|sid\|target\|taskid\|uid\)" |
| |
| " Data Recording Actions |
| syn keyword dtraceFunction trace tracemem printf printa stack ustack jstack |
| |
| " Process Destructive Actions |
| syn keyword dtraceFunction stop raise copyout copyoutstr system |
| |
| " Kernel Destructive Actions |
| syn keyword dtraceFunction breakpoint panic chill |
| |
| " Special Actions |
| syn keyword dtraceFunction speculate commit discard exit |
| |
| " Subroutines |
| syn keyword dtraceFunction alloca basename bcopy cleanpath copyin copyinstr |
| syn keyword dtraceFunction copyinto dirname msgdsize msgsize mutex_owned |
| syn keyword dtraceFunction mutex_owner mutex_type_adaptive progenyof |
| syn keyword dtraceFunction rand rw_iswriter rw_write_held speculation |
| syn keyword dtraceFunction strjoin strlen |
| |
| " Aggregating Functions |
| syn keyword dtraceAggregatingFunction count sum avg min max lquantize quantize |
| |
| syn keyword dtraceType int8_t int16_t int32_t int64_t intptr_t |
| syn keyword dtraceType uint8_t uint16_t uint32_t uint64_t uintptr_t |
| syn keyword dtraceType string |
| syn keyword dtraceType pid_t id_t |
| |
| |
| " Define the default highlighting. |
| " We use `hi def link` directly, this requires 5.8. |
| hi def link dtraceReservedKeyword Error |
| hi def link dtracePredicate String |
| hi def link dtraceProbe dtraceStatement |
| hi def link dtraceStatement Statement |
| hi def link dtraceConstant Constant |
| hi def link dtraceIdentifier Identifier |
| hi def link dtraceAggregatingFunction dtraceFunction |
| hi def link dtraceFunction Function |
| hi def link dtraceType Type |
| hi def link dtraceOperator Operator |
| hi def link dtraceComment Comment |
| hi def link dtraceNumber Number |
| hi def link dtraceOption Identifier |
| |
| let b:current_syntax = "dtrace" |