view runtime/indent/bst.vim @ 34649:353ff4d1c039 v9.1.0209

patch 9.1.0209: leaking memory in exe_newdict() on error Commit: https://github.com/vim/vim/commit/86eddced7e2e15e4a51af2009ffaeca8028291be Author: Christian Brabandt <cb@256bit.org> Date: Tue Mar 26 18:42:52 2024 +0100 patch 9.1.0209: leaking memory in exe_newdict() on error Problem: leaking memory in exe_newdict() on error (LuMingYinDetect) Solution: free allocated dict if GA_GROW_FALIS() fixes: #14255 closes: #14281 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Mar 2024 18:45:04 +0100
parents dce918af0c00
children
line wrap: on
line source

" Vim indent file
" Language:	bst
" Author:	Tim Pope <vimNOSPAM@tpope.info>
" Last Change:	2022 Mar 15

if exists("b:did_indent")
    finish
endif
let b:did_indent = 1

setlocal indentexpr=GetBstIndent(v:lnum)
setlocal cinkeys&
setlocal cinkeys-=0#
setlocal indentkeys&
let b:undo_indent = 'setlocal indentexpr< cinkeys< indentkeys<'

" Only define the function once.
if exists("*GetBstIndent")
    finish
endif

function! s:prevgood(lnum)
    " Find a non-blank line above the current line.
    " Skip over comments.
    let lnum = a:lnum
    while lnum > 0
        let lnum = prevnonblank(lnum - 1)
        if getline(lnum) !~ '^\s*%.*$'
            break
        endif
    endwhile
    return lnum
endfunction

function! s:strip(lnum)
    let line = getline(a:lnum)
    let line = substitute(line,'"[^"]*"','""','g')
    let line = substitute(line,'%.*','','')
    let line = substitute(line,'^\s\+','','')
    return line
endfunction

function! s:count(string,char)
    let str = substitute(a:string,'[^'.a:char.']','','g')
    return strlen(str)
endfunction

function! GetBstIndent(lnum) abort
    if a:lnum == 1
        return 0
    endif
    let lnum = s:prevgood(a:lnum)
    if lnum <= 0
        return indent(a:lnum - 1)
    endif
    let line = s:strip(lnum)
    let cline = s:strip(a:lnum)
    if cline =~ '^}' && exists("b:current_syntax")
        call cursor(a:lnum,indent(a:lnum))
        if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'")
            if col('.')+1 == col('$')
                return indent('.')
            else
                return virtcol('.')-1
            endif
        endif
    endif
    let fakeline = substitute(line,'^}','','').matchstr(cline,'^}')
    let ind = indent(lnum)
    let ind = ind + shiftwidth() * s:count(line,'{')
    let ind = ind - shiftwidth() * s:count(fakeline,'}')
    return ind
endfunction