Use PrinterPlain in Convert

This commit is contained in:
Michael Davidsaver
2013-04-26 15:55:04 -04:00
parent e6e1434fc1
commit 4d92bbe541
2 changed files with 13 additions and 428 deletions

View File

@@ -16,6 +16,7 @@
#include <pv/pvIntrospect.h>
#include <pv/pvData.h>
#include <pv/convert.h>
#include <pv/printer.h>
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<PVScalarArray const *>(pv),indentLevel);
return;
}
if(type==structure) {
convertStructure(buffer,static_cast<PVStructure const *>(pv),indentLevel);
return;
}
if(type==structureArray) {
convertStructureArray(
buffer,static_cast<PVStructureArray const *>(pv),indentLevel);
return;
}
PVScalar const *pvScalar = static_cast<PVScalar const *>(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<PVBoolean const *>(pv);
bool value = data->get();
if(value) {
*buffer += "true";
} else {
*buffer += "false";
}
}
return;
case pvByte: {
PVByte const *data = static_cast<PVByte const *>(pv);
char xxx[30];
sprintf(xxx,"%d",(int)data->get());
*buffer += xxx;
}
return;
case pvShort: {
PVShort const *data = static_cast<PVShort const *>(pv);
char xxx[30];
sprintf(xxx,"%d",(int)data->get());
*buffer += xxx;
}
return;
case pvInt: {
PVInt const *data = static_cast<PVInt const *>(pv);
char xxx[30];
sprintf(xxx,"%d",(int)data->get());
*buffer += xxx;
}
return;
case pvLong: {
PVLong const *data = static_cast<PVLong const *>(pv);
char xxx[30];
sprintf(xxx,"%lld",(long long)data->get());
*buffer += xxx;
}
return;
case pvUByte: {
PVUByte const *data = static_cast<PVUByte const *>(pv);
char xxx[30];
sprintf(xxx,"%u",(unsigned int)data->get());
*buffer += xxx;
}
return;
case pvUShort: {
PVUShort const *data = static_cast<PVUShort const *>(pv);
char xxx[30];
sprintf(xxx,"%u",(unsigned int)data->get());
*buffer += xxx;
}
return;
case pvUInt: {
PVUInt const *data = static_cast<PVUInt const *>(pv);
char xxx[30];
sprintf(xxx,"%u",(unsigned int)data->get());
*buffer += xxx;
}
return;
case pvULong: {
PVULong const *data = static_cast<PVULong const *>(pv);
char xxx[30];
sprintf(xxx,"%llu",(unsigned long long)data->get());
*buffer += xxx;
}
return;
case pvFloat: {
PVFloat const *data = static_cast<PVFloat const *>(pv);
char xxx[30];
sprintf(xxx,"%g",data->get());
*buffer += xxx;
}
return;
case pvDouble: {
PVDouble const *data = static_cast<PVDouble const *>(pv);
char xxx[30];
sprintf(xxx,"%g",data->get());
*buffer += xxx;
}
return;
case pvString: {
PVString const *data = static_cast<PVString const *>(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; i<length; i++) {
newLineImpl(buffer, indentLevel+1);
PVFieldPtr fieldField = fieldsData[i];
fieldField->toString(buffer,indentLevel + 1);
}
}
}
void convertArray(StringBuilder buffer,PVScalarArray const * xxx,int /*indentLevel*/)
{
PVScalarArray *pv = const_cast<PVScalarArray *>(xxx);
ScalarArrayConstPtr array = pv->getScalarArray();
ScalarType type = array->getElementType();
*buffer += array->getID() + " " + pv->getFieldName() + " ";
switch(type) {
case pvBoolean: {
PVBooleanArray *pvdata = static_cast<PVBooleanArray *>(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<PVByteArray*>(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<PVShortArray*>(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<PVIntArray*>(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<PVLongArray*>(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<PVUByteArray*>(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<PVUShortArray*>(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<PVUIntArray*>(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<PVULongArray*>(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<PVFloatArray*>(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<PVDoubleArray*>(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<PVStringArray*>(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<PVStructureArray *>(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();

View File

@@ -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.