2007-11-05 10:58:58 +00:00

420 lines
14 KiB
VimL
Raw Blame History

" Vim filetype plugin
" Language: damos Kenngroessen Beschreibungs Datei
" Maintainer: Stefan Liebl <S.Liebl@gmx.de>
" URL:
" Credits:
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endif
" ----
" TABS
" ----
" tab width
let tabwidth = 4
let &l:tabstop = tabwidth
" spaces for tabs
"let &softtabstop = tabwidth
" smart indent tabs (use spaces for indent else tabs)
"set smarttab
" use spaces for tabs
setlocal expandtab
" autoindent
" indent mode - one of autoindent, smartindent or cindent
" set autoindent
" set smartindent
"set cindent
setlocal cinoptions=*200,)100,(s,w1
let &l:shiftwidth = tabwidth
setlocal formatoptions=wan2croql
setlocal formatexpr=KgsFormat()
" commenting
" ----------
let b:commentstring = "\/\/"
" spell check
setlocal spell
" Grep options
let b:GrepFiles = '*.kgs'
" formatting
" ----------
let s:levelSgFunktion = 0 * &sw
let s:levelBlock = 1 * &sw
let s:levelKeyword = 2 * &sw
let s:lenKeyword = 27
let s:lenBlockNameId = (s:levelKeyword - s:levelBlock) + s:lenKeyword
if exists("*KgsFormat")
finish
endif
" function for gq command
" -----------------------
function KgsFormat()
if mode() !~ '[iR]'
" not in insert mode
let lstart = v:lnum
let lend = lstart + v:count - 1
while v:lnum <= lend
let level = GetKgsIndent()
let line = getline(v:lnum)
if level == s:levelSgFunktion
" nix tun
elseif level == s:levelBlock
" Definition eines Blocks
let list = matchlist(line, '^\s*\(\w\+\)\s\+\(\w\+;\?\)\s*\(.*\)\?\s*')
let NameId = printf('%s %s', list[1], list[2])
let line = printf('%-' . s:lenBlockNameId . 's %s', NameId, list[3])
elseif level == s:levelKeyword
" Parameter eines Blocks
let list = matchlist(line, '^\s*\(\w\+\)\s\+\(.\{-}\)\s\{-}\(;\)\?\(.*\)\?')
let line = printf('%-' . s:lenKeyword . 's %s%s%s', list[1], list[2], list[3], list[4])
else
endif
" delete leading spaces
let line = substitute(line, '^\s*\(.*\)', '\1', '')
" indent
let line = printf('%' . level . 's%s', '', line)
" delete trailing spaces
let line = substitute(line, '\(.\{-}\)\s*$', '\1', '')
call setline(v:lnum, line)
let v:lnum = v:lnum + 1
endwhile
endif
endfunction
" ------------
" KGS Reformat
" ------------
function ReformatKGS()
let cursorLine = line('.')
let cursorCol = col('.')
"do gq over all
execute 'normal ggVGgq'
call cursor(cursorLine, cursorCol)
endfunction
" ---------------------------------------------------------
" Physikalischen Wert zu Testwert eines Kennwerts ermitteln
" Cursor muss sich im .kgs-File auf dem Kennwert befinden
" ---------------------------------------------------------
function s:GetOspLine(umrechnungsformel)
execute 'tag ' a:umrechnungsformel
let OspLine = getline('.')
execute 'pop'
return OspLine
endfunction
function s:GetOspPoly(Nr, OspLine)
if match(a:OspLine, 'Poly') >= 0
let valRegEx = '[^:;]\+'
let pxPos = matchend(a:OspLine, 'P' . a:Nr . '=')
if pxPos >=0
let pxVal = matchstr(a:OspLine, valRegEx, pxPos)
else
let pxVal = '0.0'
endif
else
echo 'kein Polynom'
let pxVal = '0.0'
endif
return pxVal
endfunction
function s:GetOspMas(OspLine)
let masRegEx = '[^:;"]\+'
let masPos = matchend(a:OspLine, 'Mas="')
if masPos >=0
let mas = matchstr(a:OspLine, masRegEx, masPos)
else
let mas = '-'
endif
return mas
endfunction
function s:GetOspPolyPhysValue(int, p1, p2, p3, p4, p5)
" P2 - (int - P5) * P4
" phys = --------------------
" (int - P5) * P3 - P1
"
" echo 'P1: ' a:p1 ' P2:' a:p2 ' P3:' a:p3 ' P4:' a:p4 ' P5:' a:p5
let polynom = '(' . a:p2 . ' - ((' . a:int . ' - ' . a:p5 . ') * '
\ . a:p4 . ')) / (((' . a:int . ' - ' . a:p5 . ') * '
\ . a:p3 . ') - ' . a:p1 . ')'
" echo polynom
let phys = Eval(polynom)
return phys
endfunction
function s:GetOspPolyIntValue(phys, p1, p2, p3, p4, p5)
" P1 * phys + P2
" int = -------------- + P5
" P3 * phys + P4
"
" echo 'P1: ' a:p1 ' P2:' a:p2 ' P3:' a:p3 ' P4:' a:p4 ' P5:' a:p5
let polynom = '((((' . a:p1 . ' * ' . a:phys . ') + ' . a:p2 . ') / (('
\ . a:p3 . ' * ' . a:phys . ') + ' . a:p4 . ')) + ' . a:p5 . ')'
" echo polynom
let float = Eval(polynom)
let int = ToInt(float)
return int
endfunction
command -nargs=1 GetOspPhysValue call s:GetOspPhysValue('<args>')
function s:GetOspPhysValue(int)
execute 'normal yiw'
let umrechnung = @0
echo 'umrechnung:' umrechnung
let OspLine = s:GetOspLine(umrechnung)
if match(OspLine, 'Poly') >= 0
let p1Val = s:GetOspPoly('1', OspLine)
let p2Val = s:GetOspPoly('2', OspLine)
let p3Val = s:GetOspPoly('3', OspLine)
let p4Val = s:GetOspPoly('4', OspLine)
let p5Val = s:GetOspPoly('5', OspLine)
let mas = s:GetOspMas(OspLine)
" Poynom
echo 'umrechnung:' umrechnung
echo 'P1:' p1Val 'P2:' p2Val 'P3:' p3Val 'P4:' p4Val 'P5:' p5Val
let phys = s:GetOspPolyPhysValue(a:int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo 'Int:' a:int 'Phys:' phys mas
else
echo 'kein Polynom'
return
endif
endfunction
command -nargs=1 GetOspIntValue call s:GetOspIntValue('<args>')
function s:GetOspIntValue(phys)
execute 'normal yiw'
let umrechnung = @0
echo 'umrechnung:' umrechnung
let OspLine = s:GetOspLine(umrechnung)
if match(OspLine, 'Poly') >= 0
let p1Val = s:GetOspPoly('1', OspLine)
let p2Val = s:GetOspPoly('2', OspLine)
let p3Val = s:GetOspPoly('3', OspLine)
let p4Val = s:GetOspPoly('4', OspLine)
let p5Val = s:GetOspPoly('5', OspLine)
let mas = s:GetOspMas(OspLine)
" Poynom
echo 'umrechnung:' umrechnung
echo 'P1:' p1Val 'P2:' p2Val 'P3:' p3Val 'P4:' p4Val 'P5:' p5Val
let int = s:GetOspPolyIntValue(a:phys, p1Val, p2Val, p3Val, p4Val, p5Val)
let hex = ToHex(int, 0)
echo 'Phys:' a:phys mas 'Int:' int 'Hex:' hex
else
echo 'kein Polynom'
return
endif
endfunction
command GetOspTestValues call s:GetOspTestValues()
function s:GetOspTestValues()
execute 'normal yiw'
let umrechnung = @0
echo 'umrechnung:' umrechnung
let OspLine = s:GetOspLine(umrechnung)
if match(OspLine, 'Poly') >= 0
let p1Val = s:GetOspPoly('1', OspLine)
let p2Val = s:GetOspPoly('2', OspLine)
let p3Val = s:GetOspPoly('3', OspLine)
let p4Val = s:GetOspPoly('4', OspLine)
let p5Val = s:GetOspPoly('5', OspLine)
let mas = s:GetOspMas(OspLine)
" Poynom
echo 'umrechnung:' umrechnung
echo 'P1:' p1Val 'P2:' p2Val 'P3:' p3Val 'P4:' p4Val 'P5:' p5Val
let int = '0'
let hex = ToHex(int, 8)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '1'
let hex = ToHex(int, 8)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '127'
let hex = ToHex(int, 8)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '-128'
let hex = ToHex(int, 8)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '255'
let hex = ToHex(int, 8)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '32767'
let hex = ToHex(int, 16)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '-32768'
let hex = ToHex(int, 16)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '65535'
let hex = ToHex(int, 16)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '2147483647L'
let hex = ToHex(int, 32)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '-2147483648L'
let hex = ToHex(int, 32)
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
let int = '4294967295L'
let hex = '0xffffffff'
let phys = s:GetOspPolyPhysValue(int, p1Val, p2Val, p3Val, p4Val, p5Val)
echo s:formatValues(int, hex, phys, mas)
else
echo 'kein Polynom'
return
endif
endfunction
function s:formatValues(int, hex, phys, mas)
return printf('Int: %12s Hex: %12s Phys: %s %s',a:int, a:hex, a:phys, a:mas)
endfunction
command GetKgsTestWertp call s:GetKgsTestWertp()
function s:GetKgsTestWertp()
" position markieren
execute 'normal mx'
" kennwert namen speichern
execute 'normal yiw'
let kennwert = @0
echo 'kennwert:' kennwert
" Position von { und } merken
call search('{')
let startLineNr = line('.')
execute 'normal %'
let endLineNr = line('.')
execute 'normal %'
" umrechnungs-Formel hohlen
call cursor(startLineNr, 0)
call search('umrechnung', 'W')
execute 'normal wyiw'
let umrechnung = @0
echo 'umrechnung:' umrechnung
let OspLine = s:GetOspLine(umrechnung)
call cursor(startLineNr, 0)
if match(OspLine, 'Poly') >= 0
let p1Val = s:GetOspPoly('1', OspLine)
let p2Val = s:GetOspPoly('2', OspLine)
let p3Val = s:GetOspPoly('3', OspLine)
let p4Val = s:GetOspPoly('4', OspLine)
let p5Val = s:GetOspPoly('5', OspLine)
" test_wert lesen
call cursor(startLineNr, 0)
call search('test_wert', 'W')
while search('\x\+\s*}\?\s*[,;]', 'W') > 0
if line('.') <= endLineNr
execute 'normal yiw'
let test_wert = @0
" Poynom
echo 'P1:' p1Val 'P2:' p2Val 'P3:' p3Val 'P4:' p4Val 'P5:' p5Val
let phys = s:GetOspPolyPhysValue(
\test_wert, p1Val, p2Val, p3Val, p4Val, p5Val)
echo 'test_wert:' test_wert 'umrechnung:' umrechnung 'Phys:' phys
endif
endwhile
else
echo 'kein Polynom'
return
endif
execute 'normal `x'
endfunction
" ------------------------------------------------------------
" Zum <20>berpr<70>fen von Testwerten
" Im Fenster 1 muss sich konserve_2.kon befinden
" Im Fenster 3 muss sich konserve_4.kon befinden
" Im Fenster 2 wird das .kgs-File ge<67>ffnet, das den Kennwert definiert
" Im Fenster 4 wird das .c-File zum .kgs-File ge<67>ffnet
" ------------------------------------------------------------
command -nargs=1 DamosCheckValues call s:DamosCheckValues('<args>')
function s:DamosCheckValues(kennwert)
" find kennwert in kgs-file
2wincmd w
execute 'tselect ' . a:kennwert
execute 'normal 0jzok'
call search(a:kennwert)
execute 'normal gm'
let @/ = a:kennwert . '\>'
" get c-file-name and find kennwert
let cFile = expand('%:p:r') . '.c'
4wincmd w
execute 'edit ' . cFile
execute 'normal zR!'
execute 'normal n'
1wincmd w
execute 'normal n'
3wincmd w
execute 'normal n'
2wincmd w
endfunction
" --------------------------------------------------
" Sucht den Wert eines Kennwerts aus einer Konserve,
" die als erster Parameter <20>bergeben wird
" --------------------------------------------------
function s:DamosGetKonserveVal(konserve, kennwert)
let kwPos = match(a:konserve, a:kennwert)
" echo 'kwPos: ' . kwPos
if kwPos >= 0
let wertLine = matchstr(a:konserve, 'WERT\s\p\+', kwPos)
echo 'wertLine:' wertLine
let wert = substitute(wertLine, 'WERT\s\+\([0-9.,]\+\)' , '\1', '')
else
echo a:kennwert 'not found in' a:konserve
let wert = '-'
endif
return wert
endfunction
command -nargs=+ DamosCheckKonserven call s:DamosCheckKonserven(<f-args>)
function s:DamosCheckKonserven(kennwert, newValue)
let output = DamosCheckKonserve('konserve_2.kon', a:kennwert, a:newValue)
echo output
let output = DamosCheckKonserve('konserve_4.kon', a:kennwert, a:newValue)
echo output
endfunction
" -------------------------------------------------------
" <20>berpr<70>ft, ab welcher Version der Konserve ein Kennwert
" einen bestimmten Wert hat
" -------------------------------------------------------
function s:DamosCheckKonserve(konserve, kennwert, newValue)
" Get object from Continuus
silent let k2_obj = CCM_get_object(a:konserve)
silent let k2_root = CCM_get_hist_root(k2_obj)
let k2_obj = k2_root
while k2_obj != ''
let k2_content = CCM_view_object(k2_obj)
let wert = s:DamosGetKonserveVal(k2_content, a:kennwert)
if wert != '-'
echo a:kennwert . ': ' . wert . '\n'
let equal = Eval(wert . ' == ' . a:newValue)
if equal == 0
let output = a:kennwert . ': not equal in: ' . k2_obj
silent let owner = CCM_get_owner(k2_obj)
let output = output . ' owner: ' . owner
return output
endif
endif
silent let k2_obj = CCM_get_successor(k2_obj)
endwhile
return 'nix'
endfunction