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]

Reply via email to