@@ -86,65 +86,65 @@ extern "C" {
8686 };
8787
8888 // Return the sass tag for a generic sass value
89- enum Sass_Tag sass_value_get_tag (union Sass_Value* v) { return v->unknown .tag ; }
89+ enum Sass_Tag sass_value_get_tag (const union Sass_Value* v) { return v->unknown .tag ; }
9090
9191 // Check value for specified type
92- bool sass_value_is_null (union Sass_Value* v) { return v->unknown .tag == SASS_NULL; }
93- bool sass_value_is_number (union Sass_Value* v) { return v->unknown .tag == SASS_NUMBER; }
94- bool sass_value_is_string (union Sass_Value* v) { return v->unknown .tag == SASS_STRING; }
95- bool sass_value_is_boolean (union Sass_Value* v) { return v->unknown .tag == SASS_BOOLEAN; }
96- bool sass_value_is_color (union Sass_Value* v) { return v->unknown .tag == SASS_COLOR; }
97- bool sass_value_is_list (union Sass_Value* v) { return v->unknown .tag == SASS_LIST; }
98- bool sass_value_is_map (union Sass_Value* v) { return v->unknown .tag == SASS_MAP; }
99- bool sass_value_is_error (union Sass_Value* v) { return v->unknown .tag == SASS_ERROR; }
100- bool sass_value_is_warning (union Sass_Value* v) { return v->unknown .tag == SASS_WARNING; }
92+ bool sass_value_is_null (const union Sass_Value* v) { return v->unknown .tag == SASS_NULL; }
93+ bool sass_value_is_number (const union Sass_Value* v) { return v->unknown .tag == SASS_NUMBER; }
94+ bool sass_value_is_string (const union Sass_Value* v) { return v->unknown .tag == SASS_STRING; }
95+ bool sass_value_is_boolean (const union Sass_Value* v) { return v->unknown .tag == SASS_BOOLEAN; }
96+ bool sass_value_is_color (const union Sass_Value* v) { return v->unknown .tag == SASS_COLOR; }
97+ bool sass_value_is_list (const union Sass_Value* v) { return v->unknown .tag == SASS_LIST; }
98+ bool sass_value_is_map (const union Sass_Value* v) { return v->unknown .tag == SASS_MAP; }
99+ bool sass_value_is_error (const union Sass_Value* v) { return v->unknown .tag == SASS_ERROR; }
100+ bool sass_value_is_warning (const union Sass_Value* v) { return v->unknown .tag == SASS_WARNING; }
101101
102102 // Getters and setters for Sass_Number
103- double sass_number_get_value (union Sass_Value* v) { return v->number .value ; }
103+ double sass_number_get_value (const union Sass_Value* v) { return v->number .value ; }
104104 void sass_number_set_value (union Sass_Value* v, double value) { v->number .value = value; }
105- const char * sass_number_get_unit (union Sass_Value* v) { return v->number .unit ; }
105+ const char * sass_number_get_unit (const union Sass_Value* v) { return v->number .unit ; }
106106 void sass_number_set_unit (union Sass_Value* v, char * unit) { v->number .unit = unit; }
107107
108108 // Getters and setters for Sass_String
109- const char * sass_string_get_value (union Sass_Value* v) { return v->string .value ; }
109+ const char * sass_string_get_value (const union Sass_Value* v) { return v->string .value ; }
110110 void sass_string_set_value (union Sass_Value* v, char * value) { v->string .value = value; }
111111
112112 // Getters and setters for Sass_Boolean
113- bool sass_boolean_get_value (union Sass_Value* v) { return v->boolean .value ; }
113+ bool sass_boolean_get_value (const union Sass_Value* v) { return v->boolean .value ; }
114114 void sass_boolean_set_value (union Sass_Value* v, bool value) { v->boolean .value = value; }
115115
116116 // Getters and setters for Sass_Color
117- double sass_color_get_r (union Sass_Value* v) { return v->color .r ; }
117+ double sass_color_get_r (const union Sass_Value* v) { return v->color .r ; }
118118 void sass_color_set_r (union Sass_Value* v, double r) { v->color .r = r; }
119- double sass_color_get_g (union Sass_Value* v) { return v->color .g ; }
119+ double sass_color_get_g (const union Sass_Value* v) { return v->color .g ; }
120120 void sass_color_set_g (union Sass_Value* v, double g) { v->color .g = g; }
121- double sass_color_get_b (union Sass_Value* v) { return v->color .b ; }
121+ double sass_color_get_b (const union Sass_Value* v) { return v->color .b ; }
122122 void sass_color_set_b (union Sass_Value* v, double b) { v->color .b = b; }
123- double sass_color_get_a (union Sass_Value* v) { return v->color .a ; }
123+ double sass_color_get_a (const union Sass_Value* v) { return v->color .a ; }
124124 void sass_color_set_a (union Sass_Value* v, double a) { v->color .a = a; }
125125
126126 // Getters and setters for Sass_List
127- size_t sass_list_get_length (union Sass_Value* v) { return v->list .length ; }
128- enum Sass_Separator sass_list_get_separator (union Sass_Value* v) { return v->list .separator ; }
127+ size_t sass_list_get_length (const union Sass_Value* v) { return v->list .length ; }
128+ enum Sass_Separator sass_list_get_separator (const union Sass_Value* v) { return v->list .separator ; }
129129 void sass_list_set_separator (union Sass_Value* v, enum Sass_Separator separator) { v->list .separator = separator; }
130130 // Getters and setters for Sass_List values
131- union Sass_Value* sass_list_get_value (union Sass_Value* v, size_t i) { return v->list .values [i]; }
131+ union Sass_Value* sass_list_get_value (const union Sass_Value* v, size_t i) { return v->list .values [i]; }
132132 void sass_list_set_value (union Sass_Value* v, size_t i, union Sass_Value* value) { v->list .values [i] = value; }
133133
134134 // Getters and setters for Sass_Map
135- size_t sass_map_get_length (union Sass_Value* v) { return v->map .length ; }
135+ size_t sass_map_get_length (const union Sass_Value* v) { return v->map .length ; }
136136 // Getters and setters for Sass_List keys and values
137- union Sass_Value* sass_map_get_key (union Sass_Value* v, size_t i) { return v->map .pairs [i].key ; }
138- union Sass_Value* sass_map_get_value (union Sass_Value* v, size_t i) { return v->map .pairs [i].value ; }
137+ union Sass_Value* sass_map_get_key (const union Sass_Value* v, size_t i) { return v->map .pairs [i].key ; }
138+ union Sass_Value* sass_map_get_value (const union Sass_Value* v, size_t i) { return v->map .pairs [i].value ; }
139139 void sass_map_set_key (union Sass_Value* v, size_t i, union Sass_Value* key) { v->map .pairs [i].key = key; }
140140 void sass_map_set_value (union Sass_Value* v, size_t i, union Sass_Value* val) { v->map .pairs [i].value = val; }
141141
142142 // Getters and setters for Sass_Error
143- char * sass_error_get_message (union Sass_Value* v) { return v->error .message ; };
143+ char * sass_error_get_message (const union Sass_Value* v) { return v->error .message ; };
144144 void sass_error_set_message (union Sass_Value* v, char * msg) { v->error .message = msg; };
145145
146146 // Getters and setters for Sass_Warning
147- char * sass_warning_get_message (union Sass_Value* v) { return v->warning .message ; };
147+ char * sass_warning_get_message (const union Sass_Value* v) { return v->warning .message ; };
148148 void sass_warning_set_message (union Sass_Value* v, char * msg) { v->warning .message = msg; };
149149
150150 // Creator functions for all value types
@@ -283,6 +283,55 @@ extern "C" {
283283
284284 free (val);
285285
286+ }
287+
288+ // Make a deep cloned copy of the given sass value
289+ union Sass_Value* sass_clone_value (const union Sass_Value* val)
290+ {
291+
292+ size_t i;
293+ if (val == 0 ) return 0 ;
294+ switch (val->unknown .tag ) {
295+ case SASS_NULL: {
296+ return sass_make_null ();
297+ } break ;
298+ case SASS_BOOLEAN: {
299+ return sass_make_boolean (val->boolean .value );
300+ } break ;
301+ case SASS_NUMBER: {
302+ return sass_make_number (val->number .value , val->number .unit );
303+ } break ;
304+ case SASS_COLOR: {
305+ return sass_make_color (val->color .r , val->color .g , val->color .b , val->color .a );
306+ } break ;
307+ case SASS_STRING: {
308+ return sass_make_string (val->string .value );
309+ } break ;
310+ case SASS_LIST: {
311+ union Sass_Value* list = sass_make_list (val->list .length , val->list .separator );
312+ for (i = 0 ; i < list->list .length ; i++) {
313+ list->list .values [i] = sass_clone_value (val->list .values [i]);
314+ }
315+ return list;
316+ } break ;
317+ case SASS_MAP: {
318+ union Sass_Value* map = sass_make_map (val->map .length );
319+ for (i = 0 ; i < val->map .length ; i++) {
320+ map->map .pairs [i].key = sass_clone_value (val->map .pairs [i].key );
321+ map->map .pairs [i].value = sass_clone_value (val->map .pairs [i].value );
322+ }
323+ return map;
324+ } break ;
325+ case SASS_ERROR: {
326+ return sass_make_error (val->error .message );
327+ } break ;
328+ case SASS_WARNING: {
329+ return sass_make_warning (val->warning .message );
330+ } break ;
331+ }
332+
333+ return 0 ;
334+
286335 }
287336
288337}
0 commit comments