From d8f3aa5d508296bd2847b89a4f668cf5a89e399c Mon Sep 17 00:00:00 2001 From: kongo2002 Date: Tue, 27 Mar 2012 22:15:06 +0200 Subject: [PATCH] add ReadConfig() function for C/C++ checkers --- autoload/syntastic/c.vim | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/autoload/syntastic/c.vim b/autoload/syntastic/c.vim index 73623b15..49f7099e 100644 --- a/autoload/syntastic/c.vim +++ b/autoload/syntastic/c.vim @@ -65,6 +65,41 @@ function! syntastic#c#GetIncludeDirs(filetype) return join(map(s:Unique(include_dirs), '"-I" . v:val'), ' ') endfunction +" read additional compiler flags from the given configuration file +" the file format and its parsing mechanism is inspired by clang_complete +function! syntastic#c#ReadConfig(file) + " search in the current file's directory upwards + let config = findfile(a:file, '.;') + if config == '' || !filereadable(config) | return '' | endif + + " convert filename into absolute path + let filepath = substitute(fnamemodify(config, ':p:h'), '\', '/', 'g') + + " try to read config file + try + let lines = map(readfile(config), + \ 'substitute(v:val, ''\'', ''/'', ''g'')') + catch /E484/ + return '' + endtry + + let parameters = [] + for line in lines + let matches = matchlist(line, '^\s*-I\s*\(\S\+\)') + if matches != [] && matches[1] != '' + " this one looks like an absolute path + if match(matches[1], '^\%(/\|\a:\)') != -1 + call add(parameters, '-I' . matches[1]) + else + call add(parameters, '-I' . filepath . '/' . matches[1]) + endif + else + call add(parameters, line) + endif + endfor + + return join(parameters, ' ') +endfunction " search the first 100 lines for include statements that are " given in the handlers dictionary