TABLE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright 1996-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. // TABLE.C
  11. #include "cfiler.h"
  12. #include <malloc.h>
  13. /******************************************************************
  14. * CheckHeap()
  15. *
  16. * input: 
  17. *
  18. * message - buffer containing information to display on the
  19. * debug window
  20. *
  21. * purpose:
  22. *
  23. * Calls _heapchk and outputs a formatted message onto the
  24. * debug window.
  25. ******************************************************************/
  26. VOID CheckHeap(LPTSTR message) {
  27. INT rv = _heapchk();
  28. if (rv == _HEAPBADBEGIN) {
  29. ErrorMsg(message);
  30. ErrorMsg(TEXT("Initial header information is bad or cannot be found."));
  31. return;
  32. }
  33. else if (rv == _HEAPBADNODE) {
  34. ErrorMsg(message);
  35. ErrorMsg(TEXT("Bad node has been found or heap is damaged."));
  36. return;
  37. }
  38. else if (rv == _HEAPBADPTR) {
  39. ErrorMsg(message);
  40. ErrorMsg(TEXT("Pointer into heap is not valid."));
  41. return;
  42. }
  43. else if (rv == _HEAPEMPTY) {
  44. ErrorMsg(message);
  45. ErrorMsg(TEXT("Heap has not been initialized."));
  46. return;
  47. }
  48. else if (rv == _HEAPOK) {
  49. ErrorMsg(message);
  50. ErrorMsg(TEXT("Heap appears to be consistent."));
  51. return;
  52. }
  53. else {
  54. ErrorMsg(message);
  55. ErrorMsg(TEXT("_heapcheck did not return a valid value."));
  56. }
  57. return;
  58. }
  59. /******************************************************************
  60. * GetSize()
  61. *
  62. * in parameters:
  63. * pTable - pointer to string table
  64. *
  65. * returns
  66. * number of elements of pTable
  67. * -1 if error
  68. ******************************************************************/
  69. INT GetSize(TABLE pTable) {
  70. if (!pTable) {
  71. ErrorMsg(TEXT("GetSize: pTable is NULL."));
  72. return -1;
  73. }
  74. return pTable->iNumElems;
  75. }
  76. /******************************************************************
  77. * TableNew()
  78. *
  79. * Returns a new string table with no elements or NULL
  80. * if unsuccessful
  81. ******************************************************************/
  82. TABLE TableNew(VOID) {
  83. TABLE pTable;
  84. pTable = malloc(sizeof(*pTable) + 100);
  85. if (!pTable) {
  86. ErrorMsg(TEXT("TableNew: malloc failed."));
  87. return FALSE;
  88. }
  89. pTable->iNumElems = 0;
  90. pTable->pCurrentFiles = NULL;
  91. return pTable;
  92. }
  93. /******************************************************************
  94. * TableFree()
  95. *
  96. * input: pTable - pointer to a table
  97. *
  98. * purpose:
  99. * Frees the string table pointed to by pTable.
  100. *
  101. * return value:
  102. *
  103. * TRUE if successful
  104. * FALSE if unsuccessful
  105. ******************************************************************/
  106. BOOL TableFree(TABLE pTable) {
  107. ELEM *p, *q;
  108.     if (!pTable) {
  109.      ErrorMsg(TEXT("TableFree: pTable is NULL."));
  110.      return FALSE;
  111.     }
  112.     
  113.     for (p = pTable->pCurrentFiles; p; p = q) {
  114. q = p->next;
  115. free(p->hidden);
  116. free(p->displayed);
  117. free(p);
  118. p = NULL;
  119. }
  120. free(pTable);
  121. pTable = NULL;
  122. return TRUE;
  123. }
  124. /******************************************************************
  125. * TableFind()
  126. *
  127. * input: pTable - pointer to a table
  128. * szFindString - string in question.
  129. *
  130. * purpose:
  131. * Searches for szFindString in table pTable.
  132. *
  133. * return value:
  134. *
  135. * TRUE if szFindString is in table
  136. * FALSE if otherwise
  137. ******************************************************************/
  138. BOOL TableFind(TABLE pTable, LPTSTR szFindString) {
  139. ELEM *p, *q;
  140.     if (!pTable) {
  141.      ErrorMsg(TEXT("TableFree: pTable is NULL."));
  142.      return FALSE;
  143.     }
  144.     
  145.     for (p = pTable->pCurrentFiles; p; p = q) {
  146. q = p->next;
  147. if (!CFilerlstrcmp(p->displayed, szFindString)) {
  148. return TRUE;
  149. }
  150. }
  151. return FALSE;
  152. }
  153. /******************************************************************
  154. * TableAdd()
  155. *
  156. * input:
  157. *
  158. * pTable - pointer to a string table
  159. *
  160. * szHidden, szDisplayed: pair of strings to insert into table
  161. *
  162. *
  163. * purpose:
  164. *
  165. * Inserts a string pair at the end of the string table pointed
  166. * to by pTable.
  167. ******************************************************************/
  168. BOOL TableAdd(TABLE pTable, TCHAR *szHidden, LPTSTR szDisplayed) {
  169. return TableInsert(pTable, szHidden, szDisplayed, pTable->iNumElems);
  170. }
  171. /******************************************************************
  172. * TableInsert()
  173. *
  174. * input:
  175. *
  176. * pTable - pointer to a string table
  177. * szHidden, szDisplayed : string pair to be inserted
  178. * i - position to insert the string pair.
  179. *
  180. * purpose:
  181. * inserts a string pair into the table pointed to by pTable
  182. * at position indicated by i.
  183. ******************************************************************/
  184. BOOL TableInsert(TABLE pTable, LPTSTR szHidden, LPTSTR szDisplayed, INT i) {
  185. ELEM *new, *p = NULL, *q = NULL;
  186. INT j;
  187. if (!pTable) {
  188. ErrorMsg(TEXT("TableInsert: pTable is NULL."));
  189. return FALSE;
  190. }
  191. new = malloc(sizeof(*new) + 2);
  192. new->hidden = malloc(3 + sizeof(*szHidden) * lstrlen(szHidden));
  193. new->displayed = malloc(3 + sizeof(*szDisplayed) * lstrlen(szDisplayed));
  194. new->next = NULL;
  195. lstrcpy(new->hidden, szHidden);
  196. lstrcpy(new->displayed, szDisplayed);
  197. if (!pTable->pCurrentFiles) {
  198. pTable->pCurrentFiles = new;
  199. pTable->iNumElems++;
  200. return TRUE;
  201. }
  202. if (!i) {
  203. ELEM *t;
  204. t = pTable->pCurrentFiles;
  205. pTable->pCurrentFiles = new;
  206. new->next = t;
  207. pTable->iNumElems++;
  208. return TRUE;
  209. }
  210. for (j = 0, p = pTable->pCurrentFiles; j < i; j++, p = p->next)
  211. q = p;
  212. q->next = new;
  213. new->next = p;
  214. pTable->iNumElems++;
  215. return TRUE;
  216. }
  217. /******************************************************************
  218. * TableRemove()
  219. *
  220. * input: 
  221. * pTable - pointer to a string table
  222. * i - index of element to be removed
  223. *
  224. * purpose: 
  225. * Removes the element at position i in the string table 
  226. * pointed to by pTable.
  227. *
  228. * Return values:
  229. * TRUE if successful
  230. * FALSE if unsuccessful
  231. ******************************************************************/
  232. BOOL TableRemove(TABLE pTable, INT i) {
  233. INT j;
  234. ELEM *p, *q;
  235. if (!pTable) {
  236. ErrorMsg(TEXT("TableRemove: pTable is NULL."));
  237. return FALSE;
  238. }
  239. if (!pTable->pCurrentFiles) {
  240. pTable->iNumElems = 0;
  241. return TRUE;
  242. }
  243. if (!i) {
  244. ELEM *t = pTable->pCurrentFiles->next;
  245. p = pTable->pCurrentFiles;
  246. free(p->hidden);
  247. free(p->displayed);
  248. free(p);
  249. pTable->pCurrentFiles = t;
  250. pTable->iNumElems--;
  251. return TRUE;
  252. }
  253. for (j = 0, p = pTable->pCurrentFiles; j < i; j++, p = p->next) {
  254. q = p;
  255. }
  256. q->next = p->next;
  257. free(p->hidden);
  258. free(p->displayed);
  259. free(p);
  260. pTable->iNumElems--;
  261. return TRUE;
  262. }
  263. /******************************************************************
  264. * TableSort()
  265. *
  266. * input:
  267. * pTable - pointer to a string table
  268. * compare - pointer to a compare function to be used in the
  269. * sort process
  270. *
  271. * Purpose: 
  272. * sorts the elements of the string table pointed to by pTable
  273. * on the displayed field.
  274. *
  275. * Return values:
  276. * TRUE if successful
  277. * FALSE if unsuccessful
  278. ******************************************************************/
  279. BOOL TableSort(TABLE pTable, INT compare(LPCTSTR , LPCTSTR)) {
  280. ELEM *p, *q, *min, *t;
  281. INT i, j;
  282. if (!pTable) {
  283. ErrorMsg(TEXT("TableSort: pTable is NULL."));
  284. return FALSE;
  285. }
  286. t = malloc(sizeof(*t));
  287. for (i = 0, p = pTable->pCurrentFiles; p && i < pTable->iNumElems - 1; i++, p = p->next) {
  288. min = p;
  289. for (q = p->next, j = 0; q && j < pTable->iNumElems; j++, q = q->next) {
  290. if (!q->displayed || !p->displayed) {
  291. ErrorMsg(TEXT("TableSort: parameters to compare are null."));
  292. return FALSE;
  293. }
  294. if (compare(q->displayed, min->displayed) < 0) min = q;
  295. }
  296. t->displayed = min->displayed;
  297. t->hidden = min->hidden; 
  298. min->displayed = p->displayed; 
  299. min->hidden = p->hidden;
  300. p->displayed = t->displayed;
  301. p->hidden = t->hidden;
  302. }
  303. free(t);
  304. return TRUE;
  305. }
  306. /******************************************************************
  307. * TableSend()
  308. *
  309. * input:
  310. * pTable - pointer to a string table
  311. * mybox - handle to the listbox to which LB_ADDSTRING
  312. * messages are to be sent
  313. *
  314. * Purpose:
  315. * Sends the displayed members of the string table pointed to by
  316. * pTable to the listbox whose handle is mybox
  317. * by sending LB_ADDSTRING messages to the listbox for each
  318. * element of the table.
  319. *
  320. * Return values:
  321. * TRUE if successful
  322. * FALSE if unsuccessful
  323. ******************************************************************/
  324. BOOL TableSend(TABLE pTable, HWND mybox) {
  325. int j;
  326. ELEM *p;
  327. LRESULT result;
  328. if (!pTable) {
  329. ErrorMsg(TEXT("TableSend: pTable is NULL."));
  330. return FALSE;
  331. }
  332. for (j = 0, p = pTable->pCurrentFiles; j < pTable->iNumElems; j++, p = p->next) {
  333. result = SendMessage(mybox, LB_ADDSTRING, (WPARAM)0, (LPARAM)p->displayed);
  334. if (result == LB_ERR) {
  335. ErrorMsg(TEXT("TableSend: LB_ADDSTRING failed."));
  336. return FALSE;
  337. }
  338. }
  339. return TRUE;
  340. }
  341. /******************************************************************
  342. * TableGetHidden()
  343. *
  344. * input:
  345. * pTable - pointer to a string table
  346. * i - index of hidden element to retrieve
  347. * rv - (out parameter): buffer to store the hidden string
  348. *
  349. * Purpose:
  350. * Retrieves the hidden memeber of the table stored at position i
  351. * in the string table pointed to by pTable.
  352. *
  353. * Returns:
  354. * TRUE if successful
  355. * FALSE if unsuccessful
  356. ******************************************************************/
  357. BOOL TableGetHidden(TABLE pTable, INT i, LPTSTR rv) {
  358. INT j;
  359. ELEM *p, *q;
  360. if (!pTable) {
  361. ErrorMsg(TEXT("TableGetHidden: pTable is NULL."));
  362. return FALSE;
  363. }
  364. q = pTable->pCurrentFiles;
  365. if (q) {
  366. for (p = pTable->pCurrentFiles, j = 0; j <= i; j++, p = p->next)
  367. q = p;
  368. }
  369. else {
  370. ErrorMsg(TEXT("TableGetHidden: pTable->pCurrentFiles is NULL."));
  371. lstrcpy(rv, TEXT("error"));
  372. return FALSE;
  373. }
  374. if (q && q->hidden)
  375. lstrcpy(rv, q->hidden);
  376. return TRUE;
  377. }
  378. /******************************************************************
  379. * SimplifyFileName()
  380. *
  381. * input:
  382. * szFileName - buffer of string to be "simplified"
  383. * rv - (out parameter) - buffer where simplified string
  384. * is to be stored
  385. *
  386. * purpose:
  387. * strips the characters [, ], >, |, and ; from szFileName and
  388. * stores the result in rv.
  389. *
  390. * returns:
  391. * TRUE if successful
  392. * FALSE if unsuccessful
  393. ******************************************************************/
  394. BOOL SimplifyFileName(LPTSTR szFileName, LPTSTR rv) {
  395. INT i, j;
  396. for (i = 0, j = 0; szFileName[i]; ) {
  397. if (szFileName[i] == TEXT('[') || 
  398. szFileName[i] == TEXT(']') || 
  399. szFileName[i] == TEXT('|') || 
  400. szFileName[i] == TEXT('>') ||
  401. szFileName[i] == TEXT(';'))
  402. i++;
  403. else {
  404. rv[j] = szFileName[i];
  405. i++;
  406. j++;
  407. }
  408. }
  409. rv[j] = TEXT('');
  410. return TRUE;
  411. }
  412. /******************************************************************
  413. * ReplaceEscapeCharacters()
  414. *
  415. * input:
  416. * szFileName - input buffer
  417. * rv - (out parameter) - output buffer
  418. *
  419. * purpose:
  420. * replaces '&' characters in szFileName with '&' and stores
  421. * the result in rv.
  422. *
  423. * returns:
  424. * TRUE if successful
  425. * FALSE if unsuccessful
  426. ******************************************************************/
  427. BOOL ReplaceEscapeCharacters(LPTSTR szFileName, LPTSTR rv) {
  428. INT i, j;
  429. for (i = 0, j = 0; szFileName[i]; ) {
  430. if (szFileName[i] == TEXT('&')) {
  431. rv[j] = TEXT('&');
  432. rv[j + 1] = TEXT('&');
  433. i++;
  434. j += 2;
  435. }
  436. else {
  437. rv[j] = szFileName[i];
  438. i++;
  439. j++;
  440. }
  441. }
  442. rv[j] = TEXT('');
  443. return TRUE;
  444. }
  445. /******************************************************************
  446. * CFilerlstrcmp: Case-insensitive comparison of the strings s and t.
  447. * foo and |foo are the same.
  448. * [foo] and |[foo] are the same.
  449. * [foo] and foo are not the same.
  450. ******************************************************************/
  451. INT CFilerlstrcmp(LPCTSTR s, LPCTSTR t)
  452. {
  453. int i = 0, j = 0;
  454. if (s[0] == TEXT('|') || s[0] == TEXT('>') || s[0] == TEXT(';'))
  455. i++;
  456. if (t[0] == TEXT('|') || t[0] == TEXT('>') || t[0] == TEXT(';'))
  457. j++;
  458. for ( ; toupper(s[i]) == toupper(t[j]); i++, j++)
  459. if (toupper(s[i]) == TEXT(''))
  460. return 0;
  461. return toupper(s[i]) - toupper(t[j]);
  462. }