sassc 1.9.0 → 1.10.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -3
  3. data/ext/libsass/.gitignore +3 -0
  4. data/ext/libsass/.travis.yml +1 -1
  5. data/ext/libsass/GNUmakefile.am +7 -7
  6. data/ext/libsass/Makefile +7 -4
  7. data/ext/libsass/Makefile.conf +0 -1
  8. data/ext/libsass/appveyor.yml +6 -2
  9. data/ext/libsass/docs/api-context.md +4 -4
  10. data/ext/libsass/docs/api-doc.md +29 -11
  11. data/ext/libsass/docs/api-importer-example.md +5 -5
  12. data/ext/libsass/docs/build-on-windows.md +1 -1
  13. data/ext/libsass/include/sass/base.h +10 -0
  14. data/ext/libsass/include/sass/version.h +4 -0
  15. data/ext/libsass/include/sass/version.h.in +4 -0
  16. data/ext/libsass/include/sass2scss.h +1 -1
  17. data/ext/libsass/script/ci-build-libsass +15 -3
  18. data/ext/libsass/src/ast.cpp +161 -6
  19. data/ext/libsass/src/ast.hpp +71 -44
  20. data/ext/libsass/src/ast_factory.hpp +1 -1
  21. data/ext/libsass/src/ast_fwd_decl.hpp +2 -2
  22. data/ext/libsass/src/constants.cpp +2 -4
  23. data/ext/libsass/src/constants.hpp +3 -4
  24. data/ext/libsass/src/context.cpp +16 -17
  25. data/ext/libsass/src/context.hpp +2 -2
  26. data/ext/libsass/src/cssize.cpp +19 -8
  27. data/ext/libsass/src/cssize.hpp +5 -2
  28. data/ext/libsass/src/debugger.hpp +6 -3
  29. data/ext/libsass/src/emitter.cpp +1 -1
  30. data/ext/libsass/src/environment.cpp +1 -1
  31. data/ext/libsass/src/eval.cpp +42 -14
  32. data/ext/libsass/src/eval.hpp +1 -1
  33. data/ext/libsass/src/expand.cpp +24 -8
  34. data/ext/libsass/src/expand.hpp +2 -1
  35. data/ext/libsass/src/extend.cpp +55 -15
  36. data/ext/libsass/src/extend.hpp +5 -1
  37. data/ext/libsass/src/functions.cpp +10 -5
  38. data/ext/libsass/src/inspect.cpp +25 -19
  39. data/ext/libsass/src/inspect.hpp +2 -2
  40. data/ext/libsass/src/json.cpp +20 -9
  41. data/ext/libsass/src/json.hpp +5 -5
  42. data/ext/libsass/src/lexer.cpp +4 -1
  43. data/ext/libsass/src/lexer.hpp +21 -0
  44. data/ext/libsass/src/listize.cpp +2 -1
  45. data/ext/libsass/src/operation.hpp +4 -4
  46. data/ext/libsass/src/output.cpp +1 -1
  47. data/ext/libsass/src/output.hpp +1 -1
  48. data/ext/libsass/src/parser.cpp +189 -90
  49. data/ext/libsass/src/parser.hpp +42 -2
  50. data/ext/libsass/src/prelexer.cpp +474 -7
  51. data/ext/libsass/src/prelexer.hpp +15 -2
  52. data/ext/libsass/src/remove_placeholders.cpp +5 -5
  53. data/ext/libsass/src/remove_placeholders.hpp +3 -2
  54. data/ext/libsass/src/sass.cpp +33 -3
  55. data/ext/libsass/src/sass2scss.cpp +7 -0
  56. data/ext/libsass/src/sass_context.cpp +32 -62
  57. data/ext/libsass/src/sass_functions.cpp +3 -3
  58. data/ext/libsass/src/sass_values.cpp +5 -5
  59. data/ext/libsass/src/utf8/unchecked.h +16 -16
  60. data/ext/libsass/src/util.cpp +51 -30
  61. data/ext/libsass/src/util.hpp +6 -1
  62. data/ext/libsass/win/libsass.targets +0 -2
  63. data/ext/libsass/win/libsass.vcxproj.filters +0 -6
  64. data/lib/sassc/engine.rb +4 -1
  65. data/lib/sassc/error.rb +23 -1
  66. data/lib/sassc/version.rb +1 -1
  67. data/test/error_test.rb +27 -0
  68. data/test/native_test.rb +1 -1
  69. metadata +5 -5
  70. data/ext/libsass/include/sass/interface.h +0 -105
  71. data/ext/libsass/src/sass_interface.cpp +0 -215
