Page 1 of 2 12>
Topic Options
#167611 - 2006-09-14 01:56 AM Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
Hi,
this is the (nearly) finished script of my "VariableScanner". Its purpose is to scan kixfiles for all used variables, print the lines in which they are used and (most important) print orphans.
I thinks it runs fine, but i'm not 100% sure. So, if anyone sees obvious errors or has any other helpful suggestions i would appreciate the input.

Thanks, therob

Code:
 
; ===========================================================================================
;
; Script Information
;
; Title: VarScan 0.9
; Author: therob (with help of the kixtart.org-community)
; Description: Scans kixfiles for Variables and writes a reportfile
; Syntax of the reportfile: [variable] - [linenumbers in which the variable is used]
;
; ===========================================================================================


Break On

;.. Variablen

$match = 0
$Var = "$"
$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"
$dictAllVars = CreateObject ("Scripting.Dictionary")
$VarNames = $dictAllVars.Keys
$allLines = "none"
$VarCount = 0
$orphans = ""

;... Datei auswählen / select source

$System = CreateObject("Kixtart.System")

$openFile = $System.openFileDialog()
$openFile.Title = "Open a script to scan"
$openFile.InitialDirectory = @CURDIR
$openFile.Filter = "All files (*.*)|*.*"
$openFile.Title = "open"
$openFile.DefaultExt = "kix"
$openFile.ShowDialog()

$input = $OpenFile.FileName
$report = $input + "report.txt"

$ = Open (1,$FileName,2)
If $input = ""
$rc = MessageBox("No file selected.", "Whoo", 64, 5)
Quit
EndIf


;.. Datei scannen / scan file

$=Open (1,$input,2)

While NOT @error
$Line = ReadLine(1)
$linecount = $linecount + 1

For $c = 0 to Len($Line)
$Char = SubStr($Line, $c, 1)
If $Char = "$"
$match = 1
EndIf

If $match = 1 AND NOT $char ="$"
If InStr ($stopchars,$char) <> 0 OR Asc ($char) = 34

; .. add to AllVars

If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
Else
$allLines = $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
EndIf
$Match = 0 $Var = "$"
Else
$Var = $var + $char
EndIf
EndIf

Next
Loop


; ... Reportdatei schreiben / write report

If Exist ($report) Del $report EndIf
$ = Open (2,$report,5)
$ = WriteLine (2,"File: "+$input+ @CRLF+@CRLF)

For Each $VarName In $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarLines = $dictAllVars.Item ($VarName)

If NOT InStr ($Varlines,",")
$orphans = $orphans + $varname + @CRLF
$orphcount = $orphcount +1
EndIf

$reportline = $Varname + " " + $VarLines + @CRLF
$ = WriteLine (2,$reportline)
Next

$ = WriteLine (2, "-----------------------"+@CRLF+ @CRLF+ "Variables: "+ $VarCount )
$ = WriteLine (2, @CRLF+ @CRLF+ "Orphans: " + $orphcount + @CRLF+ @CRLF+ $orphans)

$=Close (1)
$=Close (2)

Quit 0


Function DictionarySet ($DictionaryObject, $key, $value)
If VarTypeName($key) = "Empty"
? " Fehler: Dictionary Keyname leer!" Quit 13
EndIf

If $DictionaryObject.Exists($key)
$DictionaryObject.Remove($key)
EndIf

$DictionaryObject.Add($key, $value)
Exit @error
EndFunction


_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167612 - 2006-09-14 05:08 AM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
What is an "orphan"?
Top
#167613 - 2006-09-14 08:59 AM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
I call obsolete variables orphans. Poor, lost little variables with no usage in the script.
In these scripts that i have to clean up and document, there are lots of them, presumably because they got worked on by different persons over the years, and nobody cared about cleaning out all of the obsolete stuff.

Anyway, i found one problem in the scipt: apparently, the dictionary object is case-sensitive, which means i got e.g. $SaveFile and $savefile logged as different variables in the report. Damn and i was so happy about the usage of the Dict-Object. Any idea on how to solve that?

cu, therob


Edited by therob (2006-09-14 09:06 AM)

Top
#167614 - 2006-09-14 09:26 AM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
Ah, I see. OK.
What about
Code:

If NOT @LOGONMODE
Break On
EndIf
Dim $RC
$RC = SetOption("Explicit","On")
$RC = SetOption("NoVarsInStrings","On")
$RC = SetOption("NoMacrosInStrings","On")

Show(5)

Function Show($i)
$Show = $i
EndFunction


I do not see any orphans in this script. The script gives me one...

About the case
http://www.google.com/search?hl=nl&q=Scripting.Dictionary+CompareMode+site%3Amicrosoft.com&meta=
So very quick:
Code:

Dim $TextMode
$TextMode = 1
$dictAllVars.CompareMode = $TextMode


Top
#167615 - 2006-09-14 11:25 AM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
Of course, "$show" is the Orphan. It's only used once.

Thanks for the code about the dictionary. Sorry, i could have found that by myself.
_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167616 - 2006-09-14 11:40 AM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
But it $orphan is no
Quote:


lost little variable with no usage in the script




Top
#167617 - 2006-09-14 12:14 PM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
Of course it is. What does your scipt do? It assigns the number 5 into $show and
then exits. So, like you posted it it has no usage.

But what exactly is your point?
The $orphan-thing is only meant to be an indicator for that a variable may be
obsolete. I will of course check for that before i delete it.
Apart from that, the script shows me e.g. when i'm about to remove a section of
the script, if the variables in that section are used anywhere else in the
script.
And its a lot faster and better than to search for every variable manually.
For example, one of the scripts i currently clean up has 263 variables and for
that its a great help.

