|
Packit Service |
7770af |
#include "sass.hpp"
|
|
Packit Service |
7770af |
#include <cstdlib>
|
|
Packit Service |
7770af |
#include <cstring>
|
|
Packit Service |
7770af |
#include "util.hpp"
|
|
Packit Service |
7770af |
#include "eval.hpp"
|
|
Packit Service |
7770af |
#include "values.hpp"
|
|
Packit Service |
7770af |
#include "sass/values.h"
|
|
Packit Service |
7770af |
#include "sass_values.hpp"
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
extern "C" {
|
|
Packit Service |
7770af |
using namespace Sass;
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Return the sass tag for a generic sass value
|
|
Packit Service |
7770af |
enum Sass_Tag ADDCALL sass_value_get_tag(const union Sass_Value* v) { return v->unknown.tag; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Check value for specified type
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_null(const union Sass_Value* v) { return v->unknown.tag == SASS_NULL; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_number(const union Sass_Value* v) { return v->unknown.tag == SASS_NUMBER; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_string(const union Sass_Value* v) { return v->unknown.tag == SASS_STRING; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_boolean(const union Sass_Value* v) { return v->unknown.tag == SASS_BOOLEAN; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_color(const union Sass_Value* v) { return v->unknown.tag == SASS_COLOR; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_list(const union Sass_Value* v) { return v->unknown.tag == SASS_LIST; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_map(const union Sass_Value* v) { return v->unknown.tag == SASS_MAP; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_error(const union Sass_Value* v) { return v->unknown.tag == SASS_ERROR; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_value_is_warning(const union Sass_Value* v) { return v->unknown.tag == SASS_WARNING; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Number
|
|
Packit Service |
7770af |
double ADDCALL sass_number_get_value(const union Sass_Value* v) { return v->number.value; }
|
|
Packit Service |
7770af |
void ADDCALL sass_number_set_value(union Sass_Value* v, double value) { v->number.value = value; }
|
|
Packit Service |
7770af |
const char* ADDCALL sass_number_get_unit(const union Sass_Value* v) { return v->number.unit; }
|
|
Packit Service |
7770af |
void ADDCALL sass_number_set_unit(union Sass_Value* v, char* unit) { v->number.unit = unit; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_String
|
|
Packit Service |
7770af |
const char* ADDCALL sass_string_get_value(const union Sass_Value* v) { return v->string.value; }
|
|
Packit Service |
7770af |
void ADDCALL sass_string_set_value(union Sass_Value* v, char* value) { v->string.value = value; }
|
|
Packit Service |
7770af |
bool ADDCALL sass_string_is_quoted(const union Sass_Value* v) { return v->string.quoted; }
|
|
Packit Service |
7770af |
void ADDCALL sass_string_set_quoted(union Sass_Value* v, bool quoted) { v->string.quoted = quoted; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Boolean
|
|
Packit Service |
7770af |
bool ADDCALL sass_boolean_get_value(const union Sass_Value* v) { return v->boolean.value; }
|
|
Packit Service |
7770af |
void ADDCALL sass_boolean_set_value(union Sass_Value* v, bool value) { v->boolean.value = value; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Color
|
|
Packit Service |
7770af |
double ADDCALL sass_color_get_r(const union Sass_Value* v) { return v->color.r; }
|
|
Packit Service |
7770af |
void ADDCALL sass_color_set_r(union Sass_Value* v, double r) { v->color.r = r; }
|
|
Packit Service |
7770af |
double ADDCALL sass_color_get_g(const union Sass_Value* v) { return v->color.g; }
|
|
Packit Service |
7770af |
void ADDCALL sass_color_set_g(union Sass_Value* v, double g) { v->color.g = g; }
|
|
Packit Service |
7770af |
double ADDCALL sass_color_get_b(const union Sass_Value* v) { return v->color.b; }
|
|
Packit Service |
7770af |
void ADDCALL sass_color_set_b(union Sass_Value* v, double b) { v->color.b = b; }
|
|
Packit Service |
7770af |
double ADDCALL sass_color_get_a(const union Sass_Value* v) { return v->color.a; }
|
|
Packit Service |
7770af |
void ADDCALL sass_color_set_a(union Sass_Value* v, double a) { v->color.a = a; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_List
|
|
Packit Service |
7770af |
size_t ADDCALL sass_list_get_length(const union Sass_Value* v) { return v->list.length; }
|
|
Packit Service |
7770af |
enum Sass_Separator ADDCALL sass_list_get_separator(const union Sass_Value* v) { return v->list.separator; }
|
|
Packit Service |
7770af |
void ADDCALL sass_list_set_separator(union Sass_Value* v, enum Sass_Separator separator) { v->list.separator = separator; }
|
|
Packit Service |
7770af |
// Getters and setters for Sass_List values
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_list_get_value(const union Sass_Value* v, size_t i) { return v->list.values[i]; }
|
|
Packit Service |
7770af |
void ADDCALL sass_list_set_value(union Sass_Value* v, size_t i, union Sass_Value* value) { v->list.values[i] = value; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Map
|
|
Packit Service |
7770af |
size_t ADDCALL sass_map_get_length(const union Sass_Value* v) { return v->map.length; }
|
|
Packit Service |
7770af |
// Getters and setters for Sass_List keys and values
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_map_get_key(const union Sass_Value* v, size_t i) { return v->map.pairs[i].key; }
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_map_get_value(const union Sass_Value* v, size_t i) { return v->map.pairs[i].value; }
|
|
Packit Service |
7770af |
void ADDCALL sass_map_set_key(union Sass_Value* v, size_t i, union Sass_Value* key) { v->map.pairs[i].key = key; }
|
|
Packit Service |
7770af |
void ADDCALL sass_map_set_value(union Sass_Value* v, size_t i, union Sass_Value* val) { v->map.pairs[i].value = val; }
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Error
|
|
Packit Service |
7770af |
char* ADDCALL sass_error_get_message(const union Sass_Value* v) { return v->error.message; };
|
|
Packit Service |
7770af |
void ADDCALL sass_error_set_message(union Sass_Value* v, char* msg) { v->error.message = msg; };
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Getters and setters for Sass_Warning
|
|
Packit Service |
7770af |
char* ADDCALL sass_warning_get_message(const union Sass_Value* v) { return v->warning.message; };
|
|
Packit Service |
7770af |
void ADDCALL sass_warning_set_message(union Sass_Value* v, char* msg) { v->warning.message = msg; };
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Creator functions for all value types
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_boolean(bool val)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->boolean.tag = SASS_BOOLEAN;
|
|
Packit Service |
7770af |
v->boolean.value = val;
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_number(double val, const char* unit)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->number.tag = SASS_NUMBER;
|
|
Packit Service |
7770af |
v->number.value = val;
|
|
Packit Service |
7770af |
v->number.unit = unit ? sass_copy_c_string(unit) : 0;
|
|
Packit Service |
7770af |
if (v->number.unit == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_color(double r, double g, double b, double a)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->color.tag = SASS_COLOR;
|
|
Packit Service |
7770af |
v->color.r = r;
|
|
Packit Service |
7770af |
v->color.g = g;
|
|
Packit Service |
7770af |
v->color.b = b;
|
|
Packit Service |
7770af |
v->color.a = a;
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_string(const char* val)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->string.quoted = false;
|
|
Packit Service |
7770af |
v->string.tag = SASS_STRING;
|
|
Packit Service |
7770af |
v->string.value = val ? sass_copy_c_string(val) : 0;
|
|
Packit Service |
7770af |
if (v->string.value == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_qstring(const char* val)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->string.quoted = true;
|
|
Packit Service |
7770af |
v->string.tag = SASS_STRING;
|
|
Packit Service |
7770af |
v->string.value = val ? sass_copy_c_string(val) : 0;
|
|
Packit Service |
7770af |
if (v->string.value == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_list(size_t len, enum Sass_Separator sep)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->list.tag = SASS_LIST;
|
|
Packit Service |
7770af |
v->list.length = len;
|
|
Packit Service |
7770af |
v->list.separator = sep;
|
|
Packit Service |
7770af |
v->list.values = (union Sass_Value**) calloc(len, sizeof(union Sass_Value*));
|
|
Packit Service |
7770af |
if (v->list.values == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_map(size_t len)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->map.tag = SASS_MAP;
|
|
Packit Service |
7770af |
v->map.length = len;
|
|
Packit Service |
7770af |
v->map.pairs = (struct Sass_MapPair*) calloc(len, sizeof(struct Sass_MapPair));
|
|
Packit Service |
7770af |
if (v->map.pairs == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_null(void)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->null.tag = SASS_NULL;
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_error(const char* msg)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->error.tag = SASS_ERROR;
|
|
Packit Service |
7770af |
v->error.message = msg ? sass_copy_c_string(msg) : 0;
|
|
Packit Service |
7770af |
if (v->error.message == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_make_warning(const char* msg)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
Packit Service |
7770af |
if (v == 0) return 0;
|
|
Packit Service |
7770af |
v->warning.tag = SASS_WARNING;
|
|
Packit Service |
7770af |
v->warning.message = msg ? sass_copy_c_string(msg) : 0;
|
|
Packit Service |
7770af |
if (v->warning.message == 0) { free(v); return 0; }
|
|
Packit Service |
7770af |
return v;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// will free all associated sass values
|
|
Packit Service |
7770af |
void ADDCALL sass_delete_value(union Sass_Value* val) {
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
size_t i;
|
|
Packit Service |
7770af |
if (val == 0) return;
|
|
Packit Service |
7770af |
switch(val->unknown.tag) {
|
|
Packit Service |
7770af |
case SASS_NULL: {
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_BOOLEAN: {
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_NUMBER: {
|
|
Packit Service |
7770af |
free(val->number.unit);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_COLOR: {
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_STRING: {
|
|
Packit Service |
7770af |
free(val->string.value);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_LIST: {
|
|
Packit Service |
7770af |
for (i=0; i<val->list.length; i++) {
|
|
Packit Service |
7770af |
sass_delete_value(val->list.values[i]);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
free(val->list.values);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_MAP: {
|
|
Packit Service |
7770af |
for (i=0; i<val->map.length; i++) {
|
|
Packit Service |
7770af |
sass_delete_value(val->map.pairs[i].key);
|
|
Packit Service |
7770af |
sass_delete_value(val->map.pairs[i].value);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
free(val->map.pairs);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_ERROR: {
|
|
Packit Service |
7770af |
free(val->error.message);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
case SASS_WARNING: {
|
|
Packit Service |
7770af |
free(val->error.message);
|
|
Packit Service |
7770af |
} break;
|
|
Packit Service |
7770af |
default: break;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
free(val);
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// Make a deep cloned copy of the given sass value
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_clone_value (const union Sass_Value* val)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
size_t i;
|
|
Packit Service |
7770af |
if (val == 0) return 0;
|
|
Packit Service |
7770af |
switch(val->unknown.tag) {
|
|
Packit Service |
7770af |
case SASS_NULL: {
|
|
Packit Service |
7770af |
return sass_make_null();
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_BOOLEAN: {
|
|
Packit Service |
7770af |
return sass_make_boolean(val->boolean.value);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_NUMBER: {
|
|
Packit Service |
7770af |
return sass_make_number(val->number.value, val->number.unit);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_COLOR: {
|
|
Packit Service |
7770af |
return sass_make_color(val->color.r, val->color.g, val->color.b, val->color.a);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_STRING: {
|
|
Packit Service |
7770af |
return sass_string_is_quoted(val) ? sass_make_qstring(val->string.value) : sass_make_string(val->string.value);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_LIST: {
|
|
Packit Service |
7770af |
union Sass_Value* list = sass_make_list(val->list.length, val->list.separator);
|
|
Packit Service |
7770af |
for (i = 0; i < list->list.length; i++) {
|
|
Packit Service |
7770af |
list->list.values[i] = sass_clone_value(val->list.values[i]);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
return list;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_MAP: {
|
|
Packit Service |
7770af |
union Sass_Value* map = sass_make_map(val->map.length);
|
|
Packit Service |
7770af |
for (i = 0; i < val->map.length; i++) {
|
|
Packit Service |
7770af |
map->map.pairs[i].key = sass_clone_value(val->map.pairs[i].key);
|
|
Packit Service |
7770af |
map->map.pairs[i].value = sass_clone_value(val->map.pairs[i].value);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
return map;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_ERROR: {
|
|
Packit Service |
7770af |
return sass_make_error(val->error.message);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
case SASS_WARNING: {
|
|
Packit Service |
7770af |
return sass_make_warning(val->warning.message);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
default: break;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
return 0;
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_value_stringify (const union Sass_Value* v, bool compressed, int precision)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
Value_Obj val = sass_value_to_ast_node(v);
|
|
Packit Service |
7770af |
Sass_Inspect_Options options(compressed ? COMPRESSED : NESTED, precision);
|
|
Packit Service |
7770af |
std::string str(val->to_string(options));
|
|
Packit Service |
7770af |
return sass_make_qstring(str.c_str());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
union Sass_Value* ADDCALL sass_value_op (enum Sass_OP op, const union Sass_Value* a, const union Sass_Value* b)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
Sass::Value_Ptr rv;
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
try {
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
Value_Obj lhs = sass_value_to_ast_node(a);
|
|
Packit Service |
7770af |
Value_Obj rhs = sass_value_to_ast_node(b);
|
|
Packit Service |
7770af |
struct Sass_Inspect_Options options(NESTED, 5);
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// see if it's a relational expression
|
|
Packit Service |
7770af |
switch(op) {
|
|
Packit Service |
7770af |
case Sass_OP::EQ: return sass_make_boolean(Eval::eq(lhs, rhs));
|
|
Packit Service |
7770af |
case Sass_OP::NEQ: return sass_make_boolean(!Eval::eq(lhs, rhs));
|
|
Packit Service |
7770af |
case Sass_OP::GT: return sass_make_boolean(!Eval::lt(lhs, rhs, "gt") && !Eval::eq(lhs, rhs));
|
|
Packit Service |
7770af |
case Sass_OP::GTE: return sass_make_boolean(!Eval::lt(lhs, rhs, "gte"));
|
|
Packit Service |
7770af |
case Sass_OP::LT: return sass_make_boolean(Eval::lt(lhs, rhs, "lt"));
|
|
Packit Service |
7770af |
case Sass_OP::LTE: return sass_make_boolean(Eval::lt(lhs, rhs, "lte") || Eval::eq(lhs, rhs));
|
|
Packit Service |
7770af |
case Sass_OP::AND: return ast_node_to_sass_value(lhs->is_false() ? lhs : rhs);
|
|
Packit Service |
7770af |
case Sass_OP::OR: return ast_node_to_sass_value(lhs->is_false() ? rhs : lhs);
|
|
Packit Service |
7770af |
default: break;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
if (sass_value_is_number(a) && sass_value_is_number(b)) {
|
|
Packit Service |
7770af |
Number_Ptr_Const l_n = Cast<Number>(lhs);
|
|
Packit Service |
7770af |
Number_Ptr_Const r_n = Cast<Number>(rhs);
|
|
Packit Service |
7770af |
rv = Eval::op_numbers(op, *l_n, *r_n, options, l_n->pstate());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
else if (sass_value_is_number(a) && sass_value_is_color(a)) {
|
|
Packit Service |
7770af |
Number_Ptr_Const l_n = Cast<Number>(lhs);
|
|
Packit Service |
7770af |
Color_Ptr_Const r_c = Cast<Color>(rhs);
|
|
Packit Service |
7770af |
rv = Eval::op_number_color(op, *l_n, *r_c, options, l_n->pstate());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
else if (sass_value_is_color(a) && sass_value_is_number(b)) {
|
|
Packit Service |
7770af |
Color_Ptr_Const l_c = Cast<Color>(lhs);
|
|
Packit Service |
7770af |
Number_Ptr_Const r_n = Cast<Number>(rhs);
|
|
Packit Service |
7770af |
rv = Eval::op_color_number(op, *l_c, *r_n, options, l_c->pstate());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
else if (sass_value_is_color(a) && sass_value_is_color(b)) {
|
|
Packit Service |
7770af |
Color_Ptr_Const l_c = Cast<Color>(lhs);
|
|
Packit Service |
7770af |
Color_Ptr_Const r_c = Cast<Color>(rhs);
|
|
Packit Service |
7770af |
rv = Eval::op_colors(op, *l_c, *r_c, options, l_c->pstate());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
else /* convert other stuff to string and apply operation */ {
|
|
Packit Service |
7770af |
Value_Ptr l_v = Cast<Value>(lhs);
|
|
Packit Service |
7770af |
Value_Ptr r_v = Cast<Value>(rhs);
|
|
Packit Service |
7770af |
rv = Eval::op_strings(op, *l_v, *r_v, options, l_v->pstate());
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// ToDo: maybe we should should return null value?
|
|
Packit Service |
7770af |
if (!rv) return sass_make_error("invalid return value");
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// convert result back to ast node
|
|
Packit Service |
7770af |
return ast_node_to_sass_value(rv);
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
// simply pass the error message back to the caller for now
|
|
Packit Service |
7770af |
catch (Exception::InvalidSass& e) { return sass_make_error(e.what()); }
|
|
Packit Service |
7770af |
catch (std::bad_alloc&) { return sass_make_error("memory exhausted"); }
|
|
Packit Service |
7770af |
catch (std::exception& e) { return sass_make_error(e.what()); }
|
|
Packit Service |
7770af |
catch (std::string& e) { return sass_make_error(e.c_str()); }
|
|
Packit Service |
7770af |
catch (const char* e) { return sass_make_error(e); }
|
|
Packit Service |
7770af |
catch (...) { return sass_make_error("unknown"); }
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
}
|