@@ -162,13 +162,19 @@ namespace Sass {
162
162
  return src;
163
163
  }
164
164
 
165
+ // equivalent of STRING_REGULAR_EXPRESSIONS
166
+ const char* re_string_double_open(const char* src);
167
+ const char* re_string_double_close(const char* src);
168
+ const char* re_string_single_open(const char* src);
169
+ const char* re_string_single_close(const char* src);
170
+ const char* re_string_uri_open(const char* src);
171
+ const char* re_string_uri_close(const char* src);
172
+
165
173
  // Match a line comment.
166
174
  const char* line_comment(const char* src);
167
- const char* line_comment_prefix(const char* src);
168
175
 
169
176
  // Match a block comment.
170
177
  const char* block_comment(const char* src);
171
- const char* block_comment_prefix(const char* src);
172
178
  // Match either.
173
179
  const char* comment(const char* src);
174
180
  // Match double- and single-quoted strings.
@@ -218,6 +224,11 @@ namespace Sass {
218
224
  // const char* url_schema(const char* src);
219
225
  // const char* url_value(const char* src);
220
226
  const char* vendor_prefix(const char* src);
227
+
228
+ const char* re_special_directive(const char* src);
229
+ const char* re_prefixed_directive(const char* src);
230
+ const char* re_almost_any_value_token(const char* src);
231
+
221
232
  // Match CSS '@' keywords.
222
233
  const char* at_keyword(const char* src);
223
234
  const char* kwd_import(const char* src);
@@ -263,6 +274,7 @@ namespace Sass {
263
274
 
264
275
  const char* kwd_null(const char* src);
265
276
 
277
+ const char* re_selector_list(const char* src);
266
278
  const char* re_type_selector(const char* src);
267
279
  const char* re_static_expression(const char* src);
268
280
 
@@ -333,6 +345,7 @@ namespace Sass {
333
345
 
334
346
  // Match SCSS variable names.
335
347
  const char* variable(const char* src);
348
+ const char* calc_fn_call(const char* src);
336
349
 
337
350
  // IE stuff
338
351
  const char* ie_progid(const char* src);
@@ -68,13 +68,13 @@ namespace Sass {
68
68
  }
69
69
 
70
70
  void Remove_Placeholders::operator()(Media_Block* m) {
71
- Block* b = m->block();
72
- for (size_t i = 0, L = b->length(); i < L; ++i) {
73
- if ((*b)[i]) (*b)[i]->perform(this);
74
- }
71
+ operator()(m->block());
72
+ }
73
+ void Remove_Placeholders::operator()(Supports_Block* m) {
74
+ operator()(m->block());
75
75
  }
76
76
 
77
- void Remove_Placeholders::operator()(At_Rule* a) {
77
+ void Remove_Placeholders::operator()(Directive* a) {
78
78
  if (a->block()) a->block()->perform(this);
79
79
  }
80
80
 
@@ -17,7 +17,7 @@ namespace Sass {
17
17
 
18
18
  void fallback_impl(AST_Node* n) {}
19
19
 
20
- private:
20
+ public:
21
21
  Selector_List* remove_placeholders(Selector_List*);
22
22
 
23
23
  public:
@@ -27,7 +27,8 @@ namespace Sass {
27
27
  void operator()(Block*);
28
28
  void operator()(Ruleset*);
29
29
  void operator()(Media_Block*);
30
- void operator()(At_Rule*);
30
+ void operator()(Supports_Block*);
31
+ void operator()(Directive*);
31
32
 
32
33
  template <typename U>
33
34
  void fallback(U x) { return fallback_impl(x); }
@@ -11,18 +11,42 @@
11
11
  extern "C" {
12
12
  using namespace Sass;
13
13
 
14
+ // Allocate libsass heap memory
15
+ // Don't forget string termination!
16
+ void* ADDCALL sass_alloc_memory(size_t size)
17
+ {
18
+ void* ptr = malloc(size);
19
+ if (ptr == NULL)
20
+ out_of_memory();
21
+ return ptr;
22
+ }
23
+
24
+ char* ADDCALL sass_copy_c_string(const char* str)
25
+ {
26
+ size_t len = strlen(str) + 1;
27
+ char* cpy = (char*) sass_alloc_memory(len);
28
+ std::memcpy(cpy, str, len);
29
+ return cpy;
30
+ }
31
+
32
+ // Deallocate libsass heap memory
33
+ void ADDCALL sass_free_memory(void* ptr)
34
+ {
35
+ if (ptr) free (ptr);
36
+ }
37
+
14
38
  // caller must free the returned memory
15
39
  char* ADDCALL sass_string_quote (const char *str, const char quote_mark)
16
40
  {
17
41
  std::string quoted = quote(str, quote_mark);
18
- return sass_strdup(quoted.c_str());
42
+ return sass_copy_c_string(quoted.c_str());
19
43
  }
20
44
 
21
45
  // caller must free the returned memory
22
46
  char* ADDCALL sass_string_unquote (const char *str)
23
47
  {
24
48
  std::string unquoted = unquote(str);
25
- return sass_strdup(unquoted.c_str());
49
+ return sass_copy_c_string(unquoted.c_str());
26
50
  }
27
51
 
28
52
  // Make sure to free the returned value!
@@ -30,7 +54,7 @@ extern "C" {
30
54
  char* ADDCALL sass_resolve_file (const char* file, const char* paths[])
31
55
  {
32
56
  std::string resolved(File::find_file(file, paths));
33
- return sass_strdup(resolved.c_str());
57
+ return sass_copy_c_string(resolved.c_str());
34
58
  }
35
59
 
36
60
  // Get compiled libsass version
@@ -39,4 +63,10 @@ extern "C" {
39
63
  return LIBSASS_VERSION;
40
64
  }
41
65
 
66
+ // Get compiled libsass version
67
+ const char* ADDCALL libsass_language_version(void)
68
+ {
69
+ return LIBSASS_LANGUAGE_VERSION;
70
+ }
71
+
42
72
  }
@@ -528,6 +528,13 @@ namespace Sass
528
528
  // reset converter state
529
529
  converter.selector = false;
530
530
 
531
+ // looks like some undocumented behavior ...
532
+ // https://github.com/mgreter/sass2scss/issues/29
533
+ if (sass.substr(pos_left, 1) == "\\") {
534
+ converter.selector = true;
535
+ sass[pos_left] = ' ';
536
+ }
537
+
531
538
  // check if we have sass property syntax
532
539
  if (sass.substr(pos_left, 1) == ":" && sass.substr(pos_left, 2) != "::")
533
540
  {
@@ -28,7 +28,7 @@ extern "C" {
28
28
  #define IMPLEMENT_SASS_OPTION_STRING_ACCESSOR(type, option, def) \
29
29
  type ADDCALL sass_option_get_##option (struct Sass_Options* options) { return safe_str(options->option, def); } \
30
30
  void ADDCALL sass_option_set_##option (struct Sass_Options* options, type option) \
31
- { free(options->option); options->option = option || def ? sass_strdup(option ? option : def) : 0; }
31
+ { free(options->option); options->option = option || def ? sass_copy_c_string(option ? option : def) : 0; }
32
32
 
33
33
  #define IMPLEMENT_SASS_CONTEXT_GETTER(type, option) \
34
34
  type ADDCALL sass_context_get_##option (struct Sass_Context* ctx) { return ctx->option; }
@@ -36,7 +36,7 @@ extern "C" {
36
36
  type sass_context_take_##option (struct Sass_Context* ctx) \
37
37
  { type foo = ctx->option; ctx->option = 0; return foo; }
38
38
 
39
- static int handle_errors(Sass_Context* c_ctx) {
39
+ static int handle_error(Sass_Context* c_ctx) {
40
40
  try {
41
41
  throw;
42
42
  }
@@ -105,11 +105,11 @@ extern "C" {
105
105
  json_append_member(json_err, "message", json_mkstring(e.what()));
106
106
  json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
107
107
 
108
- c_ctx->error_json = json_stringify(json_err, " ");;
109
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
110
- c_ctx->error_text = sass_strdup(e.what());
108
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
109
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
110
+ c_ctx->error_text = sass_copy_c_string(e.what());
111
111
  c_ctx->error_status = 1;
112
- c_ctx->error_file = sass_strdup(e.pstate.path);
112
+ c_ctx->error_file = sass_copy_c_string(e.pstate.path);
113
113
  c_ctx->error_line = e.pstate.line+1;
114
114
  c_ctx->error_column = e.pstate.column+1;
115
115
  c_ctx->error_src = e.pstate.src;
@@ -124,9 +124,9 @@ extern "C" {
124
124
  json_append_member(json_err, "status", json_mknumber(2));
125
125
  json_append_member(json_err, "message", json_mkstring(ba.what()));
126
126
  json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
127
- c_ctx->error_json = json_stringify(json_err, " ");;
128
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
129
- c_ctx->error_text = sass_strdup(ba.what());
127
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
128
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
129
+ c_ctx->error_text = sass_copy_c_string(ba.what());
130
130
  c_ctx->error_status = 2;
131
131
  c_ctx->output_string = 0;
132
132
  c_ctx->source_map_string = 0;
@@ -139,9 +139,9 @@ extern "C" {
139
139
  json_append_member(json_err, "status", json_mknumber(3));
140
140
  json_append_member(json_err, "message", json_mkstring(e.what()));
141
141
  json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
142
- c_ctx->error_json = json_stringify(json_err, " ");;
143
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
144
- c_ctx->error_text = sass_strdup(e.what());
142
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
143
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
144
+ c_ctx->error_text = sass_copy_c_string(e.what());
145
145
  c_ctx->error_status = 3;
146
146
  c_ctx->output_string = 0;
147
147
  c_ctx->source_map_string = 0;
@@ -154,9 +154,9 @@ extern "C" {
154
154
  json_append_member(json_err, "status", json_mknumber(4));
155
155
  json_append_member(json_err, "message", json_mkstring(e.c_str()));
156
156
  json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
157
- c_ctx->error_json = json_stringify(json_err, " ");;
158
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
159
- c_ctx->error_text = sass_strdup(e.c_str());
157
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
158
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
159
+ c_ctx->error_text = sass_copy_c_string(e.c_str());
160
160
  c_ctx->error_status = 4;
161
161
  c_ctx->output_string = 0;
162
162
  c_ctx->source_map_string = 0;
@@ -169,9 +169,9 @@ extern "C" {
169
169
  json_append_member(json_err, "status", json_mknumber(4));
170
170
  json_append_member(json_err, "message", json_mkstring(e));
171
171
  json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
172
- c_ctx->error_json = json_stringify(json_err, " ");;
173
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
174
- c_ctx->error_text = sass_strdup(e);
172
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
173
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
174
+ c_ctx->error_text = sass_copy_c_string(e);
175
175
  c_ctx->error_status = 4;
176
176
  c_ctx->output_string = 0;
177
177
  c_ctx->source_map_string = 0;
@@ -183,9 +183,9 @@ extern "C" {
183
183
  msg_stream << "Unknown error occurred" << std::endl;
184
184
  json_append_member(json_err, "status", json_mknumber(5));
185
185
  json_append_member(json_err, "message", json_mkstring("unknown"));
186
- c_ctx->error_json = json_stringify(json_err, " ");;
187
- c_ctx->error_message = sass_strdup(msg_stream.str().c_str());
188
- c_ctx->error_text = sass_strdup("unknown");
186
+ try { c_ctx->error_json = json_stringify(json_err, " "); } catch(...) {}
187
+ c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
188
+ c_ctx->error_text = sass_copy_c_string("unknown");
189
189
  c_ctx->error_status = 5;
190
190
  c_ctx->output_string = 0;
191
191
  c_ctx->source_map_string = 0;
@@ -194,48 +194,18 @@ extern "C" {
194
194
  return c_ctx->error_status;
195
195
  }
196
196
 
197
+ // allow one error handler to throw another error
198
+ // this can happen with invalid utf8 and json lib
199
+ static int handle_errors(Sass_Context* c_ctx) {
200
+ try { return handle_error(c_ctx); }
201
+ catch (...) { return handle_error(c_ctx); }
202
+ return c_ctx->error_status;
203
+ }
204
+
197
205
  // generic compilation function (not exported, use file/data compile instead)
198
206
  static Sass_Compiler* sass_prepare_context (Sass_Context* c_ctx, Context* cpp_ctx) throw()
199
207
  {
200
208
  try {
201
-
202
- // convert include path linked list to static array
203
- struct string_list* inc = c_ctx->include_paths;
204
- // very poor loop to get the length of the linked list
205
- size_t inc_size = 0; while (inc) { inc_size ++; inc = inc->next; }
206
- // create char* array to hold all paths plus null terminator
207
- const char** include_paths = (const char**) calloc(inc_size + 1, sizeof(char*));
208
- if (include_paths == 0) throw(std::bad_alloc());
209
- // reset iterator
210
- inc = c_ctx->include_paths;
211
- // copy over the paths
212
- for (size_t i = 0; inc; i++) {
213
- include_paths[i] = inc->string;
214
- inc = inc->next;
215
- }
216
-
217
- // convert plugin path linked list to static array
218
- struct string_list* imp = c_ctx->plugin_paths;
219
- // very poor loop to get the length of the linked list
220
- size_t imp_size = 0; while (imp) { imp_size ++; imp = imp->next; }
221
- // create char* array to hold all paths plus null terminator
222
- const char** plugin_paths = (const char**) calloc(imp_size + 1, sizeof(char*));
223
- if (plugin_paths == 0) {
224
- free(include_paths); //free include_paths before throw
225
- throw(std::bad_alloc());
226
- }
227
- // reset iterator
228
- imp = c_ctx->plugin_paths;
229
- // copy over the paths
230
- for (size_t i = 0; imp; i++) {
231
- plugin_paths[i] = imp->string;
232
- imp = imp->next;
233
- }
234
-
235
- // free intermediate data
236
- free(include_paths);
237
- free(plugin_paths);
238
-
239
209
  // register our custom functions
240
210
  if (c_ctx->c_functions) {
241
211
  auto this_func_data = c_ctx->c_functions;
@@ -565,7 +535,7 @@ extern "C" {
565
535
  static void sass_clear_context (struct Sass_Context* ctx)
566
536
  {
567
537
  if (ctx == 0) return;
568
- // release the allocated memory (mostly via sass_strdup)
538
+ // release the allocated memory (mostly via sass_copy_c_string)
569
539
  if (ctx->output_string) free(ctx->output_string);
570
540
  if (ctx->source_map_string) free(ctx->source_map_string);
571
541
  if (ctx->error_message) free(ctx->error_message);
@@ -695,7 +665,7 @@ extern "C" {
695
665
 
696
666
  struct string_list* include_path = (struct string_list*) calloc(1, sizeof(struct string_list));
697
667
  if (include_path == 0) return;
698
- include_path->string = path ? sass_strdup(path) : 0;
668
+ include_path->string = path ? sass_copy_c_string(path) : 0;
699
669
  struct string_list* last = options->include_paths;
700
670
  if (!options->include_paths) {
701
671
  options->include_paths = include_path;
@@ -713,7 +683,7 @@ extern "C" {
713
683
 
714
684
  struct string_list* plugin_path = (struct string_list*) calloc(1, sizeof(struct string_list));
715
685
  if (plugin_path == 0) return;
716
- plugin_path->string = path ? sass_strdup(path) : 0;
686
+ plugin_path->string = path ? sass_copy_c_string(path) : 0;
717
687
  struct string_list* last = options->plugin_paths;
718
688
  if (!options->plugin_paths) {
719
689
  options->plugin_paths = plugin_path;
@@ -72,8 +72,8 @@ extern "C" {
72
72
  {
73
73
  Sass_Import* v = (Sass_Import*) calloc(1, sizeof(Sass_Import));
74
74
  if (v == 0) return 0;
75
- v->imp_path = imp_path ? sass_strdup(imp_path) : 0;
76
- v->abs_path = abs_path ? sass_strdup(abs_path) : 0;
75
+ v->imp_path = imp_path ? sass_copy_c_string(imp_path) : 0;
76
+ v->abs_path = abs_path ? sass_copy_c_string(abs_path) : 0;
77
77
  v->source = source;
78
78
  v->srcmap = srcmap;
79
79
  v->error = 0;
@@ -93,7 +93,7 @@ extern "C" {
93
93
  {
94
94
  if (import == 0) return 0;
95
95
  if (import->error) free(import->error);
96
- import->error = error ? sass_strdup(error) : 0;
96
+ import->error = error ? sass_copy_c_string(error) : 0;
97
97
  import->line = line ? line : -1;
98
98
  import->column = col ? col : -1;
99
99
  return import;
@@ -91,7 +91,7 @@ extern "C" {
91
91
  if (v == 0) return 0;
92
92
  v->number.tag = SASS_NUMBER;
93
93
  v->number.value = val;
94
- v->number.unit = unit ? sass_strdup(unit) : 0;
94
+ v->number.unit = unit ? sass_copy_c_string(unit) : 0;
95
95
  if (v->number.unit == 0) { free(v); return 0; }
96
96
  return v;
97
97
  }
@@ -114,7 +114,7 @@ extern "C" {
114
114
  if (v == 0) return 0;
115
115
  v->string.quoted = false;
116
116
  v->string.tag = SASS_STRING;
117
- v->string.value = val ? sass_strdup(val) : 0;
117
+ v->string.value = val ? sass_copy_c_string(val) : 0;
118
118
  if (v->string.value == 0) { free(v); return 0; }
119
119
  return v;
120
120
  }
@@ -125,7 +125,7 @@ extern "C" {
125
125
  if (v == 0) return 0;
126
126
  v->string.quoted = true;
127
127
  v->string.tag = SASS_STRING;
128
- v->string.value = val ? sass_strdup(val) : 0;
128
+ v->string.value = val ? sass_copy_c_string(val) : 0;
129
129
  if (v->string.value == 0) { free(v); return 0; }
130
130
  return v;
131
131
  }
@@ -166,7 +166,7 @@ extern "C" {
166
166
  union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
167
167
  if (v == 0) return 0;
168
168
  v->error.tag = SASS_ERROR;
169
- v->error.message = msg ? sass_strdup(msg) : 0;
169
+ v->error.message = msg ? sass_copy_c_string(msg) : 0;
170
170
  if (v->error.message == 0) { free(v); return 0; }
171
171
  return v;
172
172
  }
@@ -176,7 +176,7 @@ extern "C" {
176
176
  union Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
177
177
  if (v == 0) return 0;
178
178
  v->warning.tag = SASS_WARNING;
179
- v->warning.message = msg ? sass_strdup(msg) : 0;
179
+ v->warning.message = msg ? sass_copy_c_string(msg) : 0;
180
180
  if (v->warning.message == 0) { free(v); return 0; }
181
181
  return v;
182
182
  }
@@ -32,13 +32,13 @@ DEALINGS IN THE SOFTWARE.
32
32
 
33
33
  namespace utf8
34
34
  {
35
- namespace unchecked
35
+ namespace unchecked
36
36
  {
37
37
  template <typename octet_iterator>
38
38
  octet_iterator append(uint32_t cp, octet_iterator result)
39
39
  {
40
40
  if (cp < 0x80) // one octet
41
- *(result++) = static_cast<uint8_t>(cp);
41
+ *(result++) = static_cast<uint8_t>(cp);
42
42
  else if (cp < 0x800) { // two octets
43
43
  *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
44
44
  *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
@@ -70,28 +70,28 @@ namespace utf8
70
70
  cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
71
71
  break;
72
72
  case 3:
73
- ++it;
73
+ ++it;
74
74
  cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
75
75
  ++it;
76
76
  cp += (*it) & 0x3f;
77
77
  break;
78
78
  case 4:
79
79
  ++it;
80
- cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
80
+ cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
81
81
  ++it;
82
82
  cp += (utf8::internal::mask8(*it) << 6) & 0xfff;
83
83
  ++it;
84
- cp += (*it) & 0x3f;
84
+ cp += (*it) & 0x3f;
85
85
  break;
86
86
  }
87
87
  ++it;
88
- return cp;
88
+ return cp;
89
89
  }
90
90
 
91
91
  template <typename octet_iterator>
92
92
  uint32_t peek_next(octet_iterator it)
93
93
  {
94
- return utf8::unchecked::next(it);
94
+ return utf8::unchecked::next(it);
95
95
  }
96
96
 
97
97
  template <typename octet_iterator>
@@ -121,14 +121,14 @@ namespace utf8
121
121
  distance (octet_iterator first, octet_iterator last)
122
122
  {
123
123
  typename std::iterator_traits<octet_iterator>::difference_type dist;
124
- for (dist = 0; first < last; ++dist)
124
+ for (dist = 0; first < last; ++dist)
125
125
  utf8::unchecked::next(first);
126
126
  return dist;
127
127
  }
128
128
 
129
129
  template <typename u16bit_iterator, typename octet_iterator>
130
130
  octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
131
- {
131
+ {
132
132
  while (start != end) {
133
133
  uint32_t cp = utf8::internal::mask16(*start++);
134
134
  // Take care of surrogate pairs first
@@ -138,7 +138,7 @@ namespace utf8
138
138
  }
139
139
  result = utf8::unchecked::append(cp, result);
140
140
  }
141
- return result;
141
+ return result;
142
142
  }
143
143
 
144
144
  template <typename u16bit_iterator, typename octet_iterator>
@@ -176,7 +176,7 @@ namespace utf8
176
176
 
177
177
  // The iterator class
178
178
  template <typename octet_iterator>
179
- class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
179
+ class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
180
180
  octet_iterator it;
181
181
  public:
182
182
  iterator () {}
@@ -188,15 +188,15 @@ namespace utf8
188
188
  octet_iterator temp = it;
189
189
  return utf8::unchecked::next(temp);
190
190
  }
191
- bool operator == (const iterator& rhs) const
192
- {
191
+ bool operator == (const iterator& rhs) const
192
+ {
193
193
  return (it == rhs.it);
194
194
  }
195
195
  bool operator != (const iterator& rhs) const
196
196
  {
197
197
  return !(operator == (rhs));
198
198
  }
199
- iterator& operator ++ ()
199
+ iterator& operator ++ ()
200
200
  {
201
201
  ::std::advance(it, utf8::internal::sequence_length(it));
202
202
  return *this;
@@ -206,7 +206,7 @@ namespace utf8
206
206
  iterator temp = *this;
207
207
  ::std::advance(it, utf8::internal::sequence_length(it));
208
208
  return temp;
209
- }
209
+ }
210
210
  iterator& operator -- ()
211
211
  {
212
212
  utf8::unchecked::prior(it);
@@ -221,7 +221,7 @@ namespace utf8
221
221
  }; // class iterator
222
222
 
223
223
  } // namespace utf8::unchecked
224
- } // namespace utf8
224
+ } // namespace utf8
225
225
 
226
226
 
227
227
  #endif // header guard