]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[script] Move object operating functions to script-object to avoid repetition
authorCharlie Brej <cbrej@cs.man.ac.uk>
Wed, 1 Jul 2009 14:32:36 +0000 (15:32 +0100)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Wed, 1 Jul 2009 14:32:36 +0000 (15:32 +0100)
src/plugins/splash/script/script-execute.c
src/plugins/splash/script/script-object.c
src/plugins/splash/script/script-object.h

index 0dc056439ed12c8c5d0510d6e48d506f52a4a24e..75b72146adc99941ca42e33c9a71ce8319f30bc7 100644 (file)
 static script_obj* script_evaluate (script_state* state, script_exp* exp);
 static script_return script_execute_function_with_parlist (script_state* state, script_function* function, ply_list_t* parameter_data);
 
-static script_obj* script_evaluate_plus (script_state* state, script_exp* exp)
+static script_obj* script_evaluate_apply_function (script_state* state, script_exp* exp, script_obj* (*function) (script_obj*, script_obj*))
 {
  script_obj* script_obj_a = script_evaluate (state, exp->data.dual.sub_a);
  script_obj* script_obj_b = script_evaluate (state, exp->data.dual.sub_b);
- script_obj* obj = NULL;
- script_obj_deref (&script_obj_a);
- script_obj_deref (&script_obj_b);
- switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_INT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (script_obj_a->data.integer + script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.integer + script_obj_b->data.floatpoint);
-                break;
-            case SCRIPT_OBJ_TYPE_STRING:
-                {
-                char* newstring;
-                asprintf(&newstring, "%d%s", script_obj_a->data.integer, script_obj_b->data.string);
-                obj = script_obj_new_string (newstring);
-                free(newstring);
-                break;
-                }
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_FLOAT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint + script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint + script_obj_b->data.floatpoint);
-                break;
-            case SCRIPT_OBJ_TYPE_STRING:
-                {
-                char* newstring;
-                asprintf(&newstring, "%f%s", script_obj_a->data.floatpoint, script_obj_b->data.string);
-                obj = script_obj_new_string (newstring);
-                free(newstring);
-                break;
-                }
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_STRING:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                {
-                char* newstring;
-                asprintf(&newstring, "%s%d", script_obj_a->data.string, script_obj_b->data.integer);
-                obj = script_obj_new_string (newstring);                    // FIXME these two asprintfs complain about ignored returned values
-                free(newstring);
-                break;
-                }
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                {
-                char* newstring;
-                asprintf(&newstring, "%s%f", script_obj_a->data.string, script_obj_b->data.floatpoint);
-                obj = script_obj_new_string (newstring);
-                free(newstring);
-                break;
-                }
-            case SCRIPT_OBJ_TYPE_STRING:
-                {
-                char* newstring;
-                asprintf(&newstring, "%s%s", script_obj_a->data.string, script_obj_b->data.string);
-                obj = script_obj_new_string (newstring);
-                free(newstring);
-                break;
-                }
-            default:
-                break;
-            }
-        break;
-        }
-       
-    default:
-        break;
-    }
- script_obj_unref (script_obj_a);
- script_obj_unref (script_obj_b);
- if (!obj){
-    obj = script_obj_new_null ();
-    }
- return obj;
-}
-
-static script_obj* script_evaluate_minus (script_state* state, script_exp* exp)
-{
- script_obj* script_obj_a = script_evaluate (state, exp->data.dual.sub_a);
- script_obj* script_obj_b = script_evaluate (state, exp->data.dual.sub_b);
- script_obj* obj = NULL;
- script_obj_deref (&script_obj_a);
- script_obj_deref (&script_obj_b);
- switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_INT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (script_obj_a->data.integer - script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.integer - script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_FLOAT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint - script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint - script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    default:
-        break;
-    }
- script_obj_unref (script_obj_a);
- script_obj_unref (script_obj_b);
- if (!obj){
-    obj = script_obj_new_null ();
-    }
- return obj;
-}
-
-static script_obj* script_evaluate_mul (script_state* state, script_exp* exp)
-{
- script_obj* script_obj_a = script_evaluate (state, exp->data.dual.sub_a);
- script_obj* script_obj_b = script_evaluate (state, exp->data.dual.sub_b);
- script_obj* obj = NULL;
- script_obj_deref (&script_obj_a);
- script_obj_deref (&script_obj_b);
- switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_INT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (script_obj_a->data.integer * script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.integer * script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_FLOAT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint * script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint * script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    default:
-        break;
-    }
- script_obj_unref (script_obj_a);
- script_obj_unref (script_obj_b);
- if (!obj){
-    obj = script_obj_new_null ();
-    }
- return obj;
-}
-
-static script_obj* script_evaluate_div (script_state* state, script_exp* exp)
-{
- script_obj* script_obj_a = script_evaluate (state, exp->data.dual.sub_a);
- script_obj* script_obj_b = script_evaluate (state, exp->data.dual.sub_b);
- script_obj* obj = NULL;
- script_obj_deref (&script_obj_a);
- script_obj_deref (&script_obj_b);
- switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_INT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float ((float)script_obj_a->data.integer / script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.integer / script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_FLOAT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint / script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (script_obj_a->data.floatpoint / script_obj_b->data.floatpoint);
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    default:
-        break;
-    }
- script_obj_unref (script_obj_a);
- script_obj_unref (script_obj_b);
- if (!obj){
-    obj = script_obj_new_null ();
-    }
- return obj;
-}
-
-
-static script_obj* script_evaluate_mod (script_state* state, script_exp* exp)
-{
- script_obj* script_obj_a = script_evaluate (state, exp->data.dual.sub_a);
- script_obj* script_obj_b = script_evaluate (state, exp->data.dual.sub_b);
- script_obj* obj = NULL;
- script_obj_deref (&script_obj_a);
- script_obj_deref (&script_obj_b);
- switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_INT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (script_obj_a->data.integer % script_obj_b->data.integer);
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (fmod(script_obj_a->data.integer, script_obj_b->data.floatpoint));
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    case SCRIPT_OBJ_TYPE_FLOAT:
-        {
-        switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_float (fmod(script_obj_a->data.floatpoint, script_obj_b->data.integer));
-                break;
-            case SCRIPT_OBJ_TYPE_FLOAT:
-                obj = script_obj_new_float (fmod(script_obj_a->data.floatpoint, script_obj_b->data.floatpoint));
-                break;
-            default:
-                break;
-            }
-        break;
-        }
-    default:
-        break;
-    }
+ script_obj* obj = function (script_obj_a, script_obj_b); 
  script_obj_unref (script_obj_a);
  script_obj_unref (script_obj_b);
