TextParse.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:15k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. #include "stdafx.h"
  18. #include "TextParse.h"
  19. CTextParse::CTextParse()
  20. {
  21. m_szBuffer[0] = '';
  22. m_pStartLine = m_szBuffer;
  23. m_pLine = m_szBuffer;
  24. m_pSavePos = m_szBuffer;
  25. }
  26. CTextParse::CTextParse(LPCTSTR pszLine)
  27. {
  28. m_szBuffer[0] = '';
  29. Set(pszLine);
  30. }
  31. CTextParse::~CTextParse()
  32. {
  33. }
  34. CTextParse::CTextParse(const CTextParse &tp)
  35. {
  36. m_pLine = tp.m_pLine;
  37. m_pStartLine = tp.m_pStartLine;
  38. m_pSavePos = tp.m_pSavePos;
  39. m_szCopyBuf[0] = '';
  40. m_szBuffer[0] = '';
  41. _tcscpy(m_szCopyBuf,tp.m_szCopyBuf);
  42. _tcscpy(m_szBuffer,tp.m_szBuffer);
  43. }
  44. const CTextParse& CTextParse::operator=(LPCTSTR lpsz)
  45. {
  46. Set(lpsz);
  47. m_szCopyBuf[0] = '';
  48. m_szBuffer[0] = '';
  49. return *this;
  50. }
  51. const CTextParse& CTextParse::operator=(const CTextParse &tp)
  52. {
  53. if (*this == tp)
  54. return *this;
  55. m_pLine = tp.m_pLine;
  56. m_pStartLine = tp.m_pStartLine;
  57. m_pSavePos = tp.m_pSavePos;
  58. _tcscpy(m_szCopyBuf,tp.m_szCopyBuf);
  59. _tcscpy(m_szBuffer,tp.m_szBuffer);
  60. return *this;
  61. }
  62. BOOL CTextParse::CharExistFromCurPos(int c,BOOL bForward)
  63. {
  64. LPCTSTR p = m_pLine;
  65. if (bForward) 
  66. {
  67. while (*p && *p != c)
  68.    p = _tcsinc(p);
  69. }
  70. else
  71. {
  72. while (p > m_pStartLine && *p != c)
  73.    p = _tcsdec(m_pLine,p);
  74. }
  75. return *p == c;
  76. }
  77. BOOL CTextParse::ValidCppCharExist(int c,BOOL bForward)
  78. {
  79. LPCTSTR p = m_pLine;
  80. while (*p && *p != c && *p != '/')
  81.    p = _tcsinc(p);
  82. return *p == c;
  83. }
  84. BOOL CTextParse::CharExist(LPCTSTR str)
  85. {
  86. LPCTSTR p = m_pStartLine;
  87. while (*p && !IsToken(str,p))
  88.    p = _tcsinc(p);
  89. return *p != '';
  90. }
  91. BOOL CTextParse::FindString(LPCTSTR str)
  92. {
  93. LPCTSTR p = _tcsstr(m_pLine,str);
  94. if (p)
  95. m_pLine = p;
  96. return p ? TRUE : FALSE;
  97. }
  98. BOOL CTextParse::FindChar(int c)
  99. {
  100. LPCTSTR p = _tcschr(m_pLine,c);
  101. if (p)
  102. m_pLine = p;
  103. return p ? TRUE : FALSE;
  104. }
  105. BOOL CTextParse::MoveUntilChar(int c,BOOL bForward)
  106. {
  107. if (bForward) 
  108. {
  109. while(*m_pLine && *m_pLine != c)
  110.    m_pLine = _tcsinc(m_pLine);
  111. return *m_pLine != '';
  112. }
  113. else 
  114. {
  115. while(m_pLine > m_pStartLine && *m_pLine != c)
  116.    m_pLine = _tcsdec(m_pStartLine,m_pLine);
  117. return *m_pLine == c;
  118. }
  119. }
  120. BOOL CTextParse::MoveUntilChar(LPCTSTR strTok,BOOL bForward)
  121. {
  122. if (bForward) 
  123. {
  124. while(*m_pLine && !IsToken(strTok,m_pLine))
  125.    m_pLine = _tcsinc(m_pLine);
  126. return *m_pLine != '';
  127. }
  128. else 
  129. {
  130. while(m_pLine > m_pStartLine && !IsToken(strTok,m_pLine))
  131.    m_pLine = _tcsdec(m_pStartLine,m_pLine);
  132. return IsToken(strTok,m_pLine);
  133. }
  134. }
  135. BOOL CTextParse::MoveUntilString(LPCTSTR str,BOOL bForward)
  136. {
  137. if (bForward) 
  138. {
  139. while(*m_pLine && !IsString(str))
  140.    m_pLine = _tcsinc(m_pLine);
  141. return *m_pLine != '';
  142. }
  143. else
  144. {
  145. while(m_pLine > m_pStartLine && !IsString(str))
  146.    m_pLine = _tcsdec(m_pStartLine,m_pLine);
  147. return IsString(str);
  148. }
  149. }
  150. BOOL CTextParse::MoveWhileChar(int c,BOOL bForward)
  151. {
  152. if (bForward) 
  153. {
  154. while(*m_pLine && *m_pLine == c)
  155.    m_pLine = _tcsinc(m_pLine);
  156. return *m_pLine != '';
  157. }
  158. else
  159. {
  160. while(m_pLine > m_pStartLine && *m_pLine == c)
  161.    m_pLine = _tcsdec(m_pStartLine,m_pLine);
  162. return *m_pLine == c;
  163. }
  164. }
  165. BOOL CTextParse::MoveWhileChar(LPCTSTR strTok,BOOL bForward)
  166. {
  167. if (bForward) 
  168. {
  169. while(*m_pLine && IsToken(strTok,m_pLine))
  170.    m_pLine = _tcsinc(m_pLine);
  171. return *m_pLine != '';
  172. }
  173. else
  174. {
  175. while(m_pLine > m_pStartLine && IsToken(strTok,m_pLine))
  176.    m_pLine = _tcsdec(m_pStartLine,m_pLine);
  177. return IsToken(strTok,m_pLine);
  178. }
  179. }
  180. LPCTSTR CTextParse::CopyWhileChar(int c)
  181. {
  182. for(int i=0;i < MAX_BUF && *m_pLine != '' && *m_pLine == c;i++)
  183. {
  184. m_szCopyBuf[i] = *m_pLine;
  185. m_pLine = _tcsinc(m_pLine);
  186. }
  187. m_szCopyBuf[i] = '';
  188. return m_szCopyBuf;
  189. }
  190. LPCTSTR CTextParse::CopyUntilString(LPCTSTR pszText)
  191. {
  192. int nLen = _tcslen(pszText);
  193. for(int i=0;i < MAX_BUF && *m_pLine != '' && _tcsncmp(m_pLine,pszText,nLen) != 0;i++)
  194. {
  195. m_szCopyBuf[i] = *m_pLine;
  196. m_pLine = _tcsinc(m_pLine);
  197. }
  198. m_szCopyBuf[i] = '';
  199. return m_szCopyBuf;
  200. }
  201. LPCTSTR CTextParse::CopyUntilChar(int c)
  202. {
  203. for(int i=0;i < MAX_BUF && *m_pLine != '' && *m_pLine != c;i++)
  204. {
  205. m_szCopyBuf[i] = *m_pLine;
  206. m_pLine = _tcsinc(m_pLine);
  207. }
  208. m_szCopyBuf[i] = '';
  209. return m_szCopyBuf;
  210. }
  211. LPCTSTR CTextParse::CopyWhileChar(LPCTSTR strTok)
  212. {
  213. for(int i=0;i < MAX_BUF && *m_pLine != '' && IsToken(strTok,m_pLine);i++)
  214. {
  215. m_szCopyBuf[i] = *m_pLine;
  216. m_pLine = _tcsinc(m_pLine);
  217. }
  218. m_szCopyBuf[i] = '';
  219. return m_szCopyBuf;
  220. }
  221. LPCTSTR CTextParse::CopyUntilChar(LPCTSTR strTok)
  222. {
  223. for(int i=0;i < MAX_BUF && *m_pLine != '' && !IsToken(strTok,m_pLine);i++)
  224. {
  225. m_szCopyBuf[i] = *m_pLine;
  226. m_pLine = _tcsinc(m_pLine);
  227. }
  228. m_szCopyBuf[i] = '';
  229. return m_szCopyBuf;
  230. }
  231. LPCTSTR CTextParse::CopyFuncUntilChar(LPCTSTR strTok)
  232. {
  233. for(int i=0;i < MAX_BUF && !IsEnd() && !IsToken(strTok,m_pLine);i++) 
  234. {
  235. /* if (*m_pLine == '=') {
  236. MoveUntilChar(",)");
  237. if (m_szCopyBuf[i-1] == ' ') {
  238. i--;
  239. }
  240. }*/
  241. if (CharAtCurrent('/')) 
  242. {
  243. MoveForward();
  244. MoveUntilChar(_T("/"));
  245. if (m_szCopyBuf[i-1] == ' ') 
  246. {
  247. i--;
  248.     MoveForward();
  249. }
  250. }
  251. m_szCopyBuf[i] = *m_pLine;
  252. MoveForward();
  253. }
  254. m_szCopyBuf[i] = '';
  255. return m_szCopyBuf;
  256. }
  257. BOOL CTextParse::IsToken(LPCTSTR strTok,LPCTSTR p)
  258. {
  259. while(*strTok) 
  260. {
  261.   if (*p == *strTok)
  262.   break;
  263.    strTok = _tcsinc(strTok);
  264. }
  265. return *strTok != '';
  266. }
  267. LPCTSTR CTextParse::ExtractConstructor()
  268. {
  269. MoveUntilChar('(');
  270. CopyUntilChar(')');
  271. _tcscat(m_szCopyBuf,_T(")"));
  272. return m_szCopyBuf;
  273. }
  274. LPCTSTR CTextParse::ExtractDeclareMacro()
  275. {
  276. return CopyUntilChar('(');
  277. }
  278. LPCTSTR CTextParse::ExtractFuncName()
  279. {
  280. Reset();
  281. // skip keywords
  282. if (_tcsncmp(m_pLine,_T("const"),5) == 0 || _tcsncmp(m_pLine,_T("afx_msg"),7) == 0 || _tcsncmp(m_pLine,_T("virtual"),7) == 0) 
  283. {
  284. CopyUntilWhiteSpace();
  285. MoveWhileWhiteSpace();
  286. }
  287. MoveUntilChar(_T("("));
  288. MoveUntilWhiteSpace(FALSE);
  289. if (*m_pLine == CPP_SPACE) // regular function
  290. MoveWhileWhiteSpace();
  291. else
  292. { // else constructor or destructor
  293. // allow for virtual destructors
  294. if (_tcsncmp(m_pLine,_T("virtual"),7) == 0)
  295. {
  296. CopyUntilWhiteSpace();
  297. MoveWhileWhiteSpace();
  298. }
  299. Reset();
  300. }
  301. // returning pointer or reference
  302. if (*m_pLine == '*' || *m_pLine == '&')
  303.    m_pLine = _tcsinc(m_pLine);
  304. return CopyUntilChar('(');
  305. }
  306. LPCTSTR CTextParse::ExtractClassName()
  307. {
  308. MoveWhileWhiteSpace();
  309. if (_tcsncmp(m_pLine,_T("class"),5) != 0)
  310. {
  311. m_szCopyBuf[0] = 0;
  312. return m_szCopyBuf;
  313. }
  314. Reset();
  315. // check if derived class
  316. if (!CharExistFromCurPos(':'))
  317. {
  318. if (!CharExistFromCurPos('{'))
  319. {
  320. MoveToLastChar();
  321. MoveWhileWhiteSpace(FALSE);
  322. MoveUntilWhiteSpace(FALSE);
  323. MoveWhileWhiteSpace();
  324. }
  325. else
  326. {
  327. MoveUntilChar('{');
  328. MoveUntilWhiteSpace(FALSE);
  329. MoveWhileWhiteSpace(FALSE);
  330. MoveUntilWhiteSpace(FALSE);
  331. MoveWhileWhiteSpace();
  332. }
  333. }
  334. else
  335. {
  336. MoveUntilChar(':');
  337. // go back and skip colon
  338. MoveUntilWhiteSpace(FALSE);
  339. MoveWhileWhiteSpace(FALSE);
  340. if (CharAtCurrent('>'))
  341. {
  342. MoveUntilChar('<',FALSE);
  343. MoveUntilWhiteSpace(FALSE);
  344. MoveWhileWhiteSpace(FALSE);
  345. }
  346. MoveUntilWhiteSpace(FALSE);
  347. MoveWhileWhiteSpace();
  348. }
  349. return CopyUntilChar(_T(" t<"));
  350. }
  351. LPCTSTR CTextParse::ExtractBaseClassName()
  352. {
  353. Reset();
  354. MoveWhileWhiteSpace();
  355. if (_tcsncmp(m_pLine,_T("class"),5) != 0)
  356. {
  357. m_szCopyBuf[0] = 0;
  358. return m_szCopyBuf;
  359. }
  360. Reset();
  361. // check if derived class
  362. if (CharExistFromCurPos(':'))
  363. {
  364. MoveUntilChar(':');
  365. // go back
  366. MoveWhileChar(':');
  367. MoveWhileWhiteSpace();
  368. MoveUntilWhiteSpace();
  369. MoveWhileWhiteSpace();
  370. }
  371. else
  372. {
  373. m_szCopyBuf[0] = 0;
  374. return m_szCopyBuf;
  375. }
  376. return CopyUntilChar(_T(" t<"));
  377. }
  378. BOOL CTextParse::IsCommentBlock(LPCTSTR strStart,LPCTSTR strEnd)
  379. {
  380. LPCTSTR p = _tcsstr(m_pLine,strStart);
  381. if (p)
  382. {
  383. if (p == m_pStartLine && *(p+sizeof(TCHAR)*2) == '+')
  384. return FALSE;
  385. if (p == m_pStartLine || (p != m_pStartLine && *(p-sizeof(TCHAR)) != '/') ) 
  386. {
  387. if (_tcsstr(m_pLine,strEnd) == NULL)
  388. return TRUE;
  389. }
  390. }
  391. return FALSE;
  392. }
  393. LPCTSTR CTextParse::CopyWholeWord()
  394. {
  395. bool bQuote=false;
  396. for(int i=0;i < MAX_BUF && *m_pLine != '';i++) 
  397. {
  398. if (*m_pLine == '"') 
  399. {
  400. bQuote = !bQuote;
  401. }
  402. else if (*m_pLine == ' ' && bQuote == false)
  403. {
  404. break;
  405. }
  406. m_szCopyBuf[i] = *m_pLine;
  407. m_pLine = _tcsinc(m_pLine);
  408. }
  409. SkipWhiteSpace();
  410. m_szCopyBuf[i] = '';
  411. return m_szCopyBuf;
  412. }
  413. LPCTSTR CTextParse::CopyUntilEnd()
  414. {
  415. for(int i=0;i < MAX_BUF && *m_pLine != '';i++) 
  416. {
  417. m_szCopyBuf[i] = *m_pLine;
  418. m_pLine = _tcsinc(m_pLine);
  419. }
  420. m_szCopyBuf[i] = '';
  421. return m_szCopyBuf;
  422. }
  423. bool CTextParse::FindWholeWord(LPCTSTR pszText)
  424. {
  425. bool bQuote = _tcsstr(pszText,_T(""")) != NULL;
  426. if (*pszText == '+' || *pszText == '-')
  427. pszText = _tcsinc(pszText);
  428. int nLen = _tcslen(pszText);
  429. int nRet=-1;
  430. for(int i=0;i < MAX_BUF && *m_pLine != '';i++) 
  431. {
  432. SkipWhiteSpace();
  433. if (*m_pLine == '"')
  434. {
  435. if (bQuote == true) 
  436. {
  437. nRet = _tcsncmp(m_pLine,pszText,nLen);
  438. if (nRet == 0)
  439. break;
  440. }
  441. MoveWhileChar('"');
  442. MoveUntilChar('"');
  443. MoveWhileChar('"');
  444. }
  445. else
  446. {
  447. nRet = _tcsncmp(m_pLine,pszText,GetWordLen());
  448. if (nRet == 0)
  449. break;
  450. SkipWord();
  451. }
  452. }
  453. return nRet == 0;
  454. }
  455. int CTextParse::GetWordLen()
  456. {
  457. LPCTSTR p = m_pLine;
  458. for (int i=0;*p && !IsToken(CPP_WHITE_SPACE,p);i++)
  459. {
  460. p++;
  461. }
  462. return i;
  463. }
  464. bool CTextParse::SkipHTMLCommand(bool bSkipCRLF)
  465. {
  466. if (CharAtCurrent('&'))
  467. {
  468. MoveUntilChar(';');
  469. if (CharAtCurrent(';'))
  470. MoveForward();
  471. return true;
  472. }
  473. LPCTSTR p = m_pLine;
  474. if (bSkipCRLF)
  475. {
  476. while (*p == 'r' || *p == 'n')
  477. p = _tcsinc(p);
  478. }
  479. if (*p != '<')
  480. return false;
  481. while (*p != '>' && *p != '')
  482. p = _tcsinc(p);
  483. if (*p == '>')
  484. p = _tcsinc(p);
  485. m_pLine = p;
  486. return true;
  487. }
  488. void CTextParse::SkipHTMLCommands(bool bSkipCRLF)
  489. {
  490. while (SkipHTMLCommand(bSkipCRLF))
  491. ;
  492. }
  493. BOOL CTextParse::IsValidCPP(LPCTSTR pszText)
  494. {
  495. BOOL bRet=FALSE;
  496. if (FindString(pszText))
  497. {
  498. // check if a comment
  499. SaveCurPos();
  500. if (!MoveUntilString(_T("//"),FALSE))
  501. {
  502. RestorePos();
  503. if (!MoveUntilString(_T("/*"),FALSE))
  504. bRet = TRUE;
  505. }
  506. }
  507. Reset();
  508. return bRet;
  509. }
  510. BOOL CTextParse::IsPrivate()
  511. {
  512. return IsValidCPP(_T("private"));
  513. }
  514. BOOL CTextParse::IsPublic()
  515. {
  516. return IsValidCPP(_T("public"));
  517. }
  518. BOOL CTextParse::IsProtected()
  519. {
  520. return IsValidCPP(_T("protected"));
  521. }
  522. BOOL CTextParse::IsVirtualFunc()
  523. {
  524. return IsValidCPP(_T("virtual"));
  525. }
  526. BOOL CTextParse::IsStartBrace()
  527. {
  528. return IsValidCPP(_T("{"));
  529. }
  530. BOOL CTextParse::IsEndBrace()
  531. {
  532. return IsValidCPP(_T("}"));
  533. }
  534. BOOL CTextParse::IsAccessSpecifier()
  535. {
  536. return IsValidCPP(_T(":"));
  537. }
  538. BOOL CTextParse::IsConstructor(LPCTSTR pszClassName)
  539. {
  540. CString sTest(pszClassName);
  541. sTest += _T("(");
  542. if (FindChar('~'))
  543. {
  544. Reset();
  545. return FALSE;
  546. }
  547. return IsValidCPP(sTest);
  548. }
  549. BOOL CTextParse::IsMsgMap()
  550. {
  551. return FindString(_T("{{AFX_MSG"));
  552. }
  553. BOOL CTextParse::IsDeclareMacro()
  554. {
  555. BOOL bRet = FALSE;
  556. if (IsValidCPP(_T("DECLARE_")))
  557. {
  558. if (!FindString(_T("()")))
  559. bRet = TRUE;
  560. Reset();
  561. }
  562. return bRet;
  563. }
  564. BOOL CTextParse::IsStartCommentBlock()
  565. {
  566. if (!FindString(_T("//")))
  567. return FindString(_T("/*"));
  568. return FALSE;
  569. }
  570. BOOL CTextParse::IsEndCommentBlock()
  571. {
  572. return FindString(_T("*/"));
  573. }
  574. BOOL CTextParse::IsClass()
  575. {
  576. BOOL bRet=TRUE;
  577. if (FindString(_T("template")))
  578. {
  579. bRet = FALSE;
  580. }
  581. if (!StringAtCurrent(_T("class ")))
  582. {
  583. bRet = FALSE;
  584. }
  585. Reset();
  586. // any line comments before 'class '
  587. MoveUntilString(_T("class "));
  588. if (MoveUntilString(_T("//"),FALSE))
  589. {
  590. bRet = FALSE;
  591. }
  592. Reset();
  593. if (FindChar(_T(';')))
  594. {
  595. bRet = FALSE;
  596. }
  597. if (FindChar(_T('#')))
  598. {
  599. bRet = FALSE;
  600. }
  601. Reset();
  602. return bRet;
  603. }
  604. BOOL CTextParse::ExtractArgs(CString &sRet,CStringArray &asArgs)
  605. {
  606. asArgs.RemoveAll();
  607. SaveCurPos();
  608. if (!CharAtCurrent('(') && FindChar('('))
  609. {
  610. RestorePos();
  611. SkipWhiteSpace();
  612. if (StringAtCurrent(_T("const")))
  613. {
  614. MoveUntilWhiteSpace();
  615. SkipWhiteSpace();
  616. }
  617. sRet = CopyUntilWhiteSpace();
  618. if (MoveUntilChar('('))
  619. {
  620. MoveForward();
  621. }
  622. else
  623. {
  624. RestorePos();
  625. }
  626. }
  627. while (!CharAtCurrent(')') && !IsEnd())
  628. {
  629. SkipWhiteSpace();
  630. if (StringAtCurrent(_T("const")))
  631. {
  632. MoveUntilWhiteSpace();
  633. SkipWhiteSpace();
  634. }
  635. MoveUntilWhiteSpace();
  636. SkipWhiteSpace();
  637. if (StringAtCurrent(_T("void")))
  638. break;
  639. if (CharAtCurrent('*') || CharAtCurrent('&'))
  640. MoveForward();
  641. asArgs.Add(CopyUntilChar(_T(",)t ")));
  642. if (CharAtCurrent(','))
  643. MoveForward();
  644. else
  645. SkipWhiteSpace();
  646. }
  647. return TRUE;
  648. }
  649. LPCTSTR CTextParse::ExtractHTMLText(bool bRemoveCRLF)
  650. {
  651. return ExtractHTMLText(_T("<"),bRemoveCRLF);
  652. }
  653. LPCTSTR CTextParse::ExtractHTMLText(LPCTSTR pszUntil,bool bRemoveCRLF)
  654. {
  655. int nLen=_tcslen(pszUntil);
  656. int i=0;
  657. bool bEnd = false;
  658. while(i < MAX_BUF && *m_pLine != '' && _tcsncmp(m_pLine,pszUntil,nLen) != 0)
  659. {
  660. if (*m_pLine == '<' || *m_pLine == '&')
  661. {
  662. while (SkipHTMLCommand(false))
  663. {
  664. if (_tcsncmp(m_pLine,pszUntil,nLen) == 0)
  665. {
  666. bEnd = true;
  667. break;
  668. }
  669. }
  670. }
  671. if (bEnd)
  672. break;
  673. if (bRemoveCRLF && (*m_pLine == 'n' || *m_pLine == 'r'))
  674. {
  675. m_pLine = _tcsinc(m_pLine);
  676. }
  677. else
  678. {
  679. m_szCopyBuf[i++] = *m_pLine;
  680. m_pLine = _tcsinc(m_pLine);
  681. }
  682. }
  683. m_szCopyBuf[i] = '';
  684. return m_szCopyBuf;
  685. }
  686. LPCTSTR CTextParse::ExtractHTMLLink()
  687. {
  688. m_szCopyBuf[0] = '';
  689. if (!FindString(_T("href=")))
  690. return m_szCopyBuf;
  691. MoveUntilChar('"');
  692. LPCTSTR p = m_pLine;
  693. if (*p == '"')
  694. {
  695. p = _tcsinc(p);
  696. m_pLine = p;
  697. LPCTSTR pRet = CopyUntilChar('"');
  698. MoveUntilChar('>');
  699. MoveWhileChar('>');
  700. return pRet;
  701. }
  702. return m_szCopyBuf;
  703. }