xmemfile.cpp
Upload User: kairuinn
Upload Date: 2009-02-07
Package Size: 2922k
Code Size: 3k
Category:

Graph program

Development Platform:

Visual C++

  1. #include "xmemfile.h"
  2. //////////////////////////////////////////////////////////
  3. size_t CxMemFile::Read(void *buffer, size_t size, size_t count)
  4. {
  5. if (m_pBuffer==NULL) return 0;
  6. if (buffer==NULL) return 0;
  7. if (m_Position > (long)m_Size) return 0;
  8. long nCount = (long)(count*size);
  9. if (nCount == 0) return 0;
  10. long nRead;
  11. if (m_Position + nCount > (long)m_Size)
  12. nRead = (m_Size - m_Position);
  13. else
  14. nRead = nCount;
  15. memcpy(buffer, m_pBuffer + m_Position, nRead);
  16. m_Position += nRead;
  17. return (size_t)(nRead/size);
  18. }
  19. //////////////////////////////////////////////////////////
  20. size_t CxMemFile::Write(const void *buffer, size_t size, size_t count)
  21. {
  22. if (m_pBuffer==NULL) return 0;
  23. if (buffer==NULL) return 0;
  24. long nCount = (long)(count*size);
  25. if (nCount == 0) return 0;
  26. if (m_Position + nCount > m_Edge) Alloc(m_Position + nCount);
  27. memcpy(m_pBuffer + m_Position, buffer, nCount);
  28. m_Position += nCount;
  29. if (m_Position > (long)m_Size) m_Size = m_Position;
  30. return count;
  31. }
  32. //////////////////////////////////////////////////////////
  33. bool CxMemFile::Seek(long offset, int origin)
  34. {
  35. if (m_pBuffer==NULL) return false;
  36. long lNewPos = m_Position;
  37. if (origin == SEEK_SET)  lNewPos = offset;
  38. else if (origin == SEEK_CUR) lNewPos += offset;
  39. else if (origin == SEEK_END) lNewPos = m_Size + offset;
  40. else return false;
  41. if (lNewPos < 0) return false;
  42. m_Position = lNewPos;
  43. return true;
  44. }
  45. //////////////////////////////////////////////////////////
  46. long CxMemFile::Tell()
  47. {
  48. if (m_pBuffer==NULL) return -1;
  49. return m_Position;
  50. }
  51. //////////////////////////////////////////////////////////
  52. long CxMemFile::Size()
  53. {
  54. if (m_pBuffer==NULL) return -1;
  55. return m_Size;
  56. }
  57. //////////////////////////////////////////////////////////
  58. bool CxMemFile::Flush()
  59. {
  60. if (m_pBuffer==NULL) return false;
  61. return true;
  62. }
  63. //////////////////////////////////////////////////////////
  64. bool CxMemFile::Eof()
  65. {
  66. if (m_pBuffer==NULL) return true;
  67. return (m_Position >= (long)m_Size);
  68. }
  69. //////////////////////////////////////////////////////////
  70. long CxMemFile::Error()
  71. {
  72. if (m_pBuffer==NULL) return -1;
  73. return (m_Position > (long)m_Size);
  74. }
  75. //////////////////////////////////////////////////////////
  76. bool CxMemFile::PutC(unsigned char c)
  77. {
  78. if (m_pBuffer==NULL) return false;
  79. if (m_Position + 1 > m_Edge) Alloc(m_Position + 1);
  80. memcpy(m_pBuffer + m_Position, &c, 1);
  81. m_Position += 1;
  82. if (m_Position > (long)m_Size) m_Size = m_Position;
  83. return true;
  84. }
  85. //////////////////////////////////////////////////////////
  86. long CxMemFile::GetC()
  87. {
  88. if (Eof()) return EOF;
  89. return *(BYTE*)((BYTE*)m_pBuffer + m_Position++);
  90. }
  91. //////////////////////////////////////////////////////////
  92. void CxMemFile::Alloc(DWORD dwNewLen)
  93. {
  94. if (dwNewLen > (DWORD)m_Edge)
  95. {
  96. // determine new buffer size
  97. DWORD dwNewBufferSize = (DWORD)m_Edge;
  98. while (dwNewBufferSize < dwNewLen) dwNewBufferSize += 4096;
  99. // allocate new buffer
  100. if (m_pBuffer == NULL) m_pBuffer = (BYTE*)malloc(dwNewBufferSize);
  101. else m_pBuffer = (BYTE*)realloc(m_pBuffer, dwNewBufferSize);
  102. // I own this buffer now (caller knows nothing about it)
  103. m_bFreeOnClose = true;
  104. m_Edge = dwNewBufferSize;
  105. }
  106. return;
  107. }
  108. //////////////////////////////////////////////////////////
  109. void CxMemFile::Free()
  110. {
  111. Close();
  112. }
  113. //////////////////////////////////////////////////////////