Top
#167618 - 2006-09-14 01:28 PM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
I do see the advantage of your script, so no problem. Just tested on some scripts and was surprised about the orphans. It happened twice:
- vars in lines preceeded by semicolons
- Functions (UDF) with at the end the setting of the return value
Just a good script for troubleshooting your scripts.

Top
#167619 - 2006-09-15 02:11 PM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
I added shawn's sort-function for the variables, it ignores variables in comments now and i added a simple check for missing quotes. I'm happy with the outcome, but one odd thing though:

After adding the sort-udf, i had to read the dict into an array for sorting. Since then, the first output is an empty dict-object. I doesnt create an error, but the orphan-counter was wrong, so i had to set it to -1 to get the right count.
Any idea why there is this empty object suddenly?

cu, therob



Code:

; ===========================================================================================
;
; Script Information
;
$Title = "VarScan 1.0"
; Author: therob (with help of the kixtart.org-community) / UDF: COMBSORT() by Shawn Tassie
; Description: Scans kixfiles for Variables and writes a reportfile
; Syntax of the reportfile: [variable] - [linenumbers in which the variable is used]
;
; ===========================================================================================


Break On

;.. Variablen

$match = 0
$Var = "$"
$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"
$TextMode = 1
$dictAllVars = CreateObject ("Scripting.Dictionary")
$dictAllVars.CompareMode = $TextMode
$VarNames = $dictAllVars.Keys
$allLines = "none"
$VarCount = 0
$orphans = ""
$orphcount = -1
$linecount = 0
$quote1 = 0
$quote2 = 0

;... Datei auswählen / select source

$System = CreateObject("Kixtart.System")

$openFile = $System.openFileDialog()
$openFile.Title = "Open a script to scan"
$openFile.InitialDirectory = @curDIR
$openFile.Filter = "All files (*.*)|*.*"
$openFile.Title = "Select a kixfile to scan..."
$openFile.DefaultExt = "kix"
$openFile.ShowDialog()

$input = $OpenFile.FileName
$report = $input + "report.txt"

$ = Open (1,$FileName,2)
If $input = ""
$rc = MessageBox("No file selected.", "Whoo", 262208, 5)
Quit
EndIf


;.. Datei scannen / scan file

$=Open (1,$input,2)

While Not @error
:readAline
$Line = ReadLine(1)

If $quote1 = 1 Or $quote2 =1
$quoterror = $quoterror + "Attention: Presumably a missing quotation mark in: "+ @CRLF + $linecount + " " + $curline + @crlf +@crlf
$quoteErrCount = $quoteErrCount + 1
EndIf
$quote1 = 0 $quote2 = 0
$linecount = $linecount + 1

For $c = 0 to Len($Line)
$Char = SubStr($Line, $c, 1)

If $Char = ";" And Not ($quote1 = 1 Or $quote2 = 1)
Goto readAline
EndIf

If $Char = "$"
$match = 1
EndIf

If $match = 1 And Not $char ="$"
If InStr ($stopchars,$char) <> 0 Or Asc ($char) = 34

; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
Else
$allLines = $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
EndIf

$Match = 0 $Var = "$"
Else
$Var = $var + $char
EndIf
EndIf

Select ;look for --> "
Case $Char = '"' And $quote1 = 1
$quote1 = 0 ; $quote1
Case $Char = '"'
$quote1 = 1 ; $quote1
$curline = $line
EndSelect

Select ;look for --> '
Case $Char = "'" And $quote2 = 1
$quote2 = 0 ; $quote1
Case $Char = "'"
$quote2 = 1 ; $quote1
$curline = $line
EndSelect
Next
Loop


; ... Reportdatei schreiben / write report

If Exist ($report) Del $report EndIf
$ = Open (2,$report,5)
$ = WriteLine (2, $Title + " / Scanned file: "+$input+ @CRLF)

; ..Sort Dict

For Each $VarNameA in $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + $VarNameA + ","
Next
$varArray = combsort (Split ($VarString,","))

;... export

For Each $VarName in $varArray

$VarLines = $dictAllVars.Item ($VarName)

If Not InStr ($Varlines,",")
$orphans = $orphans + $varname + @CRLF
$orphcount = $orphcount + 1
EndIf

$reportline = $Varname + " " + $VarLines + @CRLF
$ = WriteLine (2,$reportline)

Next


$ = WriteLine (2, "-----------------------"+@CRLF+ "Variables: "+ $VarCount )
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Orphans: " + $orphcount + @CRLF+ "-----------------------"+ $orphans)

If $quoteErrCount > 0
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Possible Quote-Errors: " + $quoteErrCount + @CRLF+ "-----------------------"+ @CRLF+ $quoterror)
Else
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "No Quote-Errors found.")
EndIf
$=Close (1)
$=Close (2)


Run "%COMSPEC% /c $report"
Quit 0


Function DictionarySet ($DictionaryObject, $key, $value)
If VarTypeName($key) = "Empty"
? " Fehler: Dictionary Keyname leer!" Quit 13
EndIf

If $DictionaryObject.Exists($key)
$DictionaryObject.Remove($key)
EndIf

$DictionaryObject.Add($key, $value)
Exit @error
EndFunction

Function combsort($v, optional $o)
Dim $i,$j,$m,$s,$g
$n=Ubound($v)
$g=$n
If $g
While $g > 1 Or Not $s
$g=($g*1000)/1279
If $g < 1
$g=1
EndIf
$s=1
For $i = 0 to $n-$g
$j=$i+$g
If ($v[$i] > $v[$j] And Not $o) Or ($v[$i] < $v[$j] And $o)
$m = $v[$i]
$v[$i] = $v[$j]
$v[$j] = $m
$s=0
EndIf
Next
Loop
$combsort = $v
Else
$combsort = 0
EndIf
EndFunction



