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.
- checksums.yaml +4 -4
- data/README.md +30 -3
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +1 -1
- data/ext/libsass/GNUmakefile.am +7 -7
- data/ext/libsass/Makefile +7 -4
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/appveyor.yml +6 -2
- data/ext/libsass/docs/api-context.md +4 -4
- data/ext/libsass/docs/api-doc.md +29 -11
- data/ext/libsass/docs/api-importer-example.md +5 -5
- data/ext/libsass/docs/build-on-windows.md +1 -1
- data/ext/libsass/include/sass/base.h +10 -0
- data/ext/libsass/include/sass/version.h +4 -0
- data/ext/libsass/include/sass/version.h.in +4 -0
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +15 -3
- data/ext/libsass/src/ast.cpp +161 -6
- data/ext/libsass/src/ast.hpp +71 -44
- data/ext/libsass/src/ast_factory.hpp +1 -1
- data/ext/libsass/src/ast_fwd_decl.hpp +2 -2
- data/ext/libsass/src/constants.cpp +2 -4
- data/ext/libsass/src/constants.hpp +3 -4
- data/ext/libsass/src/context.cpp +16 -17
- data/ext/libsass/src/context.hpp +2 -2
- data/ext/libsass/src/cssize.cpp +19 -8
- data/ext/libsass/src/cssize.hpp +5 -2
- data/ext/libsass/src/debugger.hpp +6 -3
- data/ext/libsass/src/emitter.cpp +1 -1
- data/ext/libsass/src/environment.cpp +1 -1
- data/ext/libsass/src/eval.cpp +42 -14
- data/ext/libsass/src/eval.hpp +1 -1
- data/ext/libsass/src/expand.cpp +24 -8
- data/ext/libsass/src/expand.hpp +2 -1
- data/ext/libsass/src/extend.cpp +55 -15
- data/ext/libsass/src/extend.hpp +5 -1
- data/ext/libsass/src/functions.cpp +10 -5
- data/ext/libsass/src/inspect.cpp +25 -19
- data/ext/libsass/src/inspect.hpp +2 -2
- data/ext/libsass/src/json.cpp +20 -9
- data/ext/libsass/src/json.hpp +5 -5
- data/ext/libsass/src/lexer.cpp +4 -1
- data/ext/libsass/src/lexer.hpp +21 -0
- data/ext/libsass/src/listize.cpp +2 -1
- data/ext/libsass/src/operation.hpp +4 -4
- data/ext/libsass/src/output.cpp +1 -1
- data/ext/libsass/src/output.hpp +1 -1
- data/ext/libsass/src/parser.cpp +189 -90
- data/ext/libsass/src/parser.hpp +42 -2
- data/ext/libsass/src/prelexer.cpp +474 -7
- data/ext/libsass/src/prelexer.hpp +15 -2
- data/ext/libsass/src/remove_placeholders.cpp +5 -5
- data/ext/libsass/src/remove_placeholders.hpp +3 -2
- data/ext/libsass/src/sass.cpp +33 -3
- data/ext/libsass/src/sass2scss.cpp +7 -0
- data/ext/libsass/src/sass_context.cpp +32 -62
- data/ext/libsass/src/sass_functions.cpp +3 -3
- data/ext/libsass/src/sass_values.cpp +5 -5
- data/ext/libsass/src/utf8/unchecked.h +16 -16
- data/ext/libsass/src/util.cpp +51 -30
- data/ext/libsass/src/util.hpp +6 -1
- data/ext/libsass/win/libsass.targets +0 -2
- data/ext/libsass/win/libsass.vcxproj.filters +0 -6
- data/lib/sassc/engine.rb +4 -1
- data/lib/sassc/error.rb +23 -1
- data/lib/sassc/version.rb +1 -1
- data/test/error_test.rb +27 -0
- data/test/native_test.rb +1 -1
- metadata +5 -5
- data/ext/libsass/include/sass/interface.h +0 -105
- 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
|
-
|
72
|
-
|
73
|
-
|
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()(
|
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
|
-
|
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()(
|
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); }
|
data/ext/libsass/src/sass.cpp
CHANGED
@@ -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
|
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
|
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
|
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 ?
|
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
|
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 =
|
110
|
-
c_ctx->error_text =
|
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 =
|
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 =
|
129
|
-
c_ctx->error_text =
|
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 =
|
144
|
-
c_ctx->error_text =
|
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 =
|
159
|
-
c_ctx->error_text =
|
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 =
|
174
|
-
c_ctx->error_text =
|
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 =
|
188
|
-
c_ctx->error_text =
|
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
|
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 ?
|
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 ?
|
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 ?
|
76
|
-
v->abs_path = abs_path ?
|
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 ?
|
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 ?
|
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 ?
|
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 ?
|
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 ?
|
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 ?
|
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
|