home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 9.ddi / IOSTRSR1.ZIP / SRBSKOFF.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  2.7 KB  |  89 lines

  1. /*[]-------------------------------------------------------------------[]*/
  2. /*|                                                                     |*/
  3. /*|     srbskoff.cpp                                                    |*/
  4. /*|                                                                     |*/
  5. /*|   Class strstreambuf                                                |*/
  6. /*|   streampos strstreambuf::seekoff( streamoff, ios::seek_dir, int )  |*/
  7. /*|                                                                     |*/
  8. /*[]-------------------------------------------------------------------[]*/
  9.  
  10. /*
  11.  *      C/C++ Run Time Library - Version 5.0
  12.  *
  13.  *      Copyright (c) 1990, 1992 by Borland International
  14.  *      All Rights Reserved.
  15.  *
  16.  */
  17.  
  18. #include <ioconfig.h>
  19. #include <strstrea.h>
  20.  
  21. // we assume streampos and streamoff are type int or long
  22.  
  23. streampos strstreambuf::seekoff(streamoff off, ios::seek_dir dir, int omode)
  24. {
  25.     streamoff pos = EOF;    // result
  26.  
  27.     // find position if from beginning or end
  28.     if( dir == ios::end )
  29.         {
  30.         if( (ssbflags & unlimited) || off > 0 )
  31.             pos = -1;   // can't do it
  32.         else
  33.             pos = blen() + off;
  34.         }
  35.     else if( dir == ios::beg )
  36.         pos = off;
  37.  
  38.     if( omode & ios::in )
  39.         {
  40.         // set up get area
  41.         if( dir == ios::cur )
  42.             {
  43.             // find a reasonable value for current position
  44.             if( gptr() )
  45.                 pos = streamoff(gptr() - base()) + off;
  46.             else if( pptr() )
  47.                 pos = streamoff(pptr() - base()) + off;
  48.             else
  49.                 pos = off;
  50.             }
  51.         if( pos < 0  ||  blen() < pos )
  52.             pos = EOF;  // illegal request
  53.         else
  54.             {
  55. #pragma warn -sig
  56.             char* g = base() + pos;
  57. #pragma warn .sig
  58.             char* eb = (eback() && eback() < g) ? eback() : g;
  59.             char* eg = (egptr() && g < egptr()) ? egptr() : g;
  60.             setg(eb, g, eg);
  61.             }
  62.         }
  63.     if( omode & ios::out )
  64.         {
  65.         // set up put area
  66.         if( dir == ios::cur )
  67.             {
  68.             // find a reasonable value for current position
  69.             if( pptr() )
  70.                 pos = streamoff(pptr() - base()) + off;
  71.             else if( gptr() )
  72.                 pos = streamoff(gptr() - base()) + off;
  73.             else
  74.                 pos = off;
  75.             }
  76.         if( pos < 0  ||  blen() < pos )
  77.             pos = EOF;  // illegal request
  78.         else
  79.             {
  80. #pragma warn -sig
  81.             char* p = base() + pos;
  82. #pragma warn .sig
  83.             char* ep = (epptr() && p < epptr()) ? epptr() : ebuf();
  84.             setp(p, ep);
  85.             }
  86.         }
  87.     return streampos(pos);
  88. }
  89.