Changeset: c1c76c3baba1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c1c76c3baba1 Modified Files: monetdb5/modules/kernel/mmath.c Branch: default Log Message:
Reduce use of C macros.
diffs (truncated from 681 to 300 lines):
diff --git a/monetdb5/modules/kernel/mmath.c b/monetdb5/modules/kernel/mmath.c
--- a/monetdb5/modules/kernel/mmath.c
+++ b/monetdb5/modules/kernel/mmath.c
@@ -82,159 +82,474 @@ logbsf(float base, float x)
return logf(x) / logf(base);
}
-#define unopbaseM5(NAME, FUNC, TYPE)
\
-static str
\
-MATHunary##NAME##TYPE(Client ctx, TYPE *res, const TYPE *a)
\
-{
\
- (void) ctx;
\
- if (is_##TYPE##_nil(*a)) {
\
- *res = TYPE##_nil;
\
- } else {
\
- int e = 0, ex = 0;
\
- errno = 0;
\
- feclearexcept(FE_ALL_EXCEPT);
\
- *res = FUNC(*a);
\
- e = errno;
\
- ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
\
- if (e != 0 || ex != 0) {
\
- const char *err;
\
- const char *sqlstate;
\
- char buf[128];
\
- if (ex & FE_DIVBYZERO) {
\
- err = "Divide by zero";
\
- sqlstate = SQLSTATE(22012);
\
- } else if (ex & FE_OVERFLOW ||
\
- (e == ERANGE && isinf(*res))) {
\
- err = "Overflow";
\
- sqlstate = SQLSTATE(22003);
\
- } else if (e == EDOM) {
\
- err = "Invalid argument";
\
- if (strncmp(#FUNC, "log", 3) == 0)
\
- sqlstate = SQLSTATE(2201E);
\
- else if (strcmp(#FUNC, "pow") == 0)
\
- sqlstate = SQLSTATE(2201F);
\
- else
\
- sqlstate = SQLSTATE(22003);
\
- } else if (e) {
\
- err = GDKstrerror(e, buf, sizeof(buf));
\
- sqlstate = "";
\
- } else {
\
- err = "Invalid result";
\
- sqlstate = SQLSTATE(22023);
\
- }
\
- throw(MAL, "mmath." #FUNC, "%sMath exception: %s",
\
- sqlstate, err);
\
- }
\
- }
\
- return MAL_SUCCEED;
\
+static str
+MATHunary_dbl(Client ctx, dbl *res, const dbl *a, double (*func)(double),
+ const char *funcname)
+{
+ (void) ctx;
+ if (is_dbl_nil(*a)) {
+ *res = dbl_nil;
+ } else {
+ int e = 0, ex = 0;
+ errno = 0;
+ feclearexcept(FE_ALL_EXCEPT);
+ *res = (*func)(*a);
+ e = errno;
+ ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
+ if (e != 0 || ex != 0) {
+ const char *err;
+ const char *sqlstate;
+ char buf[128];
+ if (ex & FE_DIVBYZERO) {
+ err = "Divide by zero";
+ sqlstate = SQLSTATE(22012);
+ } else if (ex & FE_OVERFLOW ||
+ (e == ERANGE && isinf(*res))) {
+ err = "Overflow";
+ sqlstate = SQLSTATE(22003);
+ } else if (e == EDOM) {
+ err = "Invalid argument";
+ if (strncmp(funcname, "mmath.log", 9) == 0)
+ sqlstate = SQLSTATE(2201E);
+ else
+ sqlstate = SQLSTATE(22003);
+ } else if (e) {
+ err = GDKstrerror(e, buf, sizeof(buf));
+ sqlstate = "";
+ } else {
+ err = "Invalid result";
+ sqlstate = SQLSTATE(22023);
+ }
+ throw(MAL, funcname, "%sMath exception: %s", sqlstate,
err);
+ }
+ }
+ return MAL_SUCCEED;
+}
+
+static str
+MATHunary_flt(Client ctx, flt *res, const flt *a, float (*func)(float),
+ const char *funcname)
+{
+ (void) ctx;
+ if (is_flt_nil(*a)) {
+ *res = flt_nil;
+ } else {
+ int e = 0, ex = 0;
+ errno = 0;
+ feclearexcept(FE_ALL_EXCEPT);
+ *res = (*func)(*a);
+ e = errno;
+ ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
+ if (e != 0 || ex != 0) {
+ const char *err;
+ const char *sqlstate;
+ char buf[128];
+ if (ex & FE_DIVBYZERO) {
+ err = "Divide by zero";
+ sqlstate = SQLSTATE(22012);
+ } else if (ex & FE_OVERFLOW ||
+ (e == ERANGE && isinf(*res))) {
+ err = "Overflow";
+ sqlstate = SQLSTATE(22003);
+ } else if (e == EDOM) {
+ err = "Invalid argument";
+ if (strncmp(funcname, "mmath.log", 9) == 0)
+ sqlstate = SQLSTATE(2201E);
+ else
+ sqlstate = SQLSTATE(22003);
+ } else if (e) {
+ err = GDKstrerror(e, buf, sizeof(buf));
+ sqlstate = "";
+ } else {
+ err = "Invalid result";
+ sqlstate = SQLSTATE(22023);
+ }
+ throw(MAL, funcname, "%sMath exception: %s", sqlstate,
err);
+ }
+ }
+ return MAL_SUCCEED;
+}
+
+static str
+MATHbinary_dbl(Client ctx, dbl *res, const dbl *a, const dbl *b,
+ double (*func)(double, double), const char *funcname)
+{
+ (void) ctx;
+ if (is_dbl_nil(*a) || is_dbl_nil(*b)) {
+ *res = dbl_nil;
+ } else {
+ int e = 0, ex = 0;
+ errno = 0;
+ feclearexcept(FE_ALL_EXCEPT);
+ *res = (*func)(*a, *b);
+ e = errno;
+ ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
+ if (e != 0 || ex != 0) {
+ const char *err;
+ const char *sqlstate;
+ char buf[128];
+ if (ex & FE_DIVBYZERO) {
+ err = "Divide by zero";
+ sqlstate = SQLSTATE(22012);
+ } else if (ex & FE_OVERFLOW ||
+ (e == ERANGE && isinf(*res))) {
+ err = "Overflow";
+ sqlstate = SQLSTATE(22003);
+ } else if (e == EDOM) {
+ err = "Invalid argument";
+ if (strncmp(funcname, "mmath.log", 9) == 0)
+ sqlstate = SQLSTATE(2201E);
+ else if (strcmp(funcname, "mmath.pow") == 0)
+ sqlstate = SQLSTATE(2201F);
+ else
+ sqlstate = SQLSTATE(22003);
+ } else if (e) {
+ err = GDKstrerror(e, buf, sizeof(buf));
+ sqlstate = "";
+ } else {
+ err = "Invalid result";
+ sqlstate = SQLSTATE(22023);
+ }
+ throw(MAL, funcname, "%sMath exception: %s", sqlstate,
err);
+ }
+ }
+ return MAL_SUCCEED;
+}
+
+static str
+MATHbinary_flt(Client ctx, flt *res, const flt *a, const flt *b,
+ float (*func)(float, float), const char *funcname)
+{
+ (void) ctx;
+ if (is_flt_nil(*a) || is_flt_nil(*b)) {
+ *res = flt_nil;
+ } else {
+ int e = 0, ex = 0;
+ errno = 0;
+ feclearexcept(FE_ALL_EXCEPT);
+ *res = (*func)(*a, *b);
+ e = errno;
+ ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
+ if (e != 0 || ex != 0) {
+ const char *err;
+ const char *sqlstate;
+ char buf[128];
+ if (ex & FE_DIVBYZERO) {
+ err = "Divide by zero";
+ sqlstate = SQLSTATE(22012);
+ } else if (ex & FE_OVERFLOW ||
+ (e == ERANGE && isinf(*res))) {
+ err = "Overflow";
+ sqlstate = SQLSTATE(22003);
+ } else if (e == EDOM) {
+ err = "Invalid argument";
+ if (strncmp(funcname, "mmath.log", 9) == 0)
+ sqlstate = SQLSTATE(2201E);
+ else if (strcmp(funcname, "mmath.pow") == 0)
+ sqlstate = SQLSTATE(2201F);
+ else
+ sqlstate = SQLSTATE(22003);
+ } else if (e) {
+ err = GDKstrerror(e, buf, sizeof(buf));
+ sqlstate = "";
+ } else {
+ err = "Invalid result";
+ sqlstate = SQLSTATE(22023);
+ }
+ throw(MAL, funcname, "%sMath exception: %s", sqlstate,
err);
+ }
+ }
+ return MAL_SUCCEED;
+}
+
+static str
+MATHunary_ACOSdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, acos, "mmath.acos");
+}
+
+static str
+MATHunary_ACOSflt(Client ctx, flt *res, const flt *a)
+{
+ return MATHunary_flt(ctx, res, a, acosf, "mmath.acos");
+}
+
+static str
+MATHunary_ASINdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, asin, "mmath.asin");
+}
+
+static str
+MATHunary_ASINflt(Client ctx, flt *res, const flt *a)
+{
+ return MATHunary_flt(ctx, res, a, asinf, "mmath.asin");
+}
+
+static str
+MATHunary_ATANdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, atan, "mmath.atan");
+}
+
+static str
+MATHunary_ATANflt(Client ctx, flt *res, const flt *a)
+{
+ return MATHunary_flt(ctx, res, a, atanf, "mmath.atan");
+}
+
+static str
+MATHunary_COSdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, cos, "mmath.cos");
+}
+
+static str
+MATHunary_COSflt(Client ctx, flt *res, const flt *a)
+{
+ return MATHunary_flt(ctx, res, a, cosf, "mmath.cos");
+}
+
+static str
+MATHunary_SINdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, sin, "mmath.sin");
}
-#define unopM5(NAME, FUNC) \
- unopbaseM5(NAME, FUNC, dbl) \
- unopbaseM5(NAME, FUNC##f, flt)
+static str
+MATHunary_SINflt(Client ctx, flt *res, const flt *a)
+{
+ return MATHunary_flt(ctx, res, a, sinf, "mmath.sin");
+}
+
+static str
+MATHunary_TANdbl(Client ctx, dbl *res, const dbl *a)
+{
+ return MATHunary_dbl(ctx, res, a, tan, "mmath.tan");
+}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