Edited by therob (2006-09-15 03:46 PM)
_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167620 - 2006-09-15 05:49 PM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
Hey therob,
I started to read through your code. I have not read it all. This is just my humble opinion.
Just quoting some of your code
Code:

;blablabla
$=Open (1,$input,2)

While Not @error
:readAline
$Line = ReadLine(1)
;blablabla
For $c = 0 to Len($Line)
$Char = SubStr($Line, $c, 1)
;blablabla
If $Char = ";" And Not ($quote1 = 1 Or $quote2 = 1)
Goto readAline
EndIf
;blablabla
Loop
;blablabla


You (try to) open the file $input and if no error is set, you start a loop.
Now at the end of that first loop, once again is tested if an error has been set. But do you know which line in your code is setting an error?
(Most probably it will be the readline that will set an error, but I am not sure.)
I think, what you want to do is test the error of readline
So
Code:

$=Open (1,$input,2)
If @ERROR
Quit @ERROR
EndIf
$Line = ReadLine(1)
While NOT @error
;Do stuff
$Line = ReadLine(1)
Loop


Now the @error of readline is tested

You have a GOTO and a LABEL. I think it is bad practice using GOTO. In Batch files, it was unavoidable using this stuff. But here, you have more options. Try p.e. to think in Functions.

On this line
$Char = SubStr($Line, $c, 1)
The first time, when $c = 0, you try to catch the character at the 0th position, which is non-existant...
I think the line just above it should read
For $c = 1 to Len($Line)

These are some first thoughts. Now I am not really a skilled coder. So please correct me if you do not agree or if you think I am mistaking.

Regards,

Top
#167621 - 2006-09-15 06:22 PM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
nono, the line with the @error in the loop is just a short way to end the loop when the sourcefile is finished (last line read).

Yeah the "goto". I know. But i added this part at the end and i dont know a short way of doing it better. I need to go to next "readline" at that point (when a ";" is found).
_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167622 - 2006-09-15 06:55 PM Re: Scan Kixfile for variables
Les Offline
KiX Master
*****

Registered: 2001-06-11
Posts: 12734
Loc: fortfrances.on.ca
Assuming that ONLY ReadLine() will throw @Error is risky business. Nomally one would kick things off with a ReadLine() before the loop starts and then have another ReadLine() as the last actio in the loop.
Top
#167623 - 2006-09-15 07:20 PM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
Sorry therob, it is not finshing when the last line is read. In your last loop, Readline reads nothing and sets an @ERROR. You are looping through your code until the "Loop" indicates to go back to the top. IMHO, you are just lucky that
- or the @ERROR set by Readline was still valid
- or you used another command or function that also had set an @ERROR <> 0

about the Substr I was talking. Try this:
Code:

If NOT @LOGONMODE
Break On
EndIf
Dim $RC
$RC = SetOption("Explicit","On")
$RC = SetOption("NoVarsInStrings","On")
$RC = SetOption("NoMacrosInStrings","On")
$RC = SetOption("WrapAtEOL","On")

Dim $str ,$i
$str = "abc"
;For $i = 1 to Len($str) ;Should use this
For $i = 0 to Len($str) ;$i = 0 is not correct
? "- " + SubStr($str,$i,1)
? "Error " + @ERROR + ": " + @SERROR
Next
? "KiX version: " + @KIX
? "KiX Executable: " + @SCRIPTEXE


I just regret that substr is not setting an error when $i = 0.


Edited by Witto (2006-09-17 10:04 AM)

Top
#167624 - 2006-09-18 08:47 PM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
I see, thanks for the suggestion. It works now as expected.
Top
#167625 - 2006-09-20 01:17 AM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
Your counter problem ($orphCount = -1) is here
Code:

For Each $VarNameA in $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + $VarNameA + ","
Next
$varArray = combsort (Split ($VarString,","))


first you build a string that always ends with a comma
then you split it with comma as delimiter
the last element in your array is ""
after combsort it is shifted to the first place
better would be something like:
Code:

For Each $VarNameA In $dictAllVars.Keys
$VarCount = $VarCount + 1
If $VarString
$VarString = $VarString + ","
EndIf
$VarString = $VarString + $VarNameA
Next
$varArray = combsort (Split ($VarString,","))


Have you allready changed the substr thing I was talking about?
Code:

;For $c = 0 to Len($Line) <-- This is wrong
For $c = 1 to Len($Line)
$Char = SubStr($Line, $c, 1)


Top
#167626 - 2006-09-20 08:57 AM Re: Scan Kixfile for variables
Richard H. Administrator Offline
Administrator
*****

Registered: 2000-01-24
Posts: 4946
Loc: Leatherhead, Surrey, UK
My personally preferred method of dealing with the "empty first field" problem is:
Code:
For Each $VarNameA In $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + "," + $VarNameA
Next
$varArray = combsort (Split (SubStr ($VarString,2),","))


Top
#167627 - 2006-09-22 04:53 PM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
sorry, for some reason the email-notify doesnt work for me.

Anyway, i took all your suggestions under advice. Thanks!
The mentioned problems are gone, but somehow i managed to implement a new one.

It must have happend somewhere on the way and i cant fix it atm.
If you look at the exportfile at the bottom, it seems that sometimes the script doesnt stop at the end of a line and add the next line to a variablestring.

This is the current state of the script:

Code:
 
