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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KTabFile.cpp
  5. // Date: 2002.02.20
  6. // Code: Huyi(Spe)
  7. // Desc: Tab File Operation Class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KStrBase.h"
  12. #include "KFile.h"
  13. #include "KFilePath.h"
  14. #include "KPakFile.h"
  15. #ifndef _SERVER
  16. #include "KCodec.h"
  17. #endif
  18. #include "KTabFile.h"
  19. #include <string.h>
  20. //---------------------------------------------------------------------------
  21. // 函数: KTabFile
  22. // 功能: 购造函数
  23. // 参数: void
  24. // 返回: void
  25. //---------------------------------------------------------------------------
  26. KTabFile::KTabFile()
  27. {
  28. m_Width = 0;
  29. m_Height = 0;
  30. }
  31. //---------------------------------------------------------------------------
  32. // 函数: ~KTabFile
  33. // 功能: 析造函数
  34. // 参数: void
  35. // 返回: void
  36. //---------------------------------------------------------------------------
  37. KTabFile::~KTabFile()
  38. {
  39. Clear();
  40. }
  41. //---------------------------------------------------------------------------
  42. // 函数: Load
  43. // 功能: 加载一个Tab文件
  44. // 参数: FileName 文件名
  45. // 返回: TRUE 成功
  46. // FALSE 失败
  47. //---------------------------------------------------------------------------
  48. BOOL KTabFile::Load(LPSTR FileName)
  49. {
  50. KPakFile File;
  51. DWORD dwSize;
  52. PVOID Buffer;
  53. // check file name
  54. if (FileName[0] == 0)
  55. return FALSE;
  56. if (!File.Open(FileName))
  57. {
  58. g_DebugLog("Can't open tab file : %s", FileName);
  59. return FALSE;
  60. }
  61. dwSize = File.Size();
  62. Buffer = m_Memory.Alloc(dwSize);
  63. File.Read(Buffer, dwSize);
  64. CreateTabOffset();
  65. return TRUE;
  66. }
  67. //---------------------------------------------------------------------------
  68. // 函数: CreateTabOffset
  69. // 功能: 建立制作表符分隔文件的偏移表
  70. // 参数: void
  71. // 返回: void
  72. //---------------------------------------------------------------------------
  73. void KTabFile::CreateTabOffset()
  74. {
  75. int nWidth, nHeight, nOffset, nSize;
  76. BYTE *Buffer;
  77. TABOFFSET *TabBuffer;
  78. nWidth = 1;
  79. nHeight = 1;
  80. nOffset = 0;
  81. Buffer = (BYTE *)m_Memory.GetMemPtr();
  82. nSize = m_Memory.GetMemLen();
  83. // 读第一行决定有多少列
  84. while (*Buffer != 0x0d && *Buffer != 0x0a)
  85. {
  86. if (*Buffer == 0x09)
  87. {
  88. nWidth++;
  89. }
  90. Buffer++;
  91. nOffset++;
  92. }
  93. if (*Buffer == 0x0d && *(Buffer + 1) == 0x0a)
  94. {
  95. Buffer += 2; // 0x0a跳过
  96. nOffset += 2; // 0x0a跳过
  97. }
  98. else
  99. {
  100. Buffer += 1; // 0x0a跳过
  101. nOffset += 1; // 0x0a跳过
  102. }
  103. while(nOffset < nSize)
  104. {
  105. while (*Buffer != 0x0d && *Buffer != 0x0a)
  106. {
  107. Buffer++;
  108. nOffset++;
  109. if (nOffset >= nSize)
  110. break;
  111. }
  112. nHeight++;
  113. if (*Buffer == 0x0d && *(Buffer + 1) == 0x0a)
  114. {
  115. Buffer += 2; // 0x0a跳过
  116. nOffset += 2; // 0x0a跳过
  117. }
  118. else
  119. {
  120. Buffer += 1; // 0x0a跳过
  121. nOffset += 1; // 0x0a跳过
  122. }
  123. }
  124. m_Width = nWidth;
  125. m_Height = nHeight;
  126. TabBuffer = (TABOFFSET *)m_OffsetTable.Alloc(m_Width * m_Height * sizeof (TABOFFSET));
  127. Buffer = (BYTE *)m_Memory.GetMemPtr();
  128. nOffset = 0;
  129. int nLength;
  130. for (int i = 0; i < nHeight; i++)
  131. {
  132. for (int j = 0; j < nWidth; j++)
  133. {
  134. TabBuffer->dwOffset = nOffset;
  135. nLength = 0;
  136. while(*Buffer != 0x09 && *Buffer != 0x0d && *Buffer != 0x0a && nOffset < nSize)
  137. {
  138. Buffer++;
  139. nOffset++;
  140. nLength++;
  141. }
  142. Buffer++; // 0x09或0x0d或0x0a(linux)跳过
  143. nOffset++;
  144. TabBuffer->dwLength = nLength;
  145. TabBuffer++;
  146. if (*(Buffer - 1) == 0x0a || *(Buffer - 1) == 0x0d) // 本行已经结束了,虽然可能没到nWidth //for linux modified [wxb 2003-7-29]
  147. {
  148. for (int k = j+1; k < nWidth; k++)
  149. {
  150. TabBuffer->dwOffset = nOffset;
  151. TabBuffer->dwLength = 0;
  152. TabBuffer++;
  153. }
  154. break;
  155. }
  156. }
  157. //modified for linux [wxb 2003-7-29]
  158. if (*(Buffer - 1) == 0x0d && *Buffer == 0x0a)
  159. {
  160. Buffer++; // 0x0a跳过
  161. nOffset++; // 0x0a跳过
  162. }
  163. }
  164. }
  165. //---------------------------------------------------------------------------
  166. // 函数: Str2Column
  167. // 功能: 取得某行某列字符串的值
  168. // 参数: szColumn
  169. // 返回: 第几列
  170. //---------------------------------------------------------------------------
  171. int KTabFile::Str2Col(LPSTR szColumn)
  172. {
  173. int nStrLen = g_StrLen(szColumn);
  174. char szTemp[4];
  175. g_StrCpy(szTemp, szColumn);
  176. g_StrUpper(szTemp);
  177. if (nStrLen == 1)
  178. {
  179. return (szTemp[0] - 'A');
  180. }
  181. return ((szTemp[0] - 'A' + 1) * 26 + szTemp[1] - 'A') + 1;
  182. }
  183. //---------------------------------------------------------------------------
  184. // 函数: GetString
  185. // 功能: 取得某行某列字符串的值
  186. // 参数: nRow 行
  187. // nColomn 列
  188. // lpDefault 缺省值
  189. // lpRString 返回值
  190. // dwSize 返回字符串的最大长度
  191. // 返回: 是否成功
  192. //---------------------------------------------------------------------------
  193. BOOL KTabFile::GetString(int nRow, LPSTR szColumn, LPSTR lpDefault, LPSTR lpRString, DWORD dwSize, BOOL bColumnLab)
  194. {
  195. int nColumn;
  196. if (bColumnLab)
  197. nColumn = FindColumn(szColumn);
  198. else
  199. nColumn = Str2Col(szColumn);
  200. if (GetValue(nRow - 1, nColumn - 1, lpRString, dwSize))
  201. return TRUE;
  202. g_StrCpyLen(lpRString, lpDefault, dwSize);
  203. return FALSE;
  204. }
  205. //---------------------------------------------------------------------------
  206. // 函数: GetString
  207. // 功能: 取得某行某列字符串的值
  208. // 参数: szRow 行 (关键字)
  209. // szColomn 列 (关键字)
  210. // lpDefault 缺省值
  211. // lpRString 返回值
  212. // dwSize 返回字符串的最大长度
  213. // 返回: 是否成功
  214. //---------------------------------------------------------------------------
  215. BOOL KTabFile::GetString(LPSTR szRow, LPSTR szColumn, LPSTR lpDefault, LPSTR lpRString, DWORD dwSize)
  216. {
  217. int nRow, nColumn;
  218. nRow = FindRow(szRow);
  219. nColumn = FindColumn(szColumn);
  220. if (GetValue(nRow - 1, nColumn - 1, lpRString, dwSize))
  221. return TRUE;
  222. g_StrCpyLen(lpRString, lpDefault, dwSize);
  223. return FALSE;
  224. }
  225. //---------------------------------------------------------------------------
  226. // 函数: GetString
  227. // 功能: 取得某行某列字符串的值
  228. // 参数: nRow 行 从1开始
  229. // nColomn 列 从1开始
  230. // lpDefault 缺省值
  231. // lpRString 返回值
  232. // dwSize 返回字符串的最大长度
  233. // 返回: 是否成功
  234. //---------------------------------------------------------------------------
  235. BOOL KTabFile::GetString(int nRow, int nColumn, LPSTR lpDefault, LPSTR lpRString, DWORD dwSize)
  236. {
  237. if (GetValue(nRow - 1, nColumn - 1,  lpRString, dwSize))
  238. return TRUE;
  239. g_StrCpyLen(lpRString, lpDefault, dwSize);
  240. return FALSE;
  241. }
  242. //---------------------------------------------------------------------------
  243. // 函数: GetInteger
  244. // 功能: 取得某行某列字符串的值
  245. // 参数: nRow 行
  246. // szColomn 列
  247. // nDefault 缺省值
  248. // pnValue 返回值
  249. // 返回: 是否成功
  250. //---------------------------------------------------------------------------
  251. BOOL KTabFile::GetInteger(int nRow, LPSTR szColumn, int nDefault, int *pnValue, BOOL bColumnLab)
  252. {
  253. char Buffer[32];
  254. int nColumn;
  255. if (bColumnLab)
  256. nColumn = FindColumn(szColumn);
  257. else
  258. nColumn = Str2Col(szColumn);
  259. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  260. {
  261. *pnValue = atoi(Buffer);
  262. return TRUE;
  263. }
  264. else
  265. {
  266. *pnValue = nDefault;
  267. return FALSE;
  268. }
  269. }
  270. //---------------------------------------------------------------------------
  271. // 函数: GetInteger
  272. // 功能: 取得某行某列字符串的值
  273. // 参数: szRow 行
  274. // szColomn 列
  275. // nDefault 缺省值
  276. // pnValue 返回值
  277. // 返回: 是否成功
  278. //---------------------------------------------------------------------------
  279. BOOL KTabFile::GetInteger(LPSTR szRow, LPSTR szColumn, int nDefault, int *pnValue)
  280. {
  281. int nRow, nColumn;
  282. char Buffer[32];
  283. nRow = FindRow(szRow);
  284. nColumn = FindColumn(szColumn);
  285. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  286. {
  287. *pnValue = atoi(Buffer);
  288. return TRUE;
  289. }
  290. else
  291. {
  292. *pnValue = nDefault;
  293. return FALSE;
  294. }
  295. }
  296. //---------------------------------------------------------------------------
  297. // 函数: GetInteger
  298. // 功能: 取得某行某列字符串的值
  299. // 参数: nRow 行 从1开始
  300. // nColomn 列 从1开始
  301. // nDefault 缺省值
  302. // pnValue 返回值
  303. // 返回: 是否成功
  304. //---------------------------------------------------------------------------
  305. BOOL KTabFile::GetInteger(int nRow, int nColumn, int nDefault, int *pnValue)
  306. {
  307. char Buffer[32];
  308. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  309. {
  310. *pnValue = atoi(Buffer);
  311. return TRUE;
  312. }
  313. else
  314. {
  315. *pnValue = nDefault;
  316. return TRUE;
  317. }
  318. }
  319. //---------------------------------------------------------------------------
  320. // 函数: GetFloat
  321. // 功能: 取得某行某列字符串的值
  322. // 参数: nRow 行
  323. // szColomn 列
  324. // nDefault 缺省值
  325. // pnValue 返回值
  326. // 返回: 是否成功
  327. //---------------------------------------------------------------------------
  328. BOOL KTabFile::GetFloat(int nRow, LPSTR szColumn, float fDefault, float *pfValue, BOOL bColumnLab)
  329. {
  330. char Buffer[32];
  331. int nColumn;
  332. if (bColumnLab)
  333. nColumn = FindColumn(szColumn);
  334. else
  335. nColumn = Str2Col(szColumn);
  336. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  337. {
  338. *pfValue = (float)atof(Buffer);
  339. return TRUE;
  340. }
  341. else
  342. {
  343. *pfValue = fDefault;
  344. return FALSE;
  345. }
  346. }
  347. //---------------------------------------------------------------------------
  348. // 函数: GetFloat
  349. // 功能: 取得某行某列字符串的值
  350. // 参数: szRow 行
  351. // szColomn 列
  352. // nDefault 缺省值
  353. // pnValue 返回值
  354. // 返回: 是否成功
  355. //---------------------------------------------------------------------------
  356. BOOL KTabFile::GetFloat(LPSTR szRow, LPSTR szColumn, float fDefault, float *pfValue)
  357. {
  358. int nRow, nColumn;
  359. char Buffer[32];
  360. nRow = FindRow(szRow);
  361. nColumn = FindColumn(szColumn);
  362. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  363. {
  364. *pfValue = (float)atof(Buffer);
  365. return TRUE;
  366. }
  367. else
  368. {
  369. *pfValue = fDefault;
  370. return FALSE;
  371. }
  372. }
  373. //---------------------------------------------------------------------------
  374. // 函数: GetFloat
  375. // 功能: 取得某行某列字符串的值
  376. // 参数: nRow 行 从1开始
  377. // nColomn 列 从1开始
  378. // nDefault 缺省值
  379. // pnValue 返回值
  380. // 返回: 是否成功
  381. //---------------------------------------------------------------------------
  382. BOOL KTabFile::GetFloat(int nRow, int nColumn, float fDefault, float *pfValue)
  383. {
  384. char Buffer[32];
  385. if (GetValue(nRow - 1, nColumn - 1, Buffer, sizeof(Buffer)))
  386. {
  387. *pfValue = (float)atof(Buffer);
  388. return TRUE;
  389. }
  390. else
  391. {
  392. *pfValue = fDefault;
  393. return FALSE;
  394. }
  395. }
  396. //---------------------------------------------------------------------------
  397. // 函数: GetValue
  398. // 功能: 取得某行某列字符串的值
  399. // 参数: nRow 行
  400. // nColomn 列
  401. // lpDefault 缺省值
  402. // lpRString 返回值
  403. // dwSize 返回字符串的最大长度
  404. // 返回: 是否成功
  405. //---------------------------------------------------------------------------
  406. BOOL KTabFile::GetValue(int nRow, int nColumn, LPSTR lpRString, DWORD dwSize)
  407. {
  408. if (nRow >= m_Height || nColumn >= m_Width || nRow < 0 || nColumn < 0)
  409. return FALSE;
  410. TABOFFSET *TempOffset;
  411. LPSTR Buffer;
  412. Buffer = (LPSTR)m_Memory.GetMemPtr();
  413. TempOffset = (TABOFFSET *)m_OffsetTable.GetMemPtr();
  414. TempOffset += nRow * m_Width + nColumn;
  415. ZeroMemory(lpRString, dwSize);
  416. Buffer += TempOffset->dwOffset;
  417. if (TempOffset->dwLength == 0)
  418. {
  419. return FALSE;
  420. }
  421. if (dwSize > TempOffset->dwLength)
  422. {
  423. memcpy(lpRString, Buffer, TempOffset->dwLength);
  424. lpRString[TempOffset->dwLength] = 0;
  425. }
  426. else
  427. {
  428. memcpy(lpRString, Buffer, dwSize);
  429. lpRString[dwSize] = 0;
  430. }
  431. return TRUE;
  432. }
  433. //---------------------------------------------------------------------------
  434. // 函数: Clear
  435. // 功能: 清除TAB文件的内容
  436. // 参数: void
  437. // 返回: void
  438. //---------------------------------------------------------------------------
  439. void KTabFile::Clear()
  440. {
  441. m_Memory.Free();
  442. m_OffsetTable.Free();
  443. }
  444. //---------------------------------------------------------------------------
  445. // 函数: FindRow
  446. // 功能: 查找行关键字
  447. // 参数: szRow(行关键字)
  448. // 返回: int
  449. //---------------------------------------------------------------------------
  450. int KTabFile::FindRow(LPSTR szRow)
  451. {
  452. char szTemp[128];
  453. for (int i = 0; i < m_Height; i++) // 从1开始,跳过第一行的字段行
  454. {
  455. GetValue(i, 0, szTemp, g_StrLen(szRow));
  456. if (g_StrCmp(szTemp, szRow))
  457. return i + 1; //改动此处为加一 by Romandou,即返回以1为起点的标号
  458. }
  459. return -1;
  460. }
  461. //---------------------------------------------------------------------------
  462. // 函数: FindColumn
  463. // 功能: 查找列关键字
  464. // 参数: szColumn(行关键字)
  465. // 返回: int
  466. //---------------------------------------------------------------------------
  467. int KTabFile::FindColumn(LPSTR szColumn)
  468. {
  469. char szTemp[128];
  470. for (int i = 0; i < m_Width; i++) // 从1开始,跳过第一列的字段行
  471. {
  472. GetValue(0, i, szTemp, g_StrLen(szColumn));
  473. if (g_StrCmp(szTemp, szColumn))
  474. return i + 1;//改动此处为加一 by Romandou,即返回以1为起点的标号
  475. }
  476. return -1;
  477. }
  478. //---------------------------------------------------------------------------
  479. // 函数: Col2Str
  480. // 功能: 把整数转成字符串
  481. // 参数: szColumn
  482. // 返回: 第几列
  483. //---------------------------------------------------------------------------
  484. void KTabFile::Col2Str(int nCol, LPSTR szColumn)
  485. {
  486. if (nCol < 26)
  487. {
  488. szColumn[0] = 'A' + nCol;
  489. szColumn[1] = 0;
  490. }
  491. else
  492. {
  493. szColumn[0] = 'A' + (nCol / 26 - 1);
  494. szColumn[1] = 'A' + nCol % 26;
  495. szColumn[2] = 0;
  496. }
  497. }