虽然在Windows里面操作INI并不是一件难事,但为了使用更强大的功能,就需要编写自己的INI解析程序,这是DWG用C#实现的一个INI解析器
using System;
using System.Text.RegularExpressions;
using System.Collections;
/*********************************************************************
DWG INI Parser 1.0
作者:DWG
Copyright(C)2002-2003
作者网站:http://asp.6to23.com/mulansystem
版权声明:
(1)版权归“DWG”所有,任何个人或企业未经许可不得用于商业用途;
(2)个人可免费使用本程序,但不得去除版权信息,修改后的版本不得去除原作者信息;
若要发布修改版本,应该先给作者发一份修改后的源程序;
(3)本源程序发布在http://asp.6to23.com/mulansystem 技术/原创作品展示
使用方法:
请参考http://asp.6to23.com/mulansystem 技术/原创作品展示内的相关文档;
*********************************************************************/
namespace StrProcessor
{
public class Ini
{
public delegate void OnDebugMessage(bool errorflag,string msg);
public event OnDebugMessage OnDebug;
private Regex regex;
private MatchCollection mc;
private Comment cm;
private Convert cv;
// Temporary swap variable
private string strA,strAA;
private string [] strB,strBB;
// Control flags
private string iniEOL;
private bool iniCleanSpilthEOL,iniProcError,iniCaseSensitive;
//
public Ini()
{
cm=new Comment();
cv=new Convert();
ResetDefaultOptions();
OnDebug+=new OnDebugMessage(OnDefaultDebugMessage);
}
///////////////////////////// Interface Functions /////////////////////////////////
public string SetString(string src_ini,string mainkey,string subkey,string val){
string temp=cv.EncodeString(val);
if(temp.Length==src_ini.Length) return AutoSetKeyValue(src_ini,mainkey,subkey,temp);
else return AutoSetKeyValue(src_ini,mainkey,subkey,"\""+temp+"\"");
}
public string GetString(string src_ini,string mainkey,string subkey){
string temp=GetKeyValue(src_ini,mainkey,subkey);
if(!iniProcError){
if(temp.IndexOf("\"")==0&&temp.IndexOf("\"",temp.Length-1)==temp.Length-1&&temp.Length>2)
return cv.DecodeString(temp.Substring(1,temp.Length-2));
else
return temp;
}
else return "";
}
public string[] GetMainkeyNames(string src_ini){
strB=new string[]{""};
strAA=CleanComments(src_ini);
if(!iniProcError){
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc = regex.Matches(strA);
int cnt=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length!=0)
cnt++;
strB=new string[cnt];
cnt=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length!=0)
strB[cnt++]=mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim();
SendOkMsg("Get mainkey names OK.");
return strB;
}
else return strB;
}
public string[] GetSubkeyNames(string src_ini,string mainkey){
strB=new string[]{""};
if(TestMainkeyExist(src_ini,mainkey)){
strB=new string[]{""};
strAA=CleanComments(src_ini);
if(!iniProcError){
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
mainkey=CaseProc(mainkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length!=0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index+mc[i].Value.Length;
if((i+1)!=mc.Count) length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strB=strAA.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
length=0;
for(int i=0;i<strB.Length;i++)
if(strB[i].Trim().Replace("\ua1a1","").Length!=0)
if(strB[i].Trim().Replace("\ua1a1","").Split('=').Length>1)
length++;
strBB=new String[length];
length=0;
for(int i=0;i<strB.Length;i++)
if(strB[i].Trim().Replace("\ua1a1","").Length!=0)
if(strB[i].Trim().Replace("\ua1a1","").Split('=').Length>1)
strBB[length++]=strB[i].Split('=')[0].Trim();
SendOkMsg("Get subkey names OK.");
return strBB;
}
else return strB;
}
else return strB;
}
public bool TestKeyExist(string src_ini,string mainkey,string subkey){
if(mainkey.Trim().Length==0&&subkey.Trim().Length==0){
SendErrorMsg("Test key exist exception:must be specify the mainkey & subkey names.");
return false;
}
else{
if(subkey.Trim().Length==0) return TestMainkeyExist(src_ini,mainkey);
else return TestSubkeyExist(src_ini,mainkey,subkey);
}
}
public string GetKeyValue(string src_ini,string mainkey,string subkey){
if(TestSubkeyExist(src_ini,mainkey,subkey)){
strAA=CleanComments(src_ini);
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
if(iniProcError) return "";
mainkey=CaseProc(mainkey.Trim());
subkey=CaseProc(subkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length!=0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index+mc[i].Value.Length;
if((i+1)!=mc.Count) length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strB=strAA.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
strA="";
for(int i=0;i<strB.Length;i++)
if(strB[i].Trim().Replace("\ua1a1","").Length!=0)
if(strB[i].Trim().Replace("\ua1a1","").Split('=').Length>1)
if(CaseProc(strB[i].Split('=')[0].Trim())==subkey)
strA=strB[i].Substring(strB[i].IndexOf("=")+1).Trim();
SendOkMsg("The value of key:\""+mainkey.Trim()+"."+subkey+"\" is "+strA+".");
return strA;
}else return "";
}
public long GetKeyValueLong(string src_ini,string mainkey,string subkey)
{
strA=GetKeyValue(src_ini,mainkey,subkey);
if(!iniProcError&&strA.Trim().Length!=0){
regex=new Regex(@"[^0-9]*");
mc=regex.Matches(strA);
if(mc.Count==0) return Int64.Parse(strA.Trim());
else return 0;
}
else return 0;
}
public string SetKeyValue(string src_ini,string mainkey,string subkey,string val){
if(TestSubkeyExist(src_ini,mainkey,subkey)){
strAA=EmptyComments(src_ini);
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
mainkey=CaseProc(mainkey.Trim());
subkey=CaseProc(subkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length>0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index+mc[i].Value.Length;
if((i+1)!=mc.Count)length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strB=strAA.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
strBB=src_ini.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
strA="";
for(int i=0;i<strB.Length;i++)
if(strB[i].Trim().Replace("\ua1a1","").Length!=0){
if(strB[i].Trim().Split('=').Length>1){
if(CaseProc(strB[i].Split('=')[0].Trim())==subkey){
strA+=strB[i].Trim().Split('=')[0].Trim()+"="+val.Trim();
if(strBB[i].IndexOf(@";")!=-1&&strBB[i].IndexOf(@"//")!=-1){
if(strBB[i].IndexOf(@";")<strBB[i].IndexOf(@"//"))
strA+=strBB[i].Substring(strBB[i].IndexOf(@";"));
else
strA+=strBB[i].Substring(strBB[i].IndexOf(@"//"));
}
else if(strBB[i].IndexOf(@"//")!=-1){
strA+=strBB[i].Substring(strBB[i].IndexOf("//"));
}
else if(strBB[i].IndexOf(@";")!=-1){
strA+=strBB[i].Substring(strBB[i].IndexOf(@";"));
}
strA+=iniEOL;
}
else strA+=strBB[i]+iniEOL;
}else strA+=strBB[i]+iniEOL;
}else strA+=strBB[i]+iniEOL;
SendOkMsg("Set the value of key:\""+mainkey.Trim()+"."+subkey+"\" to \""+val.Trim()+"\".");
strA=src_ini.Substring(0,sloc)+strA+src_ini.Substring(sloc+length);
return CleaningSpilthEOL(strA);
}
else return src_ini;
}
public string SetKeyValueLong(string src_ini,string mainkey,string subkey,long val){
return SetKeyValue(src_ini,mainkey,subkey,val.ToString());
}
public string AutoSetKeyValue(string src_ini,string mainkey,string subkey,string val){
if(!TestMainkeyExist(src_ini,mainkey))src_ini=CreateMainkey(src_ini,mainkey);
return CreateSubkey(src_ini,mainkey,subkey,val);
}
public string CleanComments(string src_ini){
if(src_ini.Trim()!=""){
cm.WithoutContainer("\"","\"","\'","\'");
strA=cm.CleanComments(src_ini,@"/*",@"*/",@"//","",@";","");
SendOkMsg("Clean comments OK.");
return CleaningSpilthEOL(strA);
}
else{
SendErrorMsg("Source ini string empty exception when cleaning comments.");
return src_ini;
}
}
public void ResetDefaultOptions(){
iniEOL="\r\n";
iniCleanSpilthEOL=true;
iniProcError=false;
iniCaseSensitive=true;
cm.EOL=iniEOL;
cm.CleanSpilthEOL=iniCleanSpilthEOL;
}
public string DeleteKey(string src_ini,string mainkey,string subkey){
if(subkey.Trim().Length==0) return DeleteMainkey(src_ini,mainkey);
else return DeleteSubkey(src_ini,mainkey,subkey);
}
/////////////////////////////// Internal functions ////////////////////////////////
protected string CreateMainkey(string src_ini,string mainkey){
if(mainkey.Trim().Length==0){
SendErrorMsg(@"Internal:create mainkey error,must specify the mainkey name.");
return src_ini;
}
else{
if(TestMainkeyExist(src_ini,mainkey))src_ini=CleaningSpilthEOL(DeleteMainkey(src_ini,mainkey));
src_ini+=iniEOL+"["+mainkey.Trim()+"]"+iniEOL;
SendOkMsg("Internal:create mainkey \""+mainkey.Trim()+"\" OK.");
return CleaningSpilthEOL(src_ini);
}
}
protected string CreateSubkey(string src_ini,string mainkey,string subkey,string val){
if(TestMainkeyExist(src_ini,mainkey)){
if(TestSubkeyExist(src_ini,mainkey,subkey)) return SetKeyValue(src_ini,mainkey,subkey,val);
strAA=EmptyComments(src_ini);
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
mainkey=CaseProc(mainkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length>0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index+mc[i].Value.Length;
if((i+1)!=mc.Count)length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strA=src_ini.Substring(0,sloc+length)+iniEOL+subkey+"="+val.Trim()+iniEOL+src_ini.Substring(sloc+length);
SendOkMsg("Create the subkey:\""+mainkey.Trim()+"."+subkey.Trim()+"\" OK.");
return CleaningSpilthEOL(strA);
}
else return src_ini;
}
protected string DeleteMainkey(string src_ini,string mainkey){
if(TestMainkeyExist(src_ini,mainkey)){
strAA=EmptyComments(src_ini);
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
mainkey=CaseProc(mainkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length>0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index;
if((i+1)!=mc.Count)length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strA=src_ini.Substring(0,sloc)+iniEOL+src_ini.Substring(sloc+length);
SendOkMsg("Delete the mainkey:\""+mainkey.Trim()+"\" OK.");
return CleaningSpilthEOL(strA);
}
else return src_ini;
}
protected string DeleteSubkey(string src_ini,string mainkey,string subkey){
if(TestSubkeyExist(src_ini,mainkey,subkey)){
strAA=EmptyComments(src_ini);
cm.WithoutContainer();
strA=cm.EmptyComments(strAA,"\"","\"");
mainkey=CaseProc(mainkey.Trim());
subkey=CaseProc(subkey.Trim());
regex=new Regex(@"(\r\n)?\[[\x20\ua1a1]*\S+[\x20\ua1a1]*\]\s*(\r\n)?");
mc=regex.Matches(strA);
int sloc=0,length=0;
for(int i=0;i<mc.Count;i++)
if(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim().Replace("\ua1a1","").Length>0)
if(CaseProc(mc[i].Value.Replace(iniEOL,"").Replace("[","").Replace("]","").Trim())==mainkey){
sloc=mc[i].Index+mc[i].Value.Length;
if((i+1)!=mc.Count)length=mc[i+1].Index-sloc;
else length=strA.Substring(sloc).Length;
break;
}
strB=strAA.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
strBB=src_ini.Substring(sloc,length).Replace(iniEOL,"\n").Split('\n');
strA="";
for(int i=0;i<strB.Length;i++)
if(strB[i].Trim().Replace("\ua1a1","").Length!=0){
if(strB[i].Trim().Replace("\ua1a1","").Split('=').Length>1){
if(CaseProc(strB[i].Split('=')[0].Trim())!=subkey)strA+=strBB[i]+iniEOL;
}else strA+=strBB[i]+iniEOL;
}else strA+=strBB[i]+iniEOL;
SendOkMsg("Delete the subkey:\""+mainkey.Trim()+"."+subkey+"\" OK.");
strA=src_ini.Substring(0,sloc)+strA+src_ini.Substring(sloc+length);
return CleaningSpilthEOL(strA);
}
else return src_ini;
}
protected string EmptyComments(string src_ini){
if(src_ini.Trim().Length!=0){
cm.WithoutContainer("\"","\"","\'","\'");
strA=cm.EmptyComments(src_ini,@"/*",@"*/",@"//","",@";","");
SendOkMsg(@"Internal:empty comments OK.");
return strA;
}
else{
SendErrorMsg(@"Internal:source ini empty exception.");
return src_ini;
}
}
protected bool TestMainkeyExist(string src_ini,string mainkey){
strB=GetMainkeyNames(src_ini);
if(!iniProcError){
mainkey=CaseProc(mainkey.Trim());
if(mainkey.Length==0){
SendErrorMsg("Test mainkey exist exception:must specify the mainkey name.");
return false;
}
for(int i=0;i<strB.Length;i++)
if(CaseProc(strB[i])==mainkey){
SendOkMsg("The main key:\""+mainkey+"\" to be exist.");
return true;
}
SendOkMsg("The main key:\""+mainkey+"\" not exist.");
return false;
}
else return false;
}
protected bool TestSubkeyExist(string src_ini,string mainkey,string subkey){
if(TestMainkeyExist(src_ini,mainkey)){
strB=new string[]{""};
strB=GetSubkeyNames(src_ini,mainkey);
if(!iniProcError){
subkey=CaseProc(subkey.Trim());
if(subkey.Length==0){
SendErrorMsg("Test subkey exist exception:must specify the subkey name.");
return false;
}
if(strB.Length>0){
for(int i=0;i<strB.Length;i++)
if(CaseProc(strB[i])==subkey){
SendOkMsg("The key:\""+mainkey.Trim()+"."+subkey+"\" to be exist.");
return true;
}
}
SendOkMsg("The key:\""+mainkey.Trim()+"."+subkey+"\" not exist.");
return false;
}
else return false;
}
else return false;
}
private string CleaningSpilthEOL(string src_ini){
strA=src_ini;
if(iniCleanSpilthEOL){
for(int i=0;i<3;i++) strA=strA.Replace(iniEOL+iniEOL,iniEOL);
while(strA.IndexOf(iniEOL)==0){
strA=strA.Substring(iniEOL.Length);
}
}
return strA;
}
private void SendOkMsg(string msg){
iniProcError=false;
OnDebug(iniProcError,msg);
}
private void SendErrorMsg(string msg){
iniProcError=true;
OnDebug(iniProcError,msg);
}
private void OnDefaultDebugMessage(bool error,string msg){
}
private string CaseProc(string str){
if(iniCaseSensitive) return str;
else return str.ToLower();
}
/////////////////////////////// Attributes function ///////////////////////////////
public string EOL{
get{
return iniEOL;
}
set{
iniEOL=value;
cm.EOL=iniEOL;
}
}
public bool CleanSpilthEOL{
get{
return iniCleanSpilthEOL;
}
set{
iniCleanSpilthEOL=value;
cm.CleanSpilthEOL=iniCleanSpilthEOL;
}
}
public bool CaseSensitive{
get{
return iniCaseSensitive;
}
set{
iniCaseSensitive=value;
}
}
public bool Error{
get{
return iniProcError;
}
}
}
public class Convert{
public string DecodeString(string src){
if(src.Trim().Length>0){
src=src.Replace(@"\a","\a");
src=src.Replace(@"\b","\b");
src=src.Replace(@"\t","\t");
src=src.Replace(@"\r","\r");
src=src.Replace(@"\v","\v");
src=src.Replace(@"\f","\f");
src=src.Replace(@"\n","\n");
src=src.Replace(@"\d","\x22");
src=src.Replace(@"\s","\x27");
src=src.Replace(@"\m","\\");
int loc=0,begin=0;
string temp="";
while(loc<src.Length&&src.IndexOf(@"\",loc)>-1){
loc=src.IndexOf(@"\",loc);
for(int i=begin;i<loc;i++) temp+=src[i].ToString();
temp+=StringToValue(src,ref loc);
begin=loc;
if(loc>=src.Length)break;
}
if(loc<=src.Length-1){
for(int i=loc;i<=src.Length-1;i++)
temp+=src[i].ToString();
}
return temp;
}
else return src;
}
public string EncodeString(string src){
if(src.Trim().Length>0){
src=src.Replace("\",@"m");
src=src.Replace("\a",@"\a");
src=src.Replace("\b",@"\b");
src=src.Replace("\t",@"\t");
src=src.Replace("\r",@"\r");
src=src.Replace("\v",@"\v");
src=src.Replace("\f",@"\f");
src=src.Replace("\n",@"\n");
src=src.Replace("\x22",@"\d");
src=src.Replace("\x27",@"\s");
string temp="";
for(int i=0;i<src.Length;i++){
if(src[i]<='\x1f'||(src[i]>='\x7f'&&src[i]<='\xff')) temp+=ToHexString(src[i]);
else temp+=src[i].ToString();
}
return temp;
}
else return src;
}
public string StringToValue(string src,ref int loc){
string temp;
if(loc+1<src.Length){
if(loc+1<src.Length-1){
temp=src.Substring(loc+1);
ushort a=0,b=0,c=0;
if(temp[0]=='0'){
if(temp[1]>='0'&&temp[1]<='7'){
a=(ushort)(temp[1]-'0');
if(temp.Length>=3){
if(temp[2]>='0'&&temp[2]<='7'){
b=(ushort)(temp[2]-'0');
if(temp.Length>=4){
if(temp[3]>='0'&&temp[3]<='7'){
c=(ushort)(temp[3]-'0');
loc+=5;
return ((char)(a*64+b*8+c)).ToString();
}
else{
loc+=4;
return ((char)(a*8+b)).ToString();
}
}
else{
loc+=4;
return ((char)(a*8+b)).ToString();
}
}
else{
loc+=3;
return ((char)a).ToString();
}
}
else{
loc+=3;
return ((char)a).ToString();
}
}
else{
loc+=2;
return @"\0";
}
}
else if(temp[0].ToString().ToLower()=="x"){
if( (temp[1]>='0'&&temp[1]<='9') || ( (temp[1]|0x20) >='a' && (temp[1]|0x20) <='f') ){
if(temp[1]<='9'){
a=(ushort)(temp[1]-'0');
}
else{
a=(ushort)((temp[1]|0x20)-'a'+10);
}
if(temp.Length>=3){
if( (temp[2]>='0'&&temp[2]<='9') || ( (temp[2]|0x20) >='a' && (temp[2]|0x20) <='f') ){
if(temp[2]<='9'){
b=(ushort)(temp[2]-'0');
}
else{
b=(ushort)((temp[2]|0x20)-'a'+10);
}
loc+=4;
return ((char)(a*16+b)).ToString();
}
else{
loc+=3;
return ((char)a).ToString();
}
}
else{
loc+=3;
return ((char)a).ToString();
}
}
else{
loc+=2;
return @"\"+temp[0].ToString();
}
}
else{
loc++;
return @"\";
}
}
else{
loc+=2;
return @"\"+src[loc-1].ToString();
}
}
else{
loc++;
return @"\";
}
}
protected string ToHexString(char val){
ushort baseradix=16;
return @"\x"+HexCode((ushort)(val/baseradix))+HexCode((ushort)(val%baseradix));
}
protected string ToOctString(char val){
int baseradix=8,a=0,b=0,c=0,v;
v=(int)val;
if(v>baseradix*baseradix)
a=v/(baseradix*baseradix);
if(v>baseradix)
b=(v-a*baseradix*baseradix)/baseradix;
c=(ushort)(v-a*baseradix*baseradix-b*baseradix);
return @"\0"+a.ToString()+b.ToString()+c.ToString();
}
private string HexCode(ushort val){
val=(ushort)(val%16);
string temp=val.ToString();
if(val>9)
{
switch(val){
case 10:
temp="a";
break;
case 11:
temp="b";
break;
case 12:
temp="c";
break;
case 13:
temp="d";
break;
case 14:
temp="e";
break;
case 15:
temp="f";
break;
}
}
return temp;
}
}
public class Comment{
private string comEOL,strA;
private string [] strB;
private const char splitor=',';
//
private int [,] info;
private string[,] without;
private bool comCleanSpilthEOL;
//
public Comment(){
ResetDefault();
}
public void ResetDefault(){
comEOL="\r\n";
info=new int[0,0];
without=new string[0,0];
comCleanSpilthEOL=true;
}
///////////////////////////////////// Public Functions /////////////////////////////////////
public void WithoutContainer(params string [] para){
if(para.GetUpperBound(0)==-1){
without=new string[0,0];
}
else{
int count=para.GetUpperBound(0)+1;
int cnt=count/2;
if(count%2==1)cnt++;
without=new string[cnt,2];
for(int i=0,j=0;i<cnt;i++){
without[i,0]=para[j++].Trim();
if(j+1>=count)
without[i,1]="";
else
without[i,1]=para[j++].Trim();
}
}
info=new int[0,0];
}
public void ProcessComments(string src,params string[] para){
if(src==null)src="";
strA="";
info=new int[0,0];
if(src.Trim().Length>0&¶.GetUpperBound(0)!=-1) {
int count=para.GetUpperBound(0)+1;
int cnt=count/2;
if(count%2==1)cnt++;
string [,]keyword=new String[cnt,3];
for(int i=0,j=0;i<cnt;i++){
keyword[i,0]=i.ToString();
keyword[i,1]=para[j++].Trim();
if(j+1>=count)
keyword[i,2]="";
else
keyword[i,2]=para[j++].Trim();
}
//check double first
int loc,end,begin;
string temp;
bool prev=false;
strA=src;
string al="";
for(int z=0;z<2;z++){
for(int i=0;i<cnt;i++){
if(z==0){if(keyword[i,2].Length==0) continue;}
else {if(keyword[i,2].Length>0) continue;}
loc=0;
while(strA.IndexOf(keyword[i,1],loc)!=-1&&loc<strA.Length){
loc=strA.IndexOf(keyword[i,1],loc);
temp=LineOfIndex(strA,loc,out begin);
if(OnTheContainer(temp,loc-begin)){
loc+=keyword[i,1].Length;
continue;
}
else{ //checking if on prefore
prev=false;
for(int j=0;j<cnt;j++){
if(j!=i){
if(temp.IndexOf(keyword[j,1])!=-1){
if(!OnTheContainer(temp,temp.IndexOf(keyword[j,1]))){
if(temp.IndexOf(keyword[j,1])<loc-begin){
prev=true;
break;
}
}
}
}
}
if(!prev){
end=loc+keyword[i,1].Length;
if(end>=strA.Length-1)
end=strA.Length-1;
if(z==0){
end=strA.IndexOf(keyword[i,2],end);
if(end==-1){
end=strA.Length-1;
begin=end+1;
}
else{
end+=keyword[i,2].Length-1;
begin=end+1;
}
}
else {
end=strA.IndexOf(comEOL,end);
if(end==-1){
end=strA.Length-1;
begin=end+1;
}
else{
end+=comEOL.Length-1;
begin=end+1;
}
}
strA=MakeBlank(strA,loc,end);
if(al.Length!=0)al+=splitor.ToString();
al+=i.ToString()+splitor.ToString()+loc.ToString()+splitor.ToString()+end.ToString();
loc=begin;
if(begin>=strA.Length)break;
}
else{
loc+=keyword[i,1].Length;
}
}//else
}//while
}//for
}//for
strB=al.Split(splitor);
count=strB.Length/3;
if(count!=0){
info=new int[count,3];
for(cnt=0,begin=0;cnt<count;cnt++){
for(loc=0;loc<3;loc++)
info[cnt,loc]=(int)Int32.Parse(strB[begin++]);
}
}
}
}
public string EmptyComments(string src,params string[] para){
if(src==null)src="";
strA="";
ProcessComments(src,para);
return strA;
}
public string CleanComments(string src,params string[] para){
if(src==null)src="";
strA="";
ProcessComments(src,para);
strB=Split(strA,comEOL);
if(strB.Length>1){
strA="";
for(int i=0;i<strB.Length;i++){
strA+=strB[i].Trim()+comEOL;
}
return CleaningSpilthEOL(strA);
}
else return CleaningSpilthEOL(strB[0].Trim());
}
public static string[] Split(string src,string separator){
if(src==null)src="";
string [] str=new string[1]{src};
if(src.Trim().Length!=0){
if(src.IndexOf(separator)>-1){
int cnt=0,loc=0,begin=0;
while(loc<src.Length&&src.IndexOf(separator,loc)>-1){
cnt++;
loc=src.IndexOf(separator,loc)+separator.Length;
if(loc>=src.Length) break;
}
if(loc<=src.Length-1)cnt++;
str=new string[cnt];
loc=0;
cnt=0;
while(loc<src.Length&&src.IndexOf(separator,loc)>-1){
loc=src.IndexOf(separator,loc);
str[cnt]="";
for(int i=begin;i<loc;i++) str[cnt]+=src[i].ToString();
loc+=separator.Length;
begin=loc;
if(loc>=src.Length)break;
cnt++;
}
if(loc<=src.Length-1){
for(int i=loc;i<=src.Length-1;i++) str[cnt]+=src[i].ToString();
}
return str;
}
else return str;
}
else return str;
}
///////////////////////////////////// Internal functions /////////////////////////////////////
protected string MakeBlank(string src,int start,int end){
if(start==end||src.Trim().Length==0) return src;
else{
string temp,tempA;
tempA=src.Substring(start,end-start+1);
if(tempA.IndexOf(comEOL)==-1){
tempA="";
for(int i=0;i<end-start+1;i++) tempA+=" ";
}
else{
int at=0,begin=0;
temp="";
while(tempA.IndexOf(comEOL,at)!=-1&&at<tempA.Length){
at=tempA.IndexOf(comEOL,at);
for(int i=begin;i<at;i++) temp+=" ";
temp+=comEOL;
at+=comEOL.Length;
begin=at;
}
if(at<=tempA.Length-1){
for(int i=at;i<=tempA.Length-1;i++) temp+=" ";
}
tempA=temp;
}
return src.Substring(0,start)+tempA+src.Substring(end+1);
}
}
protected string LineOfIndex(string src,int idx,out int begin){
int start=0;
bool equ=false;
for(int loc=idx;loc>=0;loc--){
if(src[loc]==comEOL[comEOL.Length-1]){
equ=false;
if(comEOL.Length>1){
if(loc-1>=comEOL.Length-2){
for(int j=0;j<=comEOL.Length-2;j++){
if(src[loc-j-1]==comEOL[comEOL.Length-j-2])equ=true;
else equ=false;
}
}
else equ=false;
}else equ=true;
if(equ){
start=loc+1;
break;
}
}
}
begin=start;
if(src.IndexOf(comEOL,start)==-1) return src.Substring(start);
else return src.Substring(start,src.IndexOf(comEOL,start)-start);
}
protected bool OnTheContainer(string str,int idx){
if(without.GetUpperBound(0)!=-1&&without.GetUpperBound(1)!=-1){
int cnt=without.GetUpperBound(0)+1;
int left=0,right=0;
for(int i=0;i<cnt;i++){
right=-1;
while(str.IndexOf(without[i,0],right+1)!=-1&&right+1<=str.Length){
left=str.IndexOf(without[i,0],right+1);
if(without[i,1].Length==0)
right=str.IndexOf(without[i,0],left+without[i,0].Length);
else
right=str.IndexOf(without[i,1],left+without[i,0].Length);
if(right==-1)break;
else if(idx>left&&idx<right)return true;
}
}
return false;
}
else return false;
}
protected string CleaningSpilthEOL(string src_ini){
strA=src_ini;
if(comCleanSpilthEOL){
for(int i=0;i<3;i++) strA=strA.Replace(comEOL+comEOL,comEOL);
while(true){
if(strA.IndexOf(comEOL)==0) strA=strA.Substring(comEOL.Length);
else break;
}
}
return strA;
}
///////////////////////////////////// public attrib /////////////////////////////////////
public string EOL{
get{
return comEOL;
}
set{
comEOL=value;
}
}
public bool CleanSpilthEOL{
get{
return comCleanSpilthEOL;
}
set{
comCleanSpilthEOL=value;
}
}
public int Count{
get{
if(info.GetUpperBound(0)!=-1&&info.GetUpperBound(1)!=-1){
return info.GetUpperBound(0)+1;
}
else return 0;
}
}
public void GetInfo(int index,out int start,out int end,out int type){
if(index<this.Count){
start=info[index,1];
end=info[index,2];
type=info[index,0];
}
else{
start=0;
end=0;
type=0;
}
}
}
}