added fallback code for math::round()

This commit is contained in:
hyung-hwan 2014-09-03 04:08:28 +00:00
parent 2e6765e4ba
commit b54964ac85
4 changed files with 61 additions and 7 deletions

View File

@ -183,7 +183,12 @@ static qse_sck_hnd_t open_server_socket (int proto, const qse_nwad_t* bindnwad)
skad_len = qse_nwadtoskad (bindnwad, &skad);
family = qse_skadfamily(&skad);
#if defined(IPPROTO_SCTP)
type = (proto == IPPROTO_SCTP)? SOCK_SEQPACKET: SOCK_DGRAM;
#else
type = SOCK_DGRAM;
#endif
s = socket (family, type, proto);
if (!qse_isvalidsckhnd(s))
@ -221,6 +226,7 @@ static qse_sck_hnd_t open_server_socket (int proto, const qse_nwad_t* bindnwad)
}
bind_ok:
#if defined(IPPROTO_SCTP)
if (proto == IPPROTO_SCTP)
{
#if defined(SOL_SCTP)
@ -252,6 +258,7 @@ bind_ok:
goto oops;
}
}
#endif
return s;

View File

@ -155,7 +155,45 @@ static qse_awk_flt_t math_round (qse_awk_t* awk, qse_awk_flt_t x)
#elif defined(HAVE_ROUNDF)
return roundf (x);
#else
#error ### no round function available ###
qse_flt_t f, d;
f = math_floor (awk, x);
d = x - f; /* get fraction */
if (d > (qse_awk_flt_t)0.5)
{
/* round up to the nearest */
f = f + (qse_awk_flt_t)1.0;
}
else if (d == (qse_awk_flt_t)0.5)
{
#if 1
/* round half away from zero */
if (x >= 0)
{
f = x + (qse_awk_flt_t)0.5;
}
else
{
f = x - (qse_awk_flt_t)0.5;
}
#else
/* round half to even - C99's rint() does this, i guess. */
d = f - (qse_awk_flt_t)2.0 * math_floor(awk, f * (qse_awk_flt_t)0.5);
if (d == (qse_awk_flt_t)1.0) f = f + (qse_awk_flt_t)1.0;
#endif
}
/* this implementation doesn't keep the signbit for -0.0.
* The signbit() function defined in C99 may get used to
* preserve the sign bit. but this is a fall-back rountine
* for a system without round also defined in C99.
* don't get annoyed by the lost sign bit for the value of 0.0.
*/
return f;
#endif
}

View File

@ -119,7 +119,11 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
httpd->opt.rcb.logact (httpd, &msg);
}
#if defined(IPPROTO_SCTP)
type = (proto == IPPROTO_SCTP)? SOCK_SEQPACKET: SOCK_DGRAM;
#else
type = SOCK_DGRAM;
#endif
urs->handle[0].i = open_udp_socket (httpd, AF_INET, type, proto);
#if defined(AF_INET6)

View File

@ -430,8 +430,11 @@ static QSE_INLINE qse_ssize_t __send_file (
#endif
size_t xfer;
ssize_t ret;
qse_fio_hnd_t fh;
vec.sfv_fd = in_fd.i;
fh = qse_fio_gethandle(in_fd.ptr);
vec.sfv_fd = fh;
vec.sfv_flag = 0;
if (offset)
{
@ -439,7 +442,7 @@ static QSE_INLINE qse_ssize_t __send_file (
}
else
{
vec.sfv_off = QSE_LSEEK (in_fd.i, 0, SEEK_CUR);
vec.sfv_off = QSE_LSEEK (fh, 0, SEEK_CUR);
if (vec.sfv_off == (off_t)-1) return (qse_ssize_t)-1;
}
vec.sfv_len = count;
@ -739,6 +742,7 @@ static qse_sck_hnd_t open_udp_socket (qse_httpd_t* httpd, int domain, int type,
if (set_socket_nonblock (httpd, fd, 1) <= -1) goto oops;
#if defined(IPPROTO_SCTP)
if (proto == IPPROTO_SCTP)
{
#if defined(SOL_SCTP)
@ -760,6 +764,7 @@ static qse_sck_hnd_t open_udp_socket (qse_httpd_t* httpd, int domain, int type,
if (setsockopt (fd, SOL_SCTP, SCTP_PEER_ADDR_PARAMS, &hb, QSE_SIZEOF(hb)) <= -1) goto oops;
#endif
}
#endif
return fd;