2009年12月17日 星期四

Explode ini File -- CuIniFile

//Explode ini File

CuIniFile IniFile;
IniFile.OpenFile(szFilename);
string strURL = IniFile.GetValue("InternetShortcut", "URL");


// CuIniFile.h

class CuINIItem
{
public:
    string m_Key;
    string m_Value;
};

class CuINIStatment
{
public:
    string m_Name;
    vector<CuINIItem> m_vecItem;
};

//  有使用分號 ';' 的那一行, 會直接將整行試為註解, 不管分號是不是在第一個字元
class CuIniFile
{
    vector<CuINIStatment> m_vecStatment;

public:
    CuIniFile(void);
    ~CuIniFile(void);

public:
    int OpenFile(LPCTSTR szFileName);
    string GetValue( string strStatment, string strKey);

    CuINIStatment *FindStatment( string strStatmentName );
    CuINIItem *FindItem( CuINIStatment *pStatment, string strItemName );

private:
    string GetStatment(string &str);
    BOOL IsStatmentLine(string &str);
    BOOL IsMemoLine(string &str);
    void CreateNewStatment( string &str );
    void CreateNewItem( string &str );
};


// CuIniFile.cpp

CuIniFile::CuIniFile(void)
{
}

CuIniFile::~CuIniFile(void)
{
}


int CuIniFile::OpenFile(LPCTSTR szFileName)
{
    CuStringList StrList;
    StrList.OpenFile(szFileName);

    string strTemp;
    for( int i = 0 ; i < StrList.size() ; i++ )
    {
        strTemp = StrList.at(i);
        if( IsMemoLine(strTemp) )
            continue;

        if( IsStatmentLine(strTemp) )
            CreateNewStatment(strTemp);
        else
            CreateNewItem(strTemp);
    }

    return 0;
}

CuINIStatment *CuIniFile::FindStatment( string strStatmentName )
{
    vector<CuINIStatment>::iterator iter =  m_vecStatment.begin();
    for( ; iter < m_vecStatment.end(); iter++ )
    {
        if( (*iter).m_Name == strStatmentName ) 
            return &(*iter);
    }

    return NULL;
}

CuINIItem *CuIniFile::FindItem( CuINIStatment *pStatment, string strItemName )
{
    vector<CuIniFile> &IniItem =  pStatment->m_vecItem;
    vector<CuIniFile>::iterator iter = IniItem.begin();

    for( ; iter < IniItem.end(); iter++ )
    {
        if( (*iter).m_Key == strItemName )
            return &(*iter);
    }

    return NULL;
}

string CuIniFile::GetValue( string strStatment, string strKey)
{

    CuINIStatment *pStatment = FindStatment(strStatment);
    if( pStatment == NULL )
        return "";

    CuINIItem *pItem = FindItem(pStatment , strKey);
    if( pItem == NULL )
        return "";

    return pItem->m_Value;

}

BOOL CuIniFile::IsMemoLine(string &str)
{
    size_t found = str.find( ';' );
    return ( found == 0 );
}

string CuIniFile::GetStatment(string &str)
{

    size_t found_first = str.find( '[' );
    size_t found_second = str.find( ']' , found_first);

    string strStatment;
    if( found_first != string::npos && found_second != string::npos )
        strStatment =  str.substr(found_first + 1, found_second - found_first - 1);

    return strStatment;
}

BOOL CuIniFile::IsStatmentLine(string &str)
{
    string strStatmentKey = GetStatment(str);
    return (!strStatmentKey.empty());
}

void CuIniFile::CreateNewStatment( string &str )
{
    CuINIStatment Statment;
    Statment.m_Name = GetStatment(str);
    m_vecStatment.push_back(Statment);
}   


void CuIniFile::CreateNewItem( string &str )
{

    size_t found = str.find('=');
    if( found == string::npos )
        return;

    string strKey = str.substr(0, found);
    string strValue = str.substr( found + 1 , str.size());

    CuINIItem Item;
    Item.m_Key = strKey;
    Item.m_Value = strValue;
    m_vecStatment[ m_vecStatment.size() - 1 ].m_vecItem.push_back(Item);
}


1 則留言:

  1. 註解支援不足, 不過現在主要是拿來剖 URL 捷徑, 不會有沒換行的註解, 後期要支援手動產生的ini file 在來擴充吧!

    回覆刪除