Annotation of mstools/mfc/samples/fileview/linefile.cpp, revision 1.1.1.1

1.1       root        1: // linefile.cpp : Defines the class behaviors for the line file class.
                      2: //
                      3: // This is a part of the Microsoft Foundation Classes C++ library.
                      4: // Copyright (C) 1992 Microsoft Corporation
                      5: // All rights reserved.
                      6: //
                      7: // This source code is only intended as a supplement to the
                      8: // Microsoft Foundation Classes Reference and Microsoft
                      9: // QuickHelp documentation provided with the library.
                     10: // See these sources for detailed information regarding the
                     11: // Microsoft Foundation Classes product.
                     12: 
                     13: #include "fileview.h"
                     14: 
                     15: IMPLEMENT_DYNAMIC(CLineFile, CStdioFile)
                     16: 
                     17: CLineFile::~CLineFile()
                     18: {
                     19: }
                     20: 
                     21: CLineFile::CLineFile() : CStdioFile()
                     22: {
                     23:        m_lBeginLine = 0L;
                     24: }
                     25: 
                     26: CLineFile::CLineFile(const char* pszFileName, UINT nOpenFlags)
                     27:                : CStdioFile(pszFileName, nOpenFlags)
                     28: {
                     29:        m_lBeginLine = 0L;
                     30: }
                     31: 
                     32: //
                     33: // assuming the current file offset points to the beginning of a line
                     34: // read the next line, return offset of next line
                     35: // also expand tabs to spaces
                     36: //
                     37: 
                     38: #define TABNUM 8
                     39: 
                     40: LONG
                     41: CLineFile::NextLine(char FAR* lpszArg, UINT nMax)
                     42: {
                     43:        register char FAR * lpsz = lpszArg;
                     44:        register UINT n;
                     45: 
                     46:        m_lBeginLine = GetPosition();
                     47: 
                     48:        for (n=0;;)
                     49:        {
                     50:                if ( Read( lpsz, 1) != 1 )
                     51:                {
                     52:                        break;
                     53:                }
                     54: 
                     55:                n++;
                     56: 
                     57:                if ( *lpsz == '\n' )
                     58:                {
                     59:                        break;
                     60:                }
                     61: 
                     62:                if ( *lpsz == '\r' )
                     63:                {
                     64:                        continue;
                     65:                }
                     66: 
                     67:                if ( *lpsz == '\t' )
                     68:                {
                     69:                        for ( *lpsz++ = ' '; n%TABNUM && n < nMax; n++, lpsz++ )
                     70:                        {
                     71:                                 *lpsz = ' ';
                     72:                        }
                     73:                }
                     74:                else
                     75:                {
                     76:                        lpsz++;
                     77:                }
                     78: 
                     79:                if ( n >= nMax )
                     80:                {
                     81:                        break;
                     82:                }
                     83:        }
                     84: 
                     85:        *lpsz = 0;
                     86: 
                     87:        return GetPosition();
                     88: }
                     89: 
                     90: LONG
                     91: CLineFile::SetBegin(LONG newBegin)
                     92: {
                     93:        LONG save = m_lBeginLine;
                     94: 
                     95:        m_lBeginLine = newBegin;
                     96: 
                     97:        return save;
                     98: }
                     99: 
                    100: //
                    101: // read backwards a few ( nLines ) lines
                    102: //
                    103: 
                    104: #define GUESS       100L
                    105: #define MAXLINES    200
                    106: 
                    107: LONG
                    108: CLineFile::BackLines(char FAR* lpsz, UINT nMax, UINT nLines)
                    109: {
                    110: 
                    111:        LONG    lines[ MAXLINES ];
                    112:        LONG    guess;
                    113:        register UINT i;
                    114: 
                    115:        if (m_lBeginLine == 0L)
                    116:        {
                    117:                Seek(0L, CFile::begin);
                    118:                return NextLine(lpsz, nMax);
                    119:        }
                    120: 
                    121:        if (nLines > MAXLINES)
                    122:        {
                    123:                nLines = MAXLINES;
                    124:        }
                    125: 
                    126:        guess = m_lBeginLine - ( GUESS * nLines );
                    127: 
                    128:        if (guess < 0L)
                    129:        {
                    130:                guess = 0L;
                    131:        }
                    132: 
                    133:        TRY
                    134:        {
                    135:                Seek( guess, CFile::begin);
                    136:        }
                    137:        CATCH( CFileException, e )
                    138:        {
                    139:                TRACE( "Bad Seek in BackLines %ld\n", guess );
                    140:                return -1;
                    141:        }
                    142:        END_CATCH
                    143: 
                    144:        if (guess != 0L)
                    145:        {
                    146:                ReadString( lpsz, nMax );       // skip forward to a line
                    147:        }
                    148: 
                    149:        for ( i = 0; i < nLines; i++ )
                    150:        {
                    151:                lines[ i ] = -1L;
                    152:        }
                    153: 
                    154:        for ( ; ; )
                    155:        {
                    156:                for ( i=MAXLINES-2; i > 0; i-- )
                    157:                {
                    158:                        lines[ i ] = lines[ i - 1 ];
                    159:                }
                    160: 
                    161:                lines[ 0 ] = GetPosition();
                    162: 
                    163:                if ( lines[0] >= m_lBeginLine )
                    164:                {
                    165:                        break;
                    166:                }
                    167: 
                    168:                ReadString( lpsz, nMax );       // skip forward a line
                    169:        }
                    170: 
                    171:        for ( ; lines[ nLines ] == -1L; nLines-- );
                    172: 
                    173:        Seek( lines[ nLines ], CFile::begin );
                    174: 
                    175:        NextLine( lpsz, nMax );
                    176:        m_lBeginLine = lines[ nLines ];
                    177: 
                    178:        return m_lBeginLine;
                    179: }
                    180: 
                    181: //
                    182: // read a line near some file offset
                    183: //
                    184: 
                    185: LONG
                    186: CLineFile::LineNear(char FAR* lpsz, UINT nMax, LONG  lOffset)
                    187: {
                    188:        TRY
                    189:        {
                    190:                Seek(lOffset, CFile::begin);
                    191:        }
                    192:        CATCH( CFileException, e )
                    193:        {
                    194:                TRACE("Bad Seek in LineNear %ld\n", lOffset);
                    195:                return -1;
                    196:        }
                    197:        END_CATCH
                    198: 
                    199:        m_lBeginLine = NextLine(lpsz, nMax);    // find a real line
                    200: 
                    201:        return BackLines( lpsz, nMax, 1 );      // one just before it
                    202: }

unix.superglobalmegacorp.com

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