//
// aegis - project change supervisor
// Copyright (C) 2005, 2006, 2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
output_revml_encode::~output_revml_encode()
{
//
// Make sure all buffered data has been passed to our write_inner
// method.
//
flush();
}
output_revml_encode::output_revml_encode(const output::pointer &a_deeper) :
deeper(a_deeper),
pos(0),
bol(true)
{
}
output::pointer
output_revml_encode::create(const output::pointer &a_deeper)
{
return pointer(new output_revml_encode(a_deeper));
}
static char
hex(unsigned x)
{
return "0123456789ABCDEF"[x & 15];
}
void
output_revml_encode::write_inner(const void *data, size_t length)
{
unsigned char *cp = (unsigned char *)data;
while (length > 0)
{
unsigned char c = *cp++;
--length;
++pos;
bol = false;
switch (c)
{
case '\n':
bol = true;
// fall through...
case ' ':
case '\t':
deeper->fputc(c);
break;
case '&':
deeper->fputs("&");
break;
case '"':
deeper->fputs(""");
break;
case '\'':
deeper->fputs("'");
break;
case '<':
deeper->fputs("<");
break;
case '>':
deeper->fputs(">");
break;
default:
// C locale
if (isprint(c))
deeper->fputc(c);
else if (c < ' ')
deeper->fprintf("", hex(c >> 4), hex(c));
else
deeper->fprintf("%d;", c);
break;
}
}
}
void
output_revml_encode::flush_inner()
{
deeper->flush();
}
nstring
output_revml_encode::filename()
const
{
return deeper->filename();
}
long
output_revml_encode::ftell_inner()
const
{
return pos;
}
int
output_revml_encode::page_width()
const
{
return deeper->page_width();
}
int
output_revml_encode::page_length()
const
{
return deeper->page_length();
}
void
output_revml_encode::end_of_line_inner()
{
if (!bol)
fputc('\n');
}
const char *
output_revml_encode::type_name()
const
{
return "revml";
}