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;
}
}
}