]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[script] Add support for floats
authorCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 16 Jun 2009 15:33:29 +0000 (16:33 +0100)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 16 Jun 2009 15:33:29 +0000 (16:33 +0100)
Adds parsing and execution support for floats. Some operations upgrade ints to
floats with no way of turning them back to ints.

src/plugins/splash/script/ply-scan.c
src/plugins/splash/script/ply-scan.h
src/plugins/splash/script/script-execute.c
src/plugins/splash/script/script-object.c
src/plugins/splash/script/script-object.h
src/plugins/splash/script/script-parse.c
src/plugins/splash/script/script-parse.h
src/plugins/splash/script/script.h

index d047387d60c9287b3b8363d13d1ea376d05d1c13..0f9ff0770c74551c7327ff3f222115150378b18f 100644 (file)
@@ -26,7 +26,7 @@ static ply_scan_t* ply_scan_new(void)
  return scan;
 }
 
-ply_scan_t* ply_scan_file(char* filename)
+ply_scan_t* ply_scan_file(const char* filename)
 {
  int fd = open(filename, O_RDONLY);
  if (fd<0) return NULL;
@@ -37,7 +37,7 @@ ply_scan_t* ply_scan_file(char* filename)
  return scan;
 }
 
-ply_scan_t* ply_scan_string(char* string)
+ply_scan_t* ply_scan_string(const char* string)
 {
  ply_scan_t* scan = ply_scan_new();
  scan->source.string = string;
@@ -52,6 +52,7 @@ void ply_scan_token_clean(ply_scan_token_t* token)
     case PLY_SCAN_TOKEN_TYPE_EMPTY:
     case PLY_SCAN_TOKEN_TYPE_EOF:
     case PLY_SCAN_TOKEN_TYPE_INTEGER:
+    case PLY_SCAN_TOKEN_TYPE_FLOAT:
     case PLY_SCAN_TOKEN_TYPE_SYMBOL:
         break;
     case PLY_SCAN_TOKEN_TYPE_IDENTIFIER:
@@ -121,15 +122,31 @@ void ply_scan_read_next_token(ply_scan_t* scan, ply_scan_token_t* token)
     return;
     }
  if (curchar >= '0' && curchar <= '9'){
-    token->type = PLY_SCAN_TOKEN_TYPE_INTEGER;
-    long long int value = 0;
+    long long int int_value = 0;
     do {
-        value *= 10;
-        value += curchar - '0';
+        int_value *= 10;
+        int_value += curchar - '0';
         curchar = ply_scan_get_next_char(scan);
         }
     while (curchar >= '0' && curchar <= '9');
-    token->data.integer = value;
+    
+    if (curchar == '.'){
+        double floatpoint = int_value;
+        double scalar = 1;
+        
+        curchar = ply_scan_get_next_char(scan);
+        while (curchar >= '0' && curchar <= '9'){
+            scalar /= 10;
+            floatpoint += scalar * (curchar - '0');
+            curchar = ply_scan_get_next_char(scan);
+            }
+        token->type = PLY_SCAN_TOKEN_TYPE_FLOAT;
+        token->data.floatpoint = floatpoint;
+        }
+    else {
+        token->type = PLY_SCAN_TOKEN_TYPE_INTEGER;
+        token->data.integer = int_value;
+        }
     return;
     }
  
index d7cf5a61542566e4755eb10d7c0b690e3805cbf6..521873aa43e4e39209ac94c68554cb13f1080761 100644 (file)
@@ -9,6 +9,7 @@ typedef enum
  PLY_SCAN_TOKEN_TYPE_EMPTY,
  PLY_SCAN_TOKEN_TYPE_EOF,
  PLY_SCAN_TOKEN_TYPE_INTEGER,
+ PLY_SCAN_TOKEN_TYPE_FLOAT,
  PLY_SCAN_TOKEN_TYPE_IDENTIFIER,
  PLY_SCAN_TOKEN_TYPE_STRING,
  PLY_SCAN_TOKEN_TYPE_SYMBOL,
@@ -22,6 +23,7 @@ typedef struct
     char* string;
     char symbol;
     long long int integer;
+    double floatpoint;
  } data;
 } ply_scan_token_t;
 
@@ -30,7 +32,7 @@ typedef struct
  union
  {
   int fd;
-  char* string;
+  const char* string;
  } source;
   unsigned char cur_char;
   ply_bitarray_t *identifier_1st_char;
@@ -40,8 +42,8 @@ typedef struct
   bool source_is_file;
 } ply_scan_t;
 
-ply_scan_t* ply_scan_file(char* filename);
-ply_scan_t* ply_scan_string(char* string);
+ply_scan_t* ply_scan_file(const char* filename);
+ply_scan_t* ply_scan_string(const char* string);
 void ply_scan_token_clean(ply_scan_token_t* token);
 void ply_scan_free(ply_scan_t* scan);
 unsigned char ply_scan_get_current_char(ply_scan_t* scan);
index 63bd634bf9e77cde62830c62bfe84b67d51b727b..c65d97be7a67caf2bd694764502152309b6e6d2e 100644 (file)
@@ -33,23 +33,37 @@ static script_obj* script_evaluate_plus (script_state* state, script_exp* exp)
             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_NULL:
-                obj = script_obj_new_int (script_obj_a->data.integer);                // int + NULL = int  ? meh
+            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_NULL:
+    case SCRIPT_OBJ_TYPE_FLOAT:
         {
         switch (script_obj_b->type){
             case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (script_obj_b->data.integer);
+                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:
                 {
-                obj = script_obj_new_string (script_obj_b->data.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:
@@ -57,7 +71,6 @@ static script_obj* script_evaluate_plus (script_state* state, script_exp* exp)
             }
         break;
         }
-    
     case SCRIPT_OBJ_TYPE_STRING:
         {
         switch (script_obj_b->type){
@@ -69,6 +82,14 @@ static script_obj* script_evaluate_plus (script_state* state, script_exp* exp)
                 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;
@@ -76,9 +97,6 @@ static script_obj* script_evaluate_plus (script_state* state, script_exp* exp)
                 obj = script_obj_new_string (newstring);
                 free(newstring);
                 break;
-            case SCRIPT_OBJ_TYPE_NULL:
-                obj = script_obj_new_string (script_obj_a->data.string);
-                break;
                 }
             default:
                 break;
@@ -115,25 +133,28 @@ static script_obj* script_evaluate_minus (script_state* state, script_exp* exp)
             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_NULL:
-                obj = script_obj_new_int (script_obj_a->data.integer);
+            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_NULL:
+    case SCRIPT_OBJ_TYPE_FLOAT:
         {
         switch (script_obj_b->type){
             case SCRIPT_OBJ_TYPE_INT:
-                obj = script_obj_new_int (-script_obj_b->data.integer);
+                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;
     }
@@ -162,6 +183,23 @@ static script_obj* script_evaluate_mul (script_state* state, script_exp* exp)
             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;
             }
@@ -193,8 +231,24 @@ static script_obj* script_evaluate_div (script_state* state, script_exp* exp)
         {
         switch (script_obj_b->type){
             case SCRIPT_OBJ_TYPE_INT:
-                if (script_obj_b->data.integer == 0) obj = script_obj_new_null ();
-                else obj = script_obj_new_int (script_obj_a->data.integer / script_obj_b->data.integer);
+                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;
@@ -228,8 +282,24 @@ static script_obj* script_evaluate_mod (script_state* state, script_exp* exp)
         {
         switch (script_obj_b->type){
             case SCRIPT_OBJ_TYPE_INT:
-                if (script_obj_b->data.integer == 0) obj = script_obj_new_null ();
-                else obj = script_obj_new_int (script_obj_a->data.integer % script_obj_b->data.integer);
+                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;
@@ -342,21 +412,38 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
  int eq=0;
  int ne=0;
  
int val;
float val;
  int valset=0;
  
   switch (script_obj_a->type){
-    case SCRIPT_OBJ_TYPE_REF:
-        assert(0);
     case SCRIPT_OBJ_TYPE_INT:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_INT:
                 val = script_obj_a->data.integer - script_obj_b->data.integer;
                 valset=1;
                 break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                val = script_obj_a->data.integer - script_obj_b->data.floatpoint;
+                valset=1;
+                break;
+            default:
+                ne = 1;
+                break;
+            }
+        break;
+        }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        switch (script_obj_b->type){
+            case SCRIPT_OBJ_TYPE_INT:
+                val = script_obj_a->data.floatpoint - script_obj_b->data.integer;
+                valset=1;
+                break;
+            case SCRIPT_OBJ_TYPE_FLOAT:
+                val = script_obj_a->data.floatpoint - script_obj_b->data.floatpoint;
+                valset=1;
+                break;
             default:
                 ne = 1;
                 break;
@@ -366,8 +453,6 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
     case SCRIPT_OBJ_TYPE_STRING:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_STRING:
                 val = strcmp(script_obj_a->data.string, script_obj_b->data.string);
                 valset=1;
@@ -381,8 +466,6 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
     case SCRIPT_OBJ_TYPE_HASH:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_HASH:
                 if (script_obj_a == script_obj_b) eq = 1;
                 else ne = 1;
@@ -396,8 +479,6 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
     case SCRIPT_OBJ_TYPE_FUNCTION:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_FUNCTION:
                 if (script_obj_a == script_obj_b) eq = 1;
                 else ne = 1;
@@ -411,8 +492,6 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
     case SCRIPT_OBJ_TYPE_NULL:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_NULL:
                 eq = 1;
                 break;
@@ -425,10 +504,10 @@ static script_obj* script_evaluate_cmp (script_state* state, script_exp* exp)
     case SCRIPT_OBJ_TYPE_NATIVE:
         {
         switch (script_obj_b->type){
-            case SCRIPT_OBJ_TYPE_REF:
-                assert(0);
             case SCRIPT_OBJ_TYPE_NATIVE:
-                eq = 1;
+                if (script_obj_a->data.native.object_data == script_obj_b->data.native.object_data)
+                    eq = 1;
+                else ne = 1;
                 break;
             default:
                 ne = 1;
@@ -572,6 +651,10 @@ static script_obj* script_evaluate (script_state* state, script_exp* exp)
         {
         return script_obj_new_int (exp->data.integer);
         }
+    case SCRIPT_EXP_TYPE_TERM_FLOAT:
+        {
+        return script_obj_new_float (exp->data.floatpoint);
+        }
     case SCRIPT_EXP_TYPE_TERM_STRING:
         {
         return script_obj_new_string (exp->data.string);
index c63dc7c04e0b599313edc00d14a3266d62b9aafb..4e017cf58afc6358039bdeb47fc6968261389718 100644 (file)
@@ -60,6 +60,8 @@ void script_obj_reset (script_obj* obj)
         break;
     case SCRIPT_OBJ_TYPE_INT:
         break;
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        break;
     case SCRIPT_OBJ_TYPE_STRING:
         free(obj->data.string);
         break;
@@ -146,6 +148,11 @@ char* script_obj_print (script_obj* obj)
         asprintf(&reply, "%d[%d]", obj->data.integer, obj->refcount);
         return reply;
         }
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        {
+        asprintf(&reply, "%f[%d]", obj->data.floatpoint, obj->refcount);
+        return reply;
+        }
     case SCRIPT_OBJ_TYPE_STRING:
         {
         asprintf(&reply, "\"%s\"[%d]", obj->data.string, obj->refcount);
@@ -193,6 +200,15 @@ script_obj* script_obj_new_int (int number)
  return obj;
 }
 
+script_obj* script_obj_new_float (float number)
+{
+ script_obj* obj = malloc(sizeof(script_obj));
+ obj->type = SCRIPT_OBJ_TYPE_FLOAT;
+ obj->refcount = 1;
+ obj->data.floatpoint = number;
+ return obj;
+}
+
 script_obj* script_obj_new_string (const char* string)
 {
  script_obj* obj = malloc(sizeof(script_obj));
@@ -253,8 +269,9 @@ int script_obj_as_int (script_obj* obj)
  obj = script_obj_deref_direct(obj);
  switch (obj->type){
     case SCRIPT_OBJ_TYPE_INT:
-        if (obj->data.integer) return obj->data.integer;
-        else return 0;
+        return obj->data.integer;
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        return (int) obj->data.floatpoint;
     case SCRIPT_OBJ_TYPE_NULL:
         return 0;
     case SCRIPT_OBJ_TYPE_REF:       // should have been de-reffed already
@@ -264,7 +281,6 @@ int script_obj_as_int (script_obj* obj)
     case SCRIPT_OBJ_TYPE_NATIVE:
         return 0;
     case SCRIPT_OBJ_TYPE_STRING:
-        if (*obj->data.string) return true;
         return 0;
     }
     
@@ -279,6 +295,9 @@ bool script_obj_as_bool (script_obj* obj)
     case SCRIPT_OBJ_TYPE_INT:
         if (obj->data.integer) return true;
         return false;
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        if (obj->data.floatpoint) return true;
+        return false;
     case SCRIPT_OBJ_TYPE_NULL:
         return false;
     case SCRIPT_OBJ_TYPE_REF:       // should have been de-reffed already
@@ -306,6 +325,9 @@ char* script_obj_as_string (script_obj* obj)              // reply is strdupped
     case SCRIPT_OBJ_TYPE_INT:
         asprintf(&reply, "%d", obj->data.integer);
         return reply;
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        asprintf(&reply, "%f", obj->data.floatpoint);
+        return reply;
     case SCRIPT_OBJ_TYPE_NULL:
         asprintf(&reply, "NULL");
         return reply;
@@ -338,6 +360,10 @@ void script_obj_assign (script_obj* obj_a, script_obj* obj_b)
         obj_a->type = SCRIPT_OBJ_TYPE_INT;
         obj_a->data.integer = obj_b->data.integer;
         break;
+    case SCRIPT_OBJ_TYPE_FLOAT:
+        obj_a->type = SCRIPT_OBJ_TYPE_FLOAT;
+        obj_a->data.floatpoint = obj_b->data.floatpoint;
+        break;
     case SCRIPT_OBJ_TYPE_STRING:
         obj_a->type = SCRIPT_OBJ_TYPE_STRING;
         obj_a->data.string = strdup(obj_b->data.string);
index 5e79d4359679cb00c9cb0dd5418eed3c9173d8bc..54d1f7b17b071235fe452c14961b54c19eaf6f11 100644 (file)
@@ -11,6 +11,7 @@ script_obj* script_obj_deref_direct (script_obj* obj);
 void script_obj_deref (script_obj** obj_ptr);
 char* script_obj_print (script_obj* obj);
 script_obj* script_obj_new_int (int number);
+script_obj* script_obj_new_float (float number);
 script_obj* script_obj_new_string (const char* string);
 script_obj* script_obj_new_null (void);
 script_obj* script_obj_new_hash (void);
index cd5751175fe04936ba866b4bbfc1aecc30a6177d..f542ed5bab782b3af8aa4e95bd0882a3da4c721b 100644 (file)
@@ -49,6 +49,14 @@ static script_exp* script_parse_exp_tm (ply_scan_t* scan)
     return exp;
     }
  
+ if (curtoken->type == PLY_SCAN_TOKEN_TYPE_FLOAT){
+    exp = malloc(sizeof(script_exp));
+    exp->type = SCRIPT_EXP_TYPE_TERM_FLOAT;
+    exp->data.floatpoint = curtoken->data.floatpoint;
+    ply_scan_get_next_token(scan);
+    return exp;
+    }
  if (curtoken->type == PLY_SCAN_TOKEN_TYPE_IDENTIFIER){
     exp = malloc(sizeof(script_exp));
     if (!strcmp(curtoken->data.string, "NULL")){
@@ -512,6 +520,7 @@ static void script_parse_exp_free (script_exp* exp)
         script_parse_exp_free (exp->data.dual.sub_b);
         break;
     case SCRIPT_EXP_TYPE_TERM_INT:
+    case SCRIPT_EXP_TYPE_TERM_FLOAT:
     case SCRIPT_EXP_TYPE_TERM_NULL:
     case SCRIPT_EXP_TYPE_TERM_LOCAL:
     case SCRIPT_EXP_TYPE_TERM_GLOBAL:
@@ -608,7 +617,7 @@ static void script_parse_op_list_free (ply_list_t* op_list)
 
 
 
-script_op* script_parse_file (char* filename)
+script_op* script_parse_file (const char* filename)
 {
  ply_scan_t* scan = ply_scan_file (filename);
  assert(scan);
@@ -626,7 +635,7 @@ script_op* script_parse_file (char* filename)
 
 
 
-script_op* script_parse_string (char* string)
+script_op* script_parse_string (const char* string)
 {
  ply_scan_t* scan = ply_scan_string (string);
  assert(scan);
index 04f1086564d7f2b8dfe199248f4e2e7204827e73..b5b4ce34a0a6667361f2e9078e865d11d6b169b8 100644 (file)
@@ -3,8 +3,8 @@
 
 #include "script.h"
 
-script_op* script_parse_file (char* filename);
-script_op* script_parse_string (char* string);
+script_op* script_parse_file (const char* filename);
+script_op* script_parse_string (const char* string);
 void script_parse_op_free (script_op* op);
 
 
index 8baa6e03a6e0f88b887200e11d3983ceeef85c09..487f6a266c440a4928b55c992f00b5fe7fc6a229 100644 (file)
@@ -73,6 +73,7 @@ typedef enum
  SCRIPT_OBJ_TYPE_NULL,
  SCRIPT_OBJ_TYPE_REF,
  SCRIPT_OBJ_TYPE_INT,
+ SCRIPT_OBJ_TYPE_FLOAT,
  SCRIPT_OBJ_TYPE_STRING,
  SCRIPT_OBJ_TYPE_HASH,
  SCRIPT_OBJ_TYPE_FUNCTION,
@@ -86,6 +87,7 @@ typedef struct script_obj
  union
  {
     int integer;
+    float floatpoint;
     char* string;
     struct script_obj* obj;
     script_function* function;
@@ -100,6 +102,7 @@ typedef enum
 {
  SCRIPT_EXP_TYPE_TERM_NULL,
  SCRIPT_EXP_TYPE_TERM_INT,
+ SCRIPT_EXP_TYPE_TERM_FLOAT,
  SCRIPT_EXP_TYPE_TERM_STRING,
  SCRIPT_EXP_TYPE_TERM_VAR,
  SCRIPT_EXP_TYPE_TERM_LOCAL,
@@ -133,6 +136,7 @@ typedef struct script_exp
     struct script_exp *sub;
     char* string;
     int integer; 
+    float floatpoint;
     struct {
         struct script_exp* name;
         ply_list_t* parameters;