Annotation of mstools/mfc/src/filemem.cpp, revision 1.1.1.1

1.1       root        1: // This is a part of the Microsoft Foundation Classes C++ library. 
                      2: // Copyright (C) 1992 Microsoft Corporation 
                      3: // All rights reserved. 
                      4: //  
                      5: // This source code is only intended as a supplement to the 
                      6: // Microsoft Foundation Classes Reference and Microsoft 
                      7: // QuickHelp documentation provided with the library. 
                      8: // See these sources for detailed information regarding the 
                      9: // Microsoft Foundation Classes product. 
                     10: 
                     11: #include "afx.h"
                     12: #pragma hdrstop
                     13: 
                     14: #include <limits.h>
                     15: #include <malloc.h>
                     16: 
                     17: #ifdef AFX_CORE_SEG
                     18: #pragma code_seg(AFX_CORE_SEG)
                     19: #endif
                     20: 
                     21: #ifdef _DEBUG
                     22: #undef THIS_FILE
                     23: static char BASED_CODE THIS_FILE[] = __FILE__;
                     24: #endif
                     25: 
                     26: #define new DEBUG_NEW
                     27: 
                     28: ////////////////////////////////////////////////////////////////////////////
                     29: // CMemFile implementation
                     30: 
                     31: IMPLEMENT_DYNAMIC(CMemFile, CFile)
                     32: 
                     33: CMemFile::CMemFile(UINT nGrowBytes /* = 1024 */)
                     34: {
                     35:        ASSERT(nGrowBytes <= USHRT_MAX);
                     36: 
                     37:        m_hFile = hFileNull;
                     38:        m_nGrowBytes = nGrowBytes;
                     39:        m_nPosition = 0;
                     40:        m_nBufferSize = 0;
                     41:        m_nFileSize = 0;
                     42:        m_lpBuffer = NULL;
                     43:        m_nBufferSize = 0;
                     44: }
                     45: 
                     46: CMemFile::~CMemFile()
                     47: {
                     48:        // Close should have already been called, but we check anyway
                     49:        if (m_lpBuffer)
                     50:                Close();
                     51:        ASSERT(m_lpBuffer == NULL);
                     52: 
                     53:        m_nGrowBytes = 0;
                     54:        m_nPosition = 0;
                     55:        m_nBufferSize = 0;
                     56:        m_nFileSize = 0;
                     57: }
                     58: 
                     59: BYTE FAR* 
                     60: CMemFile::Alloc(UINT nBytes)
                     61: {
                     62:        return (BYTE FAR*)_fmalloc(nBytes);
                     63: }
                     64: 
                     65: BYTE FAR* 
                     66: CMemFile::Realloc(BYTE FAR* pMem, UINT nBytes)
                     67: {
                     68:        return (BYTE FAR*)_frealloc(pMem, nBytes);
                     69: }
                     70: 
                     71: BYTE FAR* 
                     72: CMemFile::Memcpy(BYTE FAR* pMemTarget, const BYTE FAR* pMemSource, UINT nBytes)
                     73: {
                     74:        ASSERT(pMemTarget != NULL);
                     75:        ASSERT(pMemSource != NULL);
                     76:        ASSERT(AfxIsValidAddress(pMemTarget, nBytes));
                     77:        ASSERT(AfxIsValidAddress(pMemSource, nBytes, FALSE));
                     78: 
                     79:        return (BYTE FAR*)_fmemcpy(pMemTarget, pMemSource, nBytes);
                     80: }
                     81: 
                     82: void
                     83: CMemFile::Free(BYTE FAR* pMem)
                     84: {
                     85:        ASSERT(pMem != NULL);
                     86: 
                     87:        _ffree(pMem);
                     88: }
                     89: 
                     90: DWORD   
                     91: CMemFile::GetPosition() const
                     92: {
                     93:        ASSERT_VALID(this);
                     94:        return (DWORD)m_nPosition;
                     95: }
                     96: 
                     97: void 
                     98: CMemFile::GrowFile(DWORD dwNewLen)
                     99: {
                    100:        ASSERT_VALID(this);
                    101:        ASSERT((dwNewLen & 0xFFFF0000) == 0L);
                    102: 
                    103:        if (dwNewLen > m_nBufferSize)
                    104:        {
                    105:                // grow the buffer
                    106:                DWORD dwNewBufferSize = (DWORD)m_nBufferSize;
                    107: 
                    108:                while (dwNewBufferSize < dwNewLen)
                    109:                        dwNewBufferSize += m_nGrowBytes;
                    110: 
                    111:                if (dwNewBufferSize > USHRT_MAX)
                    112:                        AfxThrowFileException(CFileException::diskFull);
                    113:                ASSERT((dwNewBufferSize & 0xFFFF0000) == 0L);
                    114: 
                    115:                BYTE FAR* lpNew;
                    116:                if (m_lpBuffer == NULL)
                    117:                        lpNew = Alloc((UINT)dwNewBufferSize);
                    118:                else
                    119:                        lpNew = Realloc(m_lpBuffer, (UINT)dwNewBufferSize);
                    120: 
                    121:                if (lpNew == NULL)
                    122:                        AfxThrowMemoryException();
                    123: 
                    124:                m_lpBuffer = lpNew;
                    125:                m_nBufferSize = (UINT)dwNewBufferSize;      
                    126:        }
                    127:        ASSERT_VALID(this);
                    128: }
                    129: 
                    130: void    
                    131: CMemFile::SetLength(DWORD dwNewLen)
                    132: {
                    133:        ASSERT_VALID(this);
                    134:        ASSERT((UINT)dwNewLen <= USHRT_MAX);
                    135: 
                    136:        if (dwNewLen > m_nBufferSize)
                    137:                GrowFile(dwNewLen);
                    138: 
                    139:        if (dwNewLen < m_nPosition)
                    140:                m_nPosition = (UINT)dwNewLen;
                    141: 
                    142:        m_nFileSize = (UINT)dwNewLen;
                    143:        ASSERT_VALID(this);
                    144: }
                    145: 
                    146: 
                    147: UINT    
                    148: CMemFile::Read(void FAR* lpBuf, UINT nCount)
                    149: {
                    150:        ASSERT_VALID(this);
                    151:        ASSERT(lpBuf != NULL);
                    152:        ASSERT(AfxIsValidAddress(lpBuf, nCount));
                    153: 
                    154:        UINT nRead;
                    155: 
                    156:        if (m_nPosition > m_nFileSize)
                    157:                return 0;
                    158: 
                    159:        if (m_nPosition + nCount > m_nFileSize)
                    160:                nRead = m_nFileSize - m_nPosition;
                    161:        else
                    162:                nRead = nCount;
                    163: 
                    164:        Memcpy((BYTE FAR*)lpBuf, m_lpBuffer + m_nPosition, nRead);
                    165:        m_nPosition += nRead;
                    166: 
                    167:        ASSERT_VALID(this);
                    168: 
                    169:        return nRead;
                    170: }
                    171: 
                    172: void
                    173: CMemFile::Write(const void FAR* lpBuf, UINT nCount)
                    174: {
                    175:        ASSERT_VALID(this);
                    176:        ASSERT(lpBuf != NULL);
                    177:        ASSERT(AfxIsValidAddress(lpBuf, nCount, FALSE));
                    178: 
                    179:        if (m_nPosition + nCount > m_nBufferSize)
                    180:                GrowFile(m_nPosition + nCount);
                    181: 
                    182:        ASSERT(m_nPosition + nCount <= m_nBufferSize);
                    183: 
                    184:        Memcpy(m_lpBuffer + m_nPosition, (BYTE FAR*)lpBuf, nCount);
                    185: 
                    186:        m_nPosition += nCount;
                    187: 
                    188:        if (m_nPosition > m_nFileSize)
                    189:                m_nFileSize = m_nPosition;
                    190: 
                    191:        ASSERT_VALID(this);
                    192: }
                    193: 
                    194: 
                    195: LONG
                    196: CMemFile::Seek(LONG lOff, UINT nFrom)
                    197: {
                    198:        ASSERT_VALID(this);
                    199:        ASSERT(lOff <= USHRT_MAX);
                    200:        ASSERT(nFrom == CFile::begin || nFrom == CFile::end || nFrom == CFile::current);
                    201: 
                    202:        LONG lNewPos = m_nPosition;
                    203: 
                    204:        if (nFrom == CFile::begin)
                    205:                lNewPos = lOff;
                    206:        else if (nFrom == CFile::current)
                    207:                lNewPos += lOff;
                    208:        else if (nFrom == CFile::end)
                    209:                lNewPos = m_nFileSize + lOff;
                    210:        else
                    211:                return -1;
                    212: 
                    213:        if (lNewPos < 0)
                    214:                AfxThrowFileException(CFileException::badSeek);
                    215: 
                    216:        m_nPosition = (UINT)lNewPos;
                    217: 
                    218:        ASSERT_VALID(this);
                    219:        return m_nPosition;
                    220: }
                    221: 
                    222: void    
                    223: CMemFile::Flush()
                    224: {
                    225:        ASSERT_VALID(this);
                    226: }
                    227: 
                    228: void    
                    229: CMemFile::Close()
                    230: {
                    231:        ASSERT_VALID(this);
                    232:        m_nGrowBytes = 0;
                    233:        m_nPosition = 0;
                    234:        m_nBufferSize = 0;
                    235:        m_nFileSize = 0;
                    236:        if (m_lpBuffer)
                    237:                Free(m_lpBuffer);
                    238:        m_lpBuffer = NULL;
                    239: }
                    240: 
                    241: void 
                    242: CMemFile::LockRange(DWORD /* dwPos */, DWORD /* dwCount */)
                    243: {
                    244:        ASSERT_VALID(this);
                    245:        AfxThrowNotSupportedException();
                    246: }
                    247: 
                    248: 
                    249: void 
                    250: CMemFile::UnlockRange(DWORD /* dwPos */, DWORD /* dwCount */)
                    251: {
                    252:        ASSERT_VALID(this);
                    253:        AfxThrowNotSupportedException();
                    254: }
                    255: 
                    256: CFile*
                    257: CMemFile::Duplicate() const
                    258: {
                    259:        ASSERT_VALID(this);
                    260:        AfxThrowNotSupportedException();
                    261:        return NULL;
                    262: }
                    263: 
                    264: BOOL
                    265: CMemFile::GetStatus(CFileStatus& rStatus) const
                    266: {
                    267:        ASSERT_VALID(this);
                    268: 
                    269:        rStatus.m_ctime = 0;
                    270:        rStatus.m_mtime = 0;
                    271:        rStatus.m_atime = 0;
                    272:        rStatus.m_size = m_nFileSize;
                    273:        rStatus.m_attribute = CFile::normal;
                    274:        rStatus.m_szFullName[0] = '\0';
                    275:        return TRUE;
                    276: }
                    277: 
                    278: #ifdef _DEBUG
                    279: 
                    280: void    
                    281: CMemFile::Dump(CDumpContext& dc) const
                    282: {
                    283:        ASSERT_VALID(this);
                    284: 
                    285:        CFile::Dump(dc);
                    286: 
                    287:        dc << "\n\tfile size = " << m_nFileSize;
                    288:        dc << "\n\tbuffer size = " << m_nBufferSize;
                    289:        dc << "\n\tposition = " << m_nPosition;
                    290:        dc << "\n\tgrowth rate = " << m_nGrowBytes;
                    291: }
                    292: 
                    293: void
                    294: CMemFile::AssertValid() const
                    295: {
                    296:        CFile::AssertValid();
                    297: 
                    298:        ASSERT((m_lpBuffer == NULL && m_nBufferSize == 0) || AfxIsValidAddress(m_lpBuffer, m_nBufferSize));
                    299:        ASSERT(m_nFileSize <= m_nBufferSize);
                    300:        // m_nPosition might be after the end of file, so we cannot ASSERT
                    301:        // its validity
                    302: }
                    303: 
                    304: #endif // _DEBUG

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.