Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.4 KiB

  1. //*********************************************************************
  2. //* Microsoft Windows **
  3. //* Copyright(c) Microsoft Corp., 1994 **
  4. //*********************************************************************
  5. // ############################################################################
  6. // INCLUDES
  7. #include "appdefs.h"
  8. #include "ccsv.h"
  9. // ############################################################################
  10. // DEFINES
  11. #define chComma L','
  12. #define chNewline L'\n'
  13. #define chReturn L'\r'
  14. // ############################################################################
  15. //
  16. // CCSVFile - simple file i/o for CSV files
  17. //
  18. CCSVFile::CCSVFile()
  19. {
  20. m_hFile = 0;
  21. m_iLastRead = 0;
  22. m_pchLast = m_pchBuf = NULL;
  23. }
  24. // ############################################################################
  25. CCSVFile::~CCSVFile()
  26. {
  27. if(m_hFile)
  28. CloseHandle(m_hFile);
  29. //AssertMsg(!m_hFile, L"CCSV file is still open");
  30. }
  31. // ############################################################################
  32. BOOLEAN CCSVFile::Open(LPCWSTR pszFileName)
  33. {
  34. //AssertMsg(!m_hFile, L"a file is already open.");
  35. m_hFile = CreateFile((LPCWSTR)pszFileName,
  36. GENERIC_READ, FILE_SHARE_READ,
  37. 0, OPEN_EXISTING, 0, 0);
  38. if (INVALID_HANDLE_VALUE == m_hFile)
  39. {
  40. return FALSE;
  41. }
  42. m_pchLast = m_pchBuf = NULL;
  43. return TRUE;
  44. }
  45. // ############################################################################
  46. BOOLEAN CCSVFile::ReadToken(LPWSTR psz, DWORD cchMax)
  47. {
  48. LPWSTR pszLast;
  49. int ch;
  50. ch = ChNext();
  51. if (-1 == ch)
  52. {
  53. return FALSE;
  54. }
  55. pszLast = psz + (cchMax - 1);
  56. while ( psz < pszLast &&
  57. chComma != ch &&
  58. chNewline != ch &&
  59. chReturn != ch &&
  60. -1 != ch)
  61. {
  62. *psz++ = (WCHAR)ch;
  63. ch = ChNext(); //Read in the next WCHARacter
  64. }
  65. *psz++ = L'\0';
  66. return TRUE;
  67. }
  68. // ############################################################################
  69. BOOLEAN CCSVFile::SkipTillEOL()
  70. {
  71. int ch = ChNext();
  72. if (-1 == ch)
  73. {
  74. return FALSE;
  75. }
  76. while ( chNewline != ch &&
  77. -1 != ch)
  78. {
  79. ch = ChNext(); //Read in the next character
  80. }
  81. return TRUE;
  82. }
  83. // ############################################################################
  84. void CCSVFile::Close(void)
  85. {
  86. if (m_hFile)
  87. CloseHandle(m_hFile);
  88. m_hFile = 0;
  89. }
  90. // ############################################################################
  91. BOOL CCSVFile::FReadInBuffer(void)
  92. {
  93. //Read another buffer
  94. if (!ReadFile(m_hFile, m_rgchBuf, CCSVFILE_BUFFER_SIZE, &m_cchAvail, NULL) || !m_cchAvail)
  95. return FALSE; //nothing more to read
  96. // Convert ANSI to UNICODE
  97. MultiByteToWideChar(CP_ACP, 0, m_rgchBuf, m_cchAvail, m_rgwchBuf, m_cchAvail);
  98. m_pchBuf = m_rgwchBuf;
  99. m_pchLast = m_pchBuf + m_cchAvail;
  100. return TRUE; //success
  101. }
  102. // ############################################################################
  103. inline int CCSVFile::ChNext(void)
  104. {
  105. if (m_pchBuf >= m_pchLast && !FReadInBuffer()) //implies that we finished reading the buffer. Read in some more.
  106. return -1; //nothing more to read
  107. m_iLastRead = *m_pchBuf++;
  108. return m_iLastRead;
  109. }