; ===========================================================================================
;
; Script Information
;
$Title = "VarScan 1.1b"
; Author: therob / Function combsort () by Shawn Tassie
; Description: Scans kixfiles for Variables and missing quotes and writes a reportfile
; -> Syntax of the reportfile: [variable] - [linenumbers in which the variable is used]
;
; ===========================================================================================


Break On

;.. variables

$match = 0
$Var = "$"
$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"
$TextMode = 1
$dictAllVars = CreateObject ("Scripting.Dictionary")
$dictAllVars.CompareMode = $TextMode
$VarNames = $dictAllVars.Keys
$allLines = "none"
$VarCount = 0
$orphans = ""
$orphcount = 0
$linecount = 0
$quote1 = 0
$quote2 = 0

;... select source

$System = CreateObject("Kixtart.System")

$openFile = $System.openFileDialog()
$openFile.Title = "Open a script to scan"
$openFile.InitialDirectory = @curDIR
$openFile.Filter = "All files (*.*)|*.*"
$openFile.Title = "Select a kixfile to scan..."
$openFile.DefaultExt = "kix"
$openFile.ShowDialog()

$input = $OpenFile.FileName
$report = $input + "-VarScanReport.txt"

$ = Open (1,$FileName,2)
If $input = ""
$rc = MessageBox("No file selected.", "Whoo", 262208, 5)
Quit
EndIf


; ..
; ... scan file

$=Open (1,$input,2)
$Line = ReadLine(1)

While NOT @error

If $quote1 = 1 OR $quote2 =1
$quoterror = $quoterror + "Attention: Presumably a missing quotation mark in: "+ @CRLF + $linecount + " " + $curline + @crlf +@crlf
$quoteErrCount = $quoteErrCount + 1
EndIf
$quote1 = 0 $quote2 = 0
$linecount = $linecount + 1

For $c = 1 to Len($Line)
$Char = SubStr ($Line, $c, 1)

If $Char = ";" AND NOT ($quote1 = 1 OR $quote2 = 1)
GoTo readAline
EndIf

If $Char = "$"
$match = 1
EndIf

If $match = 1 AND NOT $char ="$"
If InStr ($stopchars,$char) <> 0 OR Asc ($char) = 34

; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
Else
$allLines = $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
EndIf

$Match = 0 $Var = "$"
Else
$Var = $var + $char
EndIf
EndIf

Select ;look for --> "
Case $Char = '"' AND $quote1 = 1
$quote1 = 0
Case $Char = '"'
$quote1 = 1
$curline = $line
EndSelect

Select ;look for --> '
Case $Char = "'" AND $quote2 = 1
$quote2 = 0
Case $Char = "'"
$quote2 = 1
$curline = $line
EndSelect
Next

:readAline

Select
Case Len ($linecount) = 1 $wslinecount = "000" + $linecount
Case Len ($linecount) = 2 $wslinecount = "00" + $linecount
Case Len ($linecount) = 3 $wslinecount = "0" + $linecount
Case 1 $wslinecount = $linecount
EndSelect
$wholescript = $wholescript + $wslinecount + " " + $line + @CRLF

$Line = ReadLine(1)
Loop


; ..
; ... sort and write report

If Exist ($report) Del $report EndIf
$ = Open (2,$report,5)
$ = WriteLine (2, $Title + " / Scanned file: "+$input+ @CRLF+ @CRLF)

; ..Sort Dict

For Each $VarNameA In $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + "," + $VarNameA
Next
$varArray = combsort (Split (SubStr ($VarString,2),","))

;... search for orphans and export the variables

For Each $VarName In $varArray

$VarLines = $dictAllVars.Item ($VarName)

If NOT InStr ($Varlines,",")
$orphans = $orphans + $varname + " " + $Varlines + @CRLF
$orphcount = $orphcount + 1
EndIf

$reportline = $Varname + " " + $VarLines + @CRLF
$ = WriteLine (2,$reportline)

Next

;... export rest

$ = WriteLine (2, "-----------------------"+@CRLF+ "All Variables: "+ $VarCount )
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Orphans: " + $orphcount + @CRLF+ "-----------------------"+ @CRLF + $orphans)

If $quoteErrCount > 0
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Possible Quote-Errors: " + $quoteErrCount + @CRLF+ "-----------------------"+ @CRLF+ $quoterror)
Else
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "No Quote-Errors found.")
EndIf

$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Scanned script:"+ @CRLF+ "-------------------------"+ @CRLF + $wholescript)
$=Close (1)
$=Close (2)


Run "%COMSPEC% /c $report"
Quit 0


; ..
;... functions

Function DictionarySet ($DictionaryObject, $key, $value)
If VarTypeName($key) = "Empty"
Quit 13
EndIf

If $DictionaryObject.Exists($key)
$DictionaryObject.Remove($key)
EndIf

$DictionaryObject.Add($key, $value)
Exit @error
EndFunction

Function combsort($v, optional $o)
Dim $i,$j,$m,$s,$g
$n=Ubound($v)
$g=$n
If $g
While $g > 1 OR NOT $s
$g=($g*1000)/1279
If $g < 1
$g=1
EndIf
$s=1
For $i = 0 to $n-$g
$j=$i+$g
If ($v[$i] > $v[$j] AND NOT $o) OR ($v[$i] < $v[$j] AND $o)
$m = $v[$i]
$v[$i] = $v[$j]
$v[$j] = $m
$s=0
EndIf
Next
Loop
$combsort = $v
Else
$combsort = 0
EndIf
EndFunction



the exportfile:

Code:
  
VarScan 1.1b / Scanned file: E:\scripte\mixed\scanKixforVariables\tes3.kix

$emessage 1, 3
$errcount 3
$errcount rc 3
$TextBox4 2
-----------------------
All Variables: 4


