Changeset View
Changeset View
Standalone View
Standalone View
head/usr.bin/dc/mem.c
Show All 16 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <openssl/err.h> | #include <openssl/err.h> | ||||
#include <err.h> | #include <err.h> | ||||
#include <limits.h> | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include "extern.h" | #include "extern.h" | ||||
struct number * | struct number * | ||||
new_number(void) | new_number(void) | ||||
{ | { | ||||
struct number *n; | struct number *n; | ||||
n = bmalloc(sizeof(*n)); | n = bmalloc(sizeof(*n)); | ||||
n->scale = 0; | n->scale = 0; | ||||
n->number = BN_new(); | n->number = BN_new(); | ||||
if (n->number == NULL) | if (n->number == NULL) | ||||
err(1, NULL); | err(1, NULL); | ||||
return (n); | return (n); | ||||
} | } | ||||
void | void | ||||
free_number(struct number *n) | free_number(struct number *n) | ||||
{ | { | ||||
BN_free(n->number); | BN_free(n->number); | ||||
free(n); | free(n); | ||||
} | |||||
/* | |||||
* Divide dividend by divisor, returning the result. Retain bscale places of | |||||
* precision. | |||||
* The result must be freed when no longer in use | |||||
*/ | |||||
struct number * | |||||
div_number(struct number *dividend, struct number *divisor, u_int bscale) | |||||
{ | |||||
struct number *quotient; | |||||
BN_CTX *ctx; | |||||
u_int scale; | |||||
quotient = new_number(); | |||||
quotient->scale = bscale; | |||||
scale = max(divisor->scale, dividend->scale); | |||||
if (BN_is_zero(divisor->number)) | |||||
warnx("divide by zero"); | |||||
else { | |||||
normalize(divisor, scale); | |||||
normalize(dividend, scale + quotient->scale); | |||||
ctx = BN_CTX_new(); | |||||
bn_checkp(ctx); | |||||
bn_check(BN_div(quotient->number, NULL, dividend->number, | |||||
divisor->number, ctx)); | |||||
BN_CTX_free(ctx); | |||||
} | |||||
return (quotient); | |||||
} | } | ||||
struct number * | struct number * | ||||
dup_number(const struct number *a) | dup_number(const struct number *a) | ||||
{ | { | ||||
struct number *n; | struct number *n; | ||||
n = bmalloc(sizeof(*n)); | n = bmalloc(sizeof(*n)); | ||||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |