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
9namespace 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

source code of gtk/subprojects/libsass/src/c2ast.cpp