//
// aegis - project change supervisor
// Copyright (C) 2005, 2006, 2008, 2011, 2012 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(void)
{
deeper->flush();
}
nstring
output_revml_encode::filename(void)
const
{
return deeper->filename();
}
long
output_revml_encode::ftell_inner(void)
const
{
return pos;
}
int
output_revml_encode::page_width(void)
const
{
return deeper->page_width();
}
int
output_revml_encode::page_length(void)
const
{
return deeper->page_length();
}
void
output_revml_encode::end_of_line_inner(void)
{
if (!bol)
fputc('\n');
}
nstring
output_revml_encode::type_name(void)
const
{
return ("revml > " + deeper->type_name());
}
// vim: set ts=8 sw=4 et :