diff --git a/contrib/win32/openssh/AnalyzeCodeDiff.ps1 b/contrib/win32/openssh/AnalyzeCodeDiff.ps1 new file mode 100644 index 0000000..560a67f --- /dev/null +++ b/contrib/win32/openssh/AnalyzeCodeDiff.ps1 @@ -0,0 +1,200 @@ +Set-StrictMode -Version Latest +$Win32Macro = 'WIN32_FIXME' +$sourceRoot = 'C:\openssh\Win32-OpenSSH' + +[int]$g_code = 0 +[int]$g_win32 = 0 +[int]$g_unix = 0 + +function AnalyzeFile($file, [bool]$log) +{ + $file = Join-Path $sourceRoot $file + if ($log) { Write-Host -ForegroundColor Gray $file } + $content = Get-Content $file + [int]$commentlines = 0 #comments + [int]$emptylines = 0 #emptylines + [int]$code = 0 #all code lines + [int]$win32 = 0 #win32 only lines + [int]$win32substituted = 0#lines in win32 block that have a corresponding Unix block (#ifdef with #else) + [int]$unix = 0; #unix only lines + [int]$unixsubstituted = 0 #lines in unix block that have a corresponding Win32 block (#ifdef with #else) + [int]$total = 0 + [int]$nestedmacros = 0 #tracks nested macro blocks inside a win32 or a unix block + [bool]$incommentblock = $false + [bool]$inWin32block = $false + [bool]$inUnixblock = $false + [int]$currentblockcode = 0 + [bool]$insubstitutedblock = $false + + + foreach ($linestr in $content) + { + $total++ + $line = [String]$linestr + $line = $line.Trim() + #skip if line is empty + if ($line.Length -gt 0) + { + if ($incommentblock) + { + $commentlines++ + if ($line.EndsWith('*/')) {$incommentblock = $false} + } + else + { + if ($line.StartsWith('//')) {$commentlines++} + elseif ($line.StartsWith('/*')) + { + if (!($line.EndsWith('*/'))) { $incommentblock = $true } + $commentlines++ + } + else + { + $code++ + if ($inWin32block) + { + $win32++ + $currentblockcode++ + #keep skipping inner #ifdefs + if ($line.StartsWith('#ifdef')) {$nestedmacros++} + + if ($line.EndsWith('#endif') -or $line.EndsWith('#else')) + { + if ($nestedmacros -eq 0) + { + $inWin32block = $false + if ($line.EndsWith('#else')) + { + $inUnixblock = $true + $insubstitutedblock = $true + $win32substituted += $currentblockcode + } + elseif ($insubstitutedblock) + { + $win32substituted += $currentblockcode + $insubstitutedblock = $false + } + $currentblockcode = 0 + } + else + { + if ($line.EndsWith('#endif')) {$nestedmacros--} + } + } + } + elseif ($inUnixblock) + { + $unix++ + $currentblockcode++ + #keep skipping inner #ifdefs + if ($line.StartsWith('#ifdef')) {$nestedmacros++} + + if ($line.EndsWith('#endif') -or $line.EndsWith('#else')) + { + if ($nestedmacros -eq 0) + { + $inUnixblock = $false + if ($line.EndsWith('#else')) + { + $inWin32block = $true + $insubstitutedblock = $true + $unixsubstituted += $currentblockcode + } + elseif ($insubstitutedblock) + { + $unixsubstituted += $currentblockcode + $insubstitutedblock = $false + } + + $currentblockcode = 0 + } + else + { + if ($line.EndsWith('#endif')) {$nestedmacros--} + } + } + } + else + { + if ($line.StartsWith('#ifdef') -and $line.Contains($Win32Macro)) + { + $inWin32block = $true + $currentblockcode = 0 + } + if ($line.StartsWith('#ifndef') -and $line.Contains($Win32Macro)) + { + $inUnixblock = $true + $currentblockcode = 0; + } + } + + } + } + } + else {$emptylines++} + } + + if ($log) + { + Write-Host -ForegroundColor Yellow " Comments " $commentlines + Write-Host -ForegroundColor Green " Blank " $emptylines + Write-Host -ForegroundColor Cyan " Code " $code + Write-Host -ForegroundColor DarkMagenta " Total " $total " check("($commentlines+$emptylines+$code)")" + Write-Host -ForegroundColor Cyan " Win32 " $win32 + Write-Host -ForegroundColor Cyan " Unix " $unix + Write-Host -ForegroundColor Cyan " Win32sub " $win32substituted + Write-Host -ForegroundColor Cyan " Unixsub " $unixsubstituted + } + + $global:g_code += $code + $global:g_win32 += $win32 + $global:g_unix += $unix + +} + + +function AnalyzeProject($project, [bool]$log) +{ + if ($log) { Write-Host "Project: " $project} + $projectName = $project + $projectroot = Join-Path $sourceRoot 'contrib\win32\openssh' + $project = Join-Path $projectroot $project + $project = $project + '.vcxproj' + + $global:g_code = 0 + $global:g_win32 = 0 + $global:g_unix = 0 + + $c = Get-Content $project + foreach ($ln in $c){ + $l = [String]$ln + $l = $l.Trim() + + if ($l.StartsWith('