string>float primitive should not throw an error on invalid input (non-ASCII strings)
parent
5bb98d28d9
commit
7e094f890c
17
vm/math.c
17
vm/math.c
|
@ -533,13 +533,20 @@ void primitive_str_to_float(void)
|
|||
maybe_gc(sizeof(F_FLOAT));
|
||||
|
||||
str = untag_string(dpeek());
|
||||
c_str = to_char_string(str,true);
|
||||
end = c_str;
|
||||
f = strtod(c_str,&end);
|
||||
if(end != c_str + string_capacity(str))
|
||||
|
||||
/* if the string has nulls or chars > 255, its definitely not a float */
|
||||
if(!check_string(str,sizeof(char)))
|
||||
drepl(F);
|
||||
else
|
||||
drepl(tag_float(f));
|
||||
{
|
||||
c_str = to_char_string(str,false);
|
||||
end = c_str;
|
||||
f = strtod(c_str,&end);
|
||||
if(end != c_str + string_capacity(str))
|
||||
drepl(F);
|
||||
else
|
||||
drepl(tag_float(f));
|
||||
}
|
||||
}
|
||||
|
||||
void primitive_float_to_str(void)
|
||||
|
|
11
vm/types.c
11
vm/types.c
|
@ -304,7 +304,7 @@ void primitive_resize_string(void)
|
|||
MEMORY_TO_STRING(char,u8)
|
||||
MEMORY_TO_STRING(u16,u16)
|
||||
|
||||
void check_string(F_STRING *s, CELL max)
|
||||
bool check_string(F_STRING *s, CELL max)
|
||||
{
|
||||
CELL capacity = string_capacity(s);
|
||||
CELL i;
|
||||
|
@ -312,8 +312,9 @@ void check_string(F_STRING *s, CELL max)
|
|||
{
|
||||
u16 ch = string_nth(s,i);
|
||||
if(ch == '\0' || ch >= (1 << (max * 8)))
|
||||
general_error(ERROR_C_STRING,tag_object(s),F,true);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
F_ARRAY *allot_c_string(CELL capacity, CELL size)
|
||||
|
@ -339,7 +340,8 @@ F_ARRAY *allot_c_string(CELL capacity, CELL size)
|
|||
{ \
|
||||
CELL capacity = string_capacity(s); \
|
||||
F_ARRAY *_c_str; \
|
||||
if(check) check_string(s,sizeof(type)); \
|
||||
if(check && !check_string(s,sizeof(type))) \
|
||||
general_error(ERROR_C_STRING,tag_object(s),F,true); \
|
||||
_c_str = allot_c_string(capacity,sizeof(type)); \
|
||||
type *c_str = (type*)(_c_str + 1); \
|
||||
type##_string_to_memory(s,c_str); \
|
||||
|
@ -350,7 +352,8 @@ F_ARRAY *allot_c_string(CELL capacity, CELL size)
|
|||
{ \
|
||||
if(sizeof(type) == sizeof(u16)) \
|
||||
{ \
|
||||
if(check) check_string(s,sizeof(type)); \
|
||||
if(check && !check_string(s,sizeof(type))) \
|
||||
general_error(ERROR_C_STRING,tag_object(s),F,true); \
|
||||
return (type*)(s + 1); \
|
||||
} \
|
||||
else \
|
||||
|
|
|
@ -94,6 +94,8 @@ void primitive_string(void);
|
|||
F_STRING *resize_string(F_STRING *string, F_FIXNUM capacity, u16 fill);
|
||||
void primitive_resize_string(void);
|
||||
|
||||
bool check_string(F_STRING *s, CELL max);
|
||||
|
||||
F_STRING *memory_to_char_string(const char *string, CELL length);
|
||||
void primitive_memory_to_char_string(void);
|
||||
F_STRING *from_char_string(const char *c_string);
|
||||
|
|
Loading…
Reference in New Issue