diff --git a/pvDataApp/factory/Convert.cpp b/pvDataApp/factory/Convert.cpp index 420bd48..16f8828 100644 --- a/pvDataApp/factory/Convert.cpp +++ b/pvDataApp/factory/Convert.cpp @@ -16,6 +16,7 @@ #include #include #include +#include using std::tr1::static_pointer_cast; using std::size_t; @@ -375,14 +376,6 @@ static size_t convertFromStringArray(PVScalarArray *pv, size_t offset, static size_t convertToStringArray(PVScalarArray *pv, size_t offset, size_t len,StringArray & to, size_t toOffset); -static void convertToString(StringBuilder buffer, - PVField const *pv,int indentLevel); -static void convertStructure(StringBuilder buffer, - PVStructure const *data,int indentLevel); -static void convertArray(StringBuilder buffer, - PVScalarArray const* pv,int indentLevel); -static void convertStructureArray(StringBuilder buffer, - PVStructureArray const * pvdata,int indentLevel); static size_t copyArrayDataReference(PVScalarArray *from,PVArray *to); static size_t copyNumericArray(PVScalarArray *from, size_t offset, PVScalarArray *to, size_t toOffset, size_t len); @@ -420,25 +413,16 @@ Convert::Convert() Convert::~Convert(){} -void Convert::getString(StringBuilder buf,PVFieldPtr const & pvField,int indentLevel) -{ - convertToString(buf,pvField.get(),indentLevel); -} - -void Convert::getString(StringBuilder buf,PVFieldPtr const & pvField) -{ - convertToString(buf,pvField.get(),0); -} - void Convert::getString(StringBuilder buf,PVField const *pvField,int indentLevel) { - convertToString(buf,pvField,indentLevel); + // TODO indextLevel ignored + std::ostringstream strm; + PrinterPlain p; + p.setStream(strm); + p.print(*pvField); + strm.str().swap(*buf); } -void Convert::getString(StringBuilder buf,PVField const *pvField) -{ - convertToString(buf,pvField,0); -} size_t Convert::fromString(PVStructurePtr const &pvStructure, StringArray const & from, size_t fromStartIndex) { @@ -2227,408 +2211,6 @@ size_t convertToStringArray(PVScalarArray *pv, return ncopy; } - -void convertToString(StringBuilder buffer,PVField const * pv,int indentLevel) -{ - Type type = pv->getField()->getType(); - if(type==scalarArray) { - convertArray(buffer,static_cast(pv),indentLevel); - return; - } - if(type==structure) { - convertStructure(buffer,static_cast(pv),indentLevel); - return; - } - if(type==structureArray) { - convertStructureArray( - buffer,static_cast(pv),indentLevel); - return; - } - PVScalar const *pvScalar = static_cast(pv); - const ScalarConstPtr & pscalar = pvScalar->getScalar(); - ScalarType scalarType = pscalar->getScalarType(); - *buffer += pscalar->getID(); - *buffer += " "; - *buffer += pv->getFieldName(); - *buffer += " "; - switch(scalarType) { - case pvBoolean: { - PVBoolean const *data = static_cast(pv); - bool value = data->get(); - if(value) { - *buffer += "true"; - } else { - *buffer += "false"; - } - } - return; - case pvByte: { - PVByte const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%d",(int)data->get()); - *buffer += xxx; - } - return; - case pvShort: { - PVShort const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%d",(int)data->get()); - *buffer += xxx; - } - return; - case pvInt: { - PVInt const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%d",(int)data->get()); - *buffer += xxx; - } - return; - case pvLong: { - PVLong const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%lld",(long long)data->get()); - *buffer += xxx; - } - return; - case pvUByte: { - PVUByte const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%u",(unsigned int)data->get()); - *buffer += xxx; - } - return; - case pvUShort: { - PVUShort const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%u",(unsigned int)data->get()); - *buffer += xxx; - } - return; - case pvUInt: { - PVUInt const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%u",(unsigned int)data->get()); - *buffer += xxx; - } - return; - case pvULong: { - PVULong const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%llu",(unsigned long long)data->get()); - *buffer += xxx; - } - return; - case pvFloat: { - PVFloat const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%g",data->get()); - *buffer += xxx; - } - return; - case pvDouble: { - PVDouble const *data = static_cast(pv); - char xxx[30]; - sprintf(xxx,"%g",data->get()); - *buffer += xxx; - } - return; - case pvString: { - PVString const *data = static_cast(pv); - *buffer += data->get(); - } - return; - default: - *buffer += "unknown ScalarType"; - } -} - -void convertStructure(StringBuilder buffer,PVStructure const *data,int indentLevel) -{ - *buffer += data->getStructure()->getID() + " " + data->getFieldName(); - String extendsName = data->getExtendsStructureName(); - if(extendsName.length()>0) { - *buffer += " extends " + extendsName; - } - PVFieldPtrArray const & fieldsData = data->getPVFields(); - if (fieldsData.size() != 0) { - int length = data->getStructure()->getNumberFields(); - for(int i=0; itoString(buffer,indentLevel + 1); - } - } -} - -void convertArray(StringBuilder buffer,PVScalarArray const * xxx,int /*indentLevel*/) -{ - PVScalarArray *pv = const_cast(xxx); - ScalarArrayConstPtr array = pv->getScalarArray(); - ScalarType type = array->getElementType(); - *buffer += array->getID() + " " + pv->getFieldName() + " "; - switch(type) { - case pvBoolean: { - PVBooleanArray *pvdata = static_cast(pv); - BooleanArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ","; - size_t num = pvdata->get(i,1,data); - if(num==1) { - BooleanArray & value = data.data; - if(value[data.offset]) { - *buffer += "true"; - } else { - *buffer += "false"; - } - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvByte: { - PVByteArray *pvdata = static_cast(pv); - ByteArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ","; - size_t num = pvdata->get(i,1,data); - if(num==1) { - int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%d",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvShort: { - PVShortArray *pvdata = static_cast(pv); - ShortArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%d",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvInt: { - PVIntArray *pvdata = static_cast(pv); - IntArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%d",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvLong: { - PVLongArray *pvdata = static_cast(pv); - LongArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - int64 val = data.data[data.offset]; - char buf[32]; - sprintf(buf,"%lld",(long long)val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvUByte: { - PVUByteArray *pvdata = static_cast(pv); - UByteArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ","; - size_t num = pvdata->get(i,1,data); - if(num==1) { - unsigned int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%u",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvUShort: { - PVUShortArray *pvdata = static_cast(pv); - UShortArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - unsigned int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%u",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvUInt: { - PVUIntArray *pvdata = static_cast(pv); - UIntArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - unsigned int val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%u",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvULong: { - PVULongArray *pvdata = static_cast(pv); - ULongArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - uint64 val = data.data[data.offset]; - char buf[32]; - sprintf(buf,"%llu",(unsigned long long)val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvFloat: { - PVFloatArray *pvdata = static_cast(pv); - FloatArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - float val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%g",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += "]"; - break; - } - case pvDouble: { - PVDoubleArray *pvdata = static_cast(pv); - DoubleArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ','; - size_t num = pvdata->get(i,1,data); - if(num==1) { - double val = data.data[data.offset]; - char buf[16]; - sprintf(buf,"%g",val); - *buffer += buf; - } else { - *buffer += "???? "; - } - } - *buffer += ("]"); - break; - } - case pvString: { - PVStringArray *pvdata = static_cast(pv); - StringArrayData data; - *buffer += "["; - for(size_t i=0; i < pvdata->getLength(); i++) { - if(i!=0) *buffer += ","; - size_t num = pvdata->get(i,1,data); - StringArray & value = data.data; - if(num==1) { - if(value[data.offset].length()>0) { - *buffer += value[data.offset].c_str(); - } else { - *buffer += "null"; - } - } else { - *buffer += "null"; - } - } - *buffer += "]"; - break; - } - default: - *buffer += " array element is unknown ScalarType"; - } - if(pv->isImmutable()) { - *buffer += " immutable "; - } -} - -void convertStructureArray(StringBuilder buffer, - PVStructureArray const * xxx,int indentLevel) -{ - PVStructureArray *pvdata = const_cast(xxx); - *buffer += pvdata->getStructureArray()->getID() + " " + pvdata->getFieldName() + " "; - size_t length = pvdata->getLength(); - if(length<=0) { - return; - } - StructureArrayData data = StructureArrayData(); - pvdata->get(0, length, data); - for (size_t i = 0; i < length; i++) { - newLineImpl(buffer, indentLevel + 1); - PVStructurePtr & pvStructure = data.data[i]; - if (pvStructure.get() == 0) { - *buffer += "null"; - } else { - pvStructure->toString(buffer,indentLevel+1); - } - } -} - size_t copyArrayDataReference(PVScalarArray *from,PVArray *to) { ScalarType scalarType = from->getScalarArray()->getElementType(); diff --git a/pvDataApp/pv/convert.h b/pvDataApp/pv/convert.h index 3df3325..b66c073 100644 --- a/pvDataApp/pv/convert.h +++ b/pvDataApp/pv/convert.h @@ -113,14 +113,16 @@ public: * If a PVField is a structure or array be prepared for a very long string. * @param indentLevel indentation level */ - void getString(StringBuilder buf,PVFieldPtr const & pvField,int indentLevel); + void getString(StringBuilder buf,PVFieldPtr const & pvField,int indentLevel) + {getString(buf, pvField.get(), indentLevel);} /** * Convert a PVField to a string. * param buf buffer for the result * @param pv The PVField to convert to a string. * If the PVField is a structure or array be prepared for a very long string. */ - void getString(StringBuilder buf,PVFieldPtr const & pvField); + inline void getString(StringBuilder buf,PVFieldPtr const & pvField) + {getString(buf, pvField.get(), 0);} /** * Convert a PVField to a string. * @param buf buffer for the result @@ -135,7 +137,8 @@ public: * @param pv The PVField to convert to a string. * If the PVField is a structure or array be prepared for a very long string. */ - void getString(StringBuilder buf,PVField const * pvField); + void getString(StringBuilder buf,PVField const * pvField) + {getString(buf, pvField, 0);} /** * Convert from an array of String to a PVScalar * @param pv The PV.