mirror of https://github.com/arendst/Tasmota.git
Berry automatic rounding of float to int when calling C mapped functions (#21601)
This commit is contained in:
parent
bdc15960ad
commit
c86e4db3a9
|
@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Matter support for Air Quality sensors (#21559)
|
- Matter support for Air Quality sensors (#21559)
|
||||||
- Matter support for bridged Air Quality (#21597)
|
- Matter support for bridged Air Quality (#21597)
|
||||||
- HASPmota rounds to nearest int values passed as 'real' (#21599)
|
- HASPmota rounds to nearest int values passed as 'real' (#21599)
|
||||||
|
- Berry automatic rounding of float to int when calling C mapped functions
|
||||||
|
|
||||||
### Breaking Changed
|
### Breaking Changed
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,13 @@
|
||||||
#include "be_exec.h"
|
#include "be_exec.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#if BE_USE_SINGLE_FLOAT
|
||||||
|
#define mathfunc(func) func##f
|
||||||
|
#else
|
||||||
|
#define mathfunc(func) func
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Ubuntu 22.04 LTS seems to have an invalid or missing signature for strtok_r, forcing a correct one */
|
/* Ubuntu 22.04 LTS seems to have an invalid or missing signature for strtok_r, forcing a correct one */
|
||||||
extern char *strtok_r(char *str, const char *delim, char **saveptr);
|
extern char *strtok_r(char *str, const char *delim, char **saveptr);
|
||||||
|
@ -227,7 +234,15 @@ intptr_t be_convert_single_elt(bvm *vm, int idx, const char * arg_type, int *buf
|
||||||
type_ok = type_ok || (arg_type[0] == provided_type && arg_type[1] == 0); // or type is a match (single char only)
|
type_ok = type_ok || (arg_type[0] == provided_type && arg_type[1] == 0); // or type is a match (single char only)
|
||||||
type_ok = type_ok || (ret == 0 && arg_type_len != 1); // or NULL is accepted for an instance
|
type_ok = type_ok || (ret == 0 && arg_type_len != 1); // or NULL is accepted for an instance
|
||||||
type_ok = type_ok || (ret == 0 && arg_type[0] == 's' && arg_type[1] == 0); // accept nil for string, can be dangerous
|
type_ok = type_ok || (ret == 0 && arg_type[0] == 's' && arg_type[1] == 0); // accept nil for string, can be dangerous
|
||||||
|
if (!type_ok) {
|
||||||
|
if ((provided_type == 'f') && (arg_type[0] == 'i') && (arg_type[1] == 0)) {
|
||||||
|
// special case: float is accepted as int
|
||||||
|
breal v_real = be_toreal(vm, idx);
|
||||||
|
ret = mathfunc(round)(v_real);
|
||||||
|
provided_type = 'i';
|
||||||
|
type_ok = btrue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!type_ok) {
|
if (!type_ok) {
|
||||||
be_raisef(vm, "type_error", "Unexpected argument type '%c', expected '%s'", provided_type, arg_type);
|
be_raisef(vm, "type_error", "Unexpected argument type '%c', expected '%s'", provided_type, arg_type);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue