split CsValue implementation into a separate unit

master
Daniel Kolesa 2016-09-06 19:27:54 +02:00
parent fb8a793d66
commit 7aebfe1b2e
3 changed files with 307 additions and 299 deletions

View File

@ -10,6 +10,7 @@ LIBCS_OBJ = \
cubescript.o \
cs_gen.o \
cs_vm.o \
cs_val.o \
cs_util.o \
lib_str.o \
lib_math.o \
@ -35,9 +36,10 @@ repl: $(LIBCS_LIB) tools/repl.cc tools/linenoise.cc tools/linenoise.hh
clean:
rm -f $(LIBCS_LIB) $(LIBCS_OBJ)
cubescript.o: cubescript.hh cubescript_conf.hh cs_vm.hh cs_util.hh
cubescript.o: cubescript.hh cubescript_conf.hh cs_vm.hh
cs_gen.o: cubescript.hh cubescript_conf.hh cs_vm.hh cs_util.hh
cs_vm.o: cubescript.hh cubescript_conf.hh cs_vm.hh cs_util.hh
cs_val.o: cubescript.hh cubescript_conf.hh cs_vm.hh cs_util.hh
lib_str.o: cubescript.hh cubescript_conf.hh
lib_math.o: cubescript.hh cubescript_conf.hh
lib_list.o: cubescript.hh cubescript_conf.hh cs_util.hh

304
cs_val.cc 100644
View File

@ -0,0 +1,304 @@
#include "cubescript.hh"
#include "cs_vm.hh"
#include "cs_util.hh"
namespace cscript {
void CsValue::cleanup() {
switch (get_type()) {
case CsValueType::string:
delete[] p_s;
break;
case CsValueType::code: {
ostd::Uint32 *bcode = reinterpret_cast<ostd::Uint32 *>(p_code);
if (bcode[-1] == CODE_START) {
delete[] bcode;
}
break;
}
default:
break;
}
}
CsValueType CsValue::get_type() const {
return p_type;
}
void CsValue::set_int(CsInt val) {
p_type = CsValueType::integer;
p_i = val;
}
void CsValue::set_float(CsFloat val) {
p_type = CsValueType::number;
p_f = val;
}
void CsValue::set_str(CsString val) {
if (val.size() == 0) {
/* ostd zero length strings cannot be disowned */
char *buf = new char[1];
buf[0] = '\0';
set_mstr(buf);
return;
}
ostd::CharRange cr = val.iter();
val.disown();
set_mstr(cr);
}
void CsValue::set_null() {
p_type = CsValueType::null;
p_code = nullptr;
}
void CsValue::set_code(CsBytecode *val) {
p_type = CsValueType::code;
p_code = val;
}
void CsValue::set_cstr(ostd::ConstCharRange val) {
p_type = CsValueType::cstring;
p_len = val.size();
p_cstr = val.data();
}
void CsValue::set_mstr(ostd::CharRange val) {
p_type = CsValueType::string;
p_len = val.size();
p_s = val.data();
}
void CsValue::set_ident(CsIdent *val) {
p_type = CsValueType::ident;
p_id = val;
}
void CsValue::set_macro(ostd::ConstCharRange val) {
p_type = CsValueType::macro;
p_len = val.size();
p_cstr = val.data();
}
void CsValue::set(CsValue &tv) {
*this = tv;
tv.set_null();
}
void CsValue::force_null() {
if (get_type() == CsValueType::null) {
return;
}
cleanup();
set_null();
}
CsFloat CsValue::force_float() {
CsFloat rf = 0.0f;
switch (get_type()) {
case CsValueType::integer:
rf = p_i;
break;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
rf = cs_parse_float(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::number:
return p_f;
default:
break;
}
cleanup();
set_float(rf);
return rf;
}
CsInt CsValue::force_int() {
CsInt ri = 0;
switch (get_type()) {
case CsValueType::number:
ri = p_f;
break;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
ri = cs_parse_int(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::integer:
return p_i;
default:
break;
}
cleanup();
set_int(ri);
return ri;
}
ostd::ConstCharRange CsValue::force_str() {
CsString rs;
switch (get_type()) {
case CsValueType::number:
rs = ostd::move(floatstr(p_f));
break;
case CsValueType::integer:
rs = ostd::move(intstr(p_i));
break;
case CsValueType::macro:
case CsValueType::cstring:
rs = ostd::ConstCharRange(p_s, p_len);
break;
case CsValueType::string:
return ostd::ConstCharRange(p_s, p_len);
default:
break;
}
cleanup();
set_str(ostd::move(rs));
return ostd::ConstCharRange(p_s, p_len);
}
CsInt CsValue::get_int() const {
switch (get_type()) {
case CsValueType::number:
return CsInt(p_f);
case CsValueType::integer:
return p_i;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_parse_int(ostd::ConstCharRange(p_s, p_len));
default:
break;
}
return 0;
}
CsFloat CsValue::get_float() const {
switch (get_type()) {
case CsValueType::number:
return p_f;
case CsValueType::integer:
return CsFloat(p_i);
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_parse_float(ostd::ConstCharRange(p_s, p_len));
default:
break;
}
return 0.0f;
}
CsBytecode *CsValue::get_code() const {
if (get_type() != CsValueType::code) {
return nullptr;
}
return p_code;
}
CsIdent *CsValue::get_ident() const {
if (get_type() != CsValueType::ident) {
return nullptr;
}
return p_id;
}
CsString CsValue::get_str() const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return ostd::ConstCharRange(p_s, p_len);
case CsValueType::integer:
return intstr(p_i);
case CsValueType::number:
return floatstr(p_f);
default:
break;
}
return CsString("");
}
ostd::ConstCharRange CsValue::get_strr() const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return ostd::ConstCharRange(p_s, p_len);
default:
break;
}
return ostd::ConstCharRange();
}
void CsValue::get_val(CsValue &r) const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
r.set_str(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::integer:
r.set_int(p_i);
break;
case CsValueType::number:
r.set_float(p_f);
break;
default:
r.set_null();
break;
}
}
OSTD_EXPORT bool cs_code_is_empty(CsBytecode *code) {
if (!code) {
return true;
}
return (
*reinterpret_cast<ostd::Uint32 *>(code) & CODE_OP_MASK
) == CODE_EXIT;
}
bool CsValue::code_is_empty() const {
if (get_type() != CsValueType::code) {
return true;
}
return cscript::cs_code_is_empty(p_code);
}
static inline bool cs_get_bool(ostd::ConstCharRange s) {
if (s.empty()) {
return false;
}
ostd::ConstCharRange end = s;
CsInt ival = cs_parse_int(end, &end);
if (end.empty()) {
return !!ival;
}
end = s;
CsFloat fval = cs_parse_float(end, &end);
if (end.empty()) {
return !!fval;
}
return true;
}
bool CsValue::get_bool() const {
switch (get_type()) {
case CsValueType::number:
return p_f != 0;
case CsValueType::integer:
return p_i != 0;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_get_bool(ostd::ConstCharRange(p_s, p_len));
default:
return false;
}
}
} /* namespace cscript */

View File

@ -1,6 +1,5 @@
#include "cubescript.hh"
#include "cs_vm.hh"
#include "cs_util.hh"
namespace cscript {
@ -613,303 +612,6 @@ void CsState::print_var(CsVar *v) {
}
}
void CsValue::cleanup() {
switch (get_type()) {
case CsValueType::string:
delete[] p_s;
break;
case CsValueType::code: {
ostd::Uint32 *bcode = reinterpret_cast<ostd::Uint32 *>(p_code);
if (bcode[-1] == CODE_START) {
delete[] bcode;
}
break;
}
default:
break;
}
}
CsValueType CsValue::get_type() const {
return p_type;
}
void CsValue::set_int(CsInt val) {
p_type = CsValueType::integer;
p_i = val;
}
void CsValue::set_float(CsFloat val) {
p_type = CsValueType::number;
p_f = val;
}
void CsValue::set_str(CsString val) {
if (val.size() == 0) {
/* ostd zero length strings cannot be disowned */
char *buf = new char[1];
buf[0] = '\0';
set_mstr(buf);
return;
}
ostd::CharRange cr = val.iter();
val.disown();
set_mstr(cr);
}
void CsValue::set_null() {
p_type = CsValueType::null;
p_code = nullptr;
}
void CsValue::set_code(CsBytecode *val) {
p_type = CsValueType::code;
p_code = val;
}
void CsValue::set_cstr(ostd::ConstCharRange val) {
p_type = CsValueType::cstring;
p_len = val.size();
p_cstr = val.data();
}
void CsValue::set_mstr(ostd::CharRange val) {
p_type = CsValueType::string;
p_len = val.size();
p_s = val.data();
}
void CsValue::set_ident(CsIdent *val) {
p_type = CsValueType::ident;
p_id = val;
}
void CsValue::set_macro(ostd::ConstCharRange val) {
p_type = CsValueType::macro;
p_len = val.size();
p_cstr = val.data();
}
void CsValue::set(CsValue &tv) {
*this = tv;
tv.set_null();
}
void CsValue::force_null() {
if (get_type() == CsValueType::null) {
return;
}
cleanup();
set_null();
}
CsFloat CsValue::force_float() {
CsFloat rf = 0.0f;
switch (get_type()) {
case CsValueType::integer:
rf = p_i;
break;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
rf = cs_parse_float(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::number:
return p_f;
default:
break;
}
cleanup();
set_float(rf);
return rf;
}
CsInt CsValue::force_int() {
CsInt ri = 0;
switch (get_type()) {
case CsValueType::number:
ri = p_f;
break;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
ri = cs_parse_int(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::integer:
return p_i;
default:
break;
}
cleanup();
set_int(ri);
return ri;
}
ostd::ConstCharRange CsValue::force_str() {
CsString rs;
switch (get_type()) {
case CsValueType::number:
rs = ostd::move(floatstr(p_f));
break;
case CsValueType::integer:
rs = ostd::move(intstr(p_i));
break;
case CsValueType::macro:
case CsValueType::cstring:
rs = ostd::ConstCharRange(p_s, p_len);
break;
case CsValueType::string:
return ostd::ConstCharRange(p_s, p_len);
default:
break;
}
cleanup();
set_str(ostd::move(rs));
return ostd::ConstCharRange(p_s, p_len);
}
CsInt CsValue::get_int() const {
switch (get_type()) {
case CsValueType::number:
return CsInt(p_f);
case CsValueType::integer:
return p_i;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_parse_int(ostd::ConstCharRange(p_s, p_len));
default:
break;
}
return 0;
}
CsFloat CsValue::get_float() const {
switch (get_type()) {
case CsValueType::number:
return p_f;
case CsValueType::integer:
return CsFloat(p_i);
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_parse_float(ostd::ConstCharRange(p_s, p_len));
default:
break;
}
return 0.0f;
}
CsBytecode *CsValue::get_code() const {
if (get_type() != CsValueType::code) {
return nullptr;
}
return p_code;
}
CsIdent *CsValue::get_ident() const {
if (get_type() != CsValueType::ident) {
return nullptr;
}
return p_id;
}
CsString CsValue::get_str() const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return ostd::ConstCharRange(p_s, p_len);
case CsValueType::integer:
return intstr(p_i);
case CsValueType::number:
return floatstr(p_f);
default:
break;
}
return CsString("");
}
ostd::ConstCharRange CsValue::get_strr() const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return ostd::ConstCharRange(p_s, p_len);
default:
break;
}
return ostd::ConstCharRange();
}
void CsValue::get_val(CsValue &r) const {
switch (get_type()) {
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
r.set_str(ostd::ConstCharRange(p_s, p_len));
break;
case CsValueType::integer:
r.set_int(p_i);
break;
case CsValueType::number:
r.set_float(p_f);
break;
default:
r.set_null();
break;
}
}
OSTD_EXPORT bool cs_code_is_empty(CsBytecode *code) {
if (!code) {
return true;
}
return (
*reinterpret_cast<ostd::Uint32 *>(code) & CODE_OP_MASK
) == CODE_EXIT;
}
bool CsValue::code_is_empty() const {
if (get_type() != CsValueType::code) {
return true;
}
return cscript::cs_code_is_empty(p_code);
}
static inline bool cs_get_bool(ostd::ConstCharRange s) {
if (s.empty()) {
return false;
}
ostd::ConstCharRange end = s;
CsInt ival = cs_parse_int(end, &end);
if (end.empty()) {
return !!ival;
}
end = s;
CsFloat fval = cs_parse_float(end, &end);
if (end.empty()) {
return !!fval;
}
return true;
}
bool CsValue::get_bool() const {
switch (get_type()) {
case CsValueType::number:
return p_f != 0;
case CsValueType::integer:
return p_i != 0;
case CsValueType::string:
case CsValueType::macro:
case CsValueType::cstring:
return cs_get_bool(ostd::ConstCharRange(p_s, p_len));
default:
return false;
}
}
void CsAlias::get_cstr(CsValue &v) const {
switch (p_val.get_type()) {
case CsValueType::macro: