From: Charlie Brej Date: Wed, 1 Jul 2009 14:32:36 +0000 (+0100) Subject: [script] Move object operating functions to script-object to avoid repetition X-Git-Tag: 0.7.0~119 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a99a8a27c9769b07f29515b76f0edafd311da204;p=thirdparty%2Fplymouth.git [script] Move object operating functions to script-object to avoid repetition --- diff --git a/src/plugins/splash/script/script-execute.c b/src/plugins/splash/script/script-execute.c index 0dc05643..75b72146 100644 --- a/src/plugins/splash/script/script-execute.c +++ b/src/plugins/splash/script/script-execute.c @@ -19,304 +19,13 @@ 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: diff --git a/src/plugins/splash/script/script-object.c b/src/plugins/splash/script/script-object.c index 15f68d17..f82255e5 100644 --- a/src/plugins/splash/script/script-object.c +++ b/src/plugins/splash/script/script-object.c @@ -10,6 +10,7 @@ #include #include #include +#include #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; +} + + + + + + + + + + + + + + + + + diff --git a/src/plugins/splash/script/script-object.h b/src/plugins/splash/script/script-object.h index 30f039fc..370809ed 100644 --- a/src/plugins/splash/script/script-object.h +++ b/src/plugins/splash/script/script-object.h @@ -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 */