Tokenizer.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include "ArrayEx.h"
  3. class CTokenizer
  4. {
  5. public:
  6. CString m_cs;
  7. CArrayEx < TCHAR > m_delim;
  8. int m_nCurPos;
  9. CTokenizer(const CString& cs, const CString& csDelim) : m_cs(cs), m_nCurPos(0)
  10. {
  11. SetDelimiters(csDelim);
  12. }
  13. void SetDelimiters(const CString& csDelim)
  14. {
  15. for (int i = 0; i < csDelim.GetLength(); ++i)
  16. {
  17. m_delim.Add(csDelim[i]);
  18. }
  19. m_delim.SortAscending();
  20. }
  21. bool Next(CString& cs)
  22. {
  23. cs.Empty();
  24. int len = m_cs.GetLength();
  25. while (m_nCurPos < len && m_delim.Find(m_cs[m_nCurPos]))
  26. {
  27. ++m_nCurPos;
  28. }
  29. if (m_nCurPos >= len)
  30. {
  31. return false;
  32. }
  33. int nStartPos = m_nCurPos;
  34. while (m_nCurPos < len && !m_delim.Find(m_cs[m_nCurPos]))
  35. {
  36. ++m_nCurPos;
  37. }
  38. cs = m_cs.Mid(nStartPos, m_nCurPos - nStartPos);
  39. return true;
  40. }
  41. CString Tail()
  42. {
  43. int len = m_cs.GetLength();
  44. int nCurPos = m_nCurPos;
  45. while (nCurPos < len && m_delim.Find(m_cs[nCurPos]))
  46. {
  47. ++nCurPos;
  48. }
  49. CString csResult;
  50. if (nCurPos < len)
  51. {
  52. csResult = m_cs.Mid(nCurPos);
  53. }
  54. return csResult;
  55. }
  56. };