#include "pv/printer.h" namespace { void indentN(std::ostream& strm, size_t N) { while(N--) strm.put(' '); } } namespace epics { namespace pvData { PrinterBase::PrinterBase() :strm(NULL) {} PrinterBase::~PrinterBase() {} void PrinterBase::setStream(std::ostream& s) { strm = &s; } void PrinterBase::clearStream() { strm = NULL; } void PrinterBase::print(const PVField& pv) { if(!strm) throw std::runtime_error("No stream set for PV Printer"); impl_print(pv); } void PrinterBase::beginStructure(const PVStructure&) {} void PrinterBase::endStructure(const PVStructure&) {} void PrinterBase::beginStructureArray(const PVStructureArray&) {} void PrinterBase::endStructureArray(const PVStructureArray&) {} void PrinterBase::encodeScalar(const PVScalar& pv) {} void PrinterBase::encodeArray(const PVScalarArray&) {} void PrinterBase::abortField(const PVField&) {} void PrinterBase::impl_print(const PVField& pv) { try { switch(pv.getField()->getType()) { case scalar: encodeScalar(static_cast(pv)); return; case scalarArray: encodeArray(static_cast(pv)); return; case structure: { const PVStructure &fld = static_cast(pv); const PVFieldPtrArray& vals = fld.getPVFields(); beginStructure(fld); for(size_t i=0, nfld=fld.getNumberFields(); iprint(*vals[i]); endStructure(fld); } case structureArray: { const PVStructureArray &fld = static_cast(pv); const PVStructureArray::pointer vals = fld.get(); beginStructureArray(fld); for(size_t i=0, nfld=fld.getLength(); iprint(*vals[i]); endStructureArray(fld); } } } catch(...) { abortField(pv); throw; } } PrinterPlain::PrinterPlain() :PrinterBase() ,ilvl(0) {} PrinterPlain::~PrinterPlain() {} void PrinterPlain::beginStructure(const PVStructure& pv) { indentN(S(), ilvl); S() << pv.getStructure()->getID() << " " << pv.getFieldName(); String ename(pv.getExtendsStructureName()); if(!ename.empty()) S() << " extends " << ename; S() << std::endl; ilvl++; } void PrinterPlain::endStructure(const PVStructure&) {ilvl--;} void PrinterPlain::beginStructureArray(const PVStructureArray& pv) { indentN(S(), ilvl); S() << pv.getStructureArray()->getID() << " " << pv.getFieldName() << " "; ilvl++; } void PrinterPlain::endStructureArray(const PVStructureArray&) {ilvl--;} void PrinterPlain::encodeScalar(const PVScalar& pv) { indentN(S(), ilvl); S() << pv.getScalar()->getID() << " " << pv.getFieldName() << " " << pv.getAs() << std::endl; } void PrinterPlain::encodeArray(const PVScalarArray& pv) { indentN(S(), ilvl); StringArray temp(pv.getLength()); // TODO: no copy pv.getAs(&temp[0], temp.size()); S() << pv.getScalarArray()->getID() << " " << pv.getFieldName() << " ["; for(size_t i=0, len=pv.getLength(); i