#include "pivariable.h" void PIVariable::setVariable(const PIString & str) { type_ = PIVariable::fromString(str); size_ = PIVariable::variableSize(type_); } PIVariable::Type PIVariable::fromString(const PIString & str) { PIString s = str.trimmed().toLowerCase(); if (s == "char" || s == "sbyte") return PIVariable::Char; if (s == "short" || s == "short int" || s == "signed short" || s == "signed short int" || s == "sword") return PIVariable::Short; if (s == "int" || s == "signed" || s == "signed int") return PIVariable::Int; if (s == "long" || s == "long int" || s == "signed long" || s == "signed long int" || s == "sdword") return PIVariable::Long; if (s == "llong" || s == "long long" || s == "long long int" || s == "signed long long" || s == "signed long long int" || s == "sqword") return PIVariable::LLong; if (s == "uchar" || s == "byte") return PIVariable::UChar; if (s == "ushort" || s == "unsigned short" || s == "unsigned short int" || s == "word") return PIVariable::UShort; if (s == "uint" || s == "unsigned" || s == "unsigned int") return PIVariable::UInt; if (s == "ulong" || s == "unsigned long" || s == "unsigned long int" || s == "dword") return PIVariable::ULong; if (s == "ullong" || s == "unsigned long long" || s == "unsigned long long int" || s == "qword") return PIVariable::ULLong; if (s == "float") return PIVariable::Float; if (s == "double" || s == "real") return PIVariable::Double; if (s == "ldouble" || s == "long double") return PIVariable::LDouble; if (s == "bool") return PIVariable::Bool; return PIVariable::Double; } PIString PIVariable::toString(const PIVariable::Type & var) { switch (var) { case PIVariable::Char: return "char"; case PIVariable::Short: return "short"; case PIVariable::Int: return "int"; case PIVariable::Long: return "long"; case PIVariable::LLong: return "llong"; case PIVariable::UChar: return "uchar"; case PIVariable::UShort: return "ushort"; case PIVariable::UInt: return "uint"; case PIVariable::ULong: return "ulong"; case PIVariable::ULLong: return "ullong"; case PIVariable::Float: return "float"; case PIVariable::Double: return "double"; case PIVariable::LDouble: return "ldouble"; case PIVariable::Bool: return "bool"; } return "double"; } uint PIVariable::variableSize(const PIVariable::Type & var) { switch (var) { case PIVariable::Char: return sizeof(char); case PIVariable::Short: return sizeof(short); case PIVariable::Int: return sizeof(int); case PIVariable::Long: return sizeof(long); case PIVariable::LLong: return sizeof(llong); case PIVariable::UChar: return sizeof(uchar); case PIVariable::UShort: return sizeof(ushort); case PIVariable::UInt: return sizeof(uint); case PIVariable::ULong: return sizeof(ulong); case PIVariable::ULLong: return sizeof(ullong); case PIVariable::Float: return sizeof(float); case PIVariable::Double: return sizeof(double); case PIVariable::LDouble: return sizeof(ldouble); case PIVariable::Bool: return sizeof(bool); } return sizeof(double); } double PIVariable::variableValue(const char * var_ptr, const PIVariable::Type & var) { switch (var) { case PIVariable::Char: return (double)(*((char * )var_ptr)); case PIVariable::Short: return (double)(*((short * )var_ptr)); case PIVariable::Int: return (double)(*((int * )var_ptr)); case PIVariable::Long: return (double)(*((long * )var_ptr)); case PIVariable::LLong: return (double)(*((llong * )var_ptr)); case PIVariable::UChar: return (double)(*((uchar * )var_ptr)); case PIVariable::UShort: return (double)(*((ushort * )var_ptr)); case PIVariable::UInt: return (double)(*((uint * )var_ptr)); case PIVariable::ULong: return (double)(*((ulong * )var_ptr)); case PIVariable::ULLong: return (double)(*((ullong * )var_ptr)); case PIVariable::Float: return (double)(*((float * )var_ptr)); case PIVariable::Double: return (double)(*((double * )var_ptr)); case PIVariable::LDouble: return (ldouble)(*((ldouble * )var_ptr)); case PIVariable::Bool: return (double)(*((bool * )var_ptr)); } return 0.; } void PIVariable::writeVariable(char * dest) { switch (type_) { case PIVariable::Char: *((char * )((int)dest + offset)) = value_; return; case PIVariable::Short: *((short * )((int)dest + offset)) = value_; return; case PIVariable::Int: *((int * )((int)dest + offset)) = value_; return; case PIVariable::Long: *((long * )((int)dest + offset)) = value_; return; case PIVariable::LLong: *((llong * )((int)dest + offset)) = value_; return; case PIVariable::UChar: *((uchar * )((int)dest + offset)) = value_; return; case PIVariable::UShort: *((ushort * )((int)dest + offset)) = value_; return; case PIVariable::UInt: *((uint * )((int)dest + offset)) = value_; return; case PIVariable::ULong: *((ulong * )((int)dest + offset)) = value_; return; case PIVariable::ULLong: *((ullong * )((int)dest + offset)) = value_; return; case PIVariable::Float: *((float * )((int)dest + offset)) = value_; return; case PIVariable::Double: *((double * )((int)dest + offset)) = value_; return; case PIVariable::LDouble: *((ldouble * )((int)dest + offset)) = value_; return; case PIVariable::Bool: *((bool * )((int)dest + offset)) = value_; return; } } void PIStruct::parseFile(const PIString & file) { PIConfig conf(file); PIVariable var; PIString ts; uint sz = 0; vars.clear(); for (int i = 0; i < conf.numValues(); ++i) { var.setVariable(conf.getValue(i)); var.setName(conf.getName(i)); var.offset = sz; sz += var.size(); ts = conf.getComment(i); if (ts.length() > 0) var.setValue(ts.toDouble()); else var.setValue(0.); vars.push_back(var); } size_ = sz; } void PIStruct::readData(const char * data) { for (uint i = 0; i < vars.size(); ++i) vars[i].readVariable(data); } void PIStruct::writeData(char * data) { for (uint i = 0; i < vars.size(); ++i) vars[i].writeVariable(data); }