Files
pip/pivariable.cpp

145 lines
5.7 KiB
C++

#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);
}