Introduction
XDD (XDesigner.Development) is a tool for software developers written by yuan yong fu. It is open source. It can analyse VB, C++, C#,
Delphi projects and count the number of source code lines, copy project files clearly; back up source files without wasting file and VSS information.
This is the project site: http://xdd.codeplex.com; (you can download the last version).
Autor's email:yyf9989@hotmail.com; blog site:http://www.cnblogs.com/xdesigner.
Background
Millions of programmers work hard year after year, and write many source codes in C++, C#, VB or Delphi. Sometimes, they want know how many lines
are there of that source code,Back file without any temp file which create by IDE. Of course, they cannot do it by hand, so they need a tool to do this.
Using the code
Today, source code files are not alone, many source code files construct a project, and the compiler handles the project and generates a program file.
For example, in VS.NET 2005, people create a C# project whose file name’s extension is csproj, and add many C# source files to the C# project.
XDD needs to analyze develop project file and get a list of source code file, also equip source code analyzer which can analyze source code like VB , C# or Pascal.
For example, a C# .NET2005 project file in XML format. There is a sample.
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>CellViewLib</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Reference Include="System">
<Name>System</Name>
</Reference>
</ItemGroup>
<ItemGroup>
<Content Include="App.ico" />
<Compile Include="frmTestCellView.cs">
<SubType>Form</SubType>
</Compile>
<EmbeddedResource Include="frmTestCellView.resx">
<DependentUpon>frmTestCellView.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
</Project>
To this XML document, I can execute XPath “Project/ItemGroup/Compile” and get a list of C# source file names. So I write the following C# code:
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(txt);
if (doc.DocumentElement.Name == "Project"
&& doc.DocumentElement.GetAttribute("xmlns") ==
"<a href="http:
"2003">http:
{
project.ProjectFileName = strFileName;
project.RootPath = System.IO.Path.GetDirectoryName(strFileName);
ProjectFile ProjFile = new ProjectFile();
ProjFile.FileName = System.IO.Path.GetFileName(strFileName);
ProjFile.FullFileName = strFileName;
ProjFile.Style = FileStyle.None;
project.Files.Add(ProjFile);
System.Xml.XmlNamespaceManager ns =
new System.Xml.XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("a", "<a href="http:
"/developer/msbuild/2003">http:
"developer/msbuild/2003</a />");
System.Xml.XmlNode NameNode = doc.SelectSingleNode
("a:Project/a:PropertyGroup/a:AssemblyName", ns);
if (NameNode != null)
{
project.Name = NameNode.InnerText;
}
foreach (System.Xml.XmlElement element in doc.SelectNodes
("a:Project/a:ItemGroup/*[name()='Compile' or name()='None' or
name()='EmbeddedResource' or name()='Content']", ns))
{
string file = element.GetAttribute("Include");
ProjectFile NewFile = new ProjectFile();
NewFile.FileName = project.FixFileName(file);
if (System.IO.Path.IsPathRooted(file))
{
NewFile.FullFileName = file;
}
else
{
NewFile.FullFileName = System.IO.Path.Combine(project.RootPath, file);
}
if (element.Name == "Compile")
{
NewFile.Style = FileStyle.SourceCode;
}
else if (element.Name == "EmbeddedResource")
{
NewFile.Style = FileStyle.Resource;
}
else
{
NewFile.Style = FileStyle.None;
}
project.Files.Add(NewFile);
}
}
Using this code, XDD can get a file list from C#2005 project file. In the same way, XDD can analyze VB.NET 2005, VB6.0, Delphi project file and get source code file list.
Next, XDD needs to analyze source code with some kind of syntax. For example, there are some C# source code as follows:
int DefineString = 0;
bool DefineComment = false ;
foreach( LineInfo info in myLines )
{
info.CodeFlag = false;
if( info.LineText.Length == 0 && DefineString == 2)
info.BlankLine = false;
for(int iCount = 0 ; iCount < info.LineText.Length ; iCount ++)
{
char c = info.LineText[iCount] ;
char c2 = (char)0;
if( iCount < info.LineText.Length - 1 )
c2 = info.LineText[ iCount + 1 ];
if(! char.IsWhiteSpace( c ))
info.BlankLine = false;
if( DefineComment )
{
info.BlankLine = false;
info.CommentFlag = true;
if( c == '*' && c2 == '/' )
{
DefineComment = false;
iCount ++ ;
}
continue ;
}
if( DefineString == 0 )
{
if( c == '/' && c2 != 0 )
{
if( c2 == '/' )
{
info.CommentFlag = true;
DefineComment = false;
goto NextLine ;
}
if( c2 == '*' )
{
if( iCount > 0 )
info.CodeFlag = true;
info.CommentFlag = true;
DefineComment = true;
iCount ++ ;
continue;
}
}
if( c == '\"')
{
if( iCount < 0 && info.LineText[iCount-1] ==
<a href="mailto:'@'">'@'</a />)
DefineString = 2 ;
else
DefineString = 1 ;
}
}
else
{
info.BlankLine = false;
if( c == '\"' )
{
if( iCount < 0 && info.LineText[iCount-1] !='\\' )
DefineString = 0 ;
}
}
if( ! char.IsWhiteSpace( c ))
info.CodeFlag = true;
}
NextLine:;
}
LineInfo
type is a class which contains information of a source code line. It is defined as follows:
public class LineInfo
{
public string LineText = null;
public bool CommentFlag = false;
public bool BlankLine = true;
public bool CodeFlag = false;
}
By using the above code, XLineCounter
can analyze C#.NET 2005 project files and C# source code, count the number of C# source code lines. In the same way, XLineCounter
can count the number of source code lines of VB.NET, Delphi and C++.
Points of Interest
None.
History
2012-6-24: First release.