www.pudn.com > MPEG2systemsrc.rar > OPortToFile.C


/* Copyright (C) 1995, Tektronix Inc. All Rights Reserved.
 *
 *   Usage Restrictions
 *
 * License is granted to copy, to use, and to make and to use derivative
 * works for research and evaluation purposes only.
 *
 *   Disclaimer of Warranty
 *
 * These software programs are available to the user without any license
 * fee or royalty on an "as is" basis.  Tektronix Inc. disclaims any and
 * all warranties, whether express, implied, or statuary, including any
 * implied warranties or merchantability or of fitness for a particular
 * purpose.  In no event shall the copyright-holder be liable for any 
 * incidental, punitive, or consequential damages of any kind whatsoever
 * arising from the use of these programs.
 *
 * This disclaimer of warranty extends to the user of these programs and
 * user's customers, employees, agents, transferees, successors, and
 * assigns.
 *
 * The Tektronix Inc. does not represent or warrant that the programs
 * furnished hereunder are free of infringement of any third-party
 * patents.
*/

/* OPortToFile implementation */

#include "OPortToFile.H"
#include "Utilities.H"

extern "C"
{
int read (int, char*, int);
int write (int, char*, int);
int close (int);
}

OPortToFile::OPortToFile (char* f, int tf) : OutputPort(tf)
{
  fd = open(f, O_CREAT | O_RDWR | O_TRUNC, 0666);
  assert(fd);
  next_out = 0;
  bufpos = 0;
}

OPortToFile::~OPortToFile()
{
  write(fd, fbuf, bufpos);
  close(fd);
}

void OPortToFile::output_bit (char b)
{
  buf[next_out] = b;
  next_out++;
  if (next_out > 7)
    {
      output_byte();
      next_out = 0;
    }
}

void OPortToFile::output_byte (char b)
{
  int result;
  if (next_out != 0)
    {
      sys_error("not on byte boundary in output_byte");
    }
  fbuf[bufpos++] = b;
  if (bufpos == CacheSize)
  {
    result = write(fd, fbuf, CacheSize);
    bufpos = 0;
  }
}
     
void OPortToFile::output_flush ()
{
  int result = write(fd, fbuf, bufpos);
  bufpos = 0;
}

char inline bit (char c)
{
  return (c == '0') ? ((char) 0) : ((char) 1);
}

void OPortToFile::output_byte ()
{
  int result;
  for (int i = 0; i < 8 - next_out; i++) write_bit('0');
  
  if (textflag)
	  result = write(fd, buf, 8);
  else
    {
      char b =
	bit(buf[0]) << 7 |
	  bit(buf[1]) << 6 |
	    bit(buf[2]) << 5 |
	      bit(buf[3]) << 4 |
		bit(buf[4]) << 3 |
		  bit(buf[5]) << 2 |
		    bit(buf[6]) << 1 |
		      bit(buf[7]) << 0;
      fbuf[bufpos++] = b;
      if (bufpos == CacheSize)
        {
	  write(fd, fbuf, CacheSize);
	  bufpos = 0;
        }

    }
}