sassc 1.11.4 → 1.12.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 (137) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +2 -2
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/README.md +4 -1
  5. data/ext/libsass/.editorconfig +1 -1
  6. data/ext/libsass/.github/CONTRIBUTING.md +7 -7
  7. data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
  8. data/ext/libsass/.gitignore +3 -0
  9. data/ext/libsass/.travis.yml +37 -18
  10. data/ext/libsass/GNUmakefile.am +23 -37
  11. data/ext/libsass/Makefile +10 -6
  12. data/ext/libsass/Makefile.conf +3 -0
  13. data/ext/libsass/Readme.md +68 -63
  14. data/ext/libsass/appveyor.yml +7 -3
  15. data/ext/libsass/configure.ac +10 -14
  16. data/ext/libsass/docs/api-context-internal.md +29 -21
  17. data/ext/libsass/docs/api-context.md +26 -6
  18. data/ext/libsass/docs/api-doc.md +49 -16
  19. data/ext/libsass/docs/api-function-example.md +1 -1
  20. data/ext/libsass/docs/api-function.md +31 -7
  21. data/ext/libsass/docs/api-importer.md +19 -19
  22. data/ext/libsass/docs/api-value.md +4 -2
  23. data/ext/libsass/docs/build-on-windows.md +4 -4
  24. data/ext/libsass/docs/build-with-mingw.md +3 -3
  25. data/ext/libsass/docs/build.md +9 -9
  26. data/ext/libsass/docs/custom-functions-internal.md +10 -8
  27. data/ext/libsass/docs/implementations.md +20 -8
  28. data/ext/libsass/docs/unicode.md +16 -10
  29. data/ext/libsass/include/sass/base.h +0 -3
  30. data/ext/libsass/include/sass/context.h +20 -2
  31. data/ext/libsass/include/sass/functions.h +31 -0
  32. data/ext/libsass/include/sass/values.h +3 -1
  33. data/ext/libsass/include/sass/version.h +1 -1
  34. data/ext/libsass/include/sass/version.h.in +1 -1
  35. data/ext/libsass/include/sass2scss.h +1 -1
  36. data/ext/libsass/res/resource.rc +6 -6
  37. data/ext/libsass/script/ci-build-libsass +10 -5
  38. data/ext/libsass/script/ci-build-plugin +62 -0
  39. data/ext/libsass/script/ci-install-compiler +1 -1
  40. data/ext/libsass/script/ci-install-deps +4 -7
  41. data/ext/libsass/script/ci-report-coverage +13 -3
  42. data/ext/libsass/script/tap-driver +1 -1
  43. data/ext/libsass/script/tap-runner +1 -1
  44. data/ext/libsass/src/GNUmakefile.am +1 -1
  45. data/ext/libsass/src/ast.cpp +537 -762
  46. data/ext/libsass/src/ast.hpp +377 -419
  47. data/ext/libsass/src/ast_def_macros.hpp +26 -1
  48. data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
  49. data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
  50. data/ext/libsass/src/b64/encode.h +3 -1
  51. data/ext/libsass/src/backtrace.cpp +46 -0
  52. data/ext/libsass/src/backtrace.hpp +7 -54
  53. data/ext/libsass/src/bind.cpp +72 -50
  54. data/ext/libsass/src/bind.hpp +0 -1
  55. data/ext/libsass/src/cencode.c +6 -0
  56. data/ext/libsass/src/check_nesting.cpp +157 -135
  57. data/ext/libsass/src/check_nesting.hpp +11 -10
  58. data/ext/libsass/src/color_maps.cpp +10 -6
  59. data/ext/libsass/src/color_maps.hpp +6 -8
  60. data/ext/libsass/src/constants.cpp +4 -3
  61. data/ext/libsass/src/constants.hpp +4 -3
  62. data/ext/libsass/src/context.cpp +110 -47
  63. data/ext/libsass/src/context.hpp +11 -1
  64. data/ext/libsass/src/cssize.cpp +105 -94
  65. data/ext/libsass/src/cssize.hpp +4 -5
  66. data/ext/libsass/src/debugger.hpp +247 -244
  67. data/ext/libsass/src/emitter.cpp +30 -6
  68. data/ext/libsass/src/emitter.hpp +7 -0
  69. data/ext/libsass/src/environment.cpp +67 -16
  70. data/ext/libsass/src/environment.hpp +28 -7
  71. data/ext/libsass/src/error_handling.cpp +92 -64
  72. data/ext/libsass/src/error_handling.hpp +64 -43
  73. data/ext/libsass/src/eval.cpp +494 -544
  74. data/ext/libsass/src/eval.hpp +17 -23
  75. data/ext/libsass/src/expand.cpp +182 -154
  76. data/ext/libsass/src/expand.hpp +4 -5
  77. data/ext/libsass/src/extend.cpp +299 -291
  78. data/ext/libsass/src/extend.hpp +46 -11
  79. data/ext/libsass/src/file.cpp +103 -36
  80. data/ext/libsass/src/file.hpp +21 -4
  81. data/ext/libsass/src/functions.cpp +561 -312
  82. data/ext/libsass/src/functions.hpp +8 -5
  83. data/ext/libsass/src/inspect.cpp +108 -53
  84. data/ext/libsass/src/inspect.hpp +5 -2
  85. data/ext/libsass/src/lexer.cpp +15 -7
  86. data/ext/libsass/src/lexer.hpp +13 -4
  87. data/ext/libsass/src/listize.cpp +3 -2
  88. data/ext/libsass/src/listize.hpp +0 -1
  89. data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
  90. data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
  91. data/ext/libsass/src/node.cpp +34 -38
  92. data/ext/libsass/src/node.hpp +6 -8
  93. data/ext/libsass/src/operation.hpp +2 -2
  94. data/ext/libsass/src/operators.cpp +240 -0
  95. data/ext/libsass/src/operators.hpp +30 -0
  96. data/ext/libsass/src/output.cpp +22 -20
  97. data/ext/libsass/src/parser.cpp +719 -358
  98. data/ext/libsass/src/parser.hpp +57 -22
  99. data/ext/libsass/src/plugins.cpp +28 -10
  100. data/ext/libsass/src/position.cpp +21 -3
  101. data/ext/libsass/src/position.hpp +2 -1
  102. data/ext/libsass/src/prelexer.cpp +104 -19
  103. data/ext/libsass/src/prelexer.hpp +10 -3
  104. data/ext/libsass/src/remove_placeholders.cpp +9 -10
  105. data/ext/libsass/src/remove_placeholders.hpp +1 -5
  106. data/ext/libsass/src/sass.cpp +62 -4
  107. data/ext/libsass/src/sass.hpp +5 -2
  108. data/ext/libsass/src/sass_context.cpp +96 -58
  109. data/ext/libsass/src/sass_context.hpp +7 -5
  110. data/ext/libsass/src/sass_functions.cpp +63 -1
  111. data/ext/libsass/src/sass_functions.hpp +19 -1
  112. data/ext/libsass/src/sass_util.cpp +3 -3
  113. data/ext/libsass/src/sass_util.hpp +4 -4
  114. data/ext/libsass/src/sass_values.cpp +42 -39
  115. data/ext/libsass/src/sass_values.hpp +2 -1
  116. data/ext/libsass/src/source_map.cpp +16 -18
  117. data/ext/libsass/src/subset_map.cpp +6 -8
  118. data/ext/libsass/src/subset_map.hpp +6 -6
  119. data/ext/libsass/src/to_c.cpp +2 -2
  120. data/ext/libsass/src/to_value.cpp +8 -3
  121. data/ext/libsass/src/to_value.hpp +1 -0
  122. data/ext/libsass/src/units.cpp +349 -45
  123. data/ext/libsass/src/units.hpp +39 -22
  124. data/ext/libsass/src/utf8/checked.h +7 -0
  125. data/ext/libsass/src/utf8/unchecked.h +7 -0
  126. data/ext/libsass/src/utf8_string.cpp +1 -1
  127. data/ext/libsass/src/util.cpp +139 -45
  128. data/ext/libsass/src/util.hpp +4 -7
  129. data/ext/libsass/src/values.cpp +15 -23
  130. data/ext/libsass/win/libsass.sln +13 -2
  131. data/ext/libsass/win/libsass.sln.DotSettings +9 -0
  132. data/ext/libsass/win/libsass.targets +3 -0
  133. data/ext/libsass/win/libsass.vcxproj.filters +9 -0
  134. data/lib/sassc/version.rb +1 -1
  135. data/sassc.gemspec +1 -1
  136. data/test/native_test.rb +1 -1
  137. metadata +11 -4
