[gnumeric] transform r.qbinom to binom.inv even for more than 3 arguments in xlsx export



commit 4d6693336778c4fdca2c85c882eb7d21bb69296d
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Mon Jun 24 14:02:31 2013 -0600

    transform r.qbinom to binom.inv even for more than 3 arguments in xlsx export
    
    2013-06-24  Andreas J. Guelzow <aguelzow pyrshep ca>
    
        * xlsx-utils.c (xlsx_func_binominv_output_handler):
        translate the expression even for more than 3 arguments

 plugins/excel/ChangeLog    |    5 ++++
 plugins/excel/xlsx-utils.c |   50 +++++++++++++++++++++++++++++++++++--------
 2 files changed, 45 insertions(+), 10 deletions(-)
---
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 7fd954f..0ddd143 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,8 @@
+2013-06-24  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+       * xlsx-utils.c (xlsx_func_binominv_output_handler):
+       translate the expression even for more than 3 arguments
+
 2013-06-22  Andreas J. Guelzow <aguelzow pyrshep ca>
 
        * xlsx-utils.c (xlsx_func_floor_output_handler): new
diff --git a/plugins/excel/xlsx-utils.c b/plugins/excel/xlsx-utils.c
index 374382b..5ed1820 100644
--- a/plugins/excel/xlsx-utils.c
+++ b/plugins/excel/xlsx-utils.c
@@ -209,25 +209,55 @@ xlsx_func_binominv_handler (G_GNUC_UNUSED GnmConventions const *convs, G_GNUC_UN
        return gnm_expr_new_funcall (f, args);
 }
 
+
 static gboolean
 xlsx_func_binominv_output_handler (GnmConventionsOut *out, GnmExprFunction const *func)
-/* R.QBINOM(c,a,b) --> BINOM.INV(a,b,c) */
 {
+#define OUTPUT_BINOM_INV(pre,post)             g_string_append (target, "_xlfn.BINOM.INV("); \
+               gnm_expr_as_gstring (ptr[1], out);\
+               g_string_append_c (target, ',');\
+               gnm_expr_as_gstring (ptr[2], out);\
+               g_string_append (target, pre);\
+               gnm_expr_as_gstring (ptr[0], out);\
+               g_string_append (target, post)
+
+       GnmExprConstPtr const *ptr = func->argv;
+       GString *target = out->accum;
+
        if (func->argc == 3) {
-               GString *target = out->accum;
-               GnmExprConstPtr const *ptr = func->argv;
-               g_string_append (target, "_xlfn.BINOM.INV(");
-               gnm_expr_as_gstring (ptr[1], out);
-               g_string_append_c (out->accum, ',');
-               gnm_expr_as_gstring (ptr[2], out);
-               g_string_append_c (out->accum, ',');
-               gnm_expr_as_gstring (ptr[0], out);
-               g_string_append_c (out->accum, ')');
+               /* R.QBINOM(c,a,b) --> BINOM.INV(a,b,c) */
+               OUTPUT_BINOM_INV (",",")");
+               return TRUE;
+       } else if (func->argc == 4) {
+               /* R.QBINOM(c,a,b,d) --> if(d,binom.inv(a,b,c), binom.inv(a,b,1-c)) */
+               g_string_append (target, "if(");
+               gnm_expr_as_gstring (ptr[3], out);
+               g_string_append (target, ",");
+               OUTPUT_BINOM_INV(",","),");
+               OUTPUT_BINOM_INV(",1-","))");
+               return TRUE;
+       } else if (func->argc == 5) {
+               /* R.QBINOM(c,a,b,d,e) -->
+                          if(d,if(e,binom.inv(a,b,exp(c)),binom.inv(a,b,c)),
+                               if(e,binom.inv(a,b,1-exp(c)),binom.inv(a,b,1-c)))*/
+               g_string_append (target, "if(");
+               gnm_expr_as_gstring (ptr[3], out);
+               g_string_append (target, ",if(");
+               gnm_expr_as_gstring (ptr[4], out);
+               g_string_append (target, ",");
+               OUTPUT_BINOM_INV(",exp(",")),");
+               OUTPUT_BINOM_INV(",",")),if(");
+               gnm_expr_as_gstring (ptr[4], out);
+               g_string_append (target, ",");
+               OUTPUT_BINOM_INV(",1-exp(",")),");
+               OUTPUT_BINOM_INV(",1-",")))");
                return TRUE;
        }
        return FALSE;
+#undef OUTPUT_BINOM_INV
 }
 
+
 static gboolean
 xlsx_func_chisqinv_output_handler (GnmConventionsOut *out, GnmExprFunction const *func)
 /* R.QCHISQ(a,b) --> CHISQ.INV(a,b) */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]