Orphans: 3
-----------------------
$errcount 3
$errcount rc 3
$TextBox4 2



No Quote-Errors found.


Scanned script:
-------------------------
0001 Function ermes ($emessage)
0002 $TextBox4.Text = $errcount
0003 $rc= WriteLine (9," @time ;Fehler $errcount ; "+$emessage+" ###@CRLF")
0004
0005 EndFunction
0006




any suggestions?
_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167628 - 2006-09-23 02:55 PM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
Yes. Me me.
Code:

If NOT @LOGONMODE
Break On
Else
Break Off
EndIf
Dim $RC
;$RC = SetOption("Explicit","On")
$RC = SetOption("NoVarsInStrings","On")
$RC = SetOption("NoMacrosInStrings","On")
$RC = SetOption("WrapAtEOL","On")
Include "D:\scripts\udf\combsort.udf"
; ===========================================================================================
;
; Script Information
;
$Title = "VarScan 1.1b"
; Author: therob / Function combsort () by Shawn Tassie
; Description: Scans kixfiles for Variables and missing quotes and writes a reportfile
; -> Syntax of the reportfile: [variable] - [linenumbers in which the variable is used]
;
; ===========================================================================================


Break On

;.. variables

$match = 0
$Var = "$"
$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"+'"'
$TextMode = 1
$dictAllVars = CreateObject ("Scripting.Dictionary")
$dictAllVars.CompareMode = $TextMode
$VarNames = $dictAllVars.Keys
$allLines = "none"
$VarCount = 0
$orphans = ""
$orphcount = 0
$linecount = 0
$quote1 = 0
$quote2 = 0

;... select source

$System = CreateObject("Kixtart.System")

$openFile = $System.openFileDialog()
$openFile.Title = "Open a script to scan"
$openFile.InitialDirectory = @curDIR
$openFile.Filter = "KiX Files(*.kix;*.udf;*.scr)|*.kix;*.udf;*.scr|All files (*.*)|*.*"
$openFile.Title = "Select a kixfile to scan..."
$openFile.DefaultExt = "kix"
$ = $openFile.ShowDialog()

$input = $OpenFile.FileName
$report = $input + "-VarScanReport.txt"

$ = Open (1,$FileName,2)
If $input = ""
$rc = MessageBox("No file selected.", "Whoo", 262208, 5)
Quit
EndIf


; ..
; ... scan file

$=Open (1,$input,2)
$Line = ReadLine(1)

While NOT @error

If $quote1 = 1 OR $quote2 =1
$quoterror = $quoterror + "Attention: Presumably a missing quotation mark in: "+ @CRLF + $linecount + " " + $curline + @crlf +@crlf
$quoteErrCount = $quoteErrCount + 1
EndIf
$quote1 = 0 $quote2 = 0
$linecount = $linecount + 1

For $c = 1 to Len($Line)
$Char = SubStr ($Line, $c, 1)

If $Char = ";" AND NOT ($quote1 = 1 OR $quote2 = 1)
$c = Len($Line);GoTo readAline
EndIf

If $Char = "$"
$match = 1
EndIf

If $match = 1 AND NOT $char ="$"
If InStr ($stopchars,$char) <> 0; OR Asc ($char) = 34

; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines)) ;"$var","$allLines")
Else
$allLines = $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines)) ;"$var","$allLines")
EndIf

$Match = 0 $Var = "$"
Else
$Var = $var + $char
EndIf
EndIf

Select ;look for --> "
Case $Char = '"' AND $quote1 = 1
$quote1 = 0
Case $Char = '"'
$quote1 = 1
$curline = $line
EndSelect

Select ;look for --> '
Case $Char = "'" AND $quote2 = 1
$quote2 = 0
Case $Char = "'"
$quote2 = 1
$curline = $line
EndSelect
Next

;:readAline

Select
Case Len ($linecount) = 1 $wslinecount = "000" + $linecount
Case Len ($linecount) = 2 $wslinecount = "00" + $linecount
Case Len ($linecount) = 3 $wslinecount = "0" + $linecount
Case 1 $wslinecount = $linecount
EndSelect
$wholescript = $wholescript + $wslinecount + " " + $line + @CRLF

If $match = 1
; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines))
Else
$allLines = $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines))
EndIf

$Match = 0 $Var = "$"

EndIf

$Line = ReadLine(1)
Loop


; ..
; ... sort and write report

If Exist ($report) Del $report EndIf
$ = Open (2,$report,5)
$ = WriteLine (2, $Title + " / Scanned file: "+$input+ @CRLF+ @CRLF)

; ..Sort Dict

For Each $VarNameA In $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + "," + $VarNameA
Next
$varArray = combsort (Split (SubStr ($VarString,2),","))

;... search for orphans and export the variables

For Each $VarName In $varArray

$VarLines = $dictAllVars.Item ($VarName)

If NOT InStr ($Varlines,",")
$orphans = $orphans + $varname + " " + $Varlines + @CRLF
$orphcount = $orphcount + 1
EndIf

$reportline = $Varname + " " + $VarLines + @CRLF
$ = WriteLine (2,$reportline)

Next

;... export rest

$ = WriteLine (2, "-----------------------"+@CRLF+ "All Variables: "+ $VarCount )
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Orphans: " + $orphcount + @CRLF+ "-----------------------"+ @CRLF + $orphans)

If $quoteErrCount > 0
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Possible Quote-Errors: " + $quoteErrCount + @CRLF+ "-----------------------"+ @CRLF+ $quoterror)
Else
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "No Quote-Errors found.")
EndIf

$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Scanned script:"+ @CRLF+ "-------------------------"+ @CRLF + $wholescript)
$=Close (1)
$=Close (2)


