]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[script] Simplify native functions by using the hash-cast access functions
authorCharlie Brej <cbrej@cs.man.ac.uk>
Fri, 3 Jul 2009 10:56:04 +0000 (11:56 +0100)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Fri, 3 Jul 2009 10:56:04 +0000 (11:56 +0100)
src/plugins/splash/script/script-lib-image.c
src/plugins/splash/script/script-lib-math.c
src/plugins/splash/script/script-lib-plymouth.c
src/plugins/splash/script/script-lib-plymouth.h
src/plugins/splash/script/script-lib-sprite.c
src/plugins/splash/script/script-object.c
src/plugins/splash/script/script-object.h

index 1c501ad4781bce46fc7fa65c83e9fabe67adc04d..9811c5f9d87f5e17c1b31466180fcf6973b9971b 100644 (file)
@@ -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;
 }
index 02b7bf9a9cab5c09f8af83b91df54baf8a615595..d704b83df4b1e57c37f710b7eb4759cbfbafbd6c 100644 (file)
@@ -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);
 }
-
index 5a886f406de18b6a239ff79dabf5b9adbd025182..23b00ef810624778d43888fd714f149ef5e23434 100644 (file)
@@ -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);
     }
index ac71daa1472ca1fb243a9a7054dd825e61ef1045..43c03d57c2cdf4bfa3589fc0327ca6cd76ef95cb 100644 (file)
@@ -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;
index 86c72105aaa009dcc1c9f0f8b40ebb2c97e8ce6e..f510db29e50440ff0883f91b2fc49835a0d2f326 100644 (file)
@@ -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)
index d9e45b0893c5c44137d75128dd18b110631b591c..845a7e1d81e68f1f8c9f71bf0ac5fbc19db2eae2 100644 (file)
@@ -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);
index fb2103c0156f563ee9b4e71a0e3f58a333863e0a..c929a914d68c1672ecc62721b3942d5ecd4203b2 100644 (file)
@@ -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);