- if (!obj){
-    obj = script_obj_new_null ();
-    }
  return obj;
 }
 
@@ -673,23 +382,23 @@ static script_obj* script_evaluate (script_state* state, script_exp* exp)
  switch (exp->type){
     case SCRIPT_EXP_TYPE_PLUS:
         {
-        return script_evaluate_plus (state, exp);
+        return script_evaluate_apply_function (state, exp, script_obj_plus);
         }
     case SCRIPT_EXP_TYPE_MINUS:
         {
-        return script_evaluate_minus (state, exp);
+        return script_evaluate_apply_function (state, exp, script_obj_minus);
         }
     case SCRIPT_EXP_TYPE_MUL:
         {
-        return script_evaluate_mul (state, exp);
+        return script_evaluate_apply_function (state, exp, script_obj_mul);
         }
     case SCRIPT_EXP_TYPE_DIV:
         {
-        return script_evaluate_div (state, exp);
+        return script_evaluate_apply_function (state, exp, script_obj_div);
         }
     case SCRIPT_EXP_TYPE_MOD:
         {
-        return script_evaluate_mod (state, exp);
+        return script_evaluate_apply_function (state, exp, script_obj_mod);
         }
     case SCRIPT_EXP_TYPE_EQ:
     case SCRIPT_EXP_TYPE_NE:
index 15f68d177fa576e3f93c8024136200581c68807a..f82255e54b629cf83b1b905f6f5902db4e610273 100644 (file)
@@ -10,6 +10,7 @@
 #include <stdbool.h>
 #include <string.h>
 #include <stdbool.h>
+#include <math.h>
 
 #include "script.h"
 #include "script-object.h"
@@ -437,3 +438,299 @@ void script_obj_hash_add_element (script_obj* hash, script_obj* element, const c
  script_obj_unref (obj);
 }
 
+
+script_obj* script_obj_plus (script_obj* script_obj_a_in, script_obj* script_obj_b_in)
+{
+ script_obj* script_obj_a = script_obj_deref_direct(script_obj_a_in);
+ script_obj* script_obj_b = script_obj_deref_direct(script_obj_b_in);
+ script_obj* obj = NULL;
+ switch (script_obj_a->type){
+    case SCRIPT_OBJ_TYPE_INT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_int (script_obj_a->data.integer + script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.integer + script_obj_b->data.floatpoint);
+                break;
+            case SCRIPT_OBJ_TYPE_STRING:
+                {
+                char* newstring;
+                asprintf(&newstring, "%d%s", script_obj_a->data.integer, script_obj_b->data.string);
+                obj = script_obj_new_string (newstring);
+                free(newstring);
+                break;
+                }
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint + script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint + script_obj_b->data.floatpoint);
+                break;
+            case SCRIPT_OBJ_TYPE_STRING:
+                {
+                char* newstring;
+                asprintf(&newstring, "%f%s", script_obj_a->data.floatpoint, script_obj_b->data.string);
+                obj = script_obj_new_string (newstring);
+                free(newstring);
+                break;
+                }
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_STRING:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                {
+                char* newstring;
+                asprintf(&newstring, "%s%d", script_obj_a->data.string, script_obj_b->data.integer);
+                obj = script_obj_new_string (newstring);                    // FIXME these two asprintfs complain about ignored returned values
+                free(newstring);
+                break;
+                }
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                {
+                char* newstring;
+                asprintf(&newstring, "%s%f", script_obj_a->data.string, script_obj_b->data.floatpoint);
+                obj = script_obj_new_string (newstring);
+                free(newstring);
+                break;
+                }
+            case SCRIPT_OBJ_TYPE_STRING:
+                {
+                char* newstring;
+                asprintf(&newstring, "%s%s", script_obj_a->data.string, script_obj_b->data.string);
+                obj = script_obj_new_string (newstring);
+                free(newstring);
+                break;
+                }
+            default:
+                break;
+            }
+        break;
+        }
+       
+    default:
+        break;
+    }
+ if (!obj){
+    obj = script_obj_new_null ();
+    }
+ return obj;
+}
+
+
+script_obj* script_obj_minus (script_obj* script_obj_a_in, script_obj* script_obj_b_in)
+{
+ script_obj* script_obj_a = script_obj_deref_direct(script_obj_a_in);
+ script_obj* script_obj_b = script_obj_deref_direct(script_obj_b_in);
+ script_obj* obj = NULL;
+ switch (script_obj_a->type){
+    case SCRIPT_OBJ_TYPE_INT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_int (script_obj_a->data.integer - script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.integer - script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint - script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint - script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    default:
+        break;
+    }
+ if (!obj){
+    obj = script_obj_new_null ();
+    }
+ return obj;
+}
+
+
+script_obj* script_obj_mul (script_obj* script_obj_a_in, script_obj* script_obj_b_in)
+{
+ script_obj* script_obj_a = script_obj_deref_direct(script_obj_a_in);
+ script_obj* script_obj_b = script_obj_deref_direct(script_obj_b_in);
+ script_obj* obj = NULL;
+ switch (script_obj_a->type){
+    case SCRIPT_OBJ_TYPE_INT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_int (script_obj_a->data.integer * script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.integer * script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint * script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint * script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    default:
+        break;
+    }
+ if (!obj){
+    obj = script_obj_new_null ();
+    }
+ return obj;
+}
+
+
+script_obj* script_obj_div (script_obj* script_obj_a_in, script_obj* script_obj_b_in)
+{
+ script_obj* script_obj_a = script_obj_deref_direct(script_obj_a_in);
+ script_obj* script_obj_b = script_obj_deref_direct(script_obj_b_in);
+ script_obj* obj = NULL;
+ switch (script_obj_a->type){
+    case SCRIPT_OBJ_TYPE_INT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float ((float)script_obj_a->data.integer / script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.integer / script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint / script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (script_obj_a->data.floatpoint / script_obj_b->data.floatpoint);
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    default:
+        break;
+    }
+ if (!obj){
+    obj = script_obj_new_null ();
+    }
+ return obj;
+}
+
+
+
+script_obj* script_obj_mod (script_obj* script_obj_a_in, script_obj* script_obj_b_in)
+{
+ script_obj* script_obj_a = script_obj_deref_direct(script_obj_a_in);
+ script_obj* script_obj_b = script_obj_deref_direct(script_obj_b_in);
+ script_obj* obj = NULL;
+ switch (script_obj_a->type){
+    case SCRIPT_OBJ_TYPE_INT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_int (script_obj_a->data.integer % script_obj_b->data.integer);
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (fmod(script_obj_a->data.integer, script_obj_b->data.floatpoint));
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                obj = script_obj_new_float (fmod(script_obj_a->data.floatpoint, script_obj_b->data.integer));
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                obj = script_obj_new_float (fmod(script_obj_a->data.floatpoint, script_obj_b->data.floatpoint));
+                break;
+            default:
+                break;
+            }
+        break;
+        }
+    default:
+        break;
+    }
+ if (!obj){
+    obj = script_obj_new_null ();
+    }
+ return obj;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
index 30f039fc4e4d523ebae9f93264174807a0c1e366..370809edad4f4daf1df971a23fa8a07e84758b59 100644 (file)
@@ -25,7 +25,11 @@ char* script_obj_as_string (script_obj* obj);
 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);
 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);
+script_obj* script_obj_mul (script_obj* script_obj_a_in, script_obj* script_obj_b_in);
+script_obj* script_obj_div (script_obj* script_obj_a_in, script_obj* script_obj_b_in);
+script_obj* script_obj_mod (script_obj* script_obj_a_in, script_obj* script_obj_b_in);
 
 
 #endif /* SCRIPT_OBJECT */