/* ** Check whether a float number is within the range of a lua_Integer. ** (The comparisons are tricky because of rounding, which can or ** not occur depending on the relative sizes of floats and integers.) ** This function is called only when 'n' has an integer value. */ int luaV_numtointeger (lua_Number n, lua_Integer *p) { if (cast_num(MIN_INTEGER) <= n && n < (MAX_INTEGER + cast_num(1))) { *p = cast_integer(n); lua_assert(cast_num(*p) == n); return 1; } return 0; /* number is outside integer limits */ }
fs_value fn_substring(fs_query *q, fs_value str, fs_value start, fs_value length) { if (!fs_is_plain_or_string(str)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } if (!fs_is_numeric(&start)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } start = cast_integer(start); /* 2 arg form */ if (length.rid == FS_RID_NULL) { length = fs_value_integer(INT_MAX); } else { if (!fs_is_numeric(&length)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } length = cast_integer(length); } str = fs_value_fill_lexical(q, str); const int slen = g_utf8_strlen(str.lex, -1); if (start.in > slen || length.in <= 0) { fs_value ret = fs_value_plain(""); ret.attr = str.attr; return ret; } gchar *spos = g_utf8_offset_to_pointer(str.lex, start.in - 1); int retlen_utf8 = g_utf8_strlen(spos, -1); if (retlen_utf8 > length.in) { retlen_utf8 = length.in; } gchar *epos = g_utf8_offset_to_pointer(spos, retlen_utf8); int retlen_bytes = epos - spos + 1; char *retstr = g_malloc(retlen_bytes+1); retstr[retlen_bytes] = '\0'; g_utf8_strncpy(retstr, spos, retlen_utf8); fs_query_add_freeable(q, retstr); fs_value ret = fs_value_plain(retstr); ret.attr = str.attr; return ret; }
fs_value fn_cast_intl(fs_query *q, fs_value v, fs_rid dt) { if (dt == fs_c.xsd_double || dt == fs_c.xsd_float) { v = cast_double(v); } else if (dt == fs_c.xsd_integer || dt == fs_c.xsd_int) { v = cast_integer(v); } else if (dt == fs_c.xsd_decimal) { v = cast_decimal(v); } else if (dt == fs_c.xsd_string) { v = fs_value_fill_lexical(q, v); } else if (dt == fs_c.xsd_datetime) { v = cast_datetime(q, v); } else if (dt == fs_c.xsd_boolean) { v = cast_boolean(v); } v.attr = dt; return v; }