@@ -4,6 +4,7 @@
4
4
  #include <cmath>
5
5
  #include <string>
6
6
  #include <sstream>
7
+ #include <vector>
7
8
 
8
9
  namespace Sass {
9
10
 
@@ -52,40 +53,56 @@ namespace Sass {
52
53
 
53
54
  };
54
55
 
56
+ class Units {
57
+ public:
58
+ std::vector<std::string> numerators;
59
+ std::vector<std::string> denominators;
60
+ public:
61
+ // default constructor
62
+ Units() :
63
+ numerators(),
64
+ denominators()
65
+ { }
66
+ // copy constructor
67
+ Units(const Units* ptr) :
68
+ numerators(ptr->numerators),
69
+ denominators(ptr->denominators)
70
+ { }
71
+ // convert to string
72
+ std::string unit() const;
73
+ // get if units are empty
74
+ bool is_unitless() const;
75
+ // return if valid for css
76
+ bool is_valid_css_unit() const;
77
+ // reduce units for output
78
+ // returns conversion factor
79
+ double reduce();
80
+ // normalize units for compare
81
+ // returns conversion factor
82
+ double normalize();
83
+ // compare operations
84
+ bool operator< (const Units& rhs) const;
85
+ bool operator== (const Units& rhs) const;
86
+ // factor to convert into given units
87
+ double convert_factor(const Units&) const;
88
+ };
89
+
55
90
  extern const double size_conversion_factors[6][6];
56
91
  extern const double angle_conversion_factors[4][4];
57
92
  extern const double time_conversion_factors[2][2];
58
93
  extern const double frequency_conversion_factors[2][2];
59
94
  extern const double resolution_conversion_factors[3][3];
60
95
 
96
+ UnitType get_main_unit(const UnitClass unit);
61
97
  enum Sass::UnitType string_to_unit(const std::string&);
62
98
  const char* unit_to_string(Sass::UnitType unit);
63
99
  enum Sass::UnitClass get_unit_type(Sass::UnitType unit);
64
100
  std::string get_unit_class(Sass::UnitType unit);
65
101
  std::string unit_to_class(const std::string&);
66
102
  // throws incompatibleUnits exceptions
67
- double conversion_factor(const std::string&, const std::string&, bool = true);
68
-
69
- class incompatibleUnits: public std::exception
70
- {
71
- public:
72
- const char* msg;
73
- incompatibleUnits(Sass::UnitType a, Sass::UnitType b)
74
- : exception()
75
- {
76
- std::stringstream ss;
77
- ss << "Incompatible units: ";
78
- ss << "'" << unit_to_string(a) << "' and ";
79
- ss << "'" << unit_to_string(b) << "'";
80
- // hold on to string on stack!
81
- std::string str(ss.str());
82
- msg = str.c_str();
83
- }
84
- virtual const char* what() const throw()
85
- {
86
- return msg;
87
- }
88
- };
103
+ double conversion_factor(const std::string&, const std::string&);
104
+ double conversion_factor(UnitType, UnitType, UnitClass, UnitClass);
105
+ double convert_units(const std::string&, const std::string&, int&, int&);
89
106
 
90
107
  }
