home *** CD-ROM | disk | FTP | other *** search
/ Informática Multimedia: Special Games / INFESPGAMES.mdf / os2 / ribble / support / cbr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-26  |  4.1 KB  |  217 lines

  1. #include <CSupport.h>
  2. #include <CAssert.h>
  3. #include <CBR.h>
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <direct.h>
  8. #include <fcntl.h>
  9. #include <io.h>
  10.  
  11. #if defined(__OS2__) && defined(__IBMC__)
  12. #define open(a,b) _open(a,b)
  13. #define lseek(a,b,c) _lseek(a,b,c)
  14. #endif
  15.  
  16. CBufferedRead::CBufferedRead(const char* _filename, int _mode)
  17. {
  18.   fd = open(_filename, _mode);
  19.   if (fd != -1)
  20.     {
  21.       fdOpened = 1;
  22.       buffer = new CSHuge char[BufferSize];
  23.       CAssert(buffer);
  24.     }
  25.   else
  26.     {
  27.       fdOpened = 0;
  28.       buffer = 0;
  29.     }
  30.   lineBuffer = 0;
  31.   lineBufferLen = 0;
  32.   bufferSeekPos = 0;
  33.   flush();
  34. }
  35.  
  36. CBufferedRead::CBufferedRead(int _fd)
  37. {
  38.   fd = _fd;
  39.  
  40.   if (fd != -1)
  41.     {
  42.       buffer = new CSHuge char[BufferSize];
  43.       CAssert(buffer);
  44.       bufferSeekPos = lseek(_fd, 0, SEEK_CUR);
  45.       flush();
  46.     }
  47.   else
  48.     {
  49.       fdOpened = 0;
  50.       buffer = 0;
  51.       bufferSeekPos = 0;
  52.       bufferSize = 0;
  53.       bufferOff = 0;
  54.     }
  55.   lineBuffer = 0;
  56.   lineBufferLen = 0;
  57. }
  58.  
  59. CBufferedRead::~CBufferedRead()
  60. {
  61.   if (fdOpened)
  62.     ::close(fd);
  63.   if (buffer)
  64.     delete [] buffer;
  65. }
  66.  
  67. void
  68. CBufferedRead::close(void)
  69. {
  70.   if (fdOpened)
  71.     ::close(fd);
  72.   fdOpened = 0;
  73.   fd = -1;
  74. }
  75.  
  76. long
  77. CBufferedRead::opened(void)
  78. {
  79.   return fd != -1;
  80. }
  81.  
  82. long 
  83. CBufferedRead::rewind(void) 
  84.   flush();
  85.   return seek(0);
  86. }
  87.  
  88. long 
  89. CBufferedRead::seek(long _position)
  90. {
  91.   if (fd == -1) return -1;
  92.  
  93.   long sdiff = _position - bufferSeekPos;
  94.  
  95.   if (sdiff >= 0 && sdiff < bufferSize)
  96.     {
  97.       bufferOff = sdiff;
  98.       return _position;
  99.     }
  100.   else
  101.     {
  102.       bufferSeekPos = lseek(fd, _position, SEEK_SET);
  103.       flush();
  104.       return bufferSeekPos;
  105.     }
  106. }
  107.  
  108. void 
  109. CBufferedRead::flush(void)
  110. {
  111.   bufferSize = 0;
  112.   bufferOff = 0;
  113. }
  114.  
  115. long 
  116. CBufferedRead::read(char* _buffer, unsigned int _length)
  117. {
  118.   if (fd == -1) return -1;
  119.  
  120.   long bufferLeft = bufferSize - bufferOff;
  121.  
  122.   if (_length <= bufferLeft)
  123.     {
  124.       memcpy(_buffer, buffer + bufferOff, _length);
  125.       bufferOff += _length;
  126.     }
  127.   else
  128.     {
  129.       if (_length >= BufferSize)
  130.         {
  131.           if (bufferLeft)
  132.             {
  133.               memcpy(_buffer, buffer + bufferOff, (size_t)bufferLeft);
  134.               bufferOff = bufferSize;
  135.             }
  136.  
  137.           long r = ::read(fd, _buffer + bufferLeft, (size_t)(_length - bufferLeft));
  138.           return r == -1 ? -1 : bufferLeft + r;
  139.         }
  140.  
  141.       if (bufferLeft)
  142.         {
  143.           memmove(buffer, buffer + bufferOff, (size_t)bufferLeft);
  144.           bufferSize = bufferLeft;
  145.           bufferOff = 0;
  146.         }
  147.       else
  148.         {
  149.           bufferSize = 0;
  150.           bufferOff = 0;
  151.         }
  152.  
  153.       bufferSeekPos = lseek(fd, 0, SEEK_CUR);
  154.       long r = ::read(fd, buffer + bufferSize, (size_t)(BufferSize - bufferSize));
  155.       if (r == -1)
  156.         return r;
  157.  
  158.       bufferSize += r;
  159.  
  160.       bufferLeft = bufferSize - bufferOff;
  161.       if (_length > bufferLeft)
  162.         {
  163.           memcpy(_buffer, buffer + bufferOff, (size_t)bufferLeft);
  164.           bufferOff += bufferLeft;
  165.           return bufferLeft;
  166.         }
  167.  
  168.       memcpy(_buffer, buffer + bufferOff, _length);
  169.       bufferOff += _length;
  170.     }
  171.   return _length;
  172. }
  173.  
  174. char*
  175. CBufferedRead::getline(void)
  176. {
  177.   if (lineBufferLen == 0)
  178.     {
  179.       lineBufferLen = 64;
  180.       lineBuffer = new char[lineBufferLen];
  181.       CAssert(lineBuffer);
  182.     }
  183.  
  184.   *lineBuffer = '\0';
  185.  
  186.   int eof = 0;
  187.  
  188.   for (int got = 0; !eof;)
  189.     {
  190.       char ch;
  191.       if (read(&ch, sizeof(ch)) == sizeof(ch))
  192.         {
  193.           if (ch == '\n')
  194.             {
  195.               lineBuffer[got] = '\0';
  196.               break;
  197.             }
  198.           lineBuffer[got++] = ch;
  199.           if (got >= lineBufferLen)
  200.             {
  201.               lineBufferLen <<= 1;
  202.               char* ext = new char[lineBufferLen];
  203.               memcpy(ext, lineBuffer, got);
  204.               delete [] lineBuffer;
  205.               lineBuffer = ext;
  206.             }
  207.         }
  208.       else
  209.         eof = 1;
  210.     }
  211.   return !got && eof ? 0 : lineBuffer;
  212. }
  213.  
  214.  
  215.  
  216.