diff options
| author | daurnimator <quae@daurnimator.com> | 2015-11-15 20:44:09 +1100 |
|---|---|---|
| committer | daurnimator <quae@daurnimator.com> | 2015-11-15 20:44:09 +1100 |
| commit | fb08628f17893280da43c70f0919687feca09265 (patch) | |
| tree | 1f75d2a67852d9c06343b505108f8049d393c57e | |
| parent | 60fc10973eb348cb3d99d27f083437ddeab03f14 (diff) | |
| download | luaossl-fb08628f17893280da43c70f0919687feca09265.tar.gz luaossl-fb08628f17893280da43c70f0919687feca09265.tar.bz2 luaossl-fb08628f17893280da43c70f0919687feca09265.zip | |
Implement lua rounding style for __mod operator
| -rw-r--r-- | src/openssl.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/openssl.c b/src/openssl.c index 9dbcda7..69115ce 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
| @@ -1809,6 +1809,12 @@ static int bn__mod(lua_State *L) { | |||
| 1809 | if (!BN_mod(r, a, b, getctx(L))) | 1809 | if (!BN_mod(r, a, b, getctx(L))) |
| 1810 | return auxL_error(L, auxL_EOPENSSL, "bignum:__mod"); | 1810 | return auxL_error(L, auxL_EOPENSSL, "bignum:__mod"); |
| 1811 | 1811 | ||
| 1812 | /* lua has different rounding behaviour for mod than C */ | ||
| 1813 | if (!BN_is_zero(r) && (BN_is_negative(a) ^ BN_is_negative(b))) { | ||
| 1814 | if (!BN_add(r, r, b)) | ||
| 1815 | return auxL_error(L, auxL_EOPENSSL, "bignum:__mod"); | ||
| 1816 | } | ||
| 1817 | |||
| 1812 | return 1; | 1818 | return 1; |
| 1813 | } /* bn__mod() */ | 1819 | } /* bn__mod() */ |
| 1814 | 1820 | ||
