From 469bbcf0701e1eb8a6670c23145b0da87357e178 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Sun, 25 Mar 2012 20:00:08 +0000 Subject: Code is all reorganized. We're about ready to release. I should write up a little explenation of the arrangement. --- src/stable/tafwriter.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/stable/tafwriter.cpp (limited to 'src/stable/tafwriter.cpp') diff --git a/src/stable/tafwriter.cpp b/src/stable/tafwriter.cpp new file mode 100644 index 0000000..b24bd1e --- /dev/null +++ b/src/stable/tafwriter.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2007-2011 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#include "bu/taf.h" +#include "bu/stream.h" + +Bu::TafWriter::TafWriter( Bu::Stream &sOut ) : + sOut( sOut ), + iDepth( 0 ) +{ +} + +Bu::TafWriter::~TafWriter() +{ +} + +void Bu::TafWriter::ident() +{ + for( int j = 0; j < iDepth; j++ ) + sOut.write(" ", 4 ); +} + +void Bu::TafWriter::writeGroup( const Bu::TafGroup *pRoot ) +{ + ident(); + sOut.write("{", 1 ); + if( pRoot->getName().isSet() ) + writeString( pRoot->getName() ); + sOut.write(":\n", 2 ); + iDepth++; + const Bu::TafGroup::NodeList &nl = pRoot->getChildren(); + for( Bu::TafGroup::NodeList::const_iterator i = nl.begin(); i != nl.end(); i++ ) + { + switch( (*i)->getType() ) + { + case Bu::TafNode::typeGroup: + writeGroup( (Bu::TafGroup *)(*i) ); + break; + + case Bu::TafNode::typeProperty: + writeProperty( (Bu::TafProperty *)(*i) ); + break; + + case Bu::TafNode::typeComment: + writeComment( (Bu::TafComment *)(*i) ); + break; + } + } + iDepth--; + ident(); + sOut.write("}\n", 2 ); +} + +void Bu::TafWriter::writeProperty( const Bu::TafProperty *pProp ) +{ + ident(); + if( !pProp->getName().isEmpty() ) + { + writeString( pProp->getName() ); + sOut.write("=", 1 ); + writeString( pProp->getValue() ); + } + else + { + writeString( pProp->getValue() ); + } + sOut.write("\n", 1 ); +} + +void Bu::TafWriter::writeComment( const Bu::TafComment *pComment ) +{ + ident(); + if( pComment->isEOLStyle() ) + { + sOut.write("//", 2 ); + sOut.write( pComment->getText().getStr(), pComment->getText().getSize() ); + sOut.write("\n", 1 ); + } + else + { + sOut.write("/*", 2 ); + sOut.write( pComment->getText().getStr(), pComment->getText().getSize() ); + sOut.write("*/ ", 3 ); + } +} + +void Bu::TafWriter::writeString( const Bu::String &str ) +{ + sOut.write("\"", 1 ); + for( Bu::String::const_iterator s = str.begin(); s != str.end(); s++ ) + { + if( *s == '\"' ) + sOut.write("\\\"", 2 ); + else if( *s == '\\' ) + sOut.write("\\\\", 2 ); + else if( *s < 32 || *s > 126 ) + { + char buf[5]; + sprintf( buf, "\\x%02X", (unsigned char)*s ); + sOut.write(buf, 4 ); + } + else + { + const char buf = *s; + sOut.write( &buf, 1 ); + } + } + sOut.write("\"", 1 ); +} + -- cgit v1.2.3