91
108
 
@@ -193,6 +193,13 @@ namespace utf8
193
193
  utf8::next(it, end);
194
194
  }
195
195
 
196
+ template <typename octet_iterator, typename distance_type>
197
+ void retreat (octet_iterator& it, distance_type n, octet_iterator start)
198
+ {
199
+ for (distance_type i = 0; i < n; ++i)
200
+ utf8::prior(it, start);
201
+ }
202
+
196
203
  template <typename octet_iterator>
197
204
  typename std::iterator_traits<octet_iterator>::difference_type
198
205
  distance (octet_iterator first, octet_iterator last)
@@ -116,6 +116,13 @@ namespace utf8
116
116
  utf8::unchecked::next(it);
117
117
  }
118
118
 
119
+ template <typename octet_iterator, typename distance_type>
120
+ void retreat (octet_iterator& it, distance_type n)
121
+ {
122
+ for (distance_type i = 0; i < n; ++i)
123
+ utf8::unchecked::prior(it);
124
+ }
125
+
119
126
  template <typename octet_iterator>
120
127
  typename std::iterator_traits<octet_iterator>::difference_type
121
128
  distance (octet_iterator first, octet_iterator last)
@@ -28,7 +28,7 @@ namespace Sass {
28
28
  size_t offset_at_position(const string& str, size_t position) {
29
29
  string::const_iterator it = str.begin();
30
30
  utf8::advance(it, position, str.end());
31
- return distance(str.begin(), it);
31
+ return std::distance(str.begin(), it);
32
32
  }
33
33
 
34
34
  // function that returns number of bytes in a character at offset
@@ -9,11 +9,22 @@
9
9
 
10
10
  #include <cmath>
11
11
  #include <stdint.h>
12
+ #if defined(_MSC_VER) && _MSC_VER >= 1800 && _MSC_VER < 1900 && defined(_M_X64)
13
+ #include <mutex>
14
+ #endif
12
15
 
13
16
  namespace Sass {
14
17
 
15
18
  double round(double val, size_t precision)
16
19
  {
20
+ // Disable FMA3-optimized implementation when compiling with VS2013 for x64 targets
21
+ // See https://github.com/sass/node-sass/issues/1854 for details
22
+ // FIXME: Remove this workaround when we switch to VS2015+
23
+ #if defined(_MSC_VER) && _MSC_VER >= 1800 && _MSC_VER < 1900 && defined(_M_X64)
24
+ static std::once_flag flag;
25
+ std::call_once(flag, []() { _set_FMA3_enable(0); });
26
+ #endif
27
+
17
28
  // https://github.com/sass/sass/commit/4e3e1d5684cc29073a507578fc977434ff488c93
18
29
  if (fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
19
30
  else if (fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
@@ -24,7 +35,7 @@ namespace Sass {
24
35
  }
25
36
 
26
37
  /* Locale unspecific atof function. */
27
- double sass_atof(const char *str)
38
+ double sass_strtod(const char *str)
28
39
  {
29
40
  char separator = *(localeconv()->decimal_point);
30
41
  if(separator != '.'){
@@ -37,13 +48,13 @@ namespace Sass {
37
48
  // of the string. This is slower but it is thread safe.
38
49
  char *copy = sass_copy_c_string(str);
39
50
  *(copy + (found - str)) = separator;
40
- double res = atof(copy);
51
+ double res = strtod(copy, NULL);
41
52
  free(copy);
42
53
  return res;
43
54
  }
44
55
  }
45
56
 
46
- return atof(str);
57
+ return strtod(str, NULL);
47
58
  }
48
59
 
49
60
  // helper for safe access to c_ctx
@@ -85,8 +96,9 @@ namespace Sass {
85
96
  }
86
97
 
87
98
  // read css string (handle multiline DELIM)
88
- std::string read_css_string(const std::string& str)
99
+ std::string read_css_string(const std::string& str, bool css)
89
100
  {
101
+ if (!css) return str;
90
102
  std::string out("");
91
103
  bool esc = false;
92
104
  for (auto i : str) {
@@ -169,6 +181,23 @@ namespace Sass {
169
181
  return out;
170
182
  }
171
183
 
184
+ std::string escape_string(const std::string& str)
185
+ {
186
+ std::string out("");
187
+ for (auto i : str) {
188
+ if (i == '\n') {
189
+ out += "\\n";
190
+ } else if (i == '\r') {
191
+ out += "\\r";
192
+ } else if (i == '\t') {
193
+ out += "\\t";
194
+ } else {
195
+ out += i;
196
+ }
197
+ }
198
+ return out;
199
+ }
200
+
172
201
  std::string comment_to_string(const std::string& text)
173
202
  {
174
203
  std::string str = "";
@@ -221,6 +250,75 @@ namespace Sass {
221
250
  return quote_mark;
222
251
  }
223
252
 
253
+ std::string read_hex_escapes(const std::string& s)
254
+ {
255
+
256
+ std::string result;
257
+ bool skipped = false;
258
+
259
+ for (size_t i = 0, L = s.length(); i < L; ++i) {
260
+
261
+ // implement the same strange ruby sass behavior
262
+ // an escape sequence can also mean a unicode char
263
+ if (s[i] == '\\' && !skipped) {
264
+
265
+ // remember
266
+ skipped = true;
267
+
268
+ // escape length
269
+ size_t len = 1;
270
+
271
+ // parse as many sequence chars as possible
272
+ // ToDo: Check if ruby aborts after possible max
273
+ while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
274
+
275
+ if (len > 1) {
276
+
277
+ // convert the extracted hex string to code point value
278
+ // ToDo: Maybe we could do this without creating a substring
279
+ uint32_t cp = strtol(s.substr (i + 1, len - 1).c_str(), NULL, 16);
280
+
281
+ if (s[i + len] == ' ') ++ len;
282
+
283
+ // assert invalid code points
284
+ if (cp == 0) cp = 0xFFFD;
285
+ // replace bell character
286
+ // if (cp == '\n') cp = 32;
287
+
288
+ // use a very simple approach to convert via utf8 lib
289
+ // maybe there is a more elegant way; maybe we shoud
290
+ // convert the whole output from string to a stream!?
291
+ // allocate memory for utf8 char and convert to utf8
292
+ unsigned char u[5] = {0,0,0,0,0}; utf8::append(cp, u);
293
+ for(size_t m = 0; m < 5 && u[m]; m++) result.push_back(u[m]);
294
+
295
+ // skip some more chars?
296
+ i += len - 1; skipped = false;
297
+
298
+ }
299
+
300
+ else {
301
+
302
+ skipped = false;
303
+
304
+ result.push_back(s[i]);
305
+
306
+ }
307
+
308
+ }
309
+
310
+ else {
311
+
312
+ result.push_back(s[i]);
313
+
314
+ }
315
+
316
+ }
317
+
318
+ return result;
319
+
320
+ }
321
+
224
322
  std::string unquote(const std::string& s, char* qd, bool keep_utf8_sequences, bool strict)
225
323
  {
226
324
 
@@ -281,7 +379,7 @@ namespace Sass {
281
379
  // convert the whole output from string to a stream!?
282
380
  // allocate memory for utf8 char and convert to utf8
283
381
  unsigned char u[5] = {0,0,0,0,0}; utf8::append(cp, u);
284
- for(size_t m = 0; u[m] && m < 5; m++) unq.push_back(u[m]);
382
+ for(size_t m = 0; m < 5 && u[m]; m++) unq.push_back(u[m]);
285
383
 
286
384
  // skip some more chars?
287
385
  i += len - 1; skipped = false;
@@ -445,7 +543,7 @@ namespace Sass {
445
543
 
446
544
  Block_Obj b = r->block();
447
545
 
448
- Selector_List_Ptr sl = SASS_MEMORY_CAST(Selector_List, r->selector());
546
+ Selector_List_Ptr sl = Cast<Selector_List>(r->selector());
449
547
  bool hasSelectors = sl ? sl->length() > 0 : false;
450
548
 
451
549
  if (!hasSelectors) {
@@ -456,16 +554,16 @@ namespace Sass {
456
554
  bool hasPrintableChildBlocks = false;
457
555
  for (size_t i = 0, L = b->length(); i < L; ++i) {
458
556
  Statement_Obj stm = b->at(i);
459
- if (dynamic_cast<Directive_Ptr>(&stm)) {
557
+ if (Cast<Directive>(stm)) {
460
558
  return true;
461
- } else if (Declaration_Ptr d = dynamic_cast<Declaration_Ptr>(&stm)) {
559
+ } else if (Declaration_Ptr d = Cast<Declaration>(stm)) {
462
560
  return isPrintable(d, style);
463
- } else if (dynamic_cast<Has_Block_Ptr>(&stm)) {
464
- Block_Obj pChildBlock = ((Has_Block_Ptr)&stm)->block();
465
- if (isPrintable(&pChildBlock, style)) {
561
+ } else if (Has_Block_Ptr p = Cast<Has_Block>(stm)) {
562
+ Block_Obj pChildBlock = p->block();
563
+ if (isPrintable(pChildBlock, style)) {
466
564
  hasPrintableChildBlocks = true;
467
565
  }
468
- } else if (Comment_Ptr c = dynamic_cast<Comment_Ptr>(&stm)) {
566
+ } else if (Comment_Ptr c = Cast<Comment>(stm)) {
469
567
  // keep for uncompressed
470
568
  if (style != COMPRESSED) {
471
569
  hasDeclarations = true;
@@ -499,8 +597,8 @@ namespace Sass {
499
597
  bool isPrintable(Declaration_Ptr d, Sass_Output_Style style)
500
598
  {
501
599
  Expression_Obj val = d->value();
502
- if (String_Quoted_Obj sq = SASS_MEMORY_CAST(String_Quoted, val)) return isPrintable(&sq, style);
503
- if (String_Constant_Obj sc = SASS_MEMORY_CAST(String_Constant, val)) return isPrintable(&sc, style);
600
+ if (String_Quoted_Obj sq = Cast<String_Quoted>(val)) return isPrintable(sq.ptr(), style);
601
+ if (String_Constant_Obj sc = Cast<String_Constant>(val)) return isPrintable(sc.ptr(), style);
504
602
  return true;
505
603
  }
506
604
 
@@ -511,19 +609,19 @@ namespace Sass {
511
609
 
512
610
  Block_Obj b = f->block();
513
611
 
514
- // bool hasSelectors = f->selector() && static_cast<Selector_List_Ptr>(f->selector())->length() > 0;
515
-
516
612
  bool hasDeclarations = false;
517
613
  bool hasPrintableChildBlocks = false;
518
614
  for (size_t i = 0, L = b->length(); i < L; ++i) {
519
615
  Statement_Obj stm = b->at(i);
520
- if (dynamic_cast<Declaration_Ptr>(&stm) || dynamic_cast<Directive_Ptr>(&stm)) {
616
+ if (Cast<Declaration>(stm) || Cast<Directive>(stm)) {
521
617
  hasDeclarations = true;
522
618
  }
523
- else if (dynamic_cast<Has_Block_Ptr>(&stm)) {
524
- Block_Obj pChildBlock = ((Has_Block_Ptr)&stm)->block();
525
- if (isPrintable(&pChildBlock, style)) {
526
- hasPrintableChildBlocks = true;
619
+ else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
620
+ Block_Obj pChildBlock = b->block();
621
+ if (!b->is_invisible()) {
622
+ if (isPrintable(pChildBlock, style)) {
623
+ hasPrintableChildBlocks = true;
624
+ }
527
625
  }
528
626
  }
529
627
 
@@ -542,34 +640,32 @@ namespace Sass {
542
640
  if (b == 0) return false;
543
641
  for (size_t i = 0, L = b->length(); i < L; ++i) {
544
642
  Statement_Obj stm = b->at(i);
545
- if (dynamic_cast<Directive_Ptr>(&stm)) return true;
546
- else if (dynamic_cast<Declaration_Ptr>(&stm)) return true;
547
- else if (dynamic_cast<Comment_Ptr>(&stm)) {
548
- Comment_Ptr c = (Comment_Ptr) &stm;
643
+ if (Cast<Directive>(stm)) return true;
644
+ else if (Cast<Declaration>(stm)) return true;
645
+ else if (Comment_Ptr c = Cast<Comment>(stm)) {
549
646
  if (isPrintable(c, style)) {
550
647
  return true;
551
648
  }
552
649
  }
553
- else if (dynamic_cast<Ruleset_Ptr>(&stm)) {
554
- Ruleset_Ptr r = (Ruleset_Ptr) &stm;
650
+ else if (Ruleset_Ptr r = Cast<Ruleset>(stm)) {
555
651
  if (isPrintable(r, style)) {
556
652
  return true;
557
653
  }
558
654
  }
559
- else if (dynamic_cast<Supports_Block_Ptr>(&stm)) {
560
- Supports_Block_Ptr f = (Supports_Block_Ptr) &stm;
655
+ else if (Supports_Block_Ptr f = Cast<Supports_Block>(stm)) {
561
656
  if (isPrintable(f, style)) {
562
657
  return true;
563
658
  }
564
659
  }
565
- else if (dynamic_cast<Media_Block_Ptr>(&stm)) {
566
- Media_Block_Ptr m = (Media_Block_Ptr) &stm;
567
- if (isPrintable(m, style)) {
660
+ else if (Media_Block_Ptr mb = Cast<Media_Block>(stm)) {
661
+ if (isPrintable(mb, style)) {
568
662
  return true;
569
663
  }
570
664
  }
571
- else if (dynamic_cast<Has_Block_Ptr>(&stm) && isPrintable(((Has_Block_Ptr)&stm)->block(), style)) {
572
- return true;
665
+ else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
666
+ if (isPrintable(b->block(), style)) {
667
+ return true;
668
+ }
573
669
  }
574
670
  }
575
671
  return false;
@@ -596,35 +692,33 @@ namespace Sass {
596
692
 
597
693
  for (size_t i = 0, L = b->length(); i < L; ++i) {
598
694
  Statement_Obj stm = b->at(i);
599
- if (dynamic_cast<Declaration_Ptr>(&stm) || dynamic_cast<Directive_Ptr>(&stm)) {
695
+ if (Cast<Declaration>(stm) || Cast<Directive>(stm)) {
600
696
  return true;
601
697
  }
602
- else if (dynamic_cast<Comment_Ptr>(&stm)) {
603
- Comment_Ptr c = (Comment_Ptr) &stm;
698
+ else if (Comment_Ptr c = Cast<Comment>(stm)) {
604
699
  if (isPrintable(c, style)) {
605
700
  return true;
606
701
  }
607
702
  }
608
- else if (dynamic_cast<Ruleset_Ptr>(&stm)) {
609
- Ruleset_Ptr r = (Ruleset_Ptr) &stm;
703
+ else if (Ruleset_Ptr r = Cast<Ruleset>(stm)) {
610
704
  if (isPrintable(r, style)) {
611
705
  return true;
612
706
  }
613
707
  }
614
- else if (dynamic_cast<Supports_Block_Ptr>(&stm)) {
615
- Supports_Block_Ptr f = (Supports_Block_Ptr) &stm;
708
+ else if (Supports_Block_Ptr f = Cast<Supports_Block>(stm)) {
616
709
  if (isPrintable(f, style)) {
617
710
  return true;
618
711
  }
619
712
  }
620
- else if (dynamic_cast<Media_Block_Ptr>(&stm)) {
621
- Media_Block_Ptr m = (Media_Block_Ptr) &stm;
713
+ else if (Media_Block_Ptr m = Cast<Media_Block>(stm)) {
622
714
  if (isPrintable(m, style)) {
623
715
  return true;
624
716
  }
625
717
  }
626
- else if (dynamic_cast<Has_Block_Ptr>(&stm) && isPrintable(((Has_Block_Ptr)&stm)->block(), style)) {
627
- return true;
718
+ else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
719
+ if (isPrintable(b->block(), style)) {
720
+ return true;
721
+ }
628
722
  }
629
723
  }
630
724
 
@@ -12,20 +12,17 @@
12
12
 
13
13
  namespace Sass {
14
14
 
15
- #define out_of_memory() do { \
16
- std::cerr << "Out of memory.\n"; \
17
- exit(EXIT_FAILURE); \
18
- } while (0)
19
-
20
15
  double round(double val, size_t precision = 0);
21
- double sass_atof(const char* str);
16
+ double sass_strtod(const char* str);
22
17
  const char* safe_str(const char *, const char* = "");
23
18
  void free_string_array(char **);
24
19
  char **copy_strings(const std::vector<std::string>&, char ***, int = 0);
25
- std::string read_css_string(const std::string& str);
20
+ std::string read_css_string(const std::string& str, bool css = true);
26
21
  std::string evacuate_escapes(const std::string& str);
27
22
  std::string string_to_output(const std::string& str);
28
23
  std::string comment_to_string(const std::string& text);
24
+ std::string read_hex_escapes(const std::string& str);
25
+ std::string escape_string(const std::string& str);
29
26
  void newline_to_space(std::string& str);
30
27
 
31
28
  std::string quote(const std::string&, char q = 0);