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.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -0,0 +1,164 @@
1
+ #ifndef SASS_PATHS_H
2
+ #define SASS_PATHS_H
3
+
4
+ #include <vector>
5
+
6
+ namespace Sass {
7
+
8
+ // Returns a list of all possible paths through the given lists.
9
+ //
10
+ // For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
11
+ //
12
+ // ```
13
+ // [[1, 3, 5],
14
+ // [2, 3, 5],
15
+ // [1, 4, 5],
16
+ // [2, 4, 5],
17
+ // [1, 3, 6],
18
+ // [2, 3, 6],
19
+ // [1, 4, 6],
20
+ // [2, 4, 6]]
21
+ // ```
22
+ //
23
+ // Note: called `paths` in dart-sass
24
+ template <class T>
25
+ sass::vector<sass::vector<T>> permutate(
26
+ const sass::vector<sass::vector<T>>& in)
27
+ {
28
+
29
+ size_t L = in.size(), n = 0;
30
+
31
+ if (L == 0) return {};
32
+ // Exit early if any entry is empty
33
+ for (size_t i = 0; i < L; i += 1) {
34
+ if (in[i].size() == 0) return {};
35
+ }
36
+
37
+ size_t* state = new size_t[L + 1];
38
+ sass::vector<sass::vector<T>> out;
39
+
40
+ // First initialize all states for every permutation group
41
+ for (size_t i = 0; i < L; i += 1) {
42
+ state[i] = in[i].size() - 1;
43
+ }
44
+ while (true) {
45
+ sass::vector<T> perm;
46
+ // Create one permutation for state
47
+ for (size_t i = 0; i < L; i += 1) {
48
+ perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
49
+ }
50
+ // Current group finished
51
+ if (state[n] == 0) {
52
+ // Find position of next decrement
53
+ while (n < L && state[++n] == 0) {}
54
+
55
+ if (n == L) {
56
+ out.push_back(perm);
57
+ break;
58
+ }
59
+
60
+ state[n] -= 1;
61
+
62
+ for (size_t p = 0; p < n; p += 1) {
63
+ state[p] = in[p].size() - 1;
64
+ }
65
+
66
+ // Restart from front
67
+ n = 0;
68
+
69
+ }
70
+ else {
71
+ state[n] -= 1;
72
+ }
73
+ out.push_back(perm);
74
+ }
75
+
76
+ delete[] state;
77
+ return out;
78
+ }
79
+ // EO permutate
80
+
81
+ // ToDo: this variant is used in resolveParentSelectors
82
+ // Returns a list of all possible paths through the given lists.
83
+ //
84
+ // For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
85
+ //
86
+ // ```
87
+ // [[1, 3, 5],
88
+ // [1, 3, 6],
89
+ // [1, 4, 5],
90
+ // [1, 4, 6],
91
+ // [2, 3, 5],
92
+ // [2, 3, 6],
93
+ // [2, 4, 5],
94
+ // [2, 4, 6]]
95
+ // ```
96
+ //
97
+ template <class T>
98
+ sass::vector<sass::vector<T>>
99
+ permutateAlt(const sass::vector<sass::vector<T>>& in) {
100
+
101
+ size_t L = in.size();
102
+ size_t n = in.size() - 1;
103
+
104
+ if (L == 0) return {};
105
+ // Exit early if any entry is empty
106
+ for (size_t i = 0; i < L; i += 1) {
107
+ if (in[i].size() == 0) return {};
108
+ }
109
+
110
+ size_t* state = new size_t[L];
111
+ sass::vector<sass::vector<T>> out;
112
+
113
+ // First initialize all states for every permutation group
114
+ for (size_t i = 0; i < L; i += 1) {
115
+ state[i] = in[i].size() - 1;
116
+ }
117
+
118
+ while (true) {
119
+ /*
120
+ // std::cerr << "PERM: ";
121
+ for (size_t p = 0; p < L; p++)
122
+ { // std::cerr << state[p] << " "; }
123
+ // std::cerr << "\n";
124
+ */
125
+ sass::vector<T> perm;
126
+ // Create one permutation for state
127
+ for (size_t i = 0; i < L; i += 1) {
128
+ perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
129
+ }
130
+ // Current group finished
131
+ if (state[n] == 0) {
132
+ // Find position of next decrement
133
+ while (n > 0 && state[--n] == 0) {}
134
+
135
+ // Check for end condition
136
+ if (state[n] != 0) {
137
+ // Decrease next on the left side
138
+ state[n] -= 1;
139
+ // Reset all counters to the right
140
+ for (size_t p = n + 1; p < L; p += 1) {
141
+ state[p] = in[p].size() - 1;
142
+ }
143
+ // Restart from end
144
+ n = L - 1;
145
+ }
146
+ else {
147
+ out.push_back(perm);
148
+ break;
149
+ }
150
+ }
151
+ else {
152
+ state[n] -= 1;
153
+ }
154
+ out.push_back(perm);
155
+ }
156
+
157
+ delete[] state;
158
+ return out;
159
+ }
160
+ // EO permutateAlt
161
+
162
+ }
163
+
164
+ #endif
@@ -1,7 +1,11 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <iostream>
3
6
  #include "output.hpp"
