2011. 11. 30. 17:35

[ATL/MFC/C++] Ini Parser(ini 파서)

ini 파서를 공유합니다.
그리고 일단 제가 공유하는 모든 코드들은,
CCL 파이센스이고, [ 상업적이용 Off / 코드 변경 Yes ] 이니,
용도에 맞게 사용하시기 바랍니다.
상업용도로 사용하시고자 한다면, 필히 저에게 알려주시기 바랍니다. (물론 공유는 해드립니다~)

일단, CIniParser Class를 공유하며,
각 API 설명은 아래와 같습니다.

내부적으로 CAtlMap을 사용하기 때문에 Get/Set 동작은 빠를 것으로 보입니다.
조건으로 Section명에 ;문자를 쓰면 안됩니다.

BOOL Parse(IN LPCTSTR lpszBuf)

lpszBuf 내용을 받아 파싱합니다.
내부에 Map을 사용하므로, Caller는 본 함수 호출이후에 lpszBuf를 Free해도 됩니다.
성공시 TRUE, 실패시 FALSE를 리턴합니다.
 
BOOL GetIni(OUT CString& strIni)

메모리상에 있는 Map을 Ini 포맷으로 변경합니다.
아래의 Parse에 전달한 lpszBuf와 Section 이름등 순서가 변경될 수 있음을 유의하시기 바랍니다.
물론, SetString한 순서도 변경될 수 있습니다.
단, 하나의 Section명은 한번만 등장하는것은 보장해 드립니다.
즉,
 [a]
 q=1
 [b]
 a=1
 [a]
 e=3
와 같이 [a]가 두번 등장하지 않고 다음과 같이 뭉쳐줍니다.
 [a]
 q=1
 e=3
 [b]
 a=1
 
BOOL GetString(IN LPCTSTR lpszSectionName, IN LPCTSTR lpszKeyName, OUT CString& strValue)

메모리상에 있는 Map을 기반으로 GetPrivateProfileString과 같은 효과를 냅니다.
값이 있을때 TRUE, 없을때 FALSE를 리턴하니,
Caller에서 알아서 기본값 세팅을 하시기 바랍니다.
 
BOOL SetString(IN LPCTSTR lpszSectionName, IN LPCTSTR lpszKeyName, IN LPCTSTR lpszValue)

메모리상에 있는 Map을 수정합니다.
성공시 TRUE, 실패시 FALSE를 리턴합니다.

View Plain을 통하면 좀더 자세히 볼 수 있습니다.
참고로, 버그 회피를 위해, 해당 Class의 Instance은
Thread간 공유할 수 없도록 하였습니다.
Class의 Instance는 해당 Thread에서만 사용하도록 하십시요.
IniParser.h


IniParser.cpp