From: Charlie Brej Date: Fri, 3 Jul 2009 10:56:04 +0000 (+0100) Subject: [script] Simplify native functions by using the hash-cast access functions X-Git-Tag: 0.7.0~113 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5b7a7c81452ac105ee32d372d531926eee0a428;p=thirdparty%2Fplymouth.git [script] Simplify native functions by using the hash-cast access functions --- diff --git a/src/plugins/splash/script/script-lib-image.c b/src/plugins/splash/script/script-lib-image.c index 1c501ad4..9811c5f9 100644 --- a/src/plugins/splash/script/script-lib-image.c +++ b/src/plugins/splash/script/script-lib-image.c @@ -15,7 +15,6 @@ #include "config.h" #define STRINGIFY_VAR script_lib_image_string - #include "script-lib-image.string" @@ -25,14 +24,12 @@ static void image_free (script_obj* obj) ply_image_free (image); } - static script_return image_new (script_state* state, void* user_data) { script_lib_image_data_t* data = user_data; script_obj* reply; char* path_filename; char* filename = script_obj_hash_get_string (state->local, "filename"); - char* test_string = filename; char* prefix_string = "special://"; while (*test_string && *prefix_string && *test_string == *prefix_string){ @@ -64,83 +61,49 @@ static script_return image_new (script_state* state, void* user_data) static script_return image_get_width (script_state* state, void* user_data) { script_lib_image_data_t* data = user_data; - script_obj* script_obj_image = script_obj_hash_get_element (state->local, "image"); - script_obj_deref(&script_obj_image); - script_obj* reply; - if (script_obj_image->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_image->data.native.class == data->class){ - ply_image_t *image = script_obj_image->data.native.object_data; - reply = script_obj_new_int (ply_image_get_width (image)); - } - else - reply = script_obj_new_null (); - script_obj_unref(script_obj_image); - return (script_return){SCRIPT_RETURN_TYPE_RETURN, reply}; + ply_image_t *image = script_obj_hash_get_native_of_class (state->local, "image", data->class); + if (image) + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_int (ply_image_get_width (image))}; + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } static script_return image_get_height (script_state* state, void* user_data) { script_lib_image_data_t* data = user_data; - script_obj* script_obj_image = script_obj_hash_get_element (state->local, "image"); - script_obj_deref(&script_obj_image); - script_obj* reply; - if (script_obj_image->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_image->data.native.class == data->class){ - ply_image_t *image = script_obj_image->data.native.object_data; - reply = script_obj_new_int (ply_image_get_height (image)); - } - else - reply = script_obj_new_null (); - script_obj_unref(script_obj_image); - return (script_return){SCRIPT_RETURN_TYPE_RETURN, reply}; + ply_image_t *image = script_obj_hash_get_native_of_class (state->local, "image", data->class); + if (image) + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_int (ply_image_get_height (image))}; + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } - - static script_return image_rotate (script_state* state, void* user_data) { script_lib_image_data_t* data = user_data; - script_obj* script_obj_image = script_obj_hash_get_element (state->local, "image"); - script_obj_deref(&script_obj_image); + ply_image_t *image = script_obj_hash_get_native_of_class (state->local, "image", data->class); float angle = script_obj_hash_get_float (state->local, "angle"); - script_obj* reply; - if (script_obj_image->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_image->data.native.class == data->class){ - ply_image_t *image = script_obj_image->data.native.object_data; - ply_image_t *new_image = ply_image_rotate (image, ply_image_get_width (image)/2, ply_image_get_height (image)/2, angle); - reply = script_obj_new_native (new_image, data->class); + if (image){ + ply_image_t *new_image = ply_image_rotate (image, + ply_image_get_width (image) / 2, + ply_image_get_height (image) / 2, + angle); + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_native (new_image, data->class)}; } - else - reply = script_obj_new_null (); - script_obj_unref(script_obj_image); - return (script_return){SCRIPT_RETURN_TYPE_RETURN, reply}; + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } - - static script_return image_scale (script_state* state, void* user_data) { script_lib_image_data_t* data = user_data; - script_obj* script_obj_image = script_obj_hash_get_element (state->local, "image"); + ply_image_t *image = script_obj_hash_get_native_of_class (state->local, "image", data->class); int width = script_obj_hash_get_int (state->local, "width"); int height = script_obj_hash_get_int (state->local, "height"); - script_obj_deref(&script_obj_image); - script_obj* reply; - if (script_obj_image->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_image->data.native.class == data->class){ - ply_image_t *image = script_obj_image->data.native.object_data; + if (image){ ply_image_t *new_image = ply_image_resize (image, width, height); - reply = script_obj_new_native (new_image, data->class); + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_native (new_image, data->class)}; } - else - reply = script_obj_new_null (); - script_obj_unref(script_obj_image); - return (script_return){SCRIPT_RETURN_TYPE_RETURN, reply}; + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } - - - script_lib_image_data_t* script_lib_image_setup(script_state *state, char* image_dir) { script_lib_image_data_t* data = malloc(sizeof(script_lib_image_data_t)); @@ -155,7 +118,7 @@ script_lib_image_data_t* script_lib_image_setup(script_state *state, char* image data->script_main_op = script_parse_string (script_lib_image_string); script_return ret = script_execute(state, data->script_main_op); - if (ret.object) script_obj_unref(ret.object); // Throw anything sent back away + script_obj_unref(ret.object); return data; } diff --git a/src/plugins/splash/script/script-lib-math.c b/src/plugins/splash/script/script-lib-math.c index 02b7bf9a..d704b83d 100644 --- a/src/plugins/splash/script/script-lib-math.c +++ b/src/plugins/splash/script/script-lib-math.c @@ -30,12 +30,10 @@ static script_return script_lib_math_int_from_float_function (script_state* stat { int (*function) (float) = user_data; float value = script_obj_hash_get_float (state->local, "value"); - float reply_int = function(value); + int reply_int = function(value); return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_int (reply_int)}; } - - static int float_to_int (float value) { return (int) value; @@ -58,11 +56,8 @@ script_lib_math_data_t* script_lib_math_setup(script_state *state) return data; } - void script_lib_math_destroy(script_lib_math_data_t* data) { script_parse_op_free (data->script_main_op); free(data); } - - diff --git a/src/plugins/splash/script/script-lib-plymouth.c b/src/plugins/splash/script/script-lib-plymouth.c index 5a886f40..23b00ef8 100644 --- a/src/plugins/splash/script/script-lib-plymouth.c +++ b/src/plugins/splash/script/script-lib-plymouth.c @@ -84,7 +84,7 @@ void script_lib_plymouth_on_refresh(script_state* state, script_lib_plymouth_dat script_obj* refresh_func_obj = data->script_refresh_func; if (refresh_func_obj && refresh_func_obj->type == SCRIPT_OBJ_TYPE_FUNCTION){ script_return ret = script_execute_function (state, refresh_func_obj->data.function, NULL); - script_obj_unref(ret.object); // Throw anything sent back away + script_obj_unref(ret.object); } } @@ -95,7 +95,7 @@ void script_lib_plymouth_on_boot_progress(script_state* state, script_lib_plymou script_obj* duration_obj = script_obj_new_float (duration); script_obj* progress_obj = script_obj_new_float (progress); script_return ret = script_execute_function (state, boot_progress_func_obj->data.function, duration_obj, progress_obj, NULL); - script_obj_unref(ret.object); // Throw anything sent back away + script_obj_unref(ret.object); script_obj_unref(duration_obj); script_obj_unref(progress_obj); } diff --git a/src/plugins/splash/script/script-lib-plymouth.h b/src/plugins/splash/script/script-lib-plymouth.h index ac71daa1..43c03d57 100644 --- a/src/plugins/splash/script/script-lib-plymouth.h +++ b/src/plugins/splash/script/script-lib-plymouth.h @@ -10,7 +10,6 @@ typedef struct script_obj *script_boot_progress_func; script_obj *script_root_mounted_func; script_obj *script_keyboard_input_func; - script_obj *script_update_status_func; script_obj *script_display_normal_func; script_obj *script_display_password_func; diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c index 86c72105..f510db29 100644 --- a/src/plugins/splash/script/script-lib-sprite.c +++ b/src/plugins/splash/script/script-lib-sprite.c @@ -57,23 +57,19 @@ static script_return sprite_new (script_state* state, void* user_data) static script_return sprite_set_image (script_state* state, void* user_data) { script_lib_sprite_data_t* data = user_data; - script_obj* script_obj_sprite = script_obj_hash_get_element (state->local, "sprite"); - script_obj_deref(&script_obj_sprite); + sprite_t *sprite = script_obj_hash_get_native_of_class (state->local, "sprite", data->class); script_obj* script_obj_image = script_obj_hash_get_element (state->local, "image"); script_obj_deref(&script_obj_image); + ply_image_t *image = script_obj_as_native_of_class_name (script_obj_image, "image"); - if (script_obj_image->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->data.native.class == data->class){ - sprite_t *sprite = script_obj_sprite->data.native.object_data; - ply_image_t *image = script_obj_image->data.native.object_data; + + if (image && sprite){ script_obj_unref(sprite->image_obj); script_obj_ref(script_obj_image); sprite->image = image; sprite->image_obj = script_obj_image; sprite->refresh_me = true; } - script_obj_unref(script_obj_sprite); script_obj_unref(script_obj_image); return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; @@ -82,64 +78,44 @@ static script_return sprite_set_image (script_state* state, void* user_data) static script_return sprite_set_x (script_state* state, void* user_data) { script_lib_sprite_data_t* data = user_data; - script_obj* script_obj_sprite = script_obj_hash_get_element (state->local, "sprite"); - script_obj_deref(&script_obj_sprite); - int value = script_obj_hash_get_int (state->local, "value"); + sprite_t *sprite = script_obj_hash_get_native_of_class (state->local, "sprite", data->class); + + if (sprite) + sprite->x = script_obj_hash_get_int (state->local, "value"); - if (script_obj_sprite->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->data.native.class == data->class){ - sprite_t *sprite = script_obj_sprite->data.native.object_data; - sprite->x = value; - } - script_obj_unref(script_obj_sprite); return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } static script_return sprite_set_y (script_state* state, void* user_data) { script_lib_sprite_data_t* data = user_data; - script_obj* script_obj_sprite = script_obj_hash_get_element (state->local, "sprite"); - script_obj_deref(&script_obj_sprite); - int value = script_obj_hash_get_int (state->local, "value"); + sprite_t *sprite = script_obj_hash_get_native_of_class (state->local, "sprite", data->class); + + if (sprite) + sprite->y = script_obj_hash_get_int (state->local, "value"); - if (script_obj_sprite->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->data.native.class == data->class){ - sprite_t *sprite = script_obj_sprite->data.native.object_data; - sprite->y = value; - } - script_obj_unref(script_obj_sprite); return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } static script_return sprite_set_z (script_state* state, void* user_data) { script_lib_sprite_data_t* data = user_data; - script_obj* script_obj_sprite = script_obj_hash_get_element (state->local, "sprite"); - script_obj_deref(&script_obj_sprite); - int value = script_obj_hash_get_int (state->local, "value"); + sprite_t *sprite = script_obj_hash_get_native_of_class (state->local, "sprite", data->class); - if (script_obj_sprite->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->data.native.class == data->class){ - sprite_t *sprite = script_obj_sprite->data.native.object_data; - sprite->z = value; - } - script_obj_unref(script_obj_sprite); + if (sprite) + sprite->z = script_obj_hash_get_int (state->local, "value"); + return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } static script_return sprite_set_opacity (script_state* state, void* user_data) { script_lib_sprite_data_t* data = user_data; - script_obj* script_obj_sprite = script_obj_hash_get_element (state->local, "sprite"); - script_obj_deref(&script_obj_sprite); - float value = script_obj_hash_get_float (state->local, "value"); + sprite_t *sprite = script_obj_hash_get_native_of_class (state->local, "sprite", data->class); + + if (sprite) + sprite->opacity = script_obj_hash_get_float (state->local, "value"); - if (script_obj_sprite->type == SCRIPT_OBJ_TYPE_NATIVE && - script_obj_sprite->data.native.class == data->class){ - sprite_t *sprite = script_obj_sprite->data.native.object_data; - sprite->opacity = value; - } - script_obj_unref(script_obj_sprite); return (script_return){SCRIPT_RETURN_TYPE_RETURN, script_obj_new_null ()}; } @@ -163,15 +139,9 @@ static script_return sprite_window_get_height (script_state* state, void* user_d static uint32_t extract_rgb_color (script_state* state) { - script_obj* script_obj_red = script_obj_hash_get_element (state->local, "red"); - script_obj* script_obj_green = script_obj_hash_get_element (state->local, "green"); - script_obj* script_obj_blue = script_obj_hash_get_element (state->local, "blue"); - uint8_t red = CLAMP(255 * script_obj_as_float(script_obj_red), 0, 255); - uint8_t green = CLAMP(255 * script_obj_as_float(script_obj_green), 0, 255); - uint8_t blue = CLAMP(255 * script_obj_as_float(script_obj_blue), 0, 255); - script_obj_unref(script_obj_red); - script_obj_unref(script_obj_green); - script_obj_unref(script_obj_blue); + uint8_t red = CLAMP(255 * script_obj_hash_get_float (state->local, "red"), 0, 255); + uint8_t green = CLAMP(255 * script_obj_hash_get_float (state->local, "green"), 0, 255); + uint8_t blue = CLAMP(255 * script_obj_hash_get_float (state->local, "blue"), 0, 255); return (uint32_t) red<<16 | green<<8 | blue; } static script_return sprite_window_set_background_top_color (script_state* state, void* user_data) diff --git a/src/plugins/splash/script/script-object.c b/src/plugins/splash/script/script-object.c index d9e45b08..845a7e1d 100644 --- a/src/plugins/splash/script/script-object.c +++ b/src/plugins/splash/script/script-object.c @@ -258,6 +258,7 @@ script_obj* script_obj_new_ref (script_obj* sub_obj) script_obj* script_obj_new_native (void* object_data, script_obj_native_class* class) { + if (!object_data) return script_obj_new_null (); script_obj* obj = malloc(sizeof(script_obj)); obj->type = SCRIPT_OBJ_TYPE_NATIVE; obj->data.native.class = class; @@ -341,7 +342,6 @@ bool script_obj_as_bool (script_obj* obj) return false; } - char* script_obj_as_string (script_obj* obj) // reply is strdupped and may be NULL { obj = script_obj_deref_direct(obj); @@ -372,8 +372,23 @@ char* script_obj_as_string (script_obj* obj) // reply is strdupped return false; } +void* script_obj_as_native_of_class (script_obj* obj, script_obj_native_class* class) +{ + obj = script_obj_deref_direct(obj); + if (script_obj_is_native_of_class (obj, class)) + return obj->data.native.object_data; + return NULL; +} +void* script_obj_as_native_of_class_name (script_obj* obj, const char* class_name) +{ + obj = script_obj_deref_direct(obj); + if (script_obj_is_native_of_class_name (obj, class_name)) + return obj->data.native.object_data; + return NULL; +} + bool script_obj_is_null (script_obj* obj) { @@ -431,10 +446,10 @@ bool script_obj_is_native_of_class (script_obj* obj, script_obj_native_class* cl return (obj->type == SCRIPT_OBJ_TYPE_NATIVE && obj->data.native.class == class); } -bool script_obj_is_native_of_class_name (script_obj* obj, char* class_name) +bool script_obj_is_native_of_class_name (script_obj* obj, const char* class_name) { obj = script_obj_deref_direct(obj); - return (obj->type == SCRIPT_OBJ_TYPE_NATIVE && obj->data.native.class->name == class_name); + return (obj->type == SCRIPT_OBJ_TYPE_NATIVE && !strcmp(obj->data.native.class->name, class_name)); } @@ -526,6 +541,22 @@ char* script_obj_hash_get_string (script_obj* hash, const char* name) return reply; } +void* script_obj_hash_get_native_of_class (script_obj* hash, const char* name, script_obj_native_class* class) +{ + script_obj* obj = script_obj_hash_get_element (hash, name); + void* reply = script_obj_as_native_of_class (obj, class); + script_obj_unref (obj); + return reply; +} + +void* script_obj_hash_get_native_of_class_name (script_obj* hash, const char* name, const char* class_name) +{ + script_obj* obj = script_obj_hash_get_element (hash, name); + void* reply = script_obj_as_native_of_class_name (obj, class_name); + script_obj_unref (obj); + return reply; +} + void script_obj_hash_add_element (script_obj* hash, script_obj* element, const char* name) { assert(hash->type == SCRIPT_OBJ_TYPE_HASH); diff --git a/src/plugins/splash/script/script-object.h b/src/plugins/splash/script/script-object.h index fb2103c0..c929a914 100644 --- a/src/plugins/splash/script/script-object.h +++ b/src/plugins/splash/script/script-object.h @@ -22,6 +22,8 @@ int script_obj_as_int (script_obj* obj); float script_obj_as_float (script_obj* obj); bool script_obj_as_bool (script_obj* obj); char* script_obj_as_string (script_obj* obj); +void* script_obj_as_native_of_class (script_obj* obj, script_obj_native_class* class); +void* script_obj_as_native_of_class_name (script_obj* obj, const char* class_name); bool script_obj_is_null (script_obj* obj); bool script_obj_is_int (script_obj* obj); bool script_obj_is_float (script_obj* obj); @@ -30,13 +32,15 @@ bool script_obj_is_hash (script_obj* obj); bool script_obj_is_function (script_obj* obj); bool script_obj_is_native (script_obj* obj); bool script_obj_is_native_of_class (script_obj* obj, script_obj_native_class* class); -bool script_obj_is_native_of_class_name (script_obj* obj, char* class_name); +bool script_obj_is_native_of_class_name (script_obj* obj, const char* class_name); void script_obj_assign (script_obj* obj_a, script_obj* obj_b); script_obj* script_obj_hash_get_element (script_obj* hash, const char* name); int script_obj_hash_get_int (script_obj* hash, const char* name); float script_obj_hash_get_float (script_obj* hash, const char* name); bool script_obj_hash_get_bool (script_obj* hash, const char* name); char* script_obj_hash_get_string (script_obj* hash, const char* name); +void* script_obj_hash_get_native_of_class (script_obj* hash, const char* name, script_obj_native_class* class); +void* script_obj_hash_get_native_of_class_name (script_obj* hash, const char* name, const char* class_name); void script_obj_hash_add_element (script_obj* hash, script_obj* element, const char* name); script_obj* script_obj_plus (script_obj* script_obj_a_in, script_obj* script_obj_b_in); script_obj* script_obj_minus (script_obj* script_obj_a_in, script_obj* script_obj_b_in);