145 lines
5.7 KiB
C++
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, PIFile::Read);
|
|
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);
|
|
}
|
|
|