" Vim indent file
" Language:     a2l
" Maintainer:   Stefan Liebl

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

setlocal indentexpr=GetA2LIndent()
setlocal nolisp
setlocal nosmartindent
setlocal autoindent
setlocal indentkeys+=},=/end

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

function GetA2LIndent()

    " Do not change indentation of commented lines.
    if exists("b:commentstring")
        if getline(v:lnum) =~ '^' . b:commentstring . '.*'
            return 0
        endif
    endif

    " Find a non-blank line above the current line, that's not a comment
    let lnum = prevnonblank(v:lnum - 1)
    if exists("b:commentstring")
        while getline(lnum) =~ '^' . b:commentstring
            let lnum = prevnonblank(lnum - 1)
            if lnum == 0
                break
            endif
        endwhile
    endif

    " At the start of the file use zero indent.
    if lnum == 0 | return 0
    endif

    let ind = indent(lnum)
    let line = getline(lnum)             " last line
    let cline = getline(v:lnum)          " current line

    " Add a 'shiftwidth' after beginning of environments.
    " Don't add it for /begin ... /end
    if line =~ '/begin'  && line !~ '/end'
        let ind = ind + &sw
    endif

    " Subtract a 'shiftwidth' when an environment ends
    if cline =~ '^\s*/end'
        let ind = ind - &sw
    endif

    return ind
endfunction