Run "%COMSPEC% /c " + $report ;Run "%COMSPEC% /c $report"
Quit 0


; ..
;... functions

Function DictionarySet ($DictionaryObject, $key, $value)
If VarTypeName($key) = "Empty"
Quit 13
EndIf

If $DictionaryObject.Exists($key)
$DictionaryObject.Remove($key)
EndIf

$DictionaryObject.Add($key, $value)
Exit @error
EndFunction


What have I been doing?

I (almost) implemented my favorite header (except for SetOption)
I put combsort in a reusable scriptfile
You do not have to do these things if you don't want. It is personal preference.
Code:

If NOT @LOGONMODE
Break On
Else
Break Off
EndIf
Dim $RC
;$RC = SetOption("Explicit","On")
$RC = SetOption("NoVarsInStrings","On")
$RC = SetOption("NoMacrosInStrings","On")
$RC = SetOption("WrapAtEOL","On")
Include "D:\scripts\udf\combsort.udf"


Show KiX files only in dialog box
Code:

$openFile.Filter = "KiX Files(*.kix;*.udf;*.scr)|*.kix;*.udf;*.scr|All files (*.*)|*.*"


I presume a double quote can also be a stopchar?
Code:

$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"+'"'
If InStr ($stopchars,$char) <> 0; OR Asc ($char) = 34


I love silence if nothing meaningfull can be said (will I shut up now? )
Code:

$ = $openFile.ShowDialog() ;$openFile.ShowDialog()


Got rid of that Goto
Code:

If $Char = ";" AND NOT ($quote1 = 1 OR $quote2 = 1)
$c = Len($Line) ;GoTo readAline
EndIf
...
;:readAline


Kicked some vars out of strings (because of SetOption("NoVarsInStrings","On"))
Code:

DictionarySet ($dictAllVars,CStr($var),CStr($allLines)) ;"$var","$allLines")
...
Run "%COMSPEC% /c " + $report ;Run "%COMSPEC% /c $report"


If var found at end of line, nothing counted or resetted
Code:

If $match = 1
; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines))
Else
$allLines = $linecount
DictionarySet ($dictAllVars,CStr($var),CStr($allLines))
EndIf

$Match = 0 $Var = "$"


This is the output file
Code:

VarScan 1.1b / Scanned file: d:\Scripts\test\VarScan.kix

$ 29, 53, 58, 68, 87, 91, 104, 148, 160, 161, 183, 189, 190, 193, 195, 198, 199, 200
$allLines 35, 97, 98, 100, 101, 141, 142, 144, 145
$c 80, 81, 84
$Char 81, 83, 87, 91, 92, 106, 111, 113, 119, 121
$curline 74, 115, 123
$dictAllVars 32, 33, 34, 95, 96, 98, 101, 139, 140, 142, 145, 165, 175
$DictionaryObject 210, 215, 216, 219
$FileName 58
$input 55, 56, 59, 68, 161
$key 210, 211, 215, 216, 219
$Line 69, 80, 81, 84, 115, 123, 135, 152
$linecount 39, 74, 78, 78, 97, 100, 130, 130, 131, 131, 132, 132, 133, 141, 144
$Match 28, 88, 91, 104, 137, 148
$OpenFile 47, 48, 49, 50, 51, 52, 53, 55
$orphans 37, 178, 178, 190
$orphcount 38, 179, 179, 190
$quote1 40, 73, 77, 83, 111, 112, 114
$quote2 41, 73, 77, 83, 119, 120, 122
$quoteErrCount 75, 75, 192, 193
$quoterror 74, 74, 193
$rc 6, 8, 9, 10, 60
$report 56, 159, 159, 160
$report 203
$reportline 182, 183
$stopchars 30, 92
$System 45, 47
$tempLines 96, 97, 140, 141
$TextMode 31, 33
$Title 16, 161
$value 210, 219
$Var 29, 95, 96, 98, 101, 104, 106, 106, 139, 140, 142, 145, 148
$varArray 169, 173
$VarCount 36, 166, 166, 189
$VarLines 175, 177, 178, 182
$Varname 173, 175, 178, 182
$VarNameA 165, 167
$VarNames 34
$VarString 167, 167, 169
$wholescript 135, 135, 198
$wslinecount 130, 131, 132, 133, 135
-----------------------
All Variables: 40


Orphans: 3
-----------------------
$FileName 58
$report 203
$VarNames 34



Possible Quote-Errors: 5
-----------------------
Attention: Presumably a missing quotation mark in:
30 $stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"+'"'

Attention: Presumably a missing quotation mark in:
111 Case $Char = '"' AND $quote1 = 1

Attention: Presumably a missing quotation mark in:
113 Case $Char = '"'

Attention: Presumably a missing quotation mark in:
119 Case $Char = "'" AND $quote2 = 1

Attention: Presumably a missing quotation mark in:
121 Case $Char = "'"




Scanned script:
-------------------------
0001 ...


