1 | #include "ast.hpp" |
2 | #include "units.hpp" |
3 | #include "position.hpp" |
4 | #include "backtrace.hpp" |
5 | #include "sass/values.h" |
6 | #include "ast_fwd_decl.hpp" |
7 | #include "error_handling.hpp" |
8 | |
9 | namespace Sass { |
10 | |
11 | Value* c2ast(union Sass_Value* v, Backtraces traces, SourceSpan pstate) |
12 | { |
13 | using std::strlen; |
14 | using std::strcpy; |
15 | Value* e = NULL; |
16 | switch (sass_value_get_tag(v)) { |
17 | case SASS_BOOLEAN: { |
18 | e = SASS_MEMORY_NEW(Boolean, pstate, !!sass_boolean_get_value(v)); |
19 | } break; |
20 | case SASS_NUMBER: { |
21 | e = SASS_MEMORY_NEW(Number, pstate, sass_number_get_value(v), sass_number_get_unit(v)); |
22 | } break; |
23 | case SASS_COLOR: { |
24 | e = SASS_MEMORY_NEW(Color_RGBA, pstate, sass_color_get_r(v), sass_color_get_g(v), sass_color_get_b(v), sass_color_get_a(v)); |
25 | } break; |
26 | case SASS_STRING: { |
27 | if (sass_string_is_quoted(v)) |
28 | e = SASS_MEMORY_NEW(String_Quoted, pstate, sass_string_get_value(v)); |
29 | else { |
30 | e = SASS_MEMORY_NEW(String_Constant, pstate, sass_string_get_value(v)); |
31 | } |
32 | } break; |
33 | case SASS_LIST: { |
34 | List* l = SASS_MEMORY_NEW(List, pstate, sass_list_get_length(v), sass_list_get_separator(v)); |
35 | for (size_t i = 0, L = sass_list_get_length(v); i < L; ++i) { |
36 | l->append(element: c2ast(v: sass_list_get_value(v, i), traces, pstate)); |
37 | } |
38 | l->is_bracketed(is_bracketed__: sass_list_get_is_bracketed(v)); |
39 | e = l; |
40 | } break; |
41 | case SASS_MAP: { |
42 | Map* m = SASS_MEMORY_NEW(Map, pstate); |
43 | for (size_t i = 0, L = sass_map_get_length(v); i < L; ++i) { |
44 | *m << std::make_pair( |
45 | x: c2ast(v: sass_map_get_key(v, i), traces, pstate), |
46 | y: c2ast(v: sass_map_get_value(v, i), traces, pstate)); |
47 | } |
48 | e = m; |
49 | } break; |
50 | case SASS_NULL: { |
51 | e = SASS_MEMORY_NEW(Null, pstate); |
52 | } break; |
53 | case SASS_ERROR: { |
54 | error(msg: "Error in C function: " + sass::string(sass_error_get_message(v)), pstate, traces); |
55 | } break; |
56 | case SASS_WARNING: { |
57 | error(msg: "Warning in C function: " + sass::string(sass_warning_get_message(v)), pstate, traces); |
58 | } break; |
59 | default: break; |
60 | } |
61 | return e; |
62 | } |
63 | |
64 | } |
65 | |