4
7
  #include "plugins.hpp"
8
+ #include "util.hpp"
5
9
 
6
10
  #ifdef _WIN32
7
11
  #include <windows.h>
@@ -40,18 +44,18 @@ namespace Sass {
40
44
  if (!strcmp(our_version, "[na]")) return false;
41
45
 
42
46
  // find the position of the second dot
43
- size_t pos = std::string(our_version).find('.', 0);
44
- if (pos != std::string::npos) pos = std::string(our_version).find('.', pos + 1);
47
+ size_t pos = sass::string(our_version).find('.', 0);
48
+ if (pos != sass::string::npos) pos = sass::string(our_version).find('.', pos + 1);
45
49
 
46
50
  // if we do not have two dots we fallback to compare complete string
47
- if (pos == std::string::npos) { return strcmp(their_version, our_version) ? 0 : 1; }
51
+ if (pos == sass::string::npos) { return strcmp(their_version, our_version) ? 0 : 1; }
48
52
  // otherwise only compare up to the second dot (major versions)
49
53
  else { return strncmp(their_version, our_version, pos) ? 0 : 1; }
50
54
 
51
55
  }
52
56
 
53
57
  // load one specific plugin
54
- bool Plugins::load_plugin (const std::string& path)
58
+ bool Plugins::load_plugin (const sass::string& path)
55
59
  {
56
60
 
57
61
  typedef const char* (*__plugin_version__)(void);
@@ -108,7 +112,7 @@ namespace Sass {
108
112
 
109
113
  }
110
114
 
111
- size_t Plugins::load_plugins(const std::string& path)
115
+ size_t Plugins::load_plugins(const sass::string& path)
112
116
  {
113
117
 
114
118
  // count plugins
@@ -122,7 +126,7 @@ namespace Sass {
122
126
  // use wchar (utf16)
123
127
  WIN32_FIND_DATAW data;
124
128
  // trailing slash is guaranteed
125
- std::string globsrch(path + "*.dll");
129
+ sass::string globsrch(path + "*.dll");
126
130
  // convert to wide chars (utf16) for system call
127
131
  std::wstring wglobsrch(UTF_8::convert_to_utf16(globsrch));
128
132
  HANDLE hFile = FindFirstFileW(wglobsrch.c_str(), &data);
@@ -136,7 +140,7 @@ namespace Sass {
136
140
  try
137
141
  {
138
142
  // the system will report the filenames with wide chars (utf16)
139
- std::string entry = UTF_8::convert_from_utf16(data.cFileName);
143
+ sass::string entry = UTF_8::convert_from_utf16(data.cFileName);
140
144
  // check if file ending matches exactly
141
145
  if (!ends_with(entry, ".dll")) continue;
142
146
  // load the plugin and increase counter
@@ -154,7 +158,7 @@ namespace Sass {
154
158
  }
155
159
  }
156
160
  }
157
- catch (utf8::invalid_utf8)
161
+ catch (utf8::invalid_utf8&)
158
162
  {
159
163
  // report the error to the console (should not happen)
160
164
  // implementors should make sure to provide valid utf8
@@ -36,19 +36,19 @@ namespace Sass {
36
36
 
37
37
  public: // methods
38
38
  // load one specific plugin
39
- bool load_plugin(const std::string& path);
39
+ bool load_plugin(const sass::string& path);
40
40
  // load all plugins from a directory
41
- size_t load_plugins(const std::string& path);
41
+ size_t load_plugins(const sass::string& path);
42
42
 
43
43
  public: // public accessors
44
- const std::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
45
- const std::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
46
- const std::vector<Sass_Function_Entry> get_functions(void) { return functions; }
44
+ const sass::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
45
+ const sass::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
46
+ const sass::vector<Sass_Function_Entry> get_functions(void) { return functions; }
47
47
 
48
48
  private: // private vars
49
- std::vector<Sass_Importer_Entry> headers;
50
- std::vector<Sass_Importer_Entry> importers;
51
- std::vector<Sass_Function_Entry> functions;
49
+ sass::vector<Sass_Importer_Entry> headers;
50
+ sass::vector<Sass_Importer_Entry> importers;
51
+ sass::vector<Sass_Function_Entry> functions;
52
52
 
53
53
  };
54
54
 
@@ -1,5 +1,9 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "position.hpp"
6
+ #include "source.hpp"
3
7
 
4
8
  namespace Sass {
5
9
 
@@ -15,7 +19,7 @@ namespace Sass {
15
19
  *this = inc(string, string + strlen(string));
16
20
  }
17
21
 
18
- Offset::Offset(const std::string& text)
22
+ Offset::Offset(const sass::string& text)
19
23
  : line(0), column(0)
20
24
  {
21
25
  *this = inc(text.c_str(), text.c_str() + text.size());
@@ -53,7 +57,7 @@ namespace Sass {
53
57
  // skip over 10xxxxxx
54
58
  // is 1st bit not set
55
59
  if ((chr & 128) == 0) {
56
- // regular ascii char
60
+ // regular ASCII char
57
61
  column += 1;
58
62
  }
59
63
  // is 2nd bit not set
@@ -114,14 +118,11 @@ namespace Sass {
114
118
  : Offset(line, column), file(file) { }
115
119
 
116
120
 
117
- ParserState::ParserState(const char* path, const char* src, const size_t file)
118
- : Position(file, 0, 0), path(path), src(src), offset(0, 0), token() { }
119
-
120
- ParserState::ParserState(const char* path, const char* src, const Position& position, Offset offset)
121
- : Position(position), path(path), src(src), offset(offset), token() { }
121
+ SourceSpan::SourceSpan(const char* path)
122
+ : source(SASS_MEMORY_NEW(SynthFile, path)), position(0, 0), offset(0, 0) { }
122
123
 
123
- ParserState::ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset)
124
- : Position(position), path(path), src(src), offset(offset), token(token) { }
124
+ SourceSpan::SourceSpan(SourceDataObj source, const Offset& position, const Offset& offset)
125
+ : source(source), position(position), offset(offset) { }
125
126
 
126
127
  Position Position::add(const char* begin, const char* end)
127
128
  {
@@ -161,21 +162,4 @@ namespace Sass {
161
162
  return Offset(line - off.line, off.line == line ? column - off.column : column);
162
163
  }
163
164
 
164
- /* not used anymore - remove?
165
- std::ostream& operator<<(std::ostream& strm, const Offset& off)
166
- {
167
- if (off.line == string::npos) strm << "-1:"; else strm << off.line << ":";
168
- if (off.column == string::npos) strm << "-1"; else strm << off.column;
169
- return strm;
170
- } */
171
-
172
- /* not used anymore - remove?
173
- std::ostream& operator<<(std::ostream& strm, const Position& pos)
174
- {
175
- if (pos.file != string::npos) strm << pos.file << ":";
176
- if (pos.line == string::npos) strm << "-1:"; else strm << pos.line << ":";
177
- if (pos.column == string::npos) strm << "-1"; else strm << pos.column;
178
- return strm;
179
- } */
180
-
181
165
  }
@@ -3,7 +3,8 @@
3
3
 
4
4
  #include <string>
5
5
  #include <cstring>
6
- // #include <iostream>
6
+ #include "source_data.hpp"
7
+ #include "ast_fwd_decl.hpp"
7
8
 
8
9
  namespace Sass {
9
10
 
@@ -13,7 +14,7 @@ namespace Sass {
13
14
  public: // c-tor
14
15
  Offset(const char chr);
15
16
  Offset(const char* string);
16
- Offset(const std::string& text);
17
+ Offset(const sass::string& text);
17
18
  Offset(const size_t line, const size_t column);
18
19
 
19
20
  // return new position, incremented by the given string
@@ -85,37 +86,59 @@ namespace Sass {
85
86
  : prefix(p), begin(b), end(e) { }
86
87
 
87
88
  size_t length() const { return end - begin; }
88
- std::string ws_before() const { return std::string(prefix, begin); }
89
- const std::string to_string() const { return std::string(begin, end); }
90
- std::string time_wspace() const {
91
- std::string str(to_string());
92
- std::string whitespaces(" \t\f\v\n\r");
89
+ sass::string ws_before() const { return sass::string(prefix, begin); }
90
+ sass::string to_string() const { return sass::string(begin, end); }
91
+ sass::string time_wspace() const {
92
+ sass::string str(to_string());
93
+ sass::string whitespaces(" \t\f\v\n\r");
93
94
  return str.erase(str.find_last_not_of(whitespaces)+1);
94
95
  }
95
96
 
96
97
  operator bool() { return begin && end && begin >= end; }
97
- operator std::string() { return to_string(); }
98
+ operator sass::string() { return to_string(); }
98
99
 
99
100
  bool operator==(Token t) { return to_string() == t.to_string(); }
100
101
  };
101
102
 
102
- class ParserState : public Position {
103
+ class SourceSpan {
103
104
 
104
- public: // c-tor
105
- ParserState(const char* path, const char* src = 0, const size_t file = std::string::npos);
106
- ParserState(const char* path, const char* src, const Position& position, Offset offset = Offset(0, 0));
107
- ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset = Offset(0, 0));
105
+ public:
108
106
 
109
- public: // down casts
110
- Offset off() { return *this; }
111
- Position pos() { return *this; }
112
- ParserState pstate() { return *this; }
107
+ SourceSpan(const char* path);
113
108
 
114
- public:
115
- const char* path;
116
- const char* src;
109
+ SourceSpan(SourceDataObj source,
110
+ const Offset& position = Offset(0, 0),
111
+ const Offset& offset = Offset(0, 0));
112
+
113
+ const char* getPath() const {
114
+ return source->getPath();
115
+ }
116
+
117
+ const char* getRawData() const {
118
+ return source->getRawData();
119
+ }
120
+
121
+ Offset getPosition() const {
122
+ return position;
123
+ }
124
+
125
+ size_t getLine() const {
126
+ return position.line + 1;
127
+ }
128
+
129
+ size_t getColumn() const {
130
+ return position.column + 1;
131
+ }
132
+
133
+ size_t getSrcId() const {
134
+ return source == nullptr
135
+ ? std::string::npos
136
+ : source->getSrcId();
137
+ }
138
+
139
+ SourceDataObj source;
140
+ Offset position;
117
141
  Offset offset;
118
- Token token;
119
142
 
120
143
  };
121
144
 
@@ -1,8 +1,11 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
2
- #include <cctype>
4
+
3
5
  #include <iostream>
4
6
  #include <iomanip>
5
7
  #include "util.hpp"
8
+ #include "util_string.hpp"
6
9
  #include "position.hpp"
7
10
  #include "prelexer.hpp"
8
11
  #include "constants.hpp"
@@ -260,7 +263,7 @@ namespace Sass {
260
263
  >(src);
261
264
  }
262
265
 
263
- // Match a line comment (/.*?(?=\n|\r\n?|\Z)/.
266
+ // Match a line comment (/.*?(?=\n|\r\n?|\f|\Z)/.
264
267
  const char* line_comment(const char* src)
265
268
  {
266
269
  return sequence<
@@ -333,7 +336,7 @@ namespace Sass {
333
336
  return alternatives<
334
337
  unicode_seq,
335
338
  alpha,
336
- unicode,
339
+ nonascii,
337
340
  exactly<'-'>,
338
341
  exactly<'_'>,
339
342
  NONASCII,
@@ -348,7 +351,7 @@ namespace Sass {
348
351
  return alternatives<
349
352
  unicode_seq,
350
353
  alnum,
351
- unicode,
354
+ nonascii,
352
355
  exactly<'-'>,
353
356
  exactly<'_'>,
354
357
  NONASCII,
@@ -382,7 +385,7 @@ namespace Sass {
382
385
  {
383
386
  return alternatives <
384
387
  alpha,
385
- unicode,
388
+ nonascii,
386
389
  escape_seq,
387
390
  exactly<'_'>
388
391
  >(src);
@@ -392,7 +395,7 @@ namespace Sass {
392
395
  {
393
396
  return alternatives <
394
397
  alnum,
395
- unicode,
398
+ nonascii,
396
399
  escape_seq,
397
400
  exactly<'_'>
398
401
  >(src);
@@ -1260,6 +1263,9 @@ namespace Sass {
1260
1263
  const char* kwd_lte(const char* src) {
1261
1264
  return exactly<lte>(src);
1262
1265
  }
1266
+ const char* kwd_using(const char* src) {
1267
+ return keyword<using_kwd>(src);
1268
+ }
1263
1269
 
1264
1270
  // match specific IE syntax
1265
1271
  const char* ie_progid(const char* src) {
@@ -1394,7 +1400,7 @@ namespace Sass {
1394
1400
  }*/
1395
1401
 
1396
1402
  const char* H(const char* src) {
1397
- return std::isxdigit(*src) ? src+1 : 0;
1403
+ return Util::ascii_isxdigit(static_cast<unsigned char>(*src)) ? src+1 : 0;
1398
1404
  }
1399
1405
 
1400
1406
  const char* W(const char* src) {
@@ -1606,7 +1612,7 @@ namespace Sass {
1606
1612
  >(src);
1607
1613
  }
1608
1614
 
1609
- extern const char css_variable_url_top_level_negates[] = "()[]{}\"'#/;!";
1615
+ extern const char css_variable_url_top_level_negates[] = "()[]{}\"'#/;";
1610
1616
  const char* css_variable_top_level_value(const char* src) {
1611
1617
  return sequence<
1612
1618
  alternatives<