KIniFile.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:32k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KIniFile.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Ini File Operation Class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KMemBase.h"
  12. #include "KStrBase.h"
  13. #include "KFile.h"
  14. #include "KFilePath.h"
  15. #include "KPakFile.h"
  16. #ifndef _SERVER
  17. #include "KCodec.h"
  18. #endif
  19. #include "KIniFile.h"
  20. #include <string.h>
  21. #include "KSG_StringProcess.h"
  22. //---------------------------------------------------------------------------
  23. typedef struct {
  24. DWORD Id; // 文件标识 = 0x4b434150 ("PACK")
  25. DWORD DataLen; // 文件原始的长度
  26. DWORD PackLen; // 文件压缩后长度
  27. DWORD Method; // 使用的压缩算法
  28. } TPackHead;
  29. //---------------------------------------------------------------------------
  30. static int  g_nCodec = 0;// codec method = 0,1,2,3,
  31. //---------------------------------------------------------------------------
  32. // 函数: SetCodec
  33. // 功能: set codec method
  34. // 参数: void
  35. // 返回: void
  36. //---------------------------------------------------------------------------
  37. void g_SetIniCodec(int nCodec)
  38. {
  39. g_nCodec = nCodec;
  40. }
  41. //---------------------------------------------------------------------------
  42. // 函数: KIniFile
  43. // 功能: 购造函数
  44. // 参数: void
  45. // 返回: void
  46. //---------------------------------------------------------------------------
  47. KIniFile::KIniFile()
  48. {
  49. g_MemZero(&m_Header, sizeof(SECNODE));
  50. }
  51. //---------------------------------------------------------------------------
  52. // 函数: ~KIniFile
  53. // 功能: 析造函数
  54. // 参数: void
  55. // 返回: void
  56. //---------------------------------------------------------------------------
  57. KIniFile::~KIniFile()
  58. {
  59. Clear();
  60. }
  61. //---------------------------------------------------------------------------
  62. // 函数: Load
  63. // 功能: 加载一个INI文件
  64. // 参数: FileName 文件名
  65. // 返回: TRUE 成功
  66. // FALSE 失败
  67. //---------------------------------------------------------------------------
  68. BOOL KIniFile::Load(LPCSTR FileName)
  69. {
  70. KPakFile File;
  71. DWORD dwSize;
  72. PVOID Buffer;
  73. TPackHead* pHeader;
  74. // check file name
  75. if (FileName[0] == 0)
  76. return FALSE;
  77. if (m_Header.pNextNode)
  78. Clear();
  79. if (!File.Open((char*)FileName))
  80. {
  81. g_DebugLog("Can't open ini file : %s", FileName);
  82. return FALSE;
  83. }
  84. #pragma message("KIniFile 当前不支持 KeyName 为中文! by Romandou")
  85. dwSize = File.Size();
  86. Buffer = m_MemStack.Push(dwSize + 4);
  87. File.Read(Buffer, dwSize);
  88. pHeader = (TPackHead*)Buffer;
  89. if (pHeader->Id == 0x4b434150) // "PACK"
  90. {
  91. File.Close();
  92. return LoadPack(FileName);
  93. }
  94. CreateIniLink(Buffer, dwSize);
  95. return TRUE;
  96. }
  97. //---------------------------------------------------------------------------
  98. // 函数: LoadPack
  99. // 功能: 打开一个压缩的INI文件
  100. // 参数: FileName 文件名
  101. // 返回: TRUE 成功
  102. // FALSE 失败
  103. //---------------------------------------------------------------------------
  104. BOOL KIniFile::LoadPack(LPCSTR FileName)
  105. {
  106. KPakFile File;
  107. PVOID PackBuf;
  108. PVOID DataBuf;
  109. #ifndef _SERVER
  110. KCodec* pCodec;
  111. TCodeInfo CodeInfo;
  112. #endif
  113. TPackHead Header;
  114. // check file name
  115. if (FileName[0] == 0)
  116. return FALSE;
  117. // close open file
  118. if (m_Header.pNextNode)
  119. Clear();
  120. // open the pack ini file
  121. if (!File.Open((char*)FileName))
  122. return FALSE;
  123. // read pack file header
  124. File.Read(&Header, sizeof(Header));
  125. // if not a pack file read directly
  126. if (Header.Id != 0x4b434150) // "PACK"
  127. return FALSE;
  128. // init codec
  129. #ifndef _SERVER
  130. pCodec = NULL;
  131. g_InitCodec(&pCodec, Header.Method);
  132. if (pCodec == NULL)
  133. return FALSE;
  134. #endif
  135. // allocate buffer for pack data
  136. PackBuf = m_MemStack.Push(Header.PackLen);
  137. // allocate bufer for real data
  138. DataBuf = m_MemStack.Push(Header.DataLen + 2);
  139. // read pack data for file
  140. File.Read(PackBuf, Header.PackLen);
  141. // decompress data
  142. #ifndef _SERVER
  143. CodeInfo.lpPack = (PBYTE)PackBuf;
  144. CodeInfo.dwPackLen = Header.PackLen;
  145. CodeInfo.lpData = (PBYTE)DataBuf;
  146. CodeInfo.dwDataLen = Header.DataLen;
  147. pCodec->Decode(&CodeInfo);
  148. g_FreeCodec(&pCodec, Header.Method);
  149. if (CodeInfo.dwDataLen != Header.DataLen)
  150. {
  151. g_DebugLog("Ini file unpack fail : %s", FileName);
  152. return FALSE;
  153. }
  154. #endif
  155. // check data length
  156. // create ini link in memory
  157. CreateIniLink(DataBuf, Header.DataLen);
  158. return TRUE;
  159. }
  160. //---------------------------------------------------------------------------
  161. // 函数: Save
  162. // 功能: 保存当前的INI文件
  163. // 参数: void
  164. // 返回: TRUE 成功
  165. // FALSE 失败
  166. //---------------------------------------------------------------------------
  167. BOOL KIniFile::Save(LPCSTR FileName)
  168. {
  169. KFile File;
  170. LPSTR DataBuf;
  171. LPSTR pBuffer;
  172. DWORD dwLen;
  173. if (FileName[0] == 0)
  174. return FALSE;
  175. if (g_nCodec)
  176. return SavePack(FileName);
  177. dwLen = m_MemStack.GetStackSize();
  178. DataBuf = (LPSTR)m_MemStack.Push(dwLen);
  179. pBuffer = DataBuf;
  180. SECNODE* SecNode = m_Header.pNextNode;
  181. KEYNODE* KeyNode = NULL;
  182. // write ini file to memory buffer
  183. while (SecNode != NULL)
  184. {
  185. dwLen = sprintf(pBuffer, "%srn", SecNode->pSection);
  186. pBuffer += dwLen;
  187. KeyNode = SecNode->pKeyNode.pNextNode;
  188. while (KeyNode != NULL)
  189. {
  190. dwLen = sprintf(pBuffer, "%s%c%srn", KeyNode->pKey, '=',
  191. KeyNode->pValue);
  192. pBuffer += dwLen;
  193. KeyNode = KeyNode->pNextNode;
  194. }
  195. SecNode = SecNode->pNextNode;
  196. dwLen = sprintf(pBuffer, "rn");
  197. pBuffer += dwLen;
  198. }
  199. // get buffer len
  200. dwLen = pBuffer - DataBuf;
  201. // create ini file
  202. if (!File.Create((char*)FileName))
  203. return FALSE;
  204. // write ini file
  205. File.Write(DataBuf, dwLen);
  206. return TRUE;
  207. }
  208. //---------------------------------------------------------------------------
  209. // 函数: SavePack
  210. // 功能: 保存一个压缩的INI文件
  211. // 参数: FileName 文件名
  212. // 返回: TRUE 成功
  213. // FALSE 失败
  214. //---------------------------------------------------------------------------
  215. BOOL KIniFile::SavePack(LPCSTR FileName)
  216. {
  217. KFile File;
  218. PVOID DataBuf;
  219. PVOID PackBuf;
  220. #ifndef _SERVER
  221. KCodec* pCodec;
  222. TCodeInfo CodeInfo;
  223. #endif
  224. TPackHead Header;
  225. LPSTR pBuffer;
  226. DWORD dwLen;
  227. // check file name
  228. if (FileName[0] == 0)
  229. return FALSE;
  230. dwLen = m_MemStack.GetStackSize();
  231. // allocate realdata buffer
  232. DataBuf = m_MemStack.Push(dwLen);
  233. // allocate compress buffer
  234. PackBuf = m_MemStack.Push(dwLen + 256);
  235. // print ini file to realdata buffer
  236. pBuffer = (LPSTR)DataBuf;
  237. SECNODE* SecNode = m_Header.pNextNode;
  238. KEYNODE* KeyNode = NULL;
  239. // write ini file to memory buffer
  240. while (SecNode != NULL)
  241. {
  242. dwLen = sprintf(pBuffer, "%srn", SecNode->pSection);
  243. pBuffer += dwLen;
  244. KeyNode = SecNode->pKeyNode.pNextNode;
  245. while (KeyNode != NULL)
  246. {
  247. dwLen = sprintf(pBuffer, "%s%c%srn", KeyNode->pKey, '=',
  248. KeyNode->pValue);
  249. pBuffer += dwLen;
  250. KeyNode = KeyNode->pNextNode;
  251. }
  252. SecNode = SecNode->pNextNode;
  253. dwLen = sprintf(pBuffer, "rn");
  254. pBuffer += dwLen;
  255. }
  256. // set header
  257. Header.Id = 0x4b434150; // "PACK"
  258. Header.Method = g_nCodec; // CODEC_LZO = 2;
  259. // init codec
  260. #ifndef _SERVER
  261. pCodec = NULL;
  262. g_InitCodec(&pCodec, Header.Method);
  263. if (pCodec == NULL)
  264. return FALSE;
  265. #endif
  266. // compress the data buffer
  267. #ifndef _SERVER
  268. CodeInfo.lpData = (PBYTE)DataBuf;
  269. CodeInfo.lpPack = (PBYTE)PackBuf;
  270. CodeInfo.dwDataLen = pBuffer - (LPCSTR)DataBuf;
  271. CodeInfo.dwPackLen = 0;
  272. pCodec->Encode(&CodeInfo);
  273. g_FreeCodec(&pCodec, Header.Method);
  274. Header.DataLen = CodeInfo.dwDataLen;
  275. Header.PackLen = CodeInfo.dwPackLen;
  276. #endif
  277. // create ini file
  278. if (!File.Create((char*)FileName))
  279. return FALSE;
  280. // write file header
  281. File.Write(&Header, sizeof(Header));
  282. // write file data
  283. File.Write(PackBuf, Header.PackLen);
  284. return TRUE;
  285. }
  286. //---------------------------------------------------------------------------
  287. // 函数: Clear
  288. // 功能: 清除INI文件的内容
  289. // 参数: void
  290. // 返回: void
  291. //---------------------------------------------------------------------------
  292. void KIniFile::Clear()
  293. {
  294. ReleaseIniLink();
  295. }
  296. //---------------------------------------------------------------------------
  297. // 函数: ReadLine
  298. // 功能: 读取INI文件的一行
  299. // 参数: Buffer 缓存
  300. // Szie 长度
  301. // 返回: TRUE 成功
  302. // FALSE 失败
  303. //---------------------------------------------------------------------------
  304. BOOL KIniFile::ReadLine(LPSTR Buffer,LONG Size)
  305. {
  306. if (m_Offset >= Size)
  307. {
  308. return FALSE;
  309. }
  310. while (Buffer[m_Offset] != 0x0D && Buffer[m_Offset] != 0x0A)
  311. {
  312. m_Offset++;
  313. if (m_Offset >= Size)
  314. break;
  315. }
  316. Buffer[m_Offset] = 0;
  317. if (Buffer[m_Offset] == 0x0D && Buffer[m_Offset + 1] == 0x0A)
  318. m_Offset += 2;
  319. else
  320. m_Offset += 1; //linux [wxb 2003-7-29]
  321. return TRUE;
  322. }
  323. //---------------------------------------------------------------------------
  324. // 函数: IsKeyChar
  325. // 功能: 判断一个字符是否为字母
  326. // 参数: ch 要判断的字符
  327. // 返回: TRUE 是字母
  328. // FALSE 不是字母
  329. //---------------------------------------------------------------------------
  330. BOOL KIniFile::IsKeyChar(char ch)
  331. {
  332. if ((ch >= '0') && (ch <= '9'))
  333. return TRUE;
  334. if ((ch >= 'A') && (ch <= 'Z'))
  335. return TRUE;
  336. if ((ch >= 'a') && (ch <= 'z'))
  337. return TRUE;
  338. return FALSE;
  339. }
  340. //---------------------------------------------------------------------------
  341. // 函数: CreateIniLink
  342. // 功能: 创建Ini链表
  343. // 参数: pBuffer 缓存
  344. // nBufLen 长度
  345. // 返回: void
  346. //---------------------------------------------------------------------------
  347. void KIniFile::CreateIniLink(LPVOID pBuffer, LONG nBufLen)
  348. {
  349. LPSTR lpBuffer = (LPSTR)pBuffer;
  350. LPSTR lpString = NULL;
  351. LPSTR lpValue  = NULL;
  352. char  szSection[32] = "[MAIN]";
  353. m_Offset = 0;
  354. while (m_Offset < nBufLen)
  355. {
  356. lpString = &lpBuffer[m_Offset];
  357. if (!ReadLine(lpBuffer, nBufLen))
  358. break;
  359. if (IsKeyChar(*lpString))
  360. {
  361. lpValue = SplitKeyValue(lpString);
  362. SetKeyValue(szSection, lpString, lpValue);
  363. }
  364. if (*lpString == '[')
  365. {
  366. g_StrCpyLen(szSection, lpString, sizeof(szSection));
  367. }
  368. }
  369. }
  370. //---------------------------------------------------------------------------
  371. // 函数: ReleaseIniLink()
  372. // 功能: 释放Ini链表
  373. // 参数: void
  374. // 返回: void
  375. //---------------------------------------------------------------------------
  376. void KIniFile::ReleaseIniLink()
  377. {
  378. SECNODE* pThisSec = &m_Header;
  379. SECNODE* pNextSec = pThisSec->pNextNode;
  380. KEYNODE* pThisKey = NULL;
  381. KEYNODE* pNextKey = NULL;
  382. while (pNextSec != NULL)
  383. {
  384. pThisSec = pNextSec->pNextNode;
  385. pThisKey = &pNextSec->pKeyNode;
  386. pNextKey = pThisKey->pNextNode;
  387. while (pNextKey != NULL)
  388. {
  389. pThisKey = pNextKey->pNextNode;
  390. m_MemStack.Free(pNextKey->pKey);
  391. m_MemStack.Free(pNextKey->pValue);
  392. m_MemStack.Free(pNextKey);
  393. pNextKey = pThisKey;
  394. }
  395. m_MemStack.Free(pNextSec->pSection);
  396. m_MemStack.Free(pNextSec);
  397. pNextSec = pThisSec;
  398. }
  399. m_Header.pNextNode = NULL;
  400. m_MemStack.FreeAllChunks();
  401. }
  402. //---------------------------------------------------------------------------
  403. // 函数: SplitKeyValue
  404. // 功能: 分割Key和Value
  405. // 参数: pString Key=Value
  406. // 返回: 指向Value
  407. //---------------------------------------------------------------------------
  408. LPSTR KIniFile::SplitKeyValue(LPSTR pString)
  409. {
  410. LPSTR pValue = pString;
  411. while (*pValue)
  412. {
  413. if (*pValue == '=')
  414. break;
  415. pValue++;
  416. }
  417. *pValue = 0;
  418. return pValue + 1;
  419. }
  420. //---------------------------------------------------------------------------
  421. // 函数: String2Id
  422. // 功能: 字符串转成32 bits ID
  423. // 参数: pString 字符串
  424. // 返回: 32 bits ID
  425. //---------------------------------------------------------------------------
  426. DWORD KIniFile::String2Id(LPCSTR pString)
  427. {
  428. DWORD Id = 0;
  429. for (int i=0; pString[i]; i++)
  430. {
  431. Id = (Id + (i+1) * pString[i]) % 0x8000000b * 0xffffffef;
  432. }
  433. return Id ^ 0x12345678;
  434. }
  435. //---------------------------------------------------------------------------
  436. // 函数: IsSectionExist
  437. // 功能: Section是否存在
  438. // 参数: pSection 节的名字
  439. // 返回: BOOL
  440. //---------------------------------------------------------------------------
  441. BOOL KIniFile::IsSectionExist(LPCSTR pSection)
  442. {
  443. // setup section name
  444. char szSection[32] = "[";
  445. if (pSection[0] != '[')
  446. {
  447. g_StrCat(szSection, pSection);
  448. g_StrCat(szSection, "]");
  449. }
  450. else
  451. {
  452. g_StrCpy(szSection, pSection);
  453. }
  454. // search for the matched section
  455. SECNODE* pSecNode = m_Header.pNextNode;
  456. DWORD dwID = String2Id(szSection);
  457. while (pSecNode != NULL)
  458. {
  459. if (dwID == pSecNode->dwID)
  460. return TRUE;
  461. pSecNode = pSecNode->pNextNode;
  462. }
  463. return FALSE;
  464. }
  465. //---------------------------------------------------------------------------
  466. // 函数: EraseSection
  467. // 功能: 清除一个Section的内容
  468. // 参数: pSection 节的名字
  469. // 返回: void
  470. //---------------------------------------------------------------------------
  471. void KIniFile::EraseSection(LPCSTR pSection)
  472. {
  473. // setup section name
  474. char szSection[32] = "[";
  475. if (pSection[0] != '[')
  476. {
  477. g_StrCat(szSection, pSection);
  478. g_StrCat(szSection, "]");
  479. }
  480. else
  481. {
  482. g_StrCpy(szSection, pSection);
  483. }
  484. // search for the matched section
  485. SECNODE* pSecNode = m_Header.pNextNode;
  486. DWORD dwID = String2Id(szSection);
  487. while (pSecNode != NULL)
  488. {
  489. if (dwID == pSecNode->dwID)
  490. {
  491. break;
  492. }
  493. pSecNode = pSecNode->pNextNode;
  494. }
  495. // if no such section found
  496. if (pSecNode == NULL)
  497. {
  498. return;
  499. }
  500. // erase all key in the section
  501. KEYNODE* pThisKey = &pSecNode->pKeyNode;
  502. KEYNODE* pNextKey = pThisKey->pNextNode;
  503. while (pNextKey != NULL)
  504. {
  505. pThisKey = pNextKey->pNextNode;
  506. m_MemStack.Free(pNextKey->pKey);
  507. m_MemStack.Free(pNextKey->pValue);
  508. m_MemStack.Free(pNextKey);
  509. pNextKey = pThisKey;
  510. }
  511. pSecNode->pKeyNode.pNextNode = NULL;
  512. }
  513. //---------------------------------------------------------------------------
  514. // 函数: EraseKey
  515. // 功能: 清除Section的下一个Key的内容
  516. // 参数: pSection 节的名字
  517. // 返回: void
  518. //---------------------------------------------------------------------------
  519. void KIniFile::EraseKey(LPCSTR lpSection, LPCSTR lpKey)
  520. {
  521. // setup section name
  522. char szSection[32] = "[";
  523. if (lpSection[0] != '[')
  524. {
  525. g_StrCat(szSection, lpSection);
  526. g_StrCat(szSection, "]");
  527. }
  528. else
  529. {
  530. g_StrCpy(szSection, lpSection);
  531. }
  532. // search for the matched section
  533. SECNODE* pSecNode = m_Header.pNextNode;
  534. DWORD dwID = String2Id(szSection);
  535. while (pSecNode != NULL)
  536. {
  537. if (dwID == pSecNode->dwID)
  538. {
  539. break;
  540. }
  541. pSecNode = pSecNode->pNextNode;
  542. }
  543. // if no such section found
  544. if (pSecNode == NULL)
  545. {
  546. return;
  547. }
  548. // erase all key in the section
  549. KEYNODE* pThisKey = &pSecNode->pKeyNode;
  550. KEYNODE* pNextKey = pThisKey->pNextNode;
  551. dwID = String2Id(lpKey);
  552. while (pNextKey != NULL)
  553. {
  554. if (pNextKey->dwID == dwID)
  555. {
  556. pThisKey->pNextNode = pNextKey->pNextNode;
  557. m_MemStack.Free(pNextKey->pKey);
  558. m_MemStack.Free(pNextKey->pValue);
  559. m_MemStack.Free(pNextKey);
  560. return;
  561. }
  562. pThisKey = pNextKey;
  563. pNextKey = pNextKey->pNextNode;
  564. }
  565. }
  566. //---------------------------------------------------------------------------
  567. // 函数: SetKeyValue
  568. // 功能: 设置Key的Value
  569. // 参数: pSection 节名
  570. // pKey 建名
  571. // pValue 建值
  572. // 返回: TRUE-成功 FALSE-失败
  573. //---------------------------------------------------------------------------
  574. BOOL KIniFile::SetKeyValue(
  575. LPCSTR pSection,
  576. LPCSTR pKey,
  577. LPCSTR pValue)
  578. {
  579. int nLen;
  580. DWORD dwID;
  581. // setup section name
  582. char szSection[32] = "[";
  583. if (pSection[0] != '[')
  584. {
  585. g_StrCat(szSection, pSection);
  586. g_StrCat(szSection, "]");
  587. }
  588. else
  589. {
  590. g_StrCpy(szSection, pSection);
  591. }
  592. // search for the matched section
  593. SECNODE* pThisSecNode = &m_Header;
  594. SECNODE* pNextSecNode = pThisSecNode->pNextNode;
  595. dwID = String2Id(szSection);
  596. while (pNextSecNode != NULL)
  597. {
  598. if (dwID == pNextSecNode->dwID)
  599. {
  600. break;
  601. }
  602. pThisSecNode = pNextSecNode;
  603. pNextSecNode = pThisSecNode->pNextNode;
  604. }
  605. // if no such section found create a new section
  606. if (pNextSecNode == NULL)
  607. {
  608. nLen = g_StrLen(szSection) + 1;
  609. pNextSecNode = (SECNODE *)m_MemStack.Push(sizeof(SECNODE));
  610. pNextSecNode->pSection = (char *)m_MemStack.Push(nLen);
  611. g_MemCopy(pNextSecNode->pSection, szSection, nLen);
  612. pNextSecNode->dwID = dwID;
  613. pNextSecNode->pKeyNode.pNextNode = NULL;
  614. pNextSecNode->pNextNode = NULL;
  615. pThisSecNode->pNextNode = pNextSecNode;
  616. }
  617. // search for the same key
  618. KEYNODE* pThisKeyNode = &pNextSecNode->pKeyNode;
  619. KEYNODE* pNextKeyNode = pThisKeyNode->pNextNode;
  620. dwID = String2Id(pKey);
  621. while (pNextKeyNode != NULL)
  622. {
  623. if (dwID == pNextKeyNode->dwID)
  624. {
  625. break;
  626. }
  627. pThisKeyNode = pNextKeyNode;
  628. pNextKeyNode = pThisKeyNode->pNextNode;
  629. }
  630. // if no such key found create a new key
  631. if (pNextKeyNode == NULL)
  632. {
  633. pNextKeyNode = (KEYNODE *)m_MemStack.Push(sizeof(KEYNODE));
  634. nLen = g_StrLen(pKey) + 1;
  635. pNextKeyNode->pKey = (char *)m_MemStack.Push(nLen);
  636. g_MemCopy(pNextKeyNode->pKey, (void*)pKey, nLen);
  637. nLen = g_StrLen(pValue) + 1;
  638. pNextKeyNode->pValue = (char *)m_MemStack.Push(nLen);
  639. g_MemCopy(pNextKeyNode->pValue, (void*)pValue, nLen);
  640. pNextKeyNode->dwID = dwID;
  641. pNextKeyNode->pNextNode = NULL;
  642. pThisKeyNode->pNextNode = pNextKeyNode;
  643. }
  644. // replace the old value with new
  645. else
  646. {
  647. m_MemStack.Free(pNextKeyNode->pValue);
  648. nLen = g_StrLen(pValue) + 1;
  649. pNextKeyNode->pValue = (char *)m_MemStack.Push(nLen);
  650. g_MemCopy(pNextKeyNode->pValue, (void*)pValue, nLen);
  651. }
  652. return TRUE;
  653. }
  654. //---------------------------------------------------------------------------
  655. // 函数: GetKeyValue
  656. // 功能: 取得Key的Value
  657. // 参数: pSection 节名
  658. // pKey 建名
  659. // pValue 建值
  660. // 返回: TRUE-成功 FALSE-失败
  661. //---------------------------------------------------------------------------
  662. BOOL KIniFile::GetKeyValue(
  663. LPCSTR pSection,
  664. LPCSTR pKey,
  665. LPSTR pValue,
  666. DWORD dwSize)
  667. {
  668. DWORD dwID;
  669. // setup section name
  670. char szSection[32] = "[";
  671. if (pSection[0] != '[')
  672. {
  673. g_StrCat(szSection, pSection);
  674. g_StrCat(szSection, "]");
  675. }
  676. else
  677. {
  678. g_StrCpy(szSection, pSection);
  679. }
  680. // search for the matched section
  681. SECNODE* pSecNode = m_Header.pNextNode;
  682. dwID = String2Id(szSection);
  683. while (pSecNode != NULL)
  684. {
  685. if (dwID == pSecNode->dwID)
  686. {
  687. break;
  688. }
  689. pSecNode = pSecNode->pNextNode;
  690. }
  691. // if no such section founded
  692. if (pSecNode == NULL)
  693. {
  694. return FALSE;
  695. }
  696. // search for the same key
  697. KEYNODE* pKeyNode = pSecNode->pKeyNode.pNextNode;
  698. dwID = String2Id(pKey);
  699. while (pKeyNode != NULL)
  700. {
  701. if (dwID == pKeyNode->dwID)
  702. {
  703. break;
  704. }
  705. pKeyNode = pKeyNode->pNextNode;
  706. }
  707. // if no such key found
  708. if (pKeyNode == NULL)
  709. {
  710. return FALSE;
  711. }
  712. // copy the value of the key
  713. g_StrCpyLen(pValue, pKeyNode->pValue, dwSize);
  714. return TRUE;
  715. }
  716. //---------------------------------------------------------------------------
  717. // 函数: GetString
  718. // 功能: 读取一个字符串
  719. // 参数: lpSection 节名
  720. // lpKeyName 建名
  721. // lpDefault 缺省值
  722. // lpRString 返回值
  723. // dwSize 返回字符串的最大长度
  724. // 返回: void
  725. //---------------------------------------------------------------------------
  726. BOOL KIniFile::GetString(
  727. LPCSTR lpSection, // points to section name
  728. LPCSTR lpKeyName, // points to key name
  729. LPCSTR lpDefault, // points to default string
  730. LPSTR lpRString, // points to destination buffer
  731. DWORD dwSize // size of string buffer
  732. )
  733. {
  734. if (GetKeyValue(lpSection, lpKeyName, lpRString, dwSize))
  735. return TRUE;
  736. g_StrCpyLen(lpRString, lpDefault, dwSize);
  737. return FALSE;
  738. }
  739. //---------------------------------------------------------------------------
  740. // 函数: GetInteger
  741. // 功能: 读取一个整数
  742. // 参数: lpSection 节名
  743. // lpKeyName 建名
  744. // nDefault 缺省值
  745. // pnValue 返回值
  746. // 返回: void
  747. //---------------------------------------------------------------------------
  748. BOOL KIniFile::GetInteger(
  749. LPCSTR lpSection, // points to section name
  750. LPCSTR lpKeyName, // points to key name
  751. int   nDefault, // default value
  752. int   *pnValue          // points to value
  753. )
  754. {
  755. char Buffer[32];
  756. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  757. {
  758. *pnValue = atoi(Buffer);
  759. return TRUE;
  760. }
  761. else
  762. {
  763. *pnValue = nDefault;
  764. return FALSE;
  765. }
  766. }
  767. //---------------------------------------------------------------------------
  768. // 函数: GetInteger2
  769. // 功能: 读取2个整数,整数之间用逗号分割。
  770. // 参数: lpSection 节名
  771. // lpKeyName 建名
  772. // pnValue1 返回值1
  773. // pnValue2 返回值2
  774. // 返回: void
  775. //---------------------------------------------------------------------------
  776. void KIniFile::GetInteger2(
  777. LPCSTR lpSection, // points to section name
  778. LPCSTR lpKeyName, // points to key name
  779. int   *pnValue1, // value 1
  780. int   *pnValue2 // value 2
  781. )
  782. {
  783. char  Buffer[32];
  784. char* pChar = Buffer;
  785. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  786. {
  787. while (*pChar)
  788. {
  789. if (',' == *pChar)
  790. {
  791. *pChar++ = 0;
  792. break;
  793. }
  794. pChar++;
  795. }
  796. *pnValue1 = atoi(Buffer);
  797. *pnValue2 = atoi(pChar);
  798. }
  799. }
  800. //---------------------------------------------------------------------------
  801. // 函数: GetFloat
  802. // 功能: 读取1个浮点数
  803. // 参数: lpSection 节名
  804. // lpKeyName 建名
  805. // fDefault 缺省值
  806. // pfValue 返回值
  807. // 返回: void
  808. //---------------------------------------------------------------------------
  809. BOOL KIniFile::GetFloat(
  810. LPCSTR lpSection, // points to section name
  811. LPCSTR lpKeyName, // points to key name
  812. float fDefault, // default value
  813. float *pfValue        // return value
  814. )
  815. {
  816. char Buffer[32];
  817. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  818. {
  819. *pfValue = (float)atof(Buffer);
  820. return TRUE;
  821. }
  822. else
  823. {
  824. *pfValue = fDefault;
  825. return FALSE;
  826. }
  827. }
  828. //---------------------------------------------------------------------------
  829. // 函数: GetFloat2
  830. // 功能: 读取2个浮点数,之间用逗号分割。
  831. // 参数: lpSection 节名
  832. // lpKeyName 建名
  833. // pfValue1 返回值1
  834. // pfValue2 返回值2
  835. // 返回: void
  836. //---------------------------------------------------------------------------
  837. void KIniFile::GetFloat2(
  838. LPCSTR lpSection, // points to section name
  839. LPCSTR lpKeyName, // points to key name
  840. float *pfValue1, // value 1
  841. float *pfValue2 // value 2
  842. )
  843. {
  844. char  Buffer[32];
  845. char* pChar = Buffer;
  846. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  847. {
  848. while (*pChar)
  849. {
  850. if (',' == *pChar)
  851. {
  852. *pChar++ = 0;
  853. break;
  854. }
  855. pChar++;
  856. }
  857. *pfValue1 = (float)atof(Buffer);
  858. *pfValue2 = (float)atof(pChar);
  859. }
  860. }
  861. //---------------------------------------------------------------------------
  862. // 函数: GetStruct
  863. // 功能: 读取一个结构
  864. // 参数: lpSection 节名
  865. // lpKeyName 建名
  866. // lpStruct 缓存
  867. // dwSize 缓存大小
  868. // 返回: void
  869. //---------------------------------------------------------------------------
  870. void KIniFile::GetStruct(
  871. LPCSTR lpSection, // pointer to section name
  872. LPCSTR lpKeyName, // pointer to key name
  873. LPVOID lpStruct, // pointer to buffer that contains data to add
  874. DWORD dwSize // size, in bytes, of the buffer
  875. )
  876. {
  877. char    Buffer[512];
  878. LPBYTE lpByte;
  879. BYTE ah,al;
  880. if (!GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  881. return;
  882. lpByte = (LPBYTE)lpStruct;
  883. int len = g_StrLen(Buffer);
  884. if (len / 2 != (int)dwSize)
  885. return;
  886. for (int i = 0; i < len; i += 2)
  887. {
  888. // get byte high
  889. ah = Buffer[i];
  890. if ((ah >= 48) && (ah <= 57))
  891. ah = (BYTE)(ah - 48);
  892. else
  893. ah = (BYTE)(ah - 65 + 10);
  894. // get byte low
  895. al = Buffer[i+1];
  896. if ((al >= 48) && (al <= 57))
  897. al = (BYTE)(al - 48);
  898. else
  899. al = (BYTE)(al - 65 + 10);
  900. // set struct bye
  901. *lpByte++ = (BYTE)(ah * 16 + al);
  902. }
  903. }
  904. //---------------------------------------------------------------------------
  905. // 函数: WriteString
  906. // 功能: 写入一个字符串
  907. // 参数: lpSection 节名
  908. // lpKeyName 建名
  909. // lpString 字符串
  910. // 返回: void
  911. //---------------------------------------------------------------------------
  912. void KIniFile::WriteString(
  913. LPCSTR lpSection, // pointer to section name
  914. LPCSTR lpKeyName, // pointer to key name
  915. LPCSTR lpString // pointer to string to add
  916. )
  917. {
  918. SetKeyValue(lpSection, lpKeyName, lpString);
  919. }
  920. //---------------------------------------------------------------------------
  921. // 函数: WriteInteger
  922. // 功能: 写入一个整数
  923. // 参数: lpSection 节名
  924. // lpKeyName 建名
  925. // nValue 整数
  926. // 返回: void
  927. //---------------------------------------------------------------------------
  928. void KIniFile::WriteInteger(
  929. LPCSTR lpSection, // pointer to section name
  930. LPCSTR lpKeyName, // pointer to key name
  931. int  nValue // Integer to write
  932. )
  933. {
  934. char Buffer[32];
  935. sprintf(Buffer, "%d", nValue);
  936. SetKeyValue(lpSection, lpKeyName, Buffer);
  937. }
  938. //---------------------------------------------------------------------------
  939. // 函数: WriteInteger2
  940. // 功能: 写入2个整数
  941. // 参数: lpSection 节名
  942. // lpKeyName 建名
  943. // nValue1 整数1
  944. // nValue2 整数2
  945. // 返回: void
  946. //---------------------------------------------------------------------------
  947. void KIniFile::WriteInteger2(
  948. LPCSTR lpSection, // pointer to section name
  949. LPCSTR lpKeyName, // pointer to key name
  950. int  Value1, // value 1 to write
  951. int Value2 // value 2 to write
  952. )
  953. {
  954. char Buffer[32];
  955. sprintf(Buffer, "%d,%d", Value1, Value2);
  956. SetKeyValue(lpSection, lpKeyName, Buffer);
  957. }
  958. //---------------------------------------------------------------------------
  959. // 函数: WriteFloat
  960. // 功能: 写入1个浮点数
  961. // 参数: lpSection 节名
  962. // lpKeyName 建名
  963. // fValue 浮点数
  964. // 返回: void
  965. //---------------------------------------------------------------------------
  966. void KIniFile::WriteFloat(
  967. LPCSTR lpSection, // pointer to section name
  968. LPCSTR lpKeyName, // pointer to key name
  969. float fValue // Integer to write
  970. )
  971. {
  972. char Buffer[32];
  973. sprintf(Buffer,"%f",fValue);
  974. SetKeyValue(lpSection, lpKeyName, Buffer);
  975. }
  976. //---------------------------------------------------------------------------
  977. // 函数: WriteFloat2
  978. // 功能: 写入2个浮点数
  979. // 参数: lpSection 节名
  980. // lpKeyName 建名
  981. // fValue1 浮点数1
  982. // fValue2 浮点数2
  983. // 返回: void
  984. //---------------------------------------------------------------------------
  985. void KIniFile::WriteFloat2(
  986. LPCSTR lpSection, // pointer to section name
  987. LPCSTR lpKeyName, // pointer to key name
  988. float  fValue1, // value 1 to write
  989. float fValue2 // value 2 to write
  990. )
  991. {
  992. char Buffer[32];
  993. sprintf(Buffer, "%f,%f", fValue1, fValue2);
  994. SetKeyValue(lpSection, lpKeyName, Buffer);
  995. }
  996. //---------------------------------------------------------------------------
  997. // 函数: WriteFloat2
  998. // 功能: 写入一个结构
  999. // 参数: lpSection 节名
  1000. // lpKeyName 建名
  1001. // lpStruct 结构
  1002. // dwSize 结构大小
  1003. // 返回: void
  1004. //---------------------------------------------------------------------------
  1005. void KIniFile::WriteStruct(
  1006. LPCSTR lpSection, // pointer to section name
  1007. LPCSTR lpKeyName, // pointer to key name
  1008. LPVOID lpStruct, // pointer to buffer that contains data to add
  1009. DWORD  dwSize // size, in bytes, of the buffer
  1010. )
  1011. {
  1012. char    Buffer[512];
  1013. LPSTR lpBuff = Buffer;
  1014. LPBYTE lpByte;
  1015. if (dwSize * 2 >= 512)
  1016. {
  1017. return;
  1018. }
  1019. lpByte = (LPBYTE) lpStruct;
  1020. for (DWORD i=0; i<dwSize; i++)
  1021. {
  1022. sprintf(lpBuff,"%02x",*lpByte);
  1023. lpBuff++;
  1024. lpBuff++;
  1025. lpByte++;
  1026. }
  1027. g_StrUpper(Buffer);
  1028. SetKeyValue(lpSection, lpKeyName, Buffer);
  1029. }
  1030. //---------------------------------------------------------------------------
  1031. //---------------------------------------------------------------------------
  1032. BOOL KIniFile::GetNextSection(LPCSTR pSection, LPSTR pNextSection)
  1033. {
  1034. if (!pSection[0]) // 传入参数为""时就是取第一个Section
  1035. {
  1036. if (!m_Header.pNextNode)
  1037. return FALSE;
  1038. else
  1039. {
  1040. g_StrCpy(pNextSection, m_Header.pNextNode->pSection);
  1041. return TRUE;
  1042. }
  1043. }
  1044. else
  1045. {
  1046. char szSection[32] = "[";
  1047. if (pSection[0] != '[')
  1048. {
  1049. g_StrCat(szSection, pSection);
  1050. g_StrCat(szSection, "]");
  1051. }
  1052. else
  1053. {
  1054. g_StrCpy(szSection, pSection);
  1055. }
  1056. // 查找参数给定的Section
  1057. SECNODE* pThisSecNode = &m_Header;
  1058. SECNODE* pNextSecNode = pThisSecNode->pNextNode;
  1059. DWORD dwID = String2Id(szSection);
  1060. while (pNextSecNode != NULL)
  1061. {
  1062. if (dwID == pNextSecNode->dwID)
  1063. {
  1064. break;
  1065. }
  1066. pThisSecNode = pNextSecNode;
  1067. pNextSecNode = pThisSecNode->pNextNode;
  1068. }
  1069. // 没有这个Section,无所谓下一个
  1070. if (!pNextSecNode)
  1071. {
  1072. return FALSE;
  1073. }
  1074. else
  1075. {
  1076. // 参数给定的Section已经是最后一个了
  1077. if (!pNextSecNode->pNextNode)
  1078. {
  1079. return FALSE;
  1080. }
  1081. else
  1082. {
  1083. g_StrCpy(pNextSection, pNextSecNode->pNextNode->pSection);
  1084. return TRUE;
  1085. }
  1086. }
  1087. }
  1088. }
  1089. //---------------------------------------------------------------------------
  1090. //---------------------------------------------------------------------------
  1091. BOOL KIniFile::GetNextKey(LPCSTR pSection, LPCSTR pKey, LPSTR pNextKey)
  1092. {
  1093. char szSection[32] = "[";
  1094. if (pSection[0] != '[')
  1095. {
  1096. g_StrCat(szSection, pSection);
  1097. g_StrCat(szSection, "]");
  1098. }
  1099. else
  1100. {
  1101. g_StrCpy(szSection, pSection);
  1102. }
  1103. // 查找参数给定的Section
  1104. SECNODE* pThisSecNode = &m_Header;
  1105. SECNODE* pNextSecNode = pThisSecNode->pNextNode;
  1106. DWORD dwID = String2Id(szSection);
  1107. while (pNextSecNode != NULL)
  1108. {
  1109. if (dwID == pNextSecNode->dwID)
  1110. {
  1111. break;
  1112. }
  1113. pThisSecNode = pNextSecNode;
  1114. pNextSecNode = pThisSecNode->pNextNode;
  1115. }
  1116. // 没有这个Section,无所谓取Key
  1117. if (!pNextSecNode)
  1118. {
  1119. return FALSE;
  1120. }
  1121. KEYNODE* pThisKeyNode = &pNextSecNode->pKeyNode;
  1122. KEYNODE* pNextKeyNode = pThisKeyNode->pNextNode;
  1123. // Key给的参数为""的话,取第一个Key
  1124. if (!pKey[0])
  1125. {
  1126. // 没有Key,返回失败
  1127. if (!pNextKeyNode->pKey)
  1128. {
  1129. return FALSE;
  1130. }
  1131. else
  1132. {
  1133. g_StrCpy(pNextKey, pNextKeyNode->pKey);
  1134. return TRUE;
  1135. }
  1136. }
  1137. dwID = String2Id(pKey);
  1138. while(pNextKeyNode != NULL)
  1139. {
  1140. if (dwID == pNextKeyNode->dwID)
  1141. {
  1142. break;
  1143. }
  1144. pThisKeyNode = pNextKeyNode;
  1145. pNextKeyNode = pThisKeyNode->pNextNode;
  1146. }
  1147. // 找不到所给的Key,无所谓下一个
  1148. if (!pNextKeyNode)
  1149. {
  1150. return FALSE;
  1151. }
  1152. // 参数给定的Key已经是最后一个了
  1153. if (!pNextKeyNode->pNextNode)
  1154. {
  1155. return FALSE;
  1156. }
  1157. else
  1158. {
  1159. g_StrCpy(pNextKey, pNextKeyNode->pNextNode->pKey);
  1160. return TRUE;
  1161. }
  1162. }
  1163. int KIniFile::GetSectionCount()
  1164. {
  1165. char Section[200];
  1166. char Section1[200];
  1167. if (!GetNextSection("",Section)) return 0;
  1168. int i  = 1;
  1169. while (1)
  1170. {
  1171. strcpy(Section1, Section);
  1172. if (!GetNextSection(Section1, Section)) return i;
  1173. i++;
  1174. }
  1175. return i;
  1176. }
  1177. // 如果从文件中没有取到对应的Section 和 Key则 pRect里面的值不变
  1178. void KIniFile::GetRect(LPCSTR lpSection, LPCSTR lpKeyName, RECT *pRect)
  1179. {
  1180. char  Buffer[256];
  1181. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  1182. {
  1183.         const char *pcszTemp = Buffer;
  1184.         
  1185.         pRect->left   = KSG_StringGetInt(&pcszTemp, 0);
  1186.         KSG_StringSkipSymbol(&pcszTemp, ',');
  1187.         pRect->top    = KSG_StringGetInt(&pcszTemp, 0);
  1188.         KSG_StringSkipSymbol(&pcszTemp, ',');
  1189.         pRect->right  = KSG_StringGetInt(&pcszTemp, 0);
  1190.         KSG_StringSkipSymbol(&pcszTemp, ',');
  1191.         pRect->bottom = KSG_StringGetInt(&pcszTemp, 0);
  1192. //sscanf(Buffer, "%d,%d,%d,%d", &(pRect->left), &(pRect->top), &(pRect->right), &(pRect->bottom));
  1193. }
  1194. }
  1195. void KIniFile::GetFloat3(LPCSTR lpSection, LPCSTR lpKeyName, float* pRect)
  1196. {
  1197. char Buffer[256];
  1198. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  1199. {
  1200. sscanf(Buffer, "%f,%f,%f", &pRect[0], &pRect[1], &pRect[2]);
  1201. }
  1202. }
  1203. void KIniFile::GetFloat4(LPCSTR lpSection, LPCSTR lpKeyName, float* pRect)
  1204. {
  1205. char  Buffer[256];
  1206. if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
  1207. {
  1208. sscanf(Buffer, "%f,%f,%f,%f", &pRect[0], &pRect[1], &pRect[2], &pRect[3]);
  1209. }
  1210. }
  1211. void KIniFile::GetBool(LPCSTR lpSection, LPCSTR lpKeyName, BOOL* pBool)
  1212. {
  1213. char  Buffer;
  1214. if (GetKeyValue(lpSection, lpKeyName, &Buffer, 1))
  1215. {
  1216. if ('T' == Buffer)
  1217. *pBool = TRUE;
  1218. else
  1219. *pBool = FALSE;
  1220. }
  1221. }