sassc 2.0.0 → 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 +4 -4
- data/.gitignore +2 -0
- data/.gitmodules +1 -1
- data/.travis.yml +9 -3
- data/CHANGELOG.md +36 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +43 -7
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/include/sass/base.h +9 -1
- data/ext/libsass/include/sass/context.h +5 -1
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +755 -2028
- data/ext/libsass/src/ast.hpp +492 -2477
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +70 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
- data/ext/libsass/src/ast_helpers.hpp +292 -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 +1043 -0
- data/ext/libsass/src/ast_selectors.hpp +522 -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/backtrace.cpp +11 -7
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +5 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +35 -34
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +83 -88
- data/ext/libsass/src/check_nesting.hpp +39 -34
- data/ext/libsass/src/color_maps.cpp +168 -164
- data/ext/libsass/src/color_maps.hpp +152 -160
- data/ext/libsass/src/constants.cpp +20 -0
- data/ext/libsass/src/constants.hpp +19 -0
- data/ext/libsass/src/context.cpp +104 -121
- data/ext/libsass/src/context.hpp +43 -55
- data/ext/libsass/src/cssize.cpp +103 -188
- data/ext/libsass/src/cssize.hpp +45 -51
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +524 -361
- data/ext/libsass/src/emitter.cpp +26 -26
- data/ext/libsass/src/emitter.hpp +20 -18
- data/ext/libsass/src/environment.cpp +41 -27
- data/ext/libsass/src/environment.hpp +33 -22
- data/ext/libsass/src/error_handling.cpp +92 -94
- data/ext/libsass/src/error_handling.hpp +73 -50
- data/ext/libsass/src/eval.cpp +380 -515
- data/ext/libsass/src/eval.hpp +64 -57
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +322 -263
- data/ext/libsass/src/expand.hpp +55 -39
- data/ext/libsass/src/extender.cpp +1188 -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 +134 -88
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +596 -0
- data/ext/libsass/src/fn_colors.hpp +85 -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 +244 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +227 -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 +158 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +253 -266
- data/ext/libsass/src/inspect.hpp +72 -74
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +25 -84
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +27 -43
- data/ext/libsass/src/listize.hpp +14 -11
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -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/operation.hpp +193 -143
- data/ext/libsass/src/operators.cpp +56 -29
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +59 -75
- data/ext/libsass/src/output.hpp +15 -22
- data/ext/libsass/src/parser.cpp +662 -818
- data/ext/libsass/src/parser.hpp +96 -100
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +12 -8
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +10 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +14 -8
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +59 -57
- data/ext/libsass/src/remove_placeholders.hpp +20 -18
- data/ext/libsass/src/sass.cpp +25 -18
- data/ext/libsass/src/sass.hpp +22 -14
- data/ext/libsass/src/sass2scss.cpp +49 -18
- data/ext/libsass/src/sass_context.cpp +104 -132
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +7 -4
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_values.cpp +26 -21
- 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 +27 -20
- data/ext/libsass/src/source_map.hpp +14 -11
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +24 -22
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +28 -22
- data/ext/libsass/src/units.hpp +9 -8
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +12 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +97 -107
- data/ext/libsass/src/util.hpp +74 -30
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +33 -24
- data/ext/libsass/src/values.hpp +2 -2
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +7 -5
- data/lib/sassc/functions_handler.rb +11 -13
- data/lib/sassc/native.rb +10 -9
- data/lib/sassc/native/native_functions_api.rb +0 -5
- data/lib/sassc/script.rb +4 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +32 -12
- data/test/engine_test.rb +32 -2
- data/test/functions_test.rb +38 -1
- data/test/native_test.rb +4 -4
- metadata +95 -109
- data/ext/Rakefile +0 -3
- data/ext/libsass/.editorconfig +0 -15
- data/ext/libsass/.gitattributes +0 -2
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.gitignore +0 -85
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/COPYING +0 -25
- data/ext/libsass/GNUmakefile.am +0 -88
- data/ext/libsass/INSTALL +0 -1
- data/ext/libsass/LICENSE +0 -25
- data/ext/libsass/Makefile +0 -351
- data/ext/libsass/Makefile.conf +0 -55
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/configure.ac +0 -138
- data/ext/libsass/contrib/libsass.spec +0 -66
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/include/sass/version.h.in +0 -12
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
- data/ext/libsass/res/resource.rc +0 -35
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/GNUmakefile.am +0 -54
- data/ext/libsass/src/extend.cpp +0 -2130
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
- data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
- data/ext/libsass/src/node.cpp +0 -319
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -149
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -55
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/ext/libsass/src/support/libsass.pc.in +0 -11
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/ext/libsass/version.sh +0 -10
- data/ext/libsass/win/libsass.sln +0 -39
- data/ext/libsass/win/libsass.sln.DotSettings +0 -9
- data/ext/libsass/win/libsass.targets +0 -118
- data/ext/libsass/win/libsass.vcxproj +0 -188
- data/ext/libsass/win/libsass.vcxproj.filters +0 -357
- data/lib/sassc/native/lib_c.rb +0 -21
- data/lib/tasks/libsass.rb +0 -33
|
@@ -154,6 +154,21 @@ namespace Sass
|
|
|
154
154
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
static size_t findFirstCharacter (std::string& sass, size_t pos)
|
|
158
|
+
{
|
|
159
|
+
return sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
static size_t findLastCharacter (std::string& sass, size_t pos)
|
|
163
|
+
{
|
|
164
|
+
return sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE, pos);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static bool isUrl (std::string& sass, size_t pos)
|
|
168
|
+
{
|
|
169
|
+
return sass[pos] == 'u' && sass[pos+1] == 'r' && sass[pos+2] == 'l' && sass[pos+3] == '(';
|
|
170
|
+
}
|
|
171
|
+
|
|
157
172
|
// check if there is some char data
|
|
158
173
|
// will ignore everything in comments
|
|
159
174
|
static bool hasCharData (std::string& sass)
|
|
@@ -452,7 +467,7 @@ namespace Sass
|
|
|
452
467
|
// right trim input
|
|
453
468
|
sass = rtrim(sass);
|
|
454
469
|
|
|
455
|
-
// get
|
|
470
|
+
// get position of first meaningfull character in string
|
|
456
471
|
size_t pos_left = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE);
|
|
457
472
|
|
|
458
473
|
// special case for final run
|
|
@@ -542,7 +557,7 @@ namespace Sass
|
|
|
542
557
|
// default to a selector
|
|
543
558
|
// change back if property found
|
|
544
559
|
converter.selector = true;
|
|
545
|
-
// get
|
|
560
|
+
// get position of first whitespace char
|
|
546
561
|
size_t pos_wspace = sass.find_first_of(SASS2SCSS_FIND_WHITESPACE, pos_left);
|
|
547
562
|
// assertion check for valid result
|
|
548
563
|
if (pos_wspace != std::string::npos)
|
|
@@ -565,7 +580,7 @@ namespace Sass
|
|
|
565
580
|
// assertion for valid result
|
|
566
581
|
if (pos_colon != std::string::npos)
|
|
567
582
|
{
|
|
568
|
-
// ... after the first word (skip
|
|
583
|
+
// ... after the first word (skip beginning colons)
|
|
569
584
|
pos_colon = sass.find_first_of(":", pos_colon);
|
|
570
585
|
// it is a selector if there was no colon found
|
|
571
586
|
converter.selector = pos_colon == std::string::npos;
|
|
@@ -587,6 +602,7 @@ namespace Sass
|
|
|
587
602
|
sass.substr(pos_left, 5) == "@warn" ||
|
|
588
603
|
sass.substr(pos_left, 6) == "@debug" ||
|
|
589
604
|
sass.substr(pos_left, 6) == "@error" ||
|
|
605
|
+
sass.substr(pos_left, 6) == "@value" ||
|
|
590
606
|
sass.substr(pos_left, 8) == "@charset" ||
|
|
591
607
|
sass.substr(pos_left, 10) == "@namespace"
|
|
592
608
|
) { sass = indent + sass.substr(pos_left); }
|
|
@@ -606,23 +622,38 @@ namespace Sass
|
|
|
606
622
|
{
|
|
607
623
|
// get positions for the actual import url
|
|
608
624
|
size_t pos_import = sass.find_first_of(SASS2SCSS_FIND_WHITESPACE, pos_left + 7);
|
|
609
|
-
size_t
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
{
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
625
|
+
size_t pos = sass.find_first_not_of(SASS2SCSS_FIND_WHITESPACE, pos_import);
|
|
626
|
+
size_t start = pos;
|
|
627
|
+
bool in_dqstr = false;
|
|
628
|
+
bool in_sqstr = false;
|
|
629
|
+
bool is_escaped = false;
|
|
630
|
+
do {
|
|
631
|
+
if (is_escaped) {
|
|
632
|
+
is_escaped = false;
|
|
633
|
+
}
|
|
634
|
+
else if (sass[pos] == '\\') {
|
|
635
|
+
is_escaped = true;
|
|
636
|
+
}
|
|
637
|
+
else if (sass[pos] == '"') {
|
|
638
|
+
if (!in_sqstr) in_dqstr = ! in_dqstr;
|
|
639
|
+
}
|
|
640
|
+
else if (sass[pos] == '\'') {
|
|
641
|
+
if (!in_dqstr) in_sqstr = ! in_sqstr;
|
|
642
|
+
}
|
|
643
|
+
else if (in_dqstr || in_sqstr) {
|
|
644
|
+
// skip over quoted stuff
|
|
645
|
+
}
|
|
646
|
+
else if (sass[pos] == ',' || sass[pos] == 0) {
|
|
647
|
+
if (sass[start] != '"' && sass[start] != '\'' && !isUrl(sass, start)) {
|
|
648
|
+
size_t end = findLastCharacter(sass, pos - 1) + 1;
|
|
649
|
+
sass = sass.replace(end, 0, "\"");
|
|
650
|
+
sass = sass.replace(start, 0, "\"");
|
|
651
|
+
pos += 2;
|
|
623
652
|
}
|
|
653
|
+
start = findFirstCharacter(sass, pos + 1);
|
|
624
654
|
}
|
|
625
655
|
}
|
|
656
|
+
while (sass[pos++] != 0);
|
|
626
657
|
|
|
627
658
|
}
|
|
628
659
|
else if (
|
|
@@ -727,7 +758,7 @@ namespace Sass
|
|
|
727
758
|
scss += flush(sass, converter);
|
|
728
759
|
}
|
|
729
760
|
|
|
730
|
-
// get
|
|
761
|
+
// get position of last meaningfull char
|
|
731
762
|
size_t pos_right = sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE);
|
|
732
763
|
|
|
733
764
|
// check for invalid result
|
|
@@ -1,41 +1,49 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
1
3
|
#include "sass.hpp"
|
|
2
|
-
#include <cstring>
|
|
3
|
-
#include <stdexcept>
|
|
4
|
-
#include <sstream>
|
|
5
|
-
#include <string>
|
|
6
|
-
#include <vector>
|
|
7
|
-
|
|
8
|
-
#include "sass.h"
|
|
9
4
|
#include "ast.hpp"
|
|
10
|
-
|
|
11
|
-
#include "json.hpp"
|
|
12
|
-
#include "util.hpp"
|
|
13
|
-
#include "context.hpp"
|
|
14
|
-
#include "sass_context.hpp"
|
|
5
|
+
|
|
15
6
|
#include "sass_functions.hpp"
|
|
16
|
-
#include "
|
|
17
|
-
#include "error_handling.hpp"
|
|
7
|
+
#include "json.hpp"
|
|
18
8
|
|
|
19
9
|
#define LFEED "\n"
|
|
20
10
|
|
|
21
11
|
// C++ helper
|
|
22
12
|
namespace Sass {
|
|
23
|
-
// see sass_copy_c_string(
|
|
24
|
-
static inline JsonNode* json_mkstream(const
|
|
13
|
+
// see sass_copy_c_string(sass::string str)
|
|
14
|
+
static inline JsonNode* json_mkstream(const sass::ostream& stream)
|
|
25
15
|
{
|
|
26
16
|
// hold on to string on stack!
|
|
27
|
-
|
|
17
|
+
sass::string str(stream.str());
|
|
28
18
|
return json_mkstring(str.c_str());
|
|
29
19
|
}
|
|
30
20
|
|
|
21
|
+
static void handle_string_error(Sass_Context* c_ctx, const sass::string& msg, int severety)
|
|
22
|
+
{
|
|
23
|
+
sass::ostream msg_stream;
|
|
24
|
+
JsonNode* json_err = json_mkobject();
|
|
25
|
+
msg_stream << "Internal Error: " << msg << std::endl;
|
|
26
|
+
json_append_member(json_err, "status", json_mknumber(severety));
|
|
27
|
+
json_append_member(json_err, "message", json_mkstring(msg.c_str()));
|
|
28
|
+
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
29
|
+
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
30
|
+
catch (...) {}
|
|
31
|
+
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
32
|
+
c_ctx->error_text = sass_copy_c_string(msg.c_str());
|
|
33
|
+
c_ctx->error_status = severety;
|
|
34
|
+
c_ctx->output_string = 0;
|
|
35
|
+
c_ctx->source_map_string = 0;
|
|
36
|
+
json_delete(json_err);
|
|
37
|
+
}
|
|
38
|
+
|
|
31
39
|
static int handle_error(Sass_Context* c_ctx) {
|
|
32
40
|
try {
|
|
33
41
|
throw;
|
|
34
42
|
}
|
|
35
43
|
catch (Exception::Base& e) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
sass::ostream msg_stream;
|
|
45
|
+
sass::string cwd(Sass::File::get_cwd());
|
|
46
|
+
sass::string msg_prefix(e.errtype());
|
|
39
47
|
bool got_newline = false;
|
|
40
48
|
msg_stream << msg_prefix << ": ";
|
|
41
49
|
const char* msg = e.what();
|
|
@@ -47,7 +55,7 @@ namespace Sass {
|
|
|
47
55
|
got_newline = true;
|
|
48
56
|
}
|
|
49
57
|
else if (got_newline) {
|
|
50
|
-
msg_stream <<
|
|
58
|
+
msg_stream << sass::string(msg_prefix.size() + 2, ' ');
|
|
51
59
|
got_newline = false;
|
|
52
60
|
}
|
|
53
61
|
msg_stream << *msg;
|
|
@@ -57,43 +65,44 @@ namespace Sass {
|
|
|
57
65
|
|
|
58
66
|
if (e.traces.empty()) {
|
|
59
67
|
// we normally should have some traces, still here as a fallback
|
|
60
|
-
|
|
61
|
-
msg_stream <<
|
|
62
|
-
msg_stream << " on line " << e.pstate.
|
|
68
|
+
sass::string rel_path(Sass::File::abs2rel(e.pstate.getPath(), cwd, cwd));
|
|
69
|
+
msg_stream << sass::string(msg_prefix.size() + 2, ' ');
|
|
70
|
+
msg_stream << " on line " << e.pstate.getLine() << " of " << rel_path << "\n";
|
|
63
71
|
}
|
|
64
72
|
else {
|
|
65
|
-
|
|
73
|
+
sass::string rel_path(Sass::File::abs2rel(e.pstate.getPath(), cwd, cwd));
|
|
66
74
|
msg_stream << traces_to_string(e.traces, " ");
|
|
67
75
|
}
|
|
68
76
|
|
|
69
77
|
// now create the code trace (ToDo: maybe have util functions?)
|
|
70
|
-
if (e.pstate.line !=
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
if (e.pstate.position.line != sass::string::npos &&
|
|
79
|
+
e.pstate.position.column != sass::string::npos &&
|
|
80
|
+
e.pstate.source != nullptr) {
|
|
81
|
+
Offset offset(e.pstate.position);
|
|
82
|
+
size_t lines = offset.line;
|
|
73
83
|
// scan through src until target line
|
|
74
84
|
// move line_beg pointer to line start
|
|
75
|
-
|
|
85
|
+
const char* line_beg;
|
|
86
|
+
for (line_beg = e.pstate.getRawData(); *line_beg != '\0'; ++line_beg) {
|
|
87
|
+
if (lines == 0) break;
|
|
76
88
|
if (*line_beg == '\n') --lines;
|
|
77
|
-
utf8::unchecked::next(line_beg);
|
|
78
89
|
}
|
|
79
|
-
const char* line_end = line_beg;
|
|
80
90
|
// move line_end before next newline character
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (*line_end == '\r') break;
|
|
84
|
-
utf8::unchecked::next(line_end);
|
|
91
|
+
const char* line_end;
|
|
92
|
+
for (line_end = line_beg; *line_end != '\0'; ++line_end) {
|
|
93
|
+
if (*line_end == '\n' || *line_end == '\r') break;
|
|
85
94
|
}
|
|
86
|
-
if (
|
|
95
|
+
if (*line_end != '\0') ++line_end;
|
|
87
96
|
size_t line_len = line_end - line_beg;
|
|
88
97
|
size_t move_in = 0; size_t shorten = 0;
|
|
89
98
|
size_t left_chars = 42; size_t max_chars = 76;
|
|
90
99
|
// reported excerpt should not exceed `max_chars` chars
|
|
91
|
-
if (
|
|
92
|
-
if (
|
|
100
|
+
if (offset.column > line_len) left_chars = offset.column;
|
|
101
|
+
if (offset.column > left_chars) move_in = offset.column - left_chars;
|
|
93
102
|
if (line_len > max_chars + move_in) shorten = line_len - move_in - max_chars;
|
|
94
103
|
utf8::advance(line_beg, move_in, line_end);
|
|
95
104
|
utf8::retreat(line_end, shorten, line_beg);
|
|
96
|
-
|
|
105
|
+
sass::string sanitized; sass::string marker(offset.column - move_in, '-');
|
|
97
106
|
utf8::replace_invalid(line_beg, line_end, std::back_inserter(sanitized));
|
|
98
107
|
msg_stream << ">> " << sanitized << "\n";
|
|
99
108
|
msg_stream << " " << marker << "^\n";
|
|
@@ -101,102 +110,40 @@ namespace Sass {
|
|
|
101
110
|
|
|
102
111
|
JsonNode* json_err = json_mkobject();
|
|
103
112
|
json_append_member(json_err, "status", json_mknumber(1));
|
|
104
|
-
json_append_member(json_err, "file", json_mkstring(e.pstate.
|
|
105
|
-
json_append_member(json_err, "line", json_mknumber((double)(e.pstate.
|
|
106
|
-
json_append_member(json_err, "column", json_mknumber((double)(e.pstate.
|
|
113
|
+
json_append_member(json_err, "file", json_mkstring(e.pstate.getPath()));
|
|
114
|
+
json_append_member(json_err, "line", json_mknumber((double)(e.pstate.getLine())));
|
|
115
|
+
json_append_member(json_err, "column", json_mknumber((double)(e.pstate.getColumn())));
|
|
107
116
|
json_append_member(json_err, "message", json_mkstring(e.what()));
|
|
108
117
|
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
109
118
|
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
110
|
-
catch (...) {}
|
|
119
|
+
catch (...) {} // silently ignore this error?
|
|
111
120
|
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
112
121
|
c_ctx->error_text = sass_copy_c_string(e.what());
|
|
113
122
|
c_ctx->error_status = 1;
|
|
114
|
-
c_ctx->error_file = sass_copy_c_string(e.pstate.
|
|
115
|
-
c_ctx->error_line = e.pstate.
|
|
116
|
-
c_ctx->error_column = e.pstate.
|
|
117
|
-
c_ctx->error_src = e.pstate.
|
|
123
|
+
c_ctx->error_file = sass_copy_c_string(e.pstate.getPath());
|
|
124
|
+
c_ctx->error_line = e.pstate.getLine();
|
|
125
|
+
c_ctx->error_column = e.pstate.getColumn();
|
|
126
|
+
c_ctx->error_src = sass_copy_c_string(e.pstate.getRawData());
|
|
118
127
|
c_ctx->output_string = 0;
|
|
119
128
|
c_ctx->source_map_string = 0;
|
|
120
129
|
json_delete(json_err);
|
|
121
130
|
}
|
|
122
131
|
catch (std::bad_alloc& ba) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
msg_stream
|
|
126
|
-
json_append_member(json_err, "status", json_mknumber(2));
|
|
127
|
-
json_append_member(json_err, "message", json_mkstring(ba.what()));
|
|
128
|
-
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
129
|
-
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
130
|
-
catch (...) {}
|
|
131
|
-
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
132
|
-
c_ctx->error_text = sass_copy_c_string(ba.what());
|
|
133
|
-
c_ctx->error_status = 2;
|
|
134
|
-
c_ctx->output_string = 0;
|
|
135
|
-
c_ctx->source_map_string = 0;
|
|
136
|
-
json_delete(json_err);
|
|
132
|
+
sass::ostream msg_stream;
|
|
133
|
+
msg_stream << "Unable to allocate memory: " << ba.what();
|
|
134
|
+
handle_string_error(c_ctx, msg_stream.str(), 2);
|
|
137
135
|
}
|
|
138
136
|
catch (std::exception& e) {
|
|
139
|
-
|
|
140
|
-
JsonNode* json_err = json_mkobject();
|
|
141
|
-
msg_stream << "Internal Error: " << e.what() << std::endl;
|
|
142
|
-
json_append_member(json_err, "status", json_mknumber(3));
|
|
143
|
-
json_append_member(json_err, "message", json_mkstring(e.what()));
|
|
144
|
-
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
145
|
-
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
146
|
-
catch (...) {}
|
|
147
|
-
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
148
|
-
c_ctx->error_text = sass_copy_c_string(e.what());
|
|
149
|
-
c_ctx->error_status = 3;
|
|
150
|
-
c_ctx->output_string = 0;
|
|
151
|
-
c_ctx->source_map_string = 0;
|
|
152
|
-
json_delete(json_err);
|
|
137
|
+
handle_string_error(c_ctx, e.what(), 3);
|
|
153
138
|
}
|
|
154
|
-
catch (
|
|
155
|
-
|
|
156
|
-
JsonNode* json_err = json_mkobject();
|
|
157
|
-
msg_stream << "Internal Error: " << e << std::endl;
|
|
158
|
-
json_append_member(json_err, "status", json_mknumber(4));
|
|
159
|
-
json_append_member(json_err, "message", json_mkstring(e.c_str()));
|
|
160
|
-
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
161
|
-
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
162
|
-
catch (...) {}
|
|
163
|
-
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
164
|
-
c_ctx->error_text = sass_copy_c_string(e.c_str());
|
|
165
|
-
c_ctx->error_status = 4;
|
|
166
|
-
c_ctx->output_string = 0;
|
|
167
|
-
c_ctx->source_map_string = 0;
|
|
168
|
-
json_delete(json_err);
|
|
139
|
+
catch (sass::string& e) {
|
|
140
|
+
handle_string_error(c_ctx, e, 4);
|
|
169
141
|
}
|
|
170
142
|
catch (const char* e) {
|
|
171
|
-
|
|
172
|
-
JsonNode* json_err = json_mkobject();
|
|
173
|
-
msg_stream << "Internal Error: " << e << std::endl;
|
|
174
|
-
json_append_member(json_err, "status", json_mknumber(4));
|
|
175
|
-
json_append_member(json_err, "message", json_mkstring(e));
|
|
176
|
-
json_append_member(json_err, "formatted", json_mkstream(msg_stream));
|
|
177
|
-
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
178
|
-
catch (...) {}
|
|
179
|
-
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
180
|
-
c_ctx->error_text = sass_copy_c_string(e);
|
|
181
|
-
c_ctx->error_status = 4;
|
|
182
|
-
c_ctx->output_string = 0;
|
|
183
|
-
c_ctx->source_map_string = 0;
|
|
184
|
-
json_delete(json_err);
|
|
143
|
+
handle_string_error(c_ctx, e, 4);
|
|
185
144
|
}
|
|
186
145
|
catch (...) {
|
|
187
|
-
|
|
188
|
-
JsonNode* json_err = json_mkobject();
|
|
189
|
-
msg_stream << "Unknown error occurred" << std::endl;
|
|
190
|
-
json_append_member(json_err, "status", json_mknumber(5));
|
|
191
|
-
json_append_member(json_err, "message", json_mkstring("unknown"));
|
|
192
|
-
try { c_ctx->error_json = json_stringify(json_err, " "); }
|
|
193
|
-
catch (...) {}
|
|
194
|
-
c_ctx->error_message = sass_copy_string(msg_stream.str());
|
|
195
|
-
c_ctx->error_text = sass_copy_c_string("unknown");
|
|
196
|
-
c_ctx->error_status = 5;
|
|
197
|
-
c_ctx->output_string = 0;
|
|
198
|
-
c_ctx->source_map_string = 0;
|
|
199
|
-
json_delete(json_err);
|
|
146
|
+
handle_string_error(c_ctx, "unknown", 5);
|
|
200
147
|
}
|
|
201
148
|
return c_ctx->error_status;
|
|
202
149
|
}
|
|
@@ -212,7 +159,7 @@ namespace Sass {
|
|
|
212
159
|
{
|
|
213
160
|
|
|
214
161
|
// assert valid pointer
|
|
215
|
-
if (compiler == 0) return
|
|
162
|
+
if (compiler == 0) return {};
|
|
216
163
|
// The cpp context must be set by now
|
|
217
164
|
Context* cpp_ctx = compiler->cpp_ctx;
|
|
218
165
|
Sass_Context* c_ctx = compiler->c_ctx;
|
|
@@ -223,8 +170,8 @@ namespace Sass {
|
|
|
223
170
|
try {
|
|
224
171
|
|
|
225
172
|
// get input/output path from options
|
|
226
|
-
|
|
227
|
-
|
|
173
|
+
sass::string input_path = safe_str(c_ctx->input_path);
|
|
174
|
+
sass::string output_path = safe_str(c_ctx->output_path);
|
|
228
175
|
|
|
229
176
|
// maybe skip some entries of included files
|
|
230
177
|
// we do not include stdin for data contexts
|
|
@@ -233,7 +180,7 @@ namespace Sass {
|
|
|
233
180
|
// dispatch parse call
|
|
234
181
|
Block_Obj root(cpp_ctx->parse());
|
|
235
182
|
// abort on errors
|
|
236
|
-
if (!root) return
|
|
183
|
+
if (!root) return {};
|
|
237
184
|
|
|
238
185
|
// skip all prefixed files? (ToDo: check srcmap)
|
|
239
186
|
// IMO source-maps should point to headers already
|
|
@@ -253,7 +200,7 @@ namespace Sass {
|
|
|
253
200
|
catch (...) { handle_errors(c_ctx); }
|
|
254
201
|
|
|
255
202
|
// error
|
|
256
|
-
return
|
|
203
|
+
return {};
|
|
257
204
|
|
|
258
205
|
}
|
|
259
206
|
|
|
@@ -331,10 +278,10 @@ extern "C" {
|
|
|
331
278
|
c_ctx->error_message = 0;
|
|
332
279
|
c_ctx->error_status = 0;
|
|
333
280
|
// reset error position
|
|
334
|
-
c_ctx->error_src = 0;
|
|
335
281
|
c_ctx->error_file = 0;
|
|
336
|
-
c_ctx->
|
|
337
|
-
c_ctx->
|
|
282
|
+
c_ctx->error_src = 0;
|
|
283
|
+
c_ctx->error_line = sass::string::npos;
|
|
284
|
+
c_ctx->error_column = sass::string::npos;
|
|
338
285
|
|
|
339
286
|
// allocate a new compiler instance
|
|
340
287
|
void* ctxmem = calloc(1, sizeof(struct Sass_Compiler));
|
|
@@ -381,7 +328,7 @@ extern "C" {
|
|
|
381
328
|
|
|
382
329
|
inline void init_options (struct Sass_Options* options)
|
|
383
330
|
{
|
|
384
|
-
options->precision =
|
|
331
|
+
options->precision = 10;
|
|
385
332
|
options->indent = " ";
|
|
386
333
|
options->linefeed = LFEED;
|
|
387
334
|
}
|
|
@@ -396,7 +343,9 @@ extern "C" {
|
|
|
396
343
|
|
|
397
344
|
Sass_File_Context* ADDCALL sass_make_file_context(const char* input_path)
|
|
398
345
|
{
|
|
399
|
-
|
|
346
|
+
#ifdef DEBUG_SHARED_PTR
|
|
347
|
+
SharedObj::setTaint(true);
|
|
348
|
+
#endif
|
|
400
349
|
struct Sass_File_Context* ctx = (struct Sass_File_Context*) calloc(1, sizeof(struct Sass_File_Context));
|
|
401
350
|
if (ctx == 0) { std::cerr << "Error allocating memory for file context" << std::endl; return 0; }
|
|
402
351
|
ctx->type = SASS_CONTEXT_FILE;
|
|
@@ -413,6 +362,9 @@ extern "C" {
|
|
|
413
362
|
|
|
414
363
|
Sass_Data_Context* ADDCALL sass_make_data_context(char* source_string)
|
|
415
364
|
{
|
|
365
|
+
#ifdef DEBUG_SHARED_PTR
|
|
366
|
+
SharedObj::setTaint(true);
|
|
367
|
+
#endif
|
|
416
368
|
struct Sass_Data_Context* ctx = (struct Sass_Data_Context*) calloc(1, sizeof(struct Sass_Data_Context));
|
|
417
369
|
if (ctx == 0) { std::cerr << "Error allocating memory for data context" << std::endl; return 0; }
|
|
418
370
|
ctx->type = SASS_CONTEXT_DATA;
|
|
@@ -448,7 +400,7 @@ extern "C" {
|
|
|
448
400
|
return data_ctx->error_status;
|
|
449
401
|
try {
|
|
450
402
|
if (data_ctx->source_string == 0) { throw(std::runtime_error("Data context has no source string")); }
|
|
451
|
-
// empty source string is a valid case, even if not really
|
|
403
|
+
// empty source string is a valid case, even if not really useful (different than with file context)
|
|
452
404
|
// if (*data_ctx->source_string == 0) { throw(std::runtime_error("Data context has empty source string")); }
|
|
453
405
|
}
|
|
454
406
|
catch (...) { return handle_errors(data_ctx) | 1; }
|
|
@@ -530,7 +482,7 @@ extern "C" {
|
|
|
530
482
|
static void sass_clear_options (struct Sass_Options* options)
|
|
531
483
|
{
|
|
532
484
|
if (options == 0) return;
|
|
533
|
-
// Deallocate custom functions, headers and
|
|
485
|
+
// Deallocate custom functions, headers and imports
|
|
534
486
|
sass_delete_function_list(options->c_functions);
|
|
535
487
|
sass_delete_importer_list(options->c_importers);
|
|
536
488
|
sass_delete_importer_list(options->c_headers);
|
|
@@ -591,6 +543,7 @@ extern "C" {
|
|
|
591
543
|
if (ctx->error_text) free(ctx->error_text);
|
|
592
544
|
if (ctx->error_json) free(ctx->error_json);
|
|
593
545
|
if (ctx->error_file) free(ctx->error_file);
|
|
546
|
+
if (ctx->error_src) free(ctx->error_src);
|
|
594
547
|
free_string_array(ctx->included_files);
|
|
595
548
|
// play safe and reset properties
|
|
596
549
|
ctx->output_string = 0;
|
|
@@ -599,6 +552,7 @@ extern "C" {
|
|
|
599
552
|
ctx->error_text = 0;
|
|
600
553
|
ctx->error_json = 0;
|
|
601
554
|
ctx->error_file = 0;
|
|
555
|
+
ctx->error_src = 0;
|
|
602
556
|
ctx->included_files = 0;
|
|
603
557
|
// debug leaked memory
|
|
604
558
|
#ifdef DEBUG_SHARED_PTR
|
|
@@ -617,7 +571,7 @@ extern "C" {
|
|
|
617
571
|
if (cpp_ctx) delete(cpp_ctx);
|
|
618
572
|
compiler->cpp_ctx = NULL;
|
|
619
573
|
compiler->c_ctx = NULL;
|
|
620
|
-
compiler->root =
|
|
574
|
+
compiler->root = {};
|
|
621
575
|
free(compiler);
|
|
622
576
|
}
|
|
623
577
|
|
|
@@ -653,7 +607,7 @@ extern "C" {
|
|
|
653
607
|
void ADDCALL sass_file_context_set_options (struct Sass_File_Context* ctx, struct Sass_Options* opt) { copy_options(ctx, opt); }
|
|
654
608
|
void ADDCALL sass_data_context_set_options (struct Sass_Data_Context* ctx, struct Sass_Options* opt) { copy_options(ctx, opt); }
|
|
655
609
|
|
|
656
|
-
// Getters for Sass_Compiler options (get
|
|
610
|
+
// Getters for Sass_Compiler options (get connected sass context)
|
|
657
611
|
enum Sass_Compiler_State ADDCALL sass_compiler_get_state(struct Sass_Compiler* compiler) { return compiler->state; }
|
|
658
612
|
struct Sass_Context* ADDCALL sass_compiler_get_context(struct Sass_Compiler* compiler) { return compiler->c_ctx; }
|
|
659
613
|
struct Sass_Options* ADDCALL sass_compiler_get_options(struct Sass_Compiler* compiler) { return compiler->c_ctx; }
|
|
@@ -697,9 +651,9 @@ extern "C" {
|
|
|
697
651
|
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_message);
|
|
698
652
|
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_text);
|
|
699
653
|
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_file);
|
|
654
|
+
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_src);
|
|
700
655
|
IMPLEMENT_SASS_CONTEXT_GETTER(size_t, error_line);
|
|
701
656
|
IMPLEMENT_SASS_CONTEXT_GETTER(size_t, error_column);
|
|
702
|
-
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, error_src);
|
|
703
657
|
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, output_string);
|
|
704
658
|
IMPLEMENT_SASS_CONTEXT_GETTER(const char*, source_map_string);
|
|
705
659
|
IMPLEMENT_SASS_CONTEXT_GETTER(char**, included_files);
|
|
@@ -709,6 +663,7 @@ extern "C" {
|
|
|
709
663
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_message);
|
|
710
664
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_text);
|
|
711
665
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_file);
|
|
666
|
+
IMPLEMENT_SASS_CONTEXT_TAKER(char*, error_src);
|
|
712
667
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, output_string);
|
|
713
668
|
IMPLEMENT_SASS_CONTEXT_TAKER(char*, source_map_string);
|
|
714
669
|
IMPLEMENT_SASS_CONTEXT_TAKER(char**, included_files);
|
|
@@ -748,6 +703,23 @@ extern "C" {
|
|
|
748
703
|
return cur->string;
|
|
749
704
|
}
|
|
750
705
|
|
|
706
|
+
// Push function for plugin paths (no manipulation support for now)
|
|
707
|
+
size_t ADDCALL sass_option_get_plugin_path_size(struct Sass_Options* options)
|
|
708
|
+
{
|
|
709
|
+
size_t len = 0;
|
|
710
|
+
struct string_list* cur = options->plugin_paths;
|
|
711
|
+
while (cur) { len++; cur = cur->next; }
|
|
712
|
+
return len;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// Push function for plugin paths (no manipulation support for now)
|
|
716
|
+
const char* ADDCALL sass_option_get_plugin_path(struct Sass_Options* options, size_t i)
|
|
717
|
+
{
|
|
718
|
+
struct string_list* cur = options->plugin_paths;
|
|
719
|
+
while (i) { i--; cur = cur->next; }
|
|
720
|
+
return cur->string;
|
|
721
|
+
}
|
|
722
|
+
|
|
751
723
|
// Push function for plugin paths (no manipulation support for now)
|
|
752
724
|
void ADDCALL sass_option_push_plugin_path(struct Sass_Options* options, const char* path)
|
|
753
725
|
{
|