Questions:
  • I do not get the Possible Quote-Errors.
    If a string starts with ", it ends with " (you can use any number of the ' quote in between)
    If a string starts with ', it ends with ' (you can use any number of the " quote in between)
    It does not matter what is between the quotes (except maybe vars and macros)
  • If you skip the line after a ";", you will also want to skip block quotes?

Top
#167629 - 2006-09-25 11:43 AM Re: Scan Kixfile for variables
therob Offline
Starting to like KiXtart

Registered: 2005-05-19
Posts: 150
Loc: Frankfurt/M., Germany
Thanks, Witto. It would have been a little bit easier for me to see what solved the initial problem actually, if you have left your cosmetics aside, but ok.

To be honest, i dont get these "no vars, macros in stings"- hype. I always found it a feature to dont have to type all these little "+"'s. Where is the disadvantage?

Anyway, the key for the problem was to place the "add to dict"-part at the end after scanning one line. As it is the same code as above i placed it in a function (think in functions? ) And now it works fine. Sometimes you dont see what is right in front of you. Thanks again.

For the quote-check: I fixed that, i just forgot to change it in the code i posted here. (Its just the "and not"-statement before setting quote1 or 2.

Code:
 
; ===========================================================================================
;
; Script Information
;
$Title = "VarScan 1.1b
; Author: therob / Function combsort () by Shawn Tassie
; Description: Scans kixfiles for Variables and missing quotes and writes a reportfile
; -> Syntax of the reportfile: [variable] - [linenumbers in which the variable is used]
;
; ===========================================================================================


Break On

;.. variables

$match = 0
$Var = "$"
$stopchars = " <>()+-.,'#;:?=/&\}][{*!@@"
$TextMode = 1
$dictAllVars = CreateObject ("Scripting.Dictionary")
$dictAllVars.CompareMode = $TextMode
$allLines = "none"
$VarCount = 0
$orphans = ""
$orphcount = 0
$linecount = 0
$quote1 = 0
$quote2 = 0

;... select source

$System = CreateObject("Kixtart.System")

$openFile = $System.openFileDialog()
$openFile.Title = "Open a script to scan"
$openFile.InitialDirectory = @curDIR
$openFile.Filter = "KiX Files(*.kix;*.udf;*.scr)|*.kix;*.udf;*.scr|All files (*.*)|*.*"
$openFile.Title = "Select a kixfile to scan..."
$openFile.DefaultExt = "kix"
$ = $openFile.ShowDialog()

$input = $OpenFile.FileName
$report = $input + "-VarScanReport.txt"

If $input = ""
$ = MessageBox("No file selected.", "Whoo", 262208, 5)
Quit
EndIf


; ..
; ... scan file

$=Open (1,$input,2)
$Line = ReadLine(1)

While NOT @error

If $quote1 = 1 OR $quote2 =1
$quoterror = $quoterror + "Attention: Presumably a missing quotation mark in: "+ @CRLF + $linecount + " " + $curline + @crlf +@crlf
$quoteErrCount = $quoteErrCount + 1
EndIf
$quote1 = 0 $quote2 = 0
$linecount = $linecount + 1

For $c = 1 to Len($Line)
$Char = SubStr ($Line, $c, 1)

If $Char = ";" AND NOT ($quote1 = 1 OR $quote2 = 1)
$c = Len($Line)
EndIf

If $Char = "$"
$match = 1
EndIf

If $match = 1 AND NOT $char ="$"
If InStr ($stopchars,$char) <> 0 OR Asc ($char) = 34
addtodict ()
Else
$Var = $var + $char
EndIf
EndIf

Select ;look for --> "
Case $Char = '"' AND $quote1 = 1
$quote1 = 0
Case $Char = '"' AND NOT $quote2 = 1
$quote1 = 1
$curline = $line
EndSelect

Select ;look for --> '
Case $Char = "'" AND $quote2 = 1
$quote2 = 0
Case $Char = "'" AND NOT $quote1 = 1
$quote2 = 1
$curline = $line
EndSelect
Next

:readAline

Select
Case Len ($linecount) = 1 $wslinecount = "000" + $linecount
Case Len ($linecount) = 2 $wslinecount = "00" + $linecount
Case Len ($linecount) = 3 $wslinecount = "0" + $linecount
Case 1 $wslinecount = $linecount
EndSelect
$wholescript = $wholescript + $wslinecount + " " + $line + @CRLF

If $match = 1
addtodict ()
EndIf

$Line = ReadLine(1)
Loop


; ..
; ... sort and write report

If Exist ($report) Del $report EndIf
$ = Open (2,$report,5)
$ = WriteLine (2, $Title + " / Scanned file: "+$input+ @CRLF+ @CRLF)

; ..Sort Dict

For Each $VarNameA In $dictAllVars.Keys
$VarCount = $VarCount + 1
$VarString = $VarString + "," + $VarNameA
Next
$varArray = combsort (Split (SubStr ($VarString,2),","))

;... search for orphans and export the variables

For Each $VarName In $varArray

$VarLines = $dictAllVars.Item ($VarName)

If NOT InStr ($Varlines,",")
$orphans = $orphans + $varname + " " + $Varlines + @CRLF
$orphcount = $orphcount + 1
EndIf

$reportline = $Varname + " " + $VarLines + @CRLF
$ = WriteLine (2,$reportline)

Next

;... export rest

$ = WriteLine (2, "-----------------------"+@CRLF+ "All Variables: "+ $VarCount )
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Orphans: " + $orphcount + @CRLF+ "-----------------------"+ @CRLF + $orphans)

If $quoteErrCount > 0
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Possible Quote-Errors: " + $quoteErrCount + @CRLF+ "-----------------------"+ @CRLF+ $quoterror)
Else
$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "No Quote-Errors found.")
EndIf

$ = WriteLine (2, @CRLF+@CRLF+ @CRLF+ "Scanned script:"+ @CRLF+ "-------------------------"+ @CRLF + $wholescript)
$=Close (1)
$=Close (2)


Run "%COMSPEC% /c " + $report
Quit 0


; ..
;... functions

Function Addtodict ()
; .. add to Dict
If $dictAllVars.Exists($var)
$tempLines = $dictAllVars.Item ($var)
$allLines = $tempLines + ", " + $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
Else
$allLines = $linecount
DictionarySet ($dictAllVars,"$var","$allLines")
EndIf

$Match = 0 $Var = "$"

EndFunction

Function DictionarySet ($DictionaryObject, $key, $value)
If VarTypeName($key) = "Empty"
Quit 13
EndIf

If $DictionaryObject.Exists($key)
$DictionaryObject.Remove($key)
EndIf

$DictionaryObject.Add($key, $value)
Exit @error
EndFunction

Function combsort($v, optional $o)
Dim $i,$j,$m,$s,$g
$n=Ubound($v)
$g=$n
If $g
While $g > 1 OR NOT $s
$g=($g*1000)/1279
If $g < 1
$g=1
EndIf
$s=1
For $i = 0 to $n-$g
$j=$i+$g
If ($v[$i] > $v[$j] AND NOT $o) OR ($v[$i] < $v[$j] AND $o)
$m = $v[$i]
$v[$i] = $v[$j]
$v[$j] = $m
$s=0
EndIf
Next
Loop
$combsort = $v
Else
$combsort = 0
EndIf
EndFunction



Export:

Code:
  
VarScan 1.1b / Scanned file: E:\scripte\mixed\scanKixforVariables\tes3.kix

$emessage 1, 3
$errcount 2, 3
$rc 3
$test 5, 5
$TextBox4 2
-----------------------
All Variables: 5


Orphans: 2
-----------------------
$rc 3
$TextBox4 2



Possible Quote-Errors: 1
-----------------------
Attention: Presumably a missing quotation mark in:
2 $TextBox4.Text = $errcount " ; <--- real quoteerror here




Scanned script:
-------------------------
0001 Function ermes ($emessage)
0002 $TextBox4.Text = $errcount " ; <--- real quoteerror here
0003 $rc= WriteLine (9," @time ;Fehler $errcount ; "+$emessage+" ###@CRLF")
0004 ; this is a $variable and a " in a comment
0005 $test = $test + "a quote in a quote --> ' <--"
0006 EndFunction
0007


_________________________
Eternity is a long time, especially towards the end. - W.Allan

Top
#167630 - 2006-09-25 12:37 PM Re: Scan Kixfile for variables
Witto Offline
MM club member
*****

Registered: 2004-09-29
Posts: 1828
Loc: Belgium
You're new problem was at the end of a line that you checked char per char. If the last "word" was a variable, there was nothing that added the variable to your "dictionary counting system" and nothing to reset "$match = 1" to "$match = 0".

About NoVarsInStrings and NoMacrosInStrings.
For me, string is string. Anything written in a string should be interpreted as a string. If it works in another way, then it is just too confusing.
try this
Code:

Break On
? "NoVarsInStrings is Off"
? "$a = "
? "$$a = "
? "$ = "
? "$$ = "
$a = 5
$ = 7
? "$a = " + $a
? "$$a = " + $a
? "$ = " + $
? "$$ = " + $
? "Now we set NoVarsInStrings On"
Dim $RC
$RC = SetOption("NoVarsInStrings","On")
? "$a = " + $a
? "$$a = " + $a
? "$ = " + $
? "$$ = " + $


Do you see the difference? IMHO, good practice to get better code: NoVarsInStrings=On.
The same goes for NoMacrosInStrings. Will I invent an example script to make it clear? Or will you invent something?
About Explicit: there are some reasons to declare your vars.
  • Avoid typos
    you would notice type errors like in this question
  • All vars that you do not declare are global
    Just play with the semicolons in this script:
    Code:

    If NOT @LOGONMODE
    Break On
    Else
    Break Off
    EndIf
    Dim $RC
    ;$RC = SetOption("Explicit","On")
    $RC = SetOption("NoVarsInStrings","On")
    $RC = SetOption("NoMacrosInStrings","On")
    $RC = SetOption("WrapAtEOL","On")

    MakeGlobalVar
    ? $ThisIsAGlobalVar

    Function MakeGlobalVar()
    ;Dim $ThisIsAGlobalVar
    ;Global $ThisIsAGlobalVar
    $ThisIsAGlobalVar = "Do you really want this?"
    EndFunction



Now these are my preferences. You do not have to use them if you do not want to.

[Edit]
I see you added this to your Addtodict function
Code:

$Match = 0 $Var = "$"


IMHO it does not belong there and it is just working because you do not declare your vars. They are global.
You should also write your function in a way that you "feed" the things to your function. Look at CombSort().
Try this, play with the semicolons. I do not like MutliplyTwo
Code:

If NOT @LOGONMODE
Break On
Else
Break Off
EndIf
Dim $RC
$RC = SetOption("Explicit","On")
$RC = SetOption("NoVarsInStrings","On")
$RC = SetOption("NoMacrosInStrings","On")
$RC = SetOption("WrapAtEOL","On")

Dim $a, $b, $c
;Global $a, $b, $c
$a = 3
$b = 4
$c = MultiplyOne($a, $b)
? $c
;? MultiplyTwo()

Function MultiplyOne($i, $j)
$MultiplyOne = $i * $j
EndFunction

;Function MultiplyTwo()
; $a * $b
;EndFunction


[/Edit]


Edited by Witto (2006-09-25 05:23 PM)

Top
Page 1 of 2 12>


Moderator:  Glenn Barnas, NTDOC, Arend_, Jochen, Radimus, Allen, ShaneEP, Ruud van Velsen, Mart 
Hop to:
Shout Box

Who's Online
0 registered and 2220 anonymous users online.
Newest Members
Viginette, ManuvdWielNL, Sir_Barrington, batdk82, StuTheCoder
17888 Registered Users

Generated in 0.148 seconds in which 0.083 seconds were spent on a total of 13 queries. Zlib compression enabled.

Search the board with:
superb Board Search
or try with google:
Google
Web kixtart.org