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,29 @@
|
|
|
1
|
+
#ifndef SASS_BACKTRACE_H
|
|
2
|
+
#define SASS_BACKTRACE_H
|
|
3
|
+
|
|
4
|
+
#include <vector>
|
|
5
|
+
#include <sstream>
|
|
6
|
+
#include "file.hpp"
|
|
7
|
+
#include "position.hpp"
|
|
8
|
+
|
|
9
|
+
namespace Sass {
|
|
10
|
+
|
|
11
|
+
struct Backtrace {
|
|
12
|
+
|
|
13
|
+
SourceSpan pstate;
|
|
14
|
+
sass::string caller;
|
|
15
|
+
|
|
16
|
+
Backtrace(SourceSpan pstate, sass::string c = "")
|
|
17
|
+
: pstate(pstate),
|
|
18
|
+
caller(c)
|
|
19
|
+
{ }
|
|
20
|
+
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
typedef sass::vector<Backtrace> Backtraces;
|
|
24
|
+
|
|
25
|
+
const sass::string traces_to_string(Backtraces traces, sass::string indent = "\t");
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#endif
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include "base64vlq.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
sass::string Base64VLQ::encode(const int number) const
|
|
10
|
+
{
|
|
11
|
+
sass::string encoded = "";
|
|
12
|
+
|
|
13
|
+
int vlq = to_vlq_signed(number);
|
|
14
|
+
|
|
15
|
+
do {
|
|
16
|
+
int digit = vlq & VLQ_BASE_MASK;
|
|
17
|
+
vlq >>= VLQ_BASE_SHIFT;
|
|
18
|
+
if (vlq > 0) {
|
|
19
|
+
digit |= VLQ_CONTINUATION_BIT;
|
|
20
|
+
}
|
|
21
|
+
encoded += base64_encode(digit);
|
|
22
|
+
} while (vlq > 0);
|
|
23
|
+
|
|
24
|
+
return encoded;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
char Base64VLQ::base64_encode(const int number) const
|
|
28
|
+
{
|
|
29
|
+
int index = number;
|
|
30
|
+
if (index < 0) index = 0;
|
|
31
|
+
if (index > 63) index = 63;
|
|
32
|
+
return CHARACTERS[index];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int Base64VLQ::to_vlq_signed(const int number) const
|
|
36
|
+
{
|
|
37
|
+
return (number < 0) ? ((-number) << 1) + 1 : (number << 1) + 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const char* Base64VLQ::CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
41
|
+
|
|
42
|
+
const int Base64VLQ::VLQ_BASE_SHIFT = 5;
|
|
43
|
+
const int Base64VLQ::VLQ_BASE = 1 << VLQ_BASE_SHIFT;
|
|
44
|
+
const int Base64VLQ::VLQ_BASE_MASK = VLQ_BASE - 1;
|
|
45
|
+
const int Base64VLQ::VLQ_CONTINUATION_BIT = VLQ_BASE;
|
|
46
|
+
|
|
47
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#ifndef SASS_BASE64VLQ_H
|
|
2
|
+
#define SASS_BASE64VLQ_H
|
|
3
|
+
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
namespace Sass {
|
|
7
|
+
|
|
8
|
+
class Base64VLQ {
|
|
9
|
+
|
|
10
|
+
public:
|
|
11
|
+
|
|
12
|
+
sass::string encode(const int number) const;
|
|
13
|
+
|
|
14
|
+
private:
|
|
15
|
+
|
|
16
|
+
char base64_encode(const int number) const;
|
|
17
|
+
|
|
18
|
+
int to_vlq_signed(const int number) const;
|
|
19
|
+
|
|
20
|
+
static const char* CHARACTERS;
|
|
21
|
+
|
|
22
|
+
static const int VLQ_BASE_SHIFT;
|
|
23
|
+
static const int VLQ_BASE;
|
|
24
|
+
static const int VLQ_BASE_MASK;
|
|
25
|
+
static const int VLQ_CONTINUATION_BIT;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#endif
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
#include "sass.hpp"
|
|
2
|
+
#include "bind.hpp"
|
|
3
|
+
#include "ast.hpp"
|
|
4
|
+
#include "backtrace.hpp"
|
|
5
|
+
#include "context.hpp"
|
|
6
|
+
#include "expand.hpp"
|
|
7
|
+
#include "eval.hpp"
|
|
8
|
+
#include <map>
|
|
9
|
+
#include <iostream>
|
|
10
|
+
#include <sstream>
|
|
11
|
+
|
|
12
|
+
namespace Sass {
|
|
13
|
+
|
|
14
|
+
void bind(sass::string type, sass::string name, Parameters_Obj ps, Arguments_Obj as, Env* env, Eval* eval, Backtraces& traces)
|
|
15
|
+
{
|
|
16
|
+
sass::string callee(type + " " + name);
|
|
17
|
+
|
|
18
|
+
std::map<sass::string, Parameter_Obj> param_map;
|
|
19
|
+
List_Obj varargs = SASS_MEMORY_NEW(List, as->pstate());
|
|
20
|
+
varargs->is_arglist(true); // enable keyword size handling
|
|
21
|
+
|
|
22
|
+
for (size_t i = 0, L = as->length(); i < L; ++i) {
|
|
23
|
+
if (auto str = Cast<String_Quoted>((*as)[i]->value())) {
|
|
24
|
+
// force optional quotes (only if needed)
|
|
25
|
+
if (str->quote_mark()) {
|
|
26
|
+
str->quote_mark('*');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Set up a map to ensure named arguments refer to actual parameters. Also
|
|
32
|
+
// eval each default value left-to-right, wrt env, populating env as we go.
|
|
33
|
+
for (size_t i = 0, L = ps->length(); i < L; ++i) {
|
|
34
|
+
Parameter_Obj p = ps->at(i);
|
|
35
|
+
param_map[p->name()] = p;
|
|
36
|
+
// if (p->default_value()) {
|
|
37
|
+
// env->local_frame()[p->name()] = p->default_value()->perform(eval->with(env));
|
|
38
|
+
// }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// plug in all args; if we have leftover params, deal with it later
|
|
42
|
+
size_t ip = 0, LP = ps->length();
|
|
43
|
+
size_t ia = 0, LA = as->length();
|
|
44
|
+
while (ia < LA) {
|
|
45
|
+
Argument_Obj a = as->at(ia);
|
|
46
|
+
if (ip >= LP) {
|
|
47
|
+
// skip empty rest arguments
|
|
48
|
+
if (a->is_rest_argument()) {
|
|
49
|
+
if (List_Obj l = Cast<List>(a->value())) {
|
|
50
|
+
if (l->length() == 0) {
|
|
51
|
+
++ ia; continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
sass::ostream msg;
|
|
56
|
+
msg << "wrong number of arguments (" << LA << " for " << LP << ")";
|
|
57
|
+
msg << " for `" << name << "'";
|
|
58
|
+
return error(msg.str(), as->pstate(), traces);
|
|
59
|
+
}
|
|
60
|
+
Parameter_Obj p = ps->at(ip);
|
|
61
|
+
|
|
62
|
+
// If the current parameter is the rest parameter, process and break the loop
|
|
63
|
+
if (p->is_rest_parameter()) {
|
|
64
|
+
// The next argument by coincidence provides a rest argument
|
|
65
|
+
if (a->is_rest_argument()) {
|
|
66
|
+
|
|
67
|
+
// We should always get a list for rest arguments
|
|
68
|
+
if (List_Obj rest = Cast<List>(a->value())) {
|
|
69
|
+
// create a new list object for wrapped items
|
|
70
|
+
List* arglist = SASS_MEMORY_NEW(List,
|
|
71
|
+
p->pstate(),
|
|
72
|
+
0,
|
|
73
|
+
rest->separator(),
|
|
74
|
+
true);
|
|
75
|
+
// wrap each item from list as an argument
|
|
76
|
+
for (ExpressionObj item : rest->elements()) {
|
|
77
|
+
if (Argument_Obj arg = Cast<Argument>(item)) {
|
|
78
|
+
arglist->append(SASS_MEMORY_COPY(arg)); // copy
|
|
79
|
+
} else {
|
|
80
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
|
81
|
+
item->pstate(),
|
|
82
|
+
item,
|
|
83
|
+
"",
|
|
84
|
+
false,
|
|
85
|
+
false));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// assign new arglist to environment
|
|
89
|
+
env->local_frame()[p->name()] = arglist;
|
|
90
|
+
}
|
|
91
|
+
// invalid state
|
|
92
|
+
else {
|
|
93
|
+
throw std::runtime_error("invalid state");
|
|
94
|
+
}
|
|
95
|
+
} else if (a->is_keyword_argument()) {
|
|
96
|
+
|
|
97
|
+
// expand keyword arguments into their parameters
|
|
98
|
+
List* arglist = SASS_MEMORY_NEW(List, p->pstate(), 0, SASS_COMMA, true);
|
|
99
|
+
env->local_frame()[p->name()] = arglist;
|
|
100
|
+
Map_Obj argmap = Cast<Map>(a->value());
|
|
101
|
+
for (auto key : argmap->keys()) {
|
|
102
|
+
if (String_Constant_Obj str = Cast<String_Constant>(key)) {
|
|
103
|
+
sass::string param = unquote(str->value());
|
|
104
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
|
105
|
+
key->pstate(),
|
|
106
|
+
argmap->at(key),
|
|
107
|
+
"$" + param,
|
|
108
|
+
false,
|
|
109
|
+
false));
|
|
110
|
+
} else {
|
|
111
|
+
traces.push_back(Backtrace(key->pstate()));
|
|
112
|
+
throw Exception::InvalidVarKwdType(key->pstate(), traces, key->inspect(), a);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
} else {
|
|
117
|
+
|
|
118
|
+
// create a new list object for wrapped items
|
|
119
|
+
List_Obj arglist = SASS_MEMORY_NEW(List,
|
|
120
|
+
p->pstate(),
|
|
121
|
+
0,
|
|
122
|
+
SASS_COMMA,
|
|
123
|
+
true);
|
|
124
|
+
// consume the next args
|
|
125
|
+
while (ia < LA) {
|
|
126
|
+
// get and post inc
|
|
127
|
+
a = (*as)[ia++];
|
|
128
|
+
// maybe we have another list as argument
|
|
129
|
+
List_Obj ls = Cast<List>(a->value());
|
|
130
|
+
// skip any list completely if empty
|
|
131
|
+
if (ls && ls->empty() && a->is_rest_argument()) continue;
|
|
132
|
+
|
|
133
|
+
ExpressionObj value = a->value();
|
|
134
|
+
if (Argument_Obj arg = Cast<Argument>(value)) {
|
|
135
|
+
arglist->append(arg);
|
|
136
|
+
}
|
|
137
|
+
// check if we have rest argument
|
|
138
|
+
else if (a->is_rest_argument()) {
|
|
139
|
+
// preserve the list separator from rest args
|
|
140
|
+
if (List_Obj rest = Cast<List>(a->value())) {
|
|
141
|
+
arglist->separator(rest->separator());
|
|
142
|
+
|
|
143
|
+
for (size_t i = 0, L = rest->length(); i < L; ++i) {
|
|
144
|
+
ExpressionObj obj = rest->value_at_index(i);
|
|
145
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
|
146
|
+
obj->pstate(),
|
|
147
|
+
obj,
|
|
148
|
+
"",
|
|
149
|
+
false,
|
|
150
|
+
false));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// no more arguments
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
// wrap all other value types into Argument
|
|
157
|
+
else {
|
|
158
|
+
arglist->append(SASS_MEMORY_NEW(Argument,
|
|
159
|
+
a->pstate(),
|
|
160
|
+
a->value(),
|
|
161
|
+
a->name(),
|
|
162
|
+
false,
|
|
163
|
+
false));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// assign new arglist to environment
|
|
167
|
+
env->local_frame()[p->name()] = arglist;
|
|
168
|
+
}
|
|
169
|
+
// consumed parameter
|
|
170
|
+
++ip;
|
|
171
|
+
// no more parameters
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// If the current argument is the rest argument, extract a value for processing
|
|
176
|
+
else if (a->is_rest_argument()) {
|
|
177
|
+
// normal param and rest arg
|
|
178
|
+
List_Obj arglist = Cast<List>(a->value());
|
|
179
|
+
if (!arglist) {
|
|
180
|
+
if (ExpressionObj arg = Cast<Expression>(a->value())) {
|
|
181
|
+
arglist = SASS_MEMORY_NEW(List, a->pstate(), 1);
|
|
182
|
+
arglist->append(arg);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// empty rest arg - treat all args as default values
|
|
187
|
+
if (!arglist || !arglist->length()) {
|
|
188
|
+
break;
|
|
189
|
+
} else {
|
|
190
|
+
if (arglist->length() > LP - ip && !ps->has_rest_parameter()) {
|
|
191
|
+
size_t arg_count = (arglist->length() + LA - 1);
|
|
192
|
+
sass::ostream msg;
|
|
193
|
+
msg << callee << " takes " << LP;
|
|
194
|
+
msg << (LP == 1 ? " argument" : " arguments");
|
|
195
|
+
msg << " but " << arg_count;
|
|
196
|
+
msg << (arg_count == 1 ? " was passed" : " were passed.");
|
|
197
|
+
deprecated_bind(msg.str(), as->pstate());
|
|
198
|
+
|
|
199
|
+
while (arglist->length() > LP - ip) {
|
|
200
|
+
arglist->elements().erase(arglist->elements().end() - 1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// otherwise move one of the rest args into the param, converting to argument if necessary
|
|
205
|
+
ExpressionObj obj = arglist->at(0);
|
|
206
|
+
if (!(a = Cast<Argument>(obj))) {
|
|
207
|
+
Expression* a_to_convert = obj;
|
|
208
|
+
a = SASS_MEMORY_NEW(Argument,
|
|
209
|
+
a_to_convert->pstate(),
|
|
210
|
+
a_to_convert,
|
|
211
|
+
"",
|
|
212
|
+
false,
|
|
213
|
+
false);
|
|
214
|
+
}
|
|
215
|
+
arglist->elements().erase(arglist->elements().begin());
|
|
216
|
+
if (!arglist->length() || (!arglist->is_arglist() && ip + 1 == LP)) {
|
|
217
|
+
++ia;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
} else if (a->is_keyword_argument()) {
|
|
221
|
+
Map_Obj argmap = Cast<Map>(a->value());
|
|
222
|
+
|
|
223
|
+
for (auto key : argmap->keys()) {
|
|
224
|
+
String_Constant* val = Cast<String_Constant>(key);
|
|
225
|
+
if (val == NULL) {
|
|
226
|
+
traces.push_back(Backtrace(key->pstate()));
|
|
227
|
+
throw Exception::InvalidVarKwdType(key->pstate(), traces, key->inspect(), a);
|
|
228
|
+
}
|
|
229
|
+
sass::string param = "$" + unquote(val->value());
|
|
230
|
+
|
|
231
|
+
if (!param_map.count(param)) {
|
|
232
|
+
sass::ostream msg;
|
|
233
|
+
msg << callee << " has no parameter named " << param;
|
|
234
|
+
error(msg.str(), a->pstate(), traces);
|
|
235
|
+
}
|
|
236
|
+
env->local_frame()[param] = argmap->at(key);
|
|
237
|
+
}
|
|
238
|
+
++ia;
|
|
239
|
+
continue;
|
|
240
|
+
} else {
|
|
241
|
+
++ia;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (a->name().empty()) {
|
|
245
|
+
if (env->has_local(p->name())) {
|
|
246
|
+
sass::ostream msg;
|
|
247
|
+
msg << "parameter " << p->name()
|
|
248
|
+
<< " provided more than once in call to " << callee;
|
|
249
|
+
error(msg.str(), a->pstate(), traces);
|
|
250
|
+
}
|
|
251
|
+
// ordinal arg -- bind it to the next param
|
|
252
|
+
env->local_frame()[p->name()] = a->value();
|
|
253
|
+
++ip;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// named arg -- bind it to the appropriately named param
|
|
257
|
+
if (!param_map.count(a->name())) {
|
|
258
|
+
if (ps->has_rest_parameter()) {
|
|
259
|
+
varargs->append(a);
|
|
260
|
+
} else {
|
|
261
|
+
sass::ostream msg;
|
|
262
|
+
msg << callee << " has no parameter named " << a->name();
|
|
263
|
+
error(msg.str(), a->pstate(), traces);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (param_map[a->name()]) {
|
|
267
|
+
if (param_map[a->name()]->is_rest_parameter()) {
|
|
268
|
+
sass::ostream msg;
|
|
269
|
+
msg << "argument " << a->name() << " of " << callee
|
|
270
|
+
<< "cannot be used as named argument";
|
|
271
|
+
error(msg.str(), a->pstate(), traces);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (env->has_local(a->name())) {
|
|
275
|
+
sass::ostream msg;
|
|
276
|
+
msg << "parameter " << p->name()
|
|
277
|
+
<< "provided more than once in call to " << callee;
|
|
278
|
+
error(msg.str(), a->pstate(), traces);
|
|
279
|
+
}
|
|
280
|
+
env->local_frame()[a->name()] = a->value();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// EO while ia
|
|
284
|
+
|
|
285
|
+
// If we make it here, we're out of args but may have leftover params.
|
|
286
|
+
// That's only okay if they have default values, or were already bound by
|
|
287
|
+
// named arguments, or if it's a single rest-param.
|
|
288
|
+
for (size_t i = ip; i < LP; ++i) {
|
|
289
|
+
Parameter_Obj leftover = ps->at(i);
|
|
290
|
+
// cerr << "env for default params:" << endl;
|
|
291
|
+
// env->print();
|
|
292
|
+
// cerr << "********" << endl;
|
|
293
|
+
if (!env->has_local(leftover->name())) {
|
|
294
|
+
if (leftover->is_rest_parameter()) {
|
|
295
|
+
env->local_frame()[leftover->name()] = varargs;
|
|
296
|
+
}
|
|
297
|
+
else if (leftover->default_value()) {
|
|
298
|
+
Expression* dv = leftover->default_value()->perform(eval);
|
|
299
|
+
env->local_frame()[leftover->name()] = dv;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// param is unbound and has no default value -- error
|
|
303
|
+
throw Exception::MissingArgument(as->pstate(), traces, name, leftover->name(), type);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#ifndef SASS_BIND_H
|
|
2
|
+
#define SASS_BIND_H
|
|
3
|
+
|
|
4
|
+
#include <string>
|
|
5
|
+
#include "backtrace.hpp"
|
|
6
|
+
#include "environment.hpp"
|
|
7
|
+
#include "ast_fwd_decl.hpp"
|
|
8
|
+
|
|
9
|
+
namespace Sass {
|
|
10
|
+
|
|
11
|
+
void bind(sass::string type, sass::string name, Parameters_Obj, Arguments_Obj, Env*, Eval*, Backtraces& traces);
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#endif
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#include "ast.hpp"
|
|
2
|
+
#include "units.hpp"
|
|
3
|
+
#include "position.hpp"
|
|
4
|
+
#include "backtrace.hpp"
|
|
5
|
+
#include "sass/values.h"
|
|
6
|
+
#include "ast_fwd_decl.hpp"
|
|
7
|
+
#include "error_handling.hpp"
|
|
8
|
+
|
|
9
|
+
namespace Sass {
|
|
10
|
+
|
|
11
|
+
Value* c2ast(union Sass_Value* v, Backtraces traces, SourceSpan pstate)
|
|
12
|
+
{
|
|
13
|
+
using std::strlen;
|
|
14
|
+
using std::strcpy;
|
|
15
|
+
Value* e = NULL;
|
|
16
|
+
switch (sass_value_get_tag(v)) {
|
|
17
|
+
case SASS_BOOLEAN: {
|
|
18
|
+
e = SASS_MEMORY_NEW(Boolean, pstate, !!sass_boolean_get_value(v));
|
|
19
|
+
} break;
|
|
20
|
+
case SASS_NUMBER: {
|
|
21
|
+
e = SASS_MEMORY_NEW(Number, pstate, sass_number_get_value(v), sass_number_get_unit(v));
|
|
22
|
+
} break;
|
|
23
|
+
case SASS_COLOR: {
|
|
24
|
+
e = SASS_MEMORY_NEW(Color_RGBA, pstate, sass_color_get_r(v), sass_color_get_g(v), sass_color_get_b(v), sass_color_get_a(v));
|
|
25
|
+
} break;
|
|
26
|
+
case SASS_STRING: {
|
|
27
|
+
if (sass_string_is_quoted(v))
|
|
28
|
+
e = SASS_MEMORY_NEW(String_Quoted, pstate, sass_string_get_value(v));
|
|
29
|
+
else {
|
|
30
|
+
e = SASS_MEMORY_NEW(String_Constant, pstate, sass_string_get_value(v));
|
|
31
|
+
}
|
|
32
|
+
} break;
|
|
33
|
+
case SASS_LIST: {
|
|
34
|
+
List* l = SASS_MEMORY_NEW(List, pstate, sass_list_get_length(v), sass_list_get_separator(v));
|
|
35
|
+
for (size_t i = 0, L = sass_list_get_length(v); i < L; ++i) {
|
|
36
|
+
l->append(c2ast(sass_list_get_value(v, i), traces, pstate));
|
|
37
|
+
}
|
|
38
|
+
l->is_bracketed(sass_list_get_is_bracketed(v));
|
|
39
|
+
e = l;
|
|
40
|
+
} break;
|
|
41
|
+
case SASS_MAP: {
|
|
42
|
+
Map* m = SASS_MEMORY_NEW(Map, pstate);
|
|
43
|
+
for (size_t i = 0, L = sass_map_get_length(v); i < L; ++i) {
|
|
44
|
+
*m << std::make_pair(
|
|
45
|
+
c2ast(sass_map_get_key(v, i), traces, pstate),
|
|
46
|
+
c2ast(sass_map_get_value(v, i), traces, pstate));
|
|
47
|
+
}
|
|
48
|
+
e = m;
|
|
49
|
+
} break;
|
|
50
|
+
case SASS_NULL: {
|
|
51
|
+
e = SASS_MEMORY_NEW(Null, pstate);
|
|
52
|
+
} break;
|
|
53
|
+
case SASS_ERROR: {
|
|
54
|
+
error("Error in C function: " + sass::string(sass_error_get_message(v)), pstate, traces);
|
|
55
|
+
} break;
|
|
56
|
+
case SASS_WARNING: {
|
|
57
|
+
error("Warning in C function: " + sass::string(sass_warning_get_message(v)), pstate, traces);
|
|
58
|
+
} break;
|
|
59
|
+
default: break;
|
|
60
|
+
}
|
|
61
|
+
return e;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2011 Joseph A. Adams (joeyadams3.14159@gmail.com)
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
#if defined(_MSC_VER) && _MSC_VER < 1900
|
|
25
|
+
|
|
26
|
+
#include <stdio.h>
|
|
27
|
+
#include <stdlib.h>
|
|
28
|
+
#include <stdarg.h>
|
|
29
|
+
|
|
30
|
+
static int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
|
|
31
|
+
{
|
|
32
|
+
int count = -1;
|
|
33
|
+
|
|
34
|
+
if (size != 0)
|
|
35
|
+
count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
|
|
36
|
+
if (count == -1)
|
|
37
|
+
count = _vscprintf(format, ap);
|
|
38
|
+
|
|
39
|
+
return count;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
int snprintf(char* str, size_t size, const char* format, ...)
|
|
43
|
+
{
|
|
44
|
+
int count;
|
|
45
|
+
va_list ap;
|
|
46
|
+
|
|
47
|
+
va_start(ap, format);
|
|
48
|
+
count = c99_vsnprintf(str, size, format, ap);
|
|
49
|
+
va_end(ap);
|
|
50
|
+
|
|
51
|
+
return count;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#endif
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/*
|
|
2
|
+
cencoder.c - c source to a base64 encoding algorithm implementation
|
|
3
|
+
|
|
4
|
+
This is part of the libb64 project, and has been placed in the public domain.
|
|
5
|
+
For details, see http://sourceforge.net/projects/libb64
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "b64/cencode.h"
|
|
9
|
+
|
|
10
|
+
void base64_init_encodestate(base64_encodestate* state_in)
|
|
11
|
+
{
|
|
12
|
+
state_in->step = step_A;
|
|
13
|
+
state_in->result = 0;
|
|
14
|
+
state_in->stepcount = 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
char base64_encode_value(char value_in)
|
|
18
|
+
{
|
|
19
|
+
static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
20
|
+
if (value_in > 63) return '=';
|
|
21
|
+
return encoding[(int)value_in];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in)
|
|
25
|
+
{
|
|
26
|
+
const char* plainchar = plaintext_in;
|
|
27
|
+
const char* const plaintextend = plaintext_in + length_in;
|
|
28
|
+
char* codechar = code_out;
|
|
29
|
+
char result;
|
|
30
|
+
char fragment;
|
|
31
|
+
|
|
32
|
+
result = state_in->result;
|
|
33
|
+
|
|
34
|
+
switch (state_in->step)
|
|
35
|
+
{
|
|
36
|
+
while (1)
|
|
37
|
+
{
|
|
38
|
+
case step_A:
|
|
39
|
+
if (plainchar == plaintextend)
|
|
40
|
+
{
|
|
41
|
+
state_in->result = result;
|
|
42
|
+
state_in->step = step_A;
|
|
43
|
+
return (int)(codechar - code_out);
|
|
44
|
+
}
|
|
45
|
+
fragment = *plainchar++;
|
|
46
|
+
result = (fragment & 0x0fc) >> 2;
|
|
47
|
+
*codechar++ = base64_encode_value(result);
|
|
48
|
+
result = (fragment & 0x003) << 4;
|
|
49
|
+
/* fall through */
|
|
50
|
+
|
|
51
|
+
case step_B:
|
|
52
|
+
if (plainchar == plaintextend)
|
|
53
|
+
{
|
|
54
|
+
state_in->result = result;
|
|
55
|
+
state_in->step = step_B;
|
|
56
|
+
return (int)(codechar - code_out);
|
|
57
|
+
}
|
|
58
|
+
fragment = *plainchar++;
|
|
59
|
+
result |= (fragment & 0x0f0) >> 4;
|
|
60
|
+
*codechar++ = base64_encode_value(result);
|
|
61
|
+
result = (fragment & 0x00f) << 2;
|
|
62
|
+
/* fall through */
|
|
63
|
+
|
|
64
|
+
case step_C:
|
|
65
|
+
if (plainchar == plaintextend)
|
|
66
|
+
{
|
|
67
|
+
state_in->result = result;
|
|
68
|
+
state_in->step = step_C;
|
|
69
|
+
return (int)(codechar - code_out);
|
|
70
|
+
}
|
|
71
|
+
fragment = *plainchar++;
|
|
72
|
+
result |= (fragment & 0x0c0) >> 6;
|
|
73
|
+
*codechar++ = base64_encode_value(result);
|
|
74
|
+
result = (fragment & 0x03f) >> 0;
|
|
75
|
+
*codechar++ = base64_encode_value(result);
|
|
76
|
+
|
|
77
|
+
++(state_in->stepcount);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/* control should not reach here */
|
|
81
|
+
return (int)(codechar - code_out);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
|
|
85
|
+
{
|
|
86
|
+
char* codechar = code_out;
|
|
87
|
+
|
|
88
|
+
switch (state_in->step)
|
|
89
|
+
{
|
|
90
|
+
case step_B:
|
|
91
|
+
*codechar++ = base64_encode_value(state_in->result);
|
|
92
|
+
*codechar++ = '=';
|
|
93
|
+
*codechar++ = '=';
|
|
94
|
+
break;
|
|
95
|
+
case step_C:
|
|
96
|
+
*codechar++ = base64_encode_value(state_in->result);
|
|
97
|
+
*codechar++ = '=';
|
|
98
|
+
break;
|
|
99
|
+
case step_A:
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
*codechar++ = '\n';
|
|
103
|
+
|
|
104
|
+
return (int)(codechar - code_out);
|
|
105
|
+
}
|
|
106
|
+
|