sassc4 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +97 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +51 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/contrib/plugin.cpp +60 -0
- data/ext/libsass/include/sass/base.h +97 -0
- data/ext/libsass/include/sass/context.h +174 -0
- data/ext/libsass/include/sass/functions.h +139 -0
- data/ext/libsass/include/sass/values.h +145 -0
- data/ext/libsass/include/sass/version.h +12 -0
- data/ext/libsass/include/sass.h +15 -0
- data/ext/libsass/include/sass2scss.h +120 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +953 -0
- data/ext/libsass/src/ast.hpp +1064 -0
- data/ext/libsass/src/ast2c.cpp +80 -0
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +140 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
- data/ext/libsass/src/ast_helpers.hpp +316 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1070 -0
- data/ext/libsass/src/ast_selectors.hpp +523 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/b64/cencode.h +32 -0
- data/ext/libsass/src/b64/encode.h +79 -0
- data/ext/libsass/src/backtrace.cpp +50 -0
- data/ext/libsass/src/backtrace.hpp +29 -0
- data/ext/libsass/src/base64vlq.cpp +47 -0
- data/ext/libsass/src/base64vlq.hpp +30 -0
- data/ext/libsass/src/bind.cpp +312 -0
- data/ext/libsass/src/bind.hpp +15 -0
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/c99func.c +54 -0
- data/ext/libsass/src/cencode.c +106 -0
- data/ext/libsass/src/check_nesting.cpp +393 -0
- data/ext/libsass/src/check_nesting.hpp +70 -0
- data/ext/libsass/src/color_maps.cpp +652 -0
- data/ext/libsass/src/color_maps.hpp +323 -0
- data/ext/libsass/src/color_spaces.cpp +241 -0
- data/ext/libsass/src/color_spaces.hpp +227 -0
- data/ext/libsass/src/constants.cpp +199 -0
- data/ext/libsass/src/constants.hpp +200 -0
- data/ext/libsass/src/context.cpp +870 -0
- data/ext/libsass/src/context.hpp +140 -0
- data/ext/libsass/src/cssize.cpp +521 -0
- data/ext/libsass/src/cssize.hpp +71 -0
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debug.hpp +43 -0
- data/ext/libsass/src/debugger.hpp +964 -0
- data/ext/libsass/src/emitter.cpp +297 -0
- data/ext/libsass/src/emitter.hpp +101 -0
- data/ext/libsass/src/environment.cpp +260 -0
- data/ext/libsass/src/environment.hpp +124 -0
- data/ext/libsass/src/error_handling.cpp +239 -0
- data/ext/libsass/src/error_handling.hpp +248 -0
- data/ext/libsass/src/eval.cpp +1543 -0
- data/ext/libsass/src/eval.hpp +110 -0
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +875 -0
- data/ext/libsass/src/expand.hpp +98 -0
- data/ext/libsass/src/extender.cpp +1226 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +531 -0
- data/ext/libsass/src/file.hpp +124 -0
- data/ext/libsass/src/fn_colors.cpp +836 -0
- data/ext/libsass/src/fn_colors.hpp +99 -0
- data/ext/libsass/src/fn_lists.cpp +285 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +248 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +246 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +159 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +1126 -0
- data/ext/libsass/src/inspect.hpp +101 -0
- data/ext/libsass/src/json.cpp +1436 -0
- data/ext/libsass/src/json.hpp +117 -0
- data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
- data/ext/libsass/src/lexer.cpp +122 -0
- data/ext/libsass/src/lexer.hpp +304 -0
- data/ext/libsass/src/listize.cpp +70 -0
- data/ext/libsass/src/listize.hpp +37 -0
- data/ext/libsass/src/mapping.hpp +19 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +223 -0
- data/ext/libsass/src/operators.cpp +267 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +320 -0
- data/ext/libsass/src/output.hpp +47 -0
- data/ext/libsass/src/parser.cpp +3059 -0
- data/ext/libsass/src/parser.hpp +395 -0
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +188 -0
- data/ext/libsass/src/plugins.hpp +57 -0
- data/ext/libsass/src/position.cpp +163 -0
- data/ext/libsass/src/position.hpp +147 -0
- data/ext/libsass/src/prelexer.cpp +1780 -0
- data/ext/libsass/src/prelexer.hpp +484 -0
- data/ext/libsass/src/remove_placeholders.cpp +86 -0
- data/ext/libsass/src/remove_placeholders.hpp +37 -0
- data/ext/libsass/src/sass.cpp +156 -0
- data/ext/libsass/src/sass.hpp +147 -0
- data/ext/libsass/src/sass2scss.cpp +895 -0
- data/ext/libsass/src/sass_context.cpp +742 -0
- data/ext/libsass/src/sass_context.hpp +129 -0
- data/ext/libsass/src/sass_functions.cpp +210 -0
- data/ext/libsass/src/sass_functions.hpp +50 -0
- data/ext/libsass/src/sass_values.cpp +362 -0
- data/ext/libsass/src/sass_values.hpp +82 -0
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +202 -0
- data/ext/libsass/src/source_map.hpp +65 -0
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +114 -0
- data/ext/libsass/src/to_value.hpp +46 -0
- data/ext/libsass/src/units.cpp +507 -0
- data/ext/libsass/src/units.hpp +110 -0
- data/ext/libsass/src/utf8/checked.h +336 -0
- data/ext/libsass/src/utf8/core.h +332 -0
- data/ext/libsass/src/utf8/unchecked.h +235 -0
- data/ext/libsass/src/utf8.h +34 -0
- data/ext/libsass/src/utf8_string.cpp +104 -0
- data/ext/libsass/src/utf8_string.hpp +38 -0
- data/ext/libsass/src/util.cpp +723 -0
- data/ext/libsass/src/util.hpp +105 -0
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +140 -0
- data/ext/libsass/src/values.hpp +12 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +141 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +73 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +159 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/native.rb +64 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script.rb +17 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/version.rb +5 -0
- data/lib/sassc.rb +57 -0
- data/sassc.gemspec +69 -0
- data/test/css_color_level4_test.rb +168 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +340 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +396 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include <cstdlib>
|
|
6
|
+
#include <cstring>
|
|
7
|
+
#include "util.hpp"
|
|
8
|
+
#include "eval.hpp"
|
|
9
|
+
#include "operators.hpp"
|
|
10
|
+
#include "sass/values.h"
|
|
11
|
+
#include "sass_values.hpp"
|
|
12
|
+
|
|
13
|
+
extern "C" {
|
|
14
|
+
using namespace Sass;
|
|
15
|
+
|
|
16
|
+
// Return the sass tag for a generic sass value
|
|
17
|
+
enum Sass_Tag ADDCALL sass_value_get_tag(const union Sass_Value* v) { return v->unknown.tag; }
|
|
18
|
+
|
|
19
|
+
// Check value for specified type
|
|
20
|
+
bool ADDCALL sass_value_is_null(const union Sass_Value* v) { return v->unknown.tag == SASS_NULL; }
|
|
21
|
+
bool ADDCALL sass_value_is_number(const union Sass_Value* v) { return v->unknown.tag == SASS_NUMBER; }
|
|
22
|
+
bool ADDCALL sass_value_is_string(const union Sass_Value* v) { return v->unknown.tag == SASS_STRING; }
|
|
23
|
+
bool ADDCALL sass_value_is_boolean(const union Sass_Value* v) { return v->unknown.tag == SASS_BOOLEAN; }
|
|
24
|
+
bool ADDCALL sass_value_is_color(const union Sass_Value* v) { return v->unknown.tag == SASS_COLOR; }
|
|
25
|
+
bool ADDCALL sass_value_is_list(const union Sass_Value* v) { return v->unknown.tag == SASS_LIST; }
|
|
26
|
+
bool ADDCALL sass_value_is_map(const union Sass_Value* v) { return v->unknown.tag == SASS_MAP; }
|
|
27
|
+
bool ADDCALL sass_value_is_error(const union Sass_Value* v) { return v->unknown.tag == SASS_ERROR; }
|
|
28
|
+
bool ADDCALL sass_value_is_warning(const union Sass_Value* v) { return v->unknown.tag == SASS_WARNING; }
|
|
29
|
+
|
|
30
|
+
// Getters and setters for Sass_Number
|
|
31
|
+
double ADDCALL sass_number_get_value(const union Sass_Value* v) { return v->number.value; }
|
|
32
|
+
void ADDCALL sass_number_set_value(union Sass_Value* v, double value) { v->number.value = value; }
|
|
33
|
+
const char* ADDCALL sass_number_get_unit(const union Sass_Value* v) { return v->number.unit; }
|
|
34
|
+
void ADDCALL sass_number_set_unit(union Sass_Value* v, char* unit) { v->number.unit = unit; }
|
|
35
|
+
|
|
36
|
+
// Getters and setters for Sass_String
|
|
37
|
+
const char* ADDCALL sass_string_get_value(const union Sass_Value* v) { return v->string.value; }
|
|
38
|
+
void ADDCALL sass_string_set_value(union Sass_Value* v, char* value) { v->string.value = value; }
|
|
39
|
+
bool ADDCALL sass_string_is_quoted(const union Sass_Value* v) { return v->string.quoted; }
|
|
40
|
+
void ADDCALL sass_string_set_quoted(union Sass_Value* v, bool quoted) { v->string.quoted = quoted; }
|
|
41
|
+
|
|
42
|
+
// Getters and setters for Sass_Boolean
|
|
43
|
+
bool ADDCALL sass_boolean_get_value(const union Sass_Value* v) { return v->boolean.value; }
|
|
44
|
+
void ADDCALL sass_boolean_set_value(union Sass_Value* v, bool value) { v->boolean.value = value; }
|
|
45
|
+
|
|
46
|
+
// Getters and setters for Sass_Color
|
|
47
|
+
double ADDCALL sass_color_get_r(const union Sass_Value* v) { return v->color.r; }
|
|
48
|
+
void ADDCALL sass_color_set_r(union Sass_Value* v, double r) { v->color.r = r; }
|
|
49
|
+
double ADDCALL sass_color_get_g(const union Sass_Value* v) { return v->color.g; }
|
|
50
|
+
void ADDCALL sass_color_set_g(union Sass_Value* v, double g) { v->color.g = g; }
|
|
51
|
+
double ADDCALL sass_color_get_b(const union Sass_Value* v) { return v->color.b; }
|
|
52
|
+
void ADDCALL sass_color_set_b(union Sass_Value* v, double b) { v->color.b = b; }
|
|
53
|
+
double ADDCALL sass_color_get_a(const union Sass_Value* v) { return v->color.a; }
|
|
54
|
+
void ADDCALL sass_color_set_a(union Sass_Value* v, double a) { v->color.a = a; }
|
|
55
|
+
|
|
56
|
+
// Getters and setters for Sass_List
|
|
57
|
+
size_t ADDCALL sass_list_get_length(const union Sass_Value* v) { return v->list.length; }
|
|
58
|
+
enum Sass_Separator ADDCALL sass_list_get_separator(const union Sass_Value* v) { return v->list.separator; }
|
|
59
|
+
void ADDCALL sass_list_set_separator(union Sass_Value* v, enum Sass_Separator separator) { v->list.separator = separator; }
|
|
60
|
+
bool ADDCALL sass_list_get_is_bracketed(const union Sass_Value* v) { return v->list.is_bracketed; }
|
|
61
|
+
void ADDCALL sass_list_set_is_bracketed(union Sass_Value* v, bool is_bracketed) { v->list.is_bracketed = is_bracketed; }
|
|
62
|
+
// Getters and setters for Sass_List values
|
|
63
|
+
union Sass_Value* ADDCALL sass_list_get_value(const union Sass_Value* v, size_t i) { return v->list.values[i]; }
|
|
64
|
+
void ADDCALL sass_list_set_value(union Sass_Value* v, size_t i, union Sass_Value* value) { v->list.values[i] = value; }
|
|
65
|
+
|
|
66
|
+
// Getters and setters for Sass_Map
|
|
67
|
+
size_t ADDCALL sass_map_get_length(const union Sass_Value* v) { return v->map.length; }
|
|
68
|
+
// Getters and setters for Sass_List keys and values
|
|
69
|
+
union Sass_Value* ADDCALL sass_map_get_key(const union Sass_Value* v, size_t i) { return v->map.pairs[i].key; }
|
|
70
|
+
union Sass_Value* ADDCALL sass_map_get_value(const union Sass_Value* v, size_t i) { return v->map.pairs[i].value; }
|
|
71
|
+
void ADDCALL sass_map_set_key(union Sass_Value* v, size_t i, union Sass_Value* key) { v->map.pairs[i].key = key; }
|
|
72
|
+
void ADDCALL sass_map_set_value(union Sass_Value* v, size_t i, union Sass_Value* val) { v->map.pairs[i].value = val; }
|
|
73
|
+
|
|
74
|
+
// Getters and setters for Sass_Error
|
|
75
|
+
char* ADDCALL sass_error_get_message(const union Sass_Value* v) { return v->error.message; };
|
|
76
|
+
void ADDCALL sass_error_set_message(union Sass_Value* v, char* msg) { v->error.message = msg; };
|
|
77
|
+
|
|
78
|
+
// Getters and setters for Sass_Warning
|
|
79
|
+
char* ADDCALL sass_warning_get_message(const union Sass_Value* v) { return v->warning.message; };
|
|
80
|
+
void ADDCALL sass_warning_set_message(union Sass_Value* v, char* msg) { v->warning.message = msg; };
|
|
81
|
+
|
|
82
|
+
// Creator functions for all value types
|
|
83
|
+
|
|
84
|
+
union Sass_Value* ADDCALL sass_make_boolean(bool val)
|
|
85
|
+
{
|
|
86
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
87
|
+
if (v == 0) return 0;
|
|
88
|
+
v->boolean.tag = SASS_BOOLEAN;
|
|
89
|
+
v->boolean.value = val;
|
|
90
|
+
return v;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
union Sass_Value* ADDCALL sass_make_number(double val, const char* unit)
|
|
94
|
+
{
|
|
95
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
96
|
+
if (v == 0) return 0;
|
|
97
|
+
v->number.tag = SASS_NUMBER;
|
|
98
|
+
v->number.value = val;
|
|
99
|
+
v->number.unit = unit ? sass_copy_c_string(unit) : 0;
|
|
100
|
+
if (v->number.unit == 0) { free(v); return 0; }
|
|
101
|
+
return v;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
union Sass_Value* ADDCALL sass_make_color(double r, double g, double b, double a)
|
|
105
|
+
{
|
|
106
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
107
|
+
if (v == 0) return 0;
|
|
108
|
+
v->color.tag = SASS_COLOR;
|
|
109
|
+
v->color.r = r;
|
|
110
|
+
v->color.g = g;
|
|
111
|
+
v->color.b = b;
|
|
112
|
+
v->color.a = a;
|
|
113
|
+
return v;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
union Sass_Value* ADDCALL sass_make_string(const char* val)
|
|
117
|
+
{
|
|
118
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
119
|
+
if (v == 0) return 0;
|
|
120
|
+
v->string.quoted = false;
|
|
121
|
+
v->string.tag = SASS_STRING;
|
|
122
|
+
v->string.value = val ? sass_copy_c_string(val) : 0;
|
|
123
|
+
if (v->string.value == 0) { free(v); return 0; }
|
|
124
|
+
return v;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
union Sass_Value* ADDCALL sass_make_qstring(const char* val)
|
|
128
|
+
{
|
|
129
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
130
|
+
if (v == 0) return 0;
|
|
131
|
+
v->string.quoted = true;
|
|
132
|
+
v->string.tag = SASS_STRING;
|
|
133
|
+
v->string.value = val ? sass_copy_c_string(val) : 0;
|
|
134
|
+
if (v->string.value == 0) { free(v); return 0; }
|
|
135
|
+
return v;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
union Sass_Value* ADDCALL sass_make_list(size_t len, enum Sass_Separator sep, bool is_bracketed)
|
|
139
|
+
{
|
|
140
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
141
|
+
if (v == 0) return 0;
|
|
142
|
+
v->list.tag = SASS_LIST;
|
|
143
|
+
v->list.length = len;
|
|
144
|
+
v->list.separator = sep;
|
|
145
|
+
v->list.is_bracketed = is_bracketed;
|
|
146
|
+
v->list.values = (union Sass_Value**) calloc(len, sizeof(union Sass_Value*));
|
|
147
|
+
if (v->list.values == 0) { free(v); return 0; }
|
|
148
|
+
return v;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
union Sass_Value* ADDCALL sass_make_map(size_t len)
|
|
152
|
+
{
|
|
153
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
154
|
+
if (v == 0) return 0;
|
|
155
|
+
v->map.tag = SASS_MAP;
|
|
156
|
+
v->map.length = len;
|
|
157
|
+
v->map.pairs = (struct Sass_MapPair*) calloc(len, sizeof(struct Sass_MapPair));
|
|
158
|
+
if (v->map.pairs == 0) { free(v); return 0; }
|
|
159
|
+
return v;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
union Sass_Value* ADDCALL sass_make_null(void)
|
|
163
|
+
{
|
|
164
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
165
|
+
if (v == 0) return 0;
|
|
166
|
+
v->null.tag = SASS_NULL;
|
|
167
|
+
return v;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
union Sass_Value* ADDCALL sass_make_error(const char* msg)
|
|
171
|
+
{
|
|
172
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
173
|
+
if (v == 0) return 0;
|
|
174
|
+
v->error.tag = SASS_ERROR;
|
|
175
|
+
v->error.message = msg ? sass_copy_c_string(msg) : 0;
|
|
176
|
+
if (v->error.message == 0) { free(v); return 0; }
|
|
177
|
+
return v;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
union Sass_Value* ADDCALL sass_make_warning(const char* msg)
|
|
181
|
+
{
|
|
182
|
+
union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
|
|
183
|
+
if (v == 0) return 0;
|
|
184
|
+
v->warning.tag = SASS_WARNING;
|
|
185
|
+
v->warning.message = msg ? sass_copy_c_string(msg) : 0;
|
|
186
|
+
if (v->warning.message == 0) { free(v); return 0; }
|
|
187
|
+
return v;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// will free all associated sass values
|
|
191
|
+
void ADDCALL sass_delete_value(union Sass_Value* val) {
|
|
192
|
+
|
|
193
|
+
size_t i;
|
|
194
|
+
if (val == 0) return;
|
|
195
|
+
switch(val->unknown.tag) {
|
|
196
|
+
case SASS_NULL: {
|
|
197
|
+
} break;
|
|
198
|
+
case SASS_BOOLEAN: {
|
|
199
|
+
} break;
|
|
200
|
+
case SASS_NUMBER: {
|
|
201
|
+
free(val->number.unit);
|
|
202
|
+
} break;
|
|
203
|
+
case SASS_COLOR: {
|
|
204
|
+
} break;
|
|
205
|
+
case SASS_STRING: {
|
|
206
|
+
free(val->string.value);
|
|
207
|
+
} break;
|
|
208
|
+
case SASS_LIST: {
|
|
209
|
+
for (i=0; i<val->list.length; i++) {
|
|
210
|
+
sass_delete_value(val->list.values[i]);
|
|
211
|
+
}
|
|
212
|
+
free(val->list.values);
|
|
213
|
+
} break;
|
|
214
|
+
case SASS_MAP: {
|
|
215
|
+
for (i=0; i<val->map.length; i++) {
|
|
216
|
+
sass_delete_value(val->map.pairs[i].key);
|
|
217
|
+
sass_delete_value(val->map.pairs[i].value);
|
|
218
|
+
}
|
|
219
|
+
free(val->map.pairs);
|
|
220
|
+
} break;
|
|
221
|
+
case SASS_ERROR: {
|
|
222
|
+
free(val->error.message);
|
|
223
|
+
} break;
|
|
224
|
+
case SASS_WARNING: {
|
|
225
|
+
free(val->error.message);
|
|
226
|
+
} break;
|
|
227
|
+
default: break;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
free(val);
|
|
231
|
+
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Make a deep cloned copy of the given sass value
|
|
235
|
+
union Sass_Value* ADDCALL sass_clone_value (const union Sass_Value* val)
|
|
236
|
+
{
|
|
237
|
+
|
|
238
|
+
size_t i;
|
|
239
|
+
if (val == 0) return 0;
|
|
240
|
+
switch(val->unknown.tag) {
|
|
241
|
+
case SASS_NULL: {
|
|
242
|
+
return sass_make_null();
|
|
243
|
+
}
|
|
244
|
+
case SASS_BOOLEAN: {
|
|
245
|
+
return sass_make_boolean(val->boolean.value);
|
|
246
|
+
}
|
|
247
|
+
case SASS_NUMBER: {
|
|
248
|
+
return sass_make_number(val->number.value, val->number.unit);
|
|
249
|
+
}
|
|
250
|
+
case SASS_COLOR: {
|
|
251
|
+
return sass_make_color(val->color.r, val->color.g, val->color.b, val->color.a);
|
|
252
|
+
}
|
|
253
|
+
case SASS_STRING: {
|
|
254
|
+
return sass_string_is_quoted(val) ? sass_make_qstring(val->string.value) : sass_make_string(val->string.value);
|
|
255
|
+
}
|
|
256
|
+
case SASS_LIST: {
|
|
257
|
+
union Sass_Value* list = sass_make_list(val->list.length, val->list.separator, val->list.is_bracketed);
|
|
258
|
+
for (i = 0; i < list->list.length; i++) {
|
|
259
|
+
list->list.values[i] = sass_clone_value(val->list.values[i]);
|
|
260
|
+
}
|
|
261
|
+
return list;
|
|
262
|
+
}
|
|
263
|
+
case SASS_MAP: {
|
|
264
|
+
union Sass_Value* map = sass_make_map(val->map.length);
|
|
265
|
+
for (i = 0; i < val->map.length; i++) {
|
|
266
|
+
map->map.pairs[i].key = sass_clone_value(val->map.pairs[i].key);
|
|
267
|
+
map->map.pairs[i].value = sass_clone_value(val->map.pairs[i].value);
|
|
268
|
+
}
|
|
269
|
+
return map;
|
|
270
|
+
}
|
|
271
|
+
case SASS_ERROR: {
|
|
272
|
+
return sass_make_error(val->error.message);
|
|
273
|
+
}
|
|
274
|
+
case SASS_WARNING: {
|
|
275
|
+
return sass_make_warning(val->warning.message);
|
|
276
|
+
}
|
|
277
|
+
default: break;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return 0;
|
|
281
|
+
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
union Sass_Value* ADDCALL sass_value_stringify (const union Sass_Value* v, bool compressed, int precision)
|
|
285
|
+
{
|
|
286
|
+
ValueObj val = sass_value_to_ast_node(v);
|
|
287
|
+
Sass_Inspect_Options options(compressed ? COMPRESSED : NESTED, precision);
|
|
288
|
+
sass::string str(val->to_string(options));
|
|
289
|
+
return sass_make_qstring(str.c_str());
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
union Sass_Value* ADDCALL sass_value_op (enum Sass_OP op, const union Sass_Value* a, const union Sass_Value* b)
|
|
293
|
+
{
|
|
294
|
+
|
|
295
|
+
Sass::ValueObj rv;
|
|
296
|
+
|
|
297
|
+
try {
|
|
298
|
+
|
|
299
|
+
ValueObj lhs = sass_value_to_ast_node(a);
|
|
300
|
+
ValueObj rhs = sass_value_to_ast_node(b);
|
|
301
|
+
struct Sass_Inspect_Options options(NESTED, 5);
|
|
302
|
+
|
|
303
|
+
// see if it's a relational expression
|
|
304
|
+
switch(op) {
|
|
305
|
+
case Sass_OP::EQ: return sass_make_boolean(Operators::eq(lhs, rhs));
|
|
306
|
+
case Sass_OP::NEQ: return sass_make_boolean(Operators::neq(lhs, rhs));
|
|
307
|
+
case Sass_OP::GT: return sass_make_boolean(Operators::gt(lhs, rhs));
|
|
308
|
+
case Sass_OP::GTE: return sass_make_boolean(Operators::gte(lhs, rhs));
|
|
309
|
+
case Sass_OP::LT: return sass_make_boolean(Operators::lt(lhs, rhs));
|
|
310
|
+
case Sass_OP::LTE: return sass_make_boolean(Operators::lte(lhs, rhs));
|
|
311
|
+
case Sass_OP::AND: return ast_node_to_sass_value(lhs->is_false() ? lhs : rhs);
|
|
312
|
+
case Sass_OP::OR: return ast_node_to_sass_value(lhs->is_false() ? rhs : lhs);
|
|
313
|
+
default: break;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (sass_value_is_number(a) && sass_value_is_number(b)) {
|
|
317
|
+
const Number* l_n = Cast<Number>(lhs);
|
|
318
|
+
const Number* r_n = Cast<Number>(rhs);
|
|
319
|
+
rv = Operators::op_numbers(op, *l_n, *r_n, options, l_n->pstate());
|
|
320
|
+
}
|
|
321
|
+
else if (sass_value_is_number(a) && sass_value_is_color(a)) {
|
|
322
|
+
const Number* l_n = Cast<Number>(lhs);
|
|
323
|
+
// Direct HSLA operations are not supported
|
|
324
|
+
// All color maths will be deprecated anyway
|
|
325
|
+
Color_RGBA_Obj r_c = Cast<Color>(rhs)->toRGBA();
|
|
326
|
+
rv = Operators::op_number_color(op, *l_n, *r_c, options, l_n->pstate());
|
|
327
|
+
}
|
|
328
|
+
else if (sass_value_is_color(a) && sass_value_is_number(b)) {
|
|
329
|
+
// Direct HSLA operations are not supported
|
|
330
|
+
// All color maths will be deprecated anyway
|
|
331
|
+
Color_RGBA_Obj l_c = Cast<Color>(lhs)->toRGBA();
|
|
332
|
+
const Number* r_n = Cast<Number>(rhs);
|
|
333
|
+
rv = Operators::op_color_number(op, *l_c, *r_n, options, l_c->pstate());
|
|
334
|
+
}
|
|
335
|
+
else if (sass_value_is_color(a) && sass_value_is_color(b)) {
|
|
336
|
+
// Direct HSLA operations are not supported
|
|
337
|
+
// All color maths will be deprecated anyway
|
|
338
|
+
Color_RGBA_Obj l_c = Cast<Color>(lhs)->toRGBA();
|
|
339
|
+
Color_RGBA_Obj r_c = Cast<Color>(rhs)->toRGBA();
|
|
340
|
+
rv = Operators::op_colors(op, *l_c, *r_c, options, l_c->pstate());
|
|
341
|
+
}
|
|
342
|
+
else /* convert other stuff to string and apply operation */ {
|
|
343
|
+
rv = Operators::op_strings(op, *lhs, *rhs, options, lhs->pstate());
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ToDo: maybe we should return null value?
|
|
347
|
+
if (!rv) return sass_make_error("invalid return value");
|
|
348
|
+
|
|
349
|
+
// convert result back to ast node
|
|
350
|
+
return ast_node_to_sass_value(rv.ptr());
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// simply pass the error message back to the caller for now
|
|
354
|
+
catch (Exception::InvalidSass& e) { return sass_make_error(e.what()); }
|
|
355
|
+
catch (std::bad_alloc&) { return sass_make_error("memory exhausted"); }
|
|
356
|
+
catch (std::exception& e) { return sass_make_error(e.what()); }
|
|
357
|
+
catch (sass::string& e) { return sass_make_error(e.c_str()); }
|
|
358
|
+
catch (const char* e) { return sass_make_error(e); }
|
|
359
|
+
catch (...) { return sass_make_error("unknown"); }
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#ifndef SASS_SASS_VALUES_H
|
|
2
|
+
#define SASS_SASS_VALUES_H
|
|
3
|
+
|
|
4
|
+
#include "sass.h"
|
|
5
|
+
|
|
6
|
+
struct Sass_Unknown {
|
|
7
|
+
enum Sass_Tag tag;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
struct Sass_Boolean {
|
|
11
|
+
enum Sass_Tag tag;
|
|
12
|
+
bool value;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
struct Sass_Number {
|
|
16
|
+
enum Sass_Tag tag;
|
|
17
|
+
double value;
|
|
18
|
+
char* unit;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
struct Sass_Color {
|
|
22
|
+
enum Sass_Tag tag;
|
|
23
|
+
double r;
|
|
24
|
+
double g;
|
|
25
|
+
double b;
|
|
26
|
+
double a;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
struct Sass_String {
|
|
30
|
+
enum Sass_Tag tag;
|
|
31
|
+
bool quoted;
|
|
32
|
+
char* value;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
struct Sass_List {
|
|
36
|
+
enum Sass_Tag tag;
|
|
37
|
+
enum Sass_Separator separator;
|
|
38
|
+
bool is_bracketed;
|
|
39
|
+
size_t length;
|
|
40
|
+
// null terminated "array"
|
|
41
|
+
union Sass_Value** values;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
struct Sass_Map {
|
|
45
|
+
enum Sass_Tag tag;
|
|
46
|
+
size_t length;
|
|
47
|
+
struct Sass_MapPair* pairs;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
struct Sass_Null {
|
|
51
|
+
enum Sass_Tag tag;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
struct Sass_Error {
|
|
55
|
+
enum Sass_Tag tag;
|
|
56
|
+
char* message;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
struct Sass_Warning {
|
|
60
|
+
enum Sass_Tag tag;
|
|
61
|
+
char* message;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
union Sass_Value {
|
|
65
|
+
struct Sass_Unknown unknown;
|
|
66
|
+
struct Sass_Boolean boolean;
|
|
67
|
+
struct Sass_Number number;
|
|
68
|
+
struct Sass_Color color;
|
|
69
|
+
struct Sass_String string;
|
|
70
|
+
struct Sass_List list;
|
|
71
|
+
struct Sass_Map map;
|
|
72
|
+
struct Sass_Null null;
|
|
73
|
+
struct Sass_Error error;
|
|
74
|
+
struct Sass_Warning warning;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
struct Sass_MapPair {
|
|
78
|
+
union Sass_Value* key;
|
|
79
|
+
union Sass_Value* value;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
#endif
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#ifndef SASS_SETTINGS_H
|
|
2
|
+
#define SASS_SETTINGS_H
|
|
3
|
+
|
|
4
|
+
// Global compile time settings should go here
|
|
5
|
+
|
|
6
|
+
// When enabled we use our custom memory pool allocator
|
|
7
|
+
// With intense workloads this can double the performance
|
|
8
|
+
// Max memory usage mostly only grows by a slight amount
|
|
9
|
+
// #define SASS_CUSTOM_ALLOCATOR
|
|
10
|
+
|
|
11
|
+
// How many buckets should we have for the free-list
|
|
12
|
+
// Determines when allocations go directly to malloc/free
|
|
13
|
+
// For maximum size of managed items multiply by alignment
|
|
14
|
+
#define SassAllocatorBuckets 512
|
|
15
|
+
|
|
16
|
+
// The size of the memory pool arenas in bytes.
|
|
17
|
+
#define SassAllocatorArenaSize (1024 * 256)
|
|
18
|
+
|
|
19
|
+
#endif
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#include <stdio.h>
|
|
2
|
+
#include <string.h>
|
|
3
|
+
#include "source.hpp"
|
|
4
|
+
#include "utf8/checked.h"
|
|
5
|
+
#include "position.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
SourceData::SourceData()
|
|
10
|
+
: SharedObj()
|
|
11
|
+
{
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
SourceFile::SourceFile(
|
|
15
|
+
const char* path,
|
|
16
|
+
const char* data,
|
|
17
|
+
size_t srcid) :
|
|
18
|
+
SourceData(),
|
|
19
|
+
path(sass_copy_c_string(path)),
|
|
20
|
+
data(sass_copy_c_string(data)),
|
|
21
|
+
length(0),
|
|
22
|
+
srcid(srcid)
|
|
23
|
+
{
|
|
24
|
+
length = strlen(data);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
SourceFile::~SourceFile() {
|
|
28
|
+
sass_free_memory(path);
|
|
29
|
+
sass_free_memory(data);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const char* SourceFile::end() const
|
|
33
|
+
{
|
|
34
|
+
return data + length;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const char* SourceFile::begin() const
|
|
38
|
+
{
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const char* SourceFile::getRawData() const
|
|
43
|
+
{
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
SourceSpan SourceFile::getSourceSpan()
|
|
48
|
+
{
|
|
49
|
+
return SourceSpan(this);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
ItplFile::ItplFile(const char* data, const SourceSpan& pstate) :
|
|
53
|
+
SourceFile(pstate.getPath(),
|
|
54
|
+
data, pstate.getSrcId()),
|
|
55
|
+
pstate(pstate)
|
|
56
|
+
{}
|
|
57
|
+
|
|
58
|
+
const char* ItplFile::getRawData() const
|
|
59
|
+
{
|
|
60
|
+
return pstate.getRawData();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
SourceSpan ItplFile::getSourceSpan()
|
|
64
|
+
{
|
|
65
|
+
return SourceSpan(pstate);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#ifndef SASS_SOURCE_H
|
|
2
|
+
#define SASS_SOURCE_H
|
|
3
|
+
|
|
4
|
+
#include "sass.hpp"
|
|
5
|
+
#include "memory.hpp"
|
|
6
|
+
#include "position.hpp"
|
|
7
|
+
#include "source_data.hpp"
|
|
8
|
+
|
|
9
|
+
namespace Sass {
|
|
10
|
+
|
|
11
|
+
class SourceFile :
|
|
12
|
+
public SourceData {
|
|
13
|
+
protected:
|
|
14
|
+
char* path;
|
|
15
|
+
char* data;
|
|
16
|
+
size_t length;
|
|
17
|
+
size_t srcid;
|
|
18
|
+
public:
|
|
19
|
+
|
|
20
|
+
SourceFile(
|
|
21
|
+
const char* path,
|
|
22
|
+
const char* data,
|
|
23
|
+
size_t srcid);
|
|
24
|
+
|
|
25
|
+
~SourceFile();
|
|
26
|
+
|
|
27
|
+
const char* end() const override final;
|
|
28
|
+
const char* begin() const override final;
|
|
29
|
+
virtual const char* getRawData() const override;
|
|
30
|
+
virtual SourceSpan getSourceSpan() override;
|
|
31
|
+
|
|
32
|
+
size_t size() const override final {
|
|
33
|
+
return length;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
virtual const char* getPath() const override {
|
|
37
|
+
return path;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
virtual size_t getSrcId() const override {
|
|
41
|
+
return srcid;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
class SynthFile :
|
|
47
|
+
public SourceData {
|
|
48
|
+
protected:
|
|
49
|
+
const char* path;
|
|
50
|
+
public:
|
|
51
|
+
|
|
52
|
+
SynthFile(
|
|
53
|
+
const char* path) :
|
|
54
|
+
path(path)
|
|
55
|
+
{}
|
|
56
|
+
|
|
57
|
+
~SynthFile() {}
|
|
58
|
+
|
|
59
|
+
const char* end() const override final { return nullptr; }
|
|
60
|
+
const char* begin() const override final { return nullptr; };
|
|
61
|
+
virtual const char* getRawData() const override { return nullptr; };
|
|
62
|
+
virtual SourceSpan getSourceSpan() override { return SourceSpan(path); };
|
|
63
|
+
|
|
64
|
+
size_t size() const override final {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
virtual const char* getPath() const override {
|
|
69
|
+
return path;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
virtual size_t getSrcId() const override {
|
|
73
|
+
return std::string::npos;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ItplFile :
|
|
80
|
+
public SourceFile {
|
|
81
|
+
private:
|
|
82
|
+
SourceSpan pstate;
|
|
83
|
+
public:
|
|
84
|
+
|
|
85
|
+
ItplFile(const char* data,
|
|
86
|
+
const SourceSpan& pstate);
|
|
87
|
+
|
|
88
|
+
// Offset getPosition() const override final;
|
|
89
|
+
const char* getRawData() const override final;
|
|
90
|
+
SourceSpan getSourceSpan() override final;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#endif
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#ifndef SASS_SOURCE_DATA_H
|
|
2
|
+
#define SASS_SOURCE_DATA_H
|
|
3
|
+
|
|
4
|
+
#include "sass.hpp"
|
|
5
|
+
#include "memory.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
class SourceSpan;
|
|
10
|
+
|
|
11
|
+
class SourceData :
|
|
12
|
+
public SharedObj {
|
|
13
|
+
public:
|
|
14
|
+
SourceData();
|
|
15
|
+
virtual size_t size() const = 0;
|
|
16
|
+
virtual size_t getSrcId() const = 0;
|
|
17
|
+
virtual const char* end() const = 0;
|
|
18
|
+
virtual const char* begin() const = 0;
|
|
19
|
+
virtual const char* getPath() const = 0;
|
|
20
|
+
// virtual Offset getPosition() const = 0;
|
|
21
|
+
virtual const char* getRawData() const = 0;
|
|
22
|
+
virtual SourceSpan getSourceSpan() = 0;
|
|
23
|
+
|
|
24
|
+
sass::string to_string() const override {
|
|
25
|
+
return sass::string{ begin(), end() };
|
|
26
|
+
}
|
|
27
|
+
~SourceData() {}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#endif
|