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.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. 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,14 @@
1
+ #ifndef SASS_C2AST_H
2
+ #define SASS_C2AST_H
3
+
4
+ #include "position.hpp"
5
+ #include "backtrace.hpp"
6
+ #include "ast_fwd_decl.hpp"
7
+
8
+ namespace Sass {
9
+
10
+ Value* c2ast(union Sass_Value* v, Backtraces traces, SourceSpan pstate);
11
+
12
+ }
13
+
14
+ #endif
@@ -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
+