Skip to content

Commit 7aaa45a

Browse files
committed
Merge pull request #692 from mgreter/fix/const_sass_values
Make Sass_Values const in API function calls
2 parents 48e97c2 + 6274460 commit 7aaa45a

File tree

3 files changed

+102
-53
lines changed

3 files changed

+102
-53
lines changed

sass_functions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ struct Sass_C_Function_Descriptor;
6363
typedef struct Sass_C_Function_Descriptor* (*Sass_C_Function_List);
6464
typedef struct Sass_C_Function_Descriptor (*Sass_C_Function_Callback);
6565
// Typedef defining custom function prototype and its return value type
66-
typedef union Sass_Value*(*Sass_C_Function) (union Sass_Value*, void* cookie);
66+
typedef union Sass_Value*(*Sass_C_Function) (const union Sass_Value*, void* cookie);
6767

6868

6969
// Creators for sass function list and function descriptors

sass_values.cpp

Lines changed: 75 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

sass_values.h

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,67 +33,67 @@ enum Sass_Separator {
3333

3434
// Return the sass tag for a generic sass value
3535
// Check is needed before accessing specific values!
36-
enum Sass_Tag sass_value_get_tag (union Sass_Value* v);
36+
enum Sass_Tag sass_value_get_tag (const union Sass_Value* v);
3737

3838
// Check value to be of a specific type
3939
// Can also be used before accessing properties!
40-
bool sass_value_is_null (union Sass_Value* v);
41-
bool sass_value_is_number (union Sass_Value* v);
42-
bool sass_value_is_string (union Sass_Value* v);
43-
bool sass_value_is_boolean (union Sass_Value* v);
44-
bool sass_value_is_color (union Sass_Value* v);
45-
bool sass_value_is_list (union Sass_Value* v);
46-
bool sass_value_is_map (union Sass_Value* v);
47-
bool sass_value_is_error (union Sass_Value* v);
48-
bool sass_value_is_warning (union Sass_Value* v);
40+
bool sass_value_is_null (const union Sass_Value* v);
41+
bool sass_value_is_number (const union Sass_Value* v);
42+
bool sass_value_is_string (const union Sass_Value* v);
43+
bool sass_value_is_boolean (const union Sass_Value* v);
44+
bool sass_value_is_color (const union Sass_Value* v);
45+
bool sass_value_is_list (const union Sass_Value* v);
46+
bool sass_value_is_map (const union Sass_Value* v);
47+
bool sass_value_is_error (const union Sass_Value* v);
48+
bool sass_value_is_warning (const union Sass_Value* v);
4949

5050
// Getters and setters for Sass_Number
51-
double sass_number_get_value (union Sass_Value* v);
51+
double sass_number_get_value (const union Sass_Value* v);
5252
void sass_number_set_value (union Sass_Value* v, double value);
53-
const char* sass_number_get_unit (union Sass_Value* v);
53+
const char* sass_number_get_unit (const union Sass_Value* v);
5454
void sass_number_set_unit (union Sass_Value* v, char* unit);
5555

5656
// Getters and setters for Sass_String
57-
const char* sass_string_get_value (union Sass_Value* v);
57+
const char* sass_string_get_value (const union Sass_Value* v);
5858
void sass_string_set_value (union Sass_Value* v, char* value);
5959

6060
// Getters and setters for Sass_Boolean
61-
bool sass_boolean_get_value (union Sass_Value* v);
61+
bool sass_boolean_get_value (const union Sass_Value* v);
6262
void sass_boolean_set_value (union Sass_Value* v, bool value);
6363

6464
// Getters and setters for Sass_Color
65-
double sass_color_get_r (union Sass_Value* v);
65+
double sass_color_get_r (const union Sass_Value* v);
6666
void sass_color_set_r (union Sass_Value* v, double r);
67-
double sass_color_get_g (union Sass_Value* v);
67+
double sass_color_get_g (const union Sass_Value* v);
6868
void sass_color_set_g (union Sass_Value* v, double g);
69-
double sass_color_get_b (union Sass_Value* v);
69+
double sass_color_get_b (const union Sass_Value* v);
7070
void sass_color_set_b (union Sass_Value* v, double b);
71-
double sass_color_get_a (union Sass_Value* v);
71+
double sass_color_get_a (const union Sass_Value* v);
7272
void sass_color_set_a (union Sass_Value* v, double a);
7373

7474
// Getter for the number of items in list
75-
size_t sass_list_get_length (union Sass_Value* v);
75+
size_t sass_list_get_length (const union Sass_Value* v);
7676
// Getters and setters for Sass_List
77-
enum Sass_Separator sass_list_get_separator (union Sass_Value* v);
77+
enum Sass_Separator sass_list_get_separator (const union Sass_Value* v);
7878
void sass_list_set_separator (union Sass_Value* v, enum Sass_Separator value);
7979
// Getters and setters for Sass_List values
80-
union Sass_Value* sass_list_get_value (union Sass_Value* v, size_t i);
80+
union Sass_Value* sass_list_get_value (const union Sass_Value* v, size_t i);
8181
void sass_list_set_value (union Sass_Value* v, size_t i, union Sass_Value* value);
8282

8383
// Getter for the number of items in map
84-
size_t sass_map_get_length (union Sass_Value* v);
84+
size_t sass_map_get_length (const union Sass_Value* v);
8585
// Getters and setters for Sass_List keys and values
86-
union Sass_Value* sass_map_get_key (union Sass_Value* v, size_t i);
86+
union Sass_Value* sass_map_get_key (const union Sass_Value* v, size_t i);
8787
void sass_map_set_key (union Sass_Value* v, size_t i, union Sass_Value*);
88-
union Sass_Value* sass_map_get_value (union Sass_Value* v, size_t i);
88+
union Sass_Value* sass_map_get_value (const union Sass_Value* v, size_t i);
8989
void sass_map_set_value (union Sass_Value* v, size_t i, union Sass_Value*);
9090

9191
// Getters and setters for Sass_Error
92-
char* sass_error_get_message (union Sass_Value* v);
92+
char* sass_error_get_message (const union Sass_Value* v);
9393
void sass_error_set_message (union Sass_Value* v, char* msg);
9494

9595
// Getters and setters for Sass_Warning
96-
char* sass_warning_get_message (union Sass_Value* v);
96+
char* sass_warning_get_message (const union Sass_Value* v);
9797
void sass_warning_set_message (union Sass_Value* v, char* msg);
9898

9999
// Creator functions for all value types

0 commit comments

Comments
 (0)