-/*\r
-Copyright (c) 2001, Loki software, inc.\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification, \r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list \r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the name of Loki software nor the names of its contributors may be used \r
-to endorse or promote products derived from this software without specific prior \r
-written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' \r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \r
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY \r
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS \r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
-*/\r
-\r
-//\r
-// File class, can be a memory file or a regular disk file.\r
-// Originally from LeoCAD, used with permission from the author. :)\r
-//\r
-// Leonardo Zide (leo@lokigames.com)\r
-//\r
-\r
-#include "stdafx.h"\r
-\r
-#include <stdio.h>\r
-#include <memory.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-\r
-\r
-IDataStream::IDataStream()\r
-{ }\r
- \r
-IDataStream::~IDataStream()\r
-{ }\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// File construction/destruction\r
-\r
-MemStream::MemStream()\r
-{\r
- m_nGrowBytes = 1024;\r
- m_nPosition = 0;\r
- m_nBufferSize = 0;\r
- m_nFileSize = 0;\r
- m_pBuffer = NULL;\r
- m_bAutoDelete = true;\r
-}\r
-\r
-MemStream::MemStream(unsigned long nLen)\r
-{\r
- m_nGrowBytes = 1024;\r
- m_nPosition = 0;\r
- m_nBufferSize = 0;\r
- m_nFileSize = 0;\r
- m_pBuffer = NULL;\r
- m_bAutoDelete = true;\r
-\r
- GrowFile (nLen);\r
-}\r
-\r
-FileStream::FileStream()\r
-{\r
- m_hFile = NULL;\r
- m_bCloseOnDelete = false;\r
-}\r
-\r
-MemStream::~MemStream()\r
-{\r
- if (m_pBuffer)\r
- Close();\r
-\r
- m_nGrowBytes = 0;\r
- m_nPosition = 0;\r
- m_nBufferSize = 0;\r
- m_nFileSize = 0;\r
-}\r
-\r
-FileStream::~FileStream()\r
-{\r
- if (m_hFile != NULL && m_bCloseOnDelete)\r
- Close();\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// File operations\r
-\r
-char* MemStream::ReadString(char* pBuf, unsigned long nMax)\r
-{\r
- int nRead = 0;\r
- unsigned char ch;\r
-\r
- if (nMax <= 0)\r
- return NULL;\r
- if (m_nPosition >= m_nFileSize)\r
- return NULL;\r
-\r
- while ((--nMax))\r
- {\r
- if (m_nPosition == m_nFileSize)\r
- break;\r
-\r
- ch = m_pBuffer[m_nPosition];\r
- m_nPosition++;\r
- pBuf[nRead++] = ch;\r
-\r
- if (ch == '\n')\r
- break;\r
- }\r
-\r
- pBuf[nRead] = '\0';\r
- return pBuf;\r
-}\r
-\r
-char* FileStream::ReadString(char* pBuf, unsigned long nMax)\r
-{\r
- return fgets(pBuf, nMax, m_hFile);\r
-}\r
-\r
-unsigned long MemStream::Read(void* pBuf, unsigned long nCount)\r
-{\r
- if (nCount == 0)\r
- return 0;\r
-\r
- if (m_nPosition > m_nFileSize)\r
- return 0;\r
-\r
- unsigned long nRead;\r
- if (m_nPosition + nCount > m_nFileSize)\r
- nRead = (unsigned long)(m_nFileSize - m_nPosition);\r
- else\r
- nRead = nCount;\r
-\r
- memcpy((unsigned char*)pBuf, (unsigned char*)m_pBuffer + m_nPosition, nRead);\r
- m_nPosition += nRead;\r
-\r
- return nRead;\r
-}\r
-\r
-unsigned long FileStream::Read(void* pBuf, unsigned long nCount)\r
-{\r
- return fread(pBuf, 1, nCount, m_hFile);\r
-}\r
-\r
-int MemStream::GetChar()\r
-{\r
- if (m_nPosition > m_nFileSize)\r
- return 0;\r
-\r
- unsigned char* ret = (unsigned char*)m_pBuffer + m_nPosition;\r
- m_nPosition++;\r
-\r
- return *ret;\r
-}\r
-\r
-int FileStream::GetChar()\r
-{\r
- return fgetc(m_hFile);\r
-}\r
-\r
-unsigned long MemStream::Write(const void* pBuf, unsigned long nCount)\r
-{\r
- if (nCount == 0)\r
- return 0;\r
-\r
- if (m_nPosition + nCount > m_nBufferSize)\r
- GrowFile(m_nPosition + nCount);\r
-\r
- memcpy((unsigned char*)m_pBuffer + m_nPosition, (unsigned char*)pBuf, nCount);\r
-\r
- m_nPosition += nCount;\r
-\r
- if (m_nPosition > m_nFileSize)\r
- m_nFileSize = m_nPosition;\r
-\r
- return nCount;\r
-}\r
-\r
-unsigned long FileStream::Write(const void* pBuf, unsigned long nCount)\r
-{\r
- return fwrite(pBuf, 1, nCount, m_hFile);\r
-}\r
-\r
-int MemStream::PutChar(int c)\r
-{\r
- if (m_nPosition + 1 > m_nBufferSize)\r
- GrowFile(m_nPosition + 1);\r
-\r
- unsigned char* bt = (unsigned char*)m_pBuffer + m_nPosition;\r
- *bt = c;\r
-\r
- m_nPosition++;\r
-\r
- if (m_nPosition > m_nFileSize)\r
- m_nFileSize = m_nPosition;\r
-\r
- return 1;\r
-}\r
-\r
-/*!\todo SPoG suggestion: replace printf with operator >> using c++ iostream and strstream */\r
-void FileStream::printf(const char* s, ...)\r
-{\r
- va_list args;\r
-\r
- va_start (args, s);\r
- vfprintf(m_hFile, s, args);\r
- va_end (args);\r
-}\r
-\r
-/*!\todo SPoG suggestion: replace printf with operator >> using c++ iostream and strstream */\r
-void MemStream::printf(const char* s, ...)\r
-{\r
- va_list args;\r
-\r
- char buffer[4096];\r
- va_start (args, s);\r
- vsprintf(buffer, s, args);\r
- va_end (args);\r
- Write(buffer, strlen(buffer));\r
-}\r
-\r
-int FileStream::PutChar(int c)\r
-{\r
- return fputc(c, m_hFile);\r
-}\r
-\r
-bool FileStream::Open(const char *filename, const char *mode)\r
-{\r
- m_hFile = fopen(filename, mode);\r
- m_bCloseOnDelete = true;\r
-\r
- return (m_hFile != NULL);\r
-}\r
-\r
-void MemStream::Close()\r
-{\r
- m_nGrowBytes = 0;\r
- m_nPosition = 0;\r
- m_nBufferSize = 0;\r
- m_nFileSize = 0;\r
- if (m_pBuffer && m_bAutoDelete)\r
- free(m_pBuffer);\r
- m_pBuffer = NULL;\r
-}\r
-\r
-void FileStream::Close()\r
-{\r
- if (m_hFile != NULL)\r
- fclose(m_hFile);\r
-\r
- m_hFile = NULL;\r
- m_bCloseOnDelete = false;\r
-}\r
-\r
-unsigned long MemStream::Seek(long lOff, int nFrom)\r
-{\r
- unsigned long lNewPos = m_nPosition;\r
-\r
- if (nFrom == SEEK_SET)\r
- lNewPos = lOff;\r
- else if (nFrom == SEEK_CUR)\r
- lNewPos += lOff;\r
- else if (nFrom == SEEK_END)\r
- lNewPos = m_nFileSize + lOff;\r
- else\r
- return (unsigned long)-1;\r
-\r
- m_nPosition = lNewPos;\r
-\r
- return m_nPosition;\r
-}\r
-\r
-unsigned long FileStream::Seek(long lOff, int nFrom)\r
-{\r
- fseek (m_hFile, lOff, nFrom);\r
-\r
- return ftell(m_hFile);\r
-}\r
-\r
-unsigned long MemStream::GetPosition() const\r
-{\r
- return m_nPosition;\r
-}\r
-\r
-unsigned long FileStream::GetPosition() const\r
-{\r
- return ftell(m_hFile);\r
-}\r
-\r
-void MemStream::GrowFile(unsigned long nNewLen)\r
-{\r
- if (nNewLen > m_nBufferSize)\r
- {\r
- // grow the buffer\r
- unsigned long nNewBufferSize = m_nBufferSize;\r
-\r
- // determine new buffer size\r
- while (nNewBufferSize < nNewLen)\r
- nNewBufferSize += m_nGrowBytes;\r
-\r
- // allocate new buffer\r
- unsigned char* lpNew;\r
- if (m_pBuffer == NULL)\r
- lpNew = static_cast<unsigned char*>(malloc(nNewBufferSize));\r
- else\r
- lpNew = static_cast<unsigned char*>(realloc(m_pBuffer, nNewBufferSize));\r
-\r
- m_pBuffer = lpNew;\r
- m_nBufferSize = nNewBufferSize;\r
- }\r
-}\r
-\r
-void MemStream::Flush()\r
-{\r
- // Nothing to be done\r
-}\r
-\r
-void FileStream::Flush()\r
-{\r
- if (m_hFile == NULL)\r
- return;\r
-\r
- fflush(m_hFile);\r
-}\r
-\r
-void MemStream::Abort()\r
-{\r
- Close();\r
-}\r
-\r
-void FileStream::Abort()\r
-{\r
- if (m_hFile != NULL)\r
- {\r
- // close but ignore errors\r
- if (m_bCloseOnDelete)\r
- fclose(m_hFile);\r
- m_hFile = NULL;\r
- m_bCloseOnDelete = false;\r
- }\r
-}\r
-\r
-void MemStream::SetLength(unsigned long nNewLen)\r
-{\r
- if (nNewLen > m_nBufferSize)\r
- GrowFile(nNewLen);\r
-\r
- if (nNewLen < m_nPosition)\r
- m_nPosition = nNewLen;\r
-\r
- m_nFileSize = nNewLen;\r
-}\r
-\r
-void FileStream::SetLength(unsigned long nNewLen)\r
-{\r
- fseek(m_hFile, nNewLen, SEEK_SET);\r
-}\r
-\r
-unsigned long MemStream::GetLength() const\r
-{\r
- return m_nFileSize;\r
-}\r
-\r
-unsigned long FileStream::GetLength() const\r
-{\r
- unsigned long nLen, nCur;\r
-\r
- // Seek is a non const operation\r
- nCur = ftell(m_hFile);\r
- fseek(m_hFile, 0, SEEK_END);\r
- nLen = ftell(m_hFile);\r
- fseek(m_hFile, nCur, SEEK_SET);\r
-\r
- return nLen;\r
-}\r
+/*
+Copyright (c) 2001, Loki software, inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the name of Loki software nor the names of its contributors may be used
+to endorse or promote products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//
+// File class, can be a memory file or a regular disk file.
+// Originally from LeoCAD, used with permission from the author. :)
+//
+// Leonardo Zide (leo@lokigames.com)
+//
+
+#include "stdafx.h"
+
+#include <stdio.h>
+#include <memory.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+IDataStream::IDataStream()
+{ }
+
+IDataStream::~IDataStream()
+{ }
+
+/////////////////////////////////////////////////////////////////////////////
+// File construction/destruction
+
+MemStream::MemStream()
+{
+ m_nGrowBytes = 1024;
+ m_nPosition = 0;
+ m_nBufferSize = 0;
+ m_nFileSize = 0;
+ m_pBuffer = NULL;
+ m_bAutoDelete = true;
+}
+
+MemStream::MemStream(unsigned long nLen)
+{
+ m_nGrowBytes = 1024;
+ m_nPosition = 0;
+ m_nBufferSize = 0;
+ m_nFileSize = 0;
+ m_pBuffer = NULL;
+ m_bAutoDelete = true;
+
+ GrowFile (nLen);
+}
+
+FileStream::FileStream()
+{
+ m_hFile = NULL;
+ m_bCloseOnDelete = false;
+}
+
+MemStream::~MemStream()
+{
+ if (m_pBuffer)
+ Close();
+
+ m_nGrowBytes = 0;
+ m_nPosition = 0;
+ m_nBufferSize = 0;
+ m_nFileSize = 0;
+}
+
+FileStream::~FileStream()
+{
+ if (m_hFile != NULL && m_bCloseOnDelete)
+ Close();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// File operations
+
+char* MemStream::ReadString(char* pBuf, unsigned long nMax)
+{
+ int nRead = 0;
+ unsigned char ch;
+
+ if (nMax <= 0)
+ return NULL;
+ if (m_nPosition >= m_nFileSize)
+ return NULL;
+
+ while ((--nMax))
+ {
+ if (m_nPosition == m_nFileSize)
+ break;
+
+ ch = m_pBuffer[m_nPosition];
+ m_nPosition++;
+ pBuf[nRead++] = ch;
+
+ if (ch == '\n')
+ break;
+ }
+
+ pBuf[nRead] = '\0';
+ return pBuf;
+}
+
+char* FileStream::ReadString(char* pBuf, unsigned long nMax)
+{
+ return fgets(pBuf, nMax, m_hFile);
+}
+
+unsigned long MemStream::Read(void* pBuf, unsigned long nCount)
+{
+ if (nCount == 0)
+ return 0;
+
+ if (m_nPosition > m_nFileSize)
+ return 0;
+
+ unsigned long nRead;
+ if (m_nPosition + nCount > m_nFileSize)
+ nRead = (unsigned long)(m_nFileSize - m_nPosition);
+ else
+ nRead = nCount;
+
+ memcpy((unsigned char*)pBuf, (unsigned char*)m_pBuffer + m_nPosition, nRead);
+ m_nPosition += nRead;
+
+ return nRead;
+}
+
+unsigned long FileStream::Read(void* pBuf, unsigned long nCount)
+{
+ return fread(pBuf, 1, nCount, m_hFile);
+}
+
+int MemStream::GetChar()
+{
+ if (m_nPosition > m_nFileSize)
+ return 0;
+
+ unsigned char* ret = (unsigned char*)m_pBuffer + m_nPosition;
+ m_nPosition++;
+
+ return *ret;
+}
+
+int FileStream::GetChar()
+{
+ return fgetc(m_hFile);
+}
+
+unsigned long MemStream::Write(const void* pBuf, unsigned long nCount)
+{
+ if (nCount == 0)
+ return 0;
+
+ if (m_nPosition + nCount > m_nBufferSize)
+ GrowFile(m_nPosition + nCount);
+
+ memcpy((unsigned char*)m_pBuffer + m_nPosition, (unsigned char*)pBuf, nCount);
+
+ m_nPosition += nCount;
+
+ if (m_nPosition > m_nFileSize)
+ m_nFileSize = m_nPosition;
+
+ return nCount;
+}
+
+unsigned long FileStream::Write(const void* pBuf, unsigned long nCount)
+{
+ return fwrite(pBuf, 1, nCount, m_hFile);
+}
+
+int MemStream::PutChar(int c)
+{
+ if (m_nPosition + 1 > m_nBufferSize)
+ GrowFile(m_nPosition + 1);
+
+ unsigned char* bt = (unsigned char*)m_pBuffer + m_nPosition;
+ *bt = c;
+
+ m_nPosition++;
+
+ if (m_nPosition > m_nFileSize)
+ m_nFileSize = m_nPosition;
+
+ return 1;
+}
+
+/*!\todo SPoG suggestion: replace printf with operator >> using c++ iostream and strstream */
+void FileStream::printf(const char* s, ...)
+{
+ va_list args;
+
+ va_start (args, s);
+ vfprintf(m_hFile, s, args);
+ va_end (args);
+}
+
+/*!\todo SPoG suggestion: replace printf with operator >> using c++ iostream and strstream */
+void MemStream::printf(const char* s, ...)
+{
+ va_list args;
+
+ char buffer[4096];
+ va_start (args, s);
+ vsprintf(buffer, s, args);
+ va_end (args);
+ Write(buffer, strlen(buffer));
+}
+
+int FileStream::PutChar(int c)
+{
+ return fputc(c, m_hFile);
+}
+
+bool FileStream::Open(const char *filename, const char *mode)
+{
+ m_hFile = fopen(filename, mode);
+ m_bCloseOnDelete = true;
+
+ return (m_hFile != NULL);
+}
+
+void MemStream::Close()
+{
+ m_nGrowBytes = 0;
+ m_nPosition = 0;
+ m_nBufferSize = 0;
+ m_nFileSize = 0;
+ if (m_pBuffer && m_bAutoDelete)
+ free(m_pBuffer);
+ m_pBuffer = NULL;
+}
+
+void FileStream::Close()
+{
+ if (m_hFile != NULL)
+ fclose(m_hFile);
+
+ m_hFile = NULL;
+ m_bCloseOnDelete = false;
+}
+
+unsigned long MemStream::Seek(long lOff, int nFrom)
+{
+ unsigned long lNewPos = m_nPosition;
+
+ if (nFrom == SEEK_SET)
+ lNewPos = lOff;
+ else if (nFrom == SEEK_CUR)
+ lNewPos += lOff;
+ else if (nFrom == SEEK_END)
+ lNewPos = m_nFileSize + lOff;
+ else
+ return (unsigned long)-1;
+
+ m_nPosition = lNewPos;
+
+ return m_nPosition;
+}
+
+unsigned long FileStream::Seek(long lOff, int nFrom)
+{
+ fseek (m_hFile, lOff, nFrom);
+
+ return ftell(m_hFile);
+}
+
+unsigned long MemStream::GetPosition() const
+{
+ return m_nPosition;
+}
+
+unsigned long FileStream::GetPosition() const
+{
+ return ftell(m_hFile);
+}
+
+void MemStream::GrowFile(unsigned long nNewLen)
+{
+ if (nNewLen > m_nBufferSize)
+ {
+ // grow the buffer
+ unsigned long nNewBufferSize = m_nBufferSize;
+
+ // determine new buffer size
+ while (nNewBufferSize < nNewLen)
+ nNewBufferSize += m_nGrowBytes;
+
+ // allocate new buffer
+ unsigned char* lpNew;
+ if (m_pBuffer == NULL)
+ lpNew = static_cast<unsigned char*>(malloc(nNewBufferSize));
+ else
+ lpNew = static_cast<unsigned char*>(realloc(m_pBuffer, nNewBufferSize));
+
+ m_pBuffer = lpNew;
+ m_nBufferSize = nNewBufferSize;
+ }
+}
+
+void MemStream::Flush()
+{
+ // Nothing to be done
+}
+
+void FileStream::Flush()
+{
+ if (m_hFile == NULL)
+ return;
+
+ fflush(m_hFile);
+}
+
+void MemStream::Abort()
+{
+ Close();
+}
+
+void FileStream::Abort()
+{
+ if (m_hFile != NULL)
+ {
+ // close but ignore errors
+ if (m_bCloseOnDelete)
+ fclose(m_hFile);
+ m_hFile = NULL;
+ m_bCloseOnDelete = false;
+ }
+}
+
+void MemStream::SetLength(unsigned long nNewLen)
+{
+ if (nNewLen > m_nBufferSize)
+ GrowFile(nNewLen);
+
+ if (nNewLen < m_nPosition)
+ m_nPosition = nNewLen;
+
+ m_nFileSize = nNewLen;
+}
+
+void FileStream::SetLength(unsigned long nNewLen)
+{
+ fseek(m_hFile, nNewLen, SEEK_SET);
+}
+
+unsigned long MemStream::GetLength() const
+{
+ return m_nFileSize;
+}
+
+unsigned long FileStream::GetLength() const
+{
+ unsigned long nLen, nCur;
+
+ // Seek is a non const operation
+ nCur = ftell(m_hFile);
+ fseek(m_hFile, 0, SEEK_END);
+ nLen = ftell(m_hFile);
+ fseek(m_hFile, nCur, SEEK_SET);
+
+ return nLen;
+}