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.

129 lines
3.4 KiB

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