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;
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;
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:
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;
}
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:
}
break;
}
-
case SCRIPT_OBJ_TYPE_STRING:
{
switch (script_obj_b->type){
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;
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;
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;
}
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;
}
{
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;
{
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;
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;
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;
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;
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;
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;
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;
{
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);
break;
case SCRIPT_OBJ_TYPE_INT:
break;
+ case SCRIPT_OBJ_TYPE_FLOAT:
+ break;
case SCRIPT_OBJ_TYPE_STRING:
free(obj->data.string);
break;
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);
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));
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
case SCRIPT_OBJ_TYPE_NATIVE:
return 0;
case SCRIPT_OBJ_TYPE_STRING:
- if (*obj->data.string) return true;
return 0;
}
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
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;
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);