[gnumeric] Handle ODF function CHISQDIST
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnumeric] Handle ODF function CHISQDIST
- Date: Thu, 18 Jun 2009 15:11:17 -0400 (EDT)
commit f482317ceb3a121be3fa9ec31482957974da5e37
Author: Andreas J. Guelzow <aguelzow pyrshep ca>
Date: Thu Jun 18 13:10:21 2009 -0600
Handle ODF function CHISQDIST
2009-06-18 Andreas J. Guelzow <aguelzow pyrshep ca>
* openoffice-read.c (odf_func_chisqdist_handler): new
(oo_func_map_in): new handler hash
* openoffice-write.c (odf_func_r_dchisq_handler): new
(odf_func_r_pchisq_handler): new
(sc_func_handlers): hook up the above
2009-06-18 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/expr.h (gnm_func_lookup_or_add_placeholder): new
* src/expr.c (gnm_func_lookup_or_add_placeholder): new
ChangeLog | 7 +-
plugins/openoffice/ChangeLog | 8 +
plugins/openoffice/openoffice-read.c | 83 +++++-
plugins/openoffice/openoffice-write.c | 502 +++++++++++++++++----------------
src/func.c | 11 +
src/func.h | 3 +
6 files changed, 372 insertions(+), 242 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 91decc3..85e53b0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-18 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ * src/expr.h (gnm_func_lookup_or_add_placeholder): new
+ * src/expr.c (gnm_func_lookup_or_add_placeholder): new
+
2009-06-17 Morten Welinder <terra gnome org>
* src/mathfunc.c (gnm_coth, gnm_acoth): New functions.
@@ -5,7 +10,7 @@
2009-06-17 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/expr.h (gnm_expr_list_as_string): new
- * src/expr.h (gnm_expr_list_as_string): make non-static
+ * src/expr.c (gnm_expr_list_as_string): make non-static
(do_expr_as_string): use convs->output.func
* src/parse-util.h (_GnmConventions): add func field
* src/parse-util.c (std_expr_func_handler): new
diff --git a/plugins/openoffice/ChangeLog b/plugins/openoffice/ChangeLog
index db63f22..5be655e 100644
--- a/plugins/openoffice/ChangeLog
+++ b/plugins/openoffice/ChangeLog
@@ -1,5 +1,13 @@
2009-06-18 Andreas J. Guelzow <aguelzow pyrshep ca>
+ * openoffice-read.c (odf_func_chisqdist_handler): new
+ (oo_func_map_in): new handler hash
+ * openoffice-write.c (odf_func_r_dchisq_handler): new
+ (odf_func_r_pchisq_handler): new
+ (sc_func_handlers): hook up the above
+
+2009-06-18 Andreas J. Guelzow <aguelzow pyrshep ca>
+
* openoffice-write.c (odf_func_r_qchisq_handler): new
(odf_expr_func_handler): add hash of individual handlers, map
GET.FORMULA to FORMULA and 2-argument instances of R.QCHISQ to
diff --git a/plugins/openoffice/openoffice-read.c b/plugins/openoffice/openoffice-read.c
index 7fbd9da..3144500 100644
--- a/plugins/openoffice/openoffice-read.c
+++ b/plugins/openoffice/openoffice-read.c
@@ -3599,10 +3599,66 @@ static GsfXMLInNode const *get_dtd () { return opendoc_content_dtd; }
/****************************************************************************/
static GnmExpr const *
+odf_func_chisqdist_handler (GnmConventions const *convs, Workbook *scope, GnmExprList *args)
+{
+ switch (gnm_expr_list_length (args)) {
+ case 2: {
+ GnmFunc *f = gnm_func_lookup_or_add_placeholder ("R.PCHISQ", scope, FALSE);
+ return gnm_expr_new_funcall (f, args);
+ }
+ case 3: {
+ GSList * link = g_slist_nth ((GSList *) args, 2);
+ GnmExpr const *expr = link->data;
+ GnmFunc *fd_if;
+ GnmFunc *fd_pchisq;
+ GnmFunc *fd_dchisq;
+ GnmExpr const *expr_pchisq;
+ GnmExpr const *expr_dchisq;
+
+ args = (GnmExprList *) g_slist_remove_link ((GSList *) args, link);
+ g_slist_free (link);
+
+ if (GNM_EXPR_GET_OPER (expr) == GNM_EXPR_OP_FUNCALL) {
+ if (go_ascii_strcase_equal (expr->func.func->name, "TRUE")) {
+ fd_pchisq = gnm_func_lookup_or_add_placeholder ("R.PCHISQ", scope, FALSE);
+ gnm_expr_free (expr);
+ return gnm_expr_new_funcall (fd_pchisq, args);
+ }
+ if (go_ascii_strcase_equal (expr->func.func->name, "FALSE")) {
+ fd_dchisq = gnm_func_lookup_or_add_placeholder ("R.DCHISQ", scope, FALSE);
+ gnm_expr_free (expr);
+ return gnm_expr_new_funcall (fd_dchisq, args);
+ }
+ }
+ fd_if = gnm_func_lookup_or_add_placeholder ("IF", scope, FALSE);
+ fd_pchisq = gnm_func_lookup_or_add_placeholder ("R.PCHISQ", scope, FALSE);
+ fd_dchisq = gnm_func_lookup_or_add_placeholder ("R.DCHISQ", scope, FALSE);
+ expr_pchisq = gnm_expr_new_funcall2
+ (fd_pchisq, gnm_expr_copy (g_slist_nth_data ((GSList *) args, 0)),
+ gnm_expr_copy (g_slist_nth_data ((GSList *) args, 1)));
+ expr_dchisq = gnm_expr_new_funcall (fd_dchisq, args);
+ return gnm_expr_new_funcall3 (fd_if, expr, expr_pchisq, expr_dchisq);
+ }
+ default:
+ break;
+ }
+ return NULL;
+}
+
+
+static GnmExpr const *
oo_func_map_in (GnmConventions const *convs, Workbook *scope,
char const *name, GnmExprList *args)
{
static struct {
+ char const *gnm_name;
+ gpointer handler;
+ } const sc_func_handlers[] = {
+ {"CHISQDIST", odf_func_chisqdist_handler},
+ {NULL, NULL}
+ };
+
+ static struct {
char const *oo_name;
char const *gnm_name;
} const sc_func_renames[] = {
@@ -4049,10 +4105,12 @@ oo_func_map_in (GnmConventions const *convs, Workbook *scope,
static char const OOoAnalysisPrefix[] = "com.sun.star.sheet.addin.Analysis.get";
static char const GnumericPrefix[] = "ORG.GNUMERIC.";
static GHashTable *namemap = NULL;
+ static GHashTable *handlermap = NULL;
GnmFunc *f;
char const *new_name;
int i;
+ GnmExpr const * (*handler) (GnmConventions const *convs, Workbook *scope, GnmExprList *args);
#warning "TODO : OO adds a 'mode' parm to floor/ceiling"
#warning "TODO : OO missing 'A1' parm for address"
@@ -4064,18 +4122,33 @@ oo_func_map_in (GnmConventions const *convs, Workbook *scope,
(gchar *) sc_func_renames[i].oo_name,
(gchar *) sc_func_renames[i].gnm_name);
}
+ if (NULL == handlermap) {
+ guint i;
+ handlermap = g_hash_table_new (go_ascii_strcase_hash,
+ go_ascii_strcase_equal);
+ for (i = 0; sc_func_handlers[i].gnm_name; i++)
+ g_hash_table_insert (handlermap,
+ (gchar *) sc_func_handlers[i].gnm_name,
+ sc_func_handlers[i].handler);
+ }
+
+ handler = g_hash_table_lookup (handlermap, name);
+ if (handler != NULL) {
+ GnmExpr const * res = handler (convs, scope, args);
+ if (res != NULL)
+ return res;
+ }
+
if (0 == strncmp (name, GnumericPrefix, sizeof (GnumericPrefix)-1)) {
- f = gnm_func_lookup (name+sizeof (GnumericPrefix)-1, scope);
+ f = gnm_func_lookup_or_add_placeholder (name+sizeof (GnumericPrefix)-1, scope, TRUE);
} else if (0 != strncmp (name, OOoAnalysisPrefix, sizeof (OOoAnalysisPrefix)-1)) {
if (NULL != namemap &&
NULL != (new_name = g_hash_table_lookup (namemap, name)))
name = new_name;
- f = gnm_func_lookup (name, scope);
+ f = gnm_func_lookup_or_add_placeholder (name, scope, TRUE);
} else
- f = gnm_func_lookup (name+sizeof (OOoAnalysisPrefix)-1, scope);
+ f = gnm_func_lookup_or_add_placeholder (name+sizeof (OOoAnalysisPrefix)-1, scope, TRUE);
- if (NULL == f)
- f = gnm_func_add_placeholder (scope, name, "", TRUE);
return gnm_expr_new_funcall (f, args);
}
diff --git a/plugins/openoffice/openoffice-write.c b/plugins/openoffice/openoffice-write.c
index 1f78726..ec37ad4 100644
--- a/plugins/openoffice/openoffice-write.c
+++ b/plugins/openoffice/openoffice-write.c
@@ -1284,6 +1284,34 @@ odf_rangeref_as_string (GnmConventionsOut *out, GnmRangeRef const *ref)
}
static gboolean
+odf_func_r_dchisq_handler (GnmConventionsOut *out, GnmExprFunction const *func)
+{
+ if (func->argc == 2) {
+ GString *target = out->accum;
+ GnmExprConstPtr const *ptr = func->argv;
+ g_string_append (target, "CHISQDIST(");
+ gnm_expr_as_gstring (ptr[0], out);
+ g_string_append_c (out->accum, ';');
+ gnm_expr_as_gstring (ptr[1], out);
+ g_string_append (out->accum, ";FALSE())");
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+odf_func_r_pchisq_handler (GnmConventionsOut *out, GnmExprFunction const *func)
+{
+ if (func->argc == 2) {
+ GString *target = out->accum;
+ g_string_append (target, "CHISQDIST");
+ gnm_expr_list_as_string (func->argc, func->argv, out);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
odf_func_r_qchisq_handler (GnmConventionsOut *out, GnmExprFunction const *func)
{
if (func->argc == 2) {
@@ -1298,204 +1326,206 @@ odf_func_r_qchisq_handler (GnmConventionsOut *out, GnmExprFunction const *func)
static void
odf_expr_func_handler (GnmConventionsOut *out, GnmExprFunction const *func)
{
- static struct {
- char const *gnm_name;
- gpointer handler;
- } const sc_func_handlers[] = {
+ static struct {
+ char const *gnm_name;
+ gpointer handler;
+ } const sc_func_handlers[] = {
{"R.QCHISQ", odf_func_r_qchisq_handler},
+ {"R.DCHISQ", odf_func_r_dchisq_handler},
+ {"R.PCHISQ", odf_func_r_pchisq_handler},
{NULL, NULL}
- };
-
- static struct {
- char const *gnm_name;
- char const *odf_name;
- } const sc_func_renames[] = {
- { "CEIL", "CEILING" },
- { "CHIDIST","LEGACY.CHIDIST" },
- { "CHIINV","LEGACY.CHIINV" },
- { "CHITEST","LEGACY.CHITEST" },
- { "FDIST","LEGACY.FDIST" },
- { "FINV","LEGACY.FINV" },
- { "NORMSDIST","LEGACY.NORMSDIST" },
- { "NORMSINV","LEGACY.NORMSINV" },
- { "GET.FORMULA","FORMULA" },
-
+ };
+
+ static struct {
+ char const *gnm_name;
+ char const *odf_name;
+ } const sc_func_renames[] = {
+ { "CEIL", "CEILING" },
+ { "CHIDIST","LEGACY.CHIDIST" },
+ { "CHIINV","LEGACY.CHIINV" },
+ { "CHITEST","LEGACY.CHITEST" },
+ { "FDIST","LEGACY.FDIST" },
+ { "FINV","LEGACY.FINV" },
+ { "NORMSDIST","LEGACY.NORMSDIST" },
+ { "NORMSINV","LEGACY.NORMSINV" },
+ { "GET.FORMULA","FORMULA" },
+
/* The following Gnumeric specific functions should be preceded by ORG.GNUMERIC.*/
-
- { "ATL_LAST","ORG.GNUMERIC.ATL_LAST" },
- { "BERNOULLI","ORG.GNUMERIC.BERNOULLI" },
- { "BETA","ORG.GNUMERIC.BETA" },
- { "BETALN","ORG.GNUMERIC.BETALN" },
- { "CAUCHY","ORG.GNUMERIC.CAUCHY" },
- { "COLUMNNUMBER","ORG.GNUMERIC.COLUMNNUMBER" },
- { "CRONBACH","ORG.GNUMERIC.CRONBACH" },
- { "CUM_BIV_NORM_DIST","ORG.GNUMERIC.CUM_BIV_NORM_DIST" },
- { "DATE2UNIX","ORG.GNUMERIC.DATE2UNIX" },
- { "DAYS360","ORG.GNUMERIC.DAYS360" },
- { "DIMCIRC","ORG.GNUMERIC.DIMCIRC" },
- { "ERROR","ORG.GNUMERIC.ERROR" },
- { "EURO","ORG.GNUMERIC.EURO" },
- { "EXECSQL","ORG.GNUMERIC.EXECSQL" },
- { "EXPM1","ORG.GNUMERIC.EXPM1" },
- { "EXPPOWDIST","ORG.GNUMERIC.EXPPOWDIST" },
- { "EXPRESSION","ORG.GNUMERIC.EXPRESSION" },
- { "FIB","ORG.GNUMERIC.FIB" },
- { "G_DURATION","ORG.GNUMERIC.G_DURATION" },
- { "GEOMDIST","ORG.GNUMERIC.GEOMDIST" },
- { "GETENV","ORG.GNUMERIC.GETENV" },
- { "G_PRODUCT","ORG.GNUMERIC.G_PRODUCT" },
- { "HYPOT","ORG.GNUMERIC.HYPOT" },
- { "IMARCCOS","ORG.GNUMERIC.IMARCCOS" },
- { "IMARCCOSH","ORG.GNUMERIC.IMARCCOSH" },
- { "IMARCCOT","ORG.GNUMERIC.IMARCCOT" },
- { "IMARCCOTH","ORG.GNUMERIC.IMARCCOTH" },
- { "IMARCCSC","ORG.GNUMERIC.IMARCCSC" },
- { "IMARCCSCH","ORG.GNUMERIC.IMARCCSCH" },
- { "IMARCSEC","ORG.GNUMERIC.IMARCSEC" },
- { "IMARCSECH","ORG.GNUMERIC.IMARCSECH" },
- { "IMARCSIN","ORG.GNUMERIC.IMARCSIN" },
- { "IMARCSINH","ORG.GNUMERIC.IMARCSINH" },
- { "IMARCTAN","ORG.GNUMERIC.IMARCTAN" },
- { "IMARCTANH","ORG.GNUMERIC.IMARCTANH" },
- { "IMCOSH","ORG.GNUMERIC.IMCOSH" },
- { "IMCOTH","ORG.GNUMERIC.IMCOTH" },
- { "IMINV","ORG.GNUMERIC.IMINV" },
- { "IMNEG","ORG.GNUMERIC.IMNEG" },
- { "IMSINH","ORG.GNUMERIC.IMSINH" },
- { "IMTANH","ORG.GNUMERIC.IMTANH" },
- { "INTERPOLATION","ORG.GNUMERIC.INTERPOLATION" },
- { "INVSUMINV","ORG.GNUMERIC.INVSUMINV" },
- { "ISOYEAR","ORG.GNUMERIC.ISOYEAR" },
- { "ISPRIME","ORG.GNUMERIC.ISPRIME" },
- { "ITHPRIME","ORG.GNUMERIC.ITHPRIME" },
- { "KURTP","ORG.GNUMERIC.KURTP" },
- { "LANDAU","ORG.GNUMERIC.LANDAU" },
- { "LAPLACE","ORG.GNUMERIC.LAPLACE" },
- { "LN1P","ORG.GNUMERIC.LN1P" },
- { "LOG2","ORG.GNUMERIC.LOG2" },
- { "LOGFIT","ORG.GNUMERIC.LOGFIT" },
- { "LOGISTIC","ORG.GNUMERIC.LOGISTIC" },
- { "LOGREG","ORG.GNUMERIC.LOGREG" },
- { "NT_D","ORG.GNUMERIC.NT_D" },
- { "NT_MU","ORG.GNUMERIC.NT_MU" },
- { "NT_PHI","ORG.GNUMERIC.NT_PHI" },
- { "NT_PI","ORG.GNUMERIC.NT_PI" },
- { "NT_SIGMA","ORG.GNUMERIC.NT_SIGMA" },
- { "OFFCAP","ORG.GNUMERIC.OFFCAP" },
- { "OFFTRAF","ORG.GNUMERIC.OFFTRAF" },
- { "OPT_2_ASSET_CORRELATION","ORG.GNUMERIC.OPT_2_ASSET_CORRELATION" },
- { "OPT_AMER_EXCHANGE","ORG.GNUMERIC.OPT_AMER_EXCHANGE" },
- { "OPT_BAW_AMER","ORG.GNUMERIC.OPT_BAW_AMER" },
- { "OPT_BINOMIAL","ORG.GNUMERIC.OPT_BINOMIAL" },
- { "OPT_BJER_STENS","ORG.GNUMERIC.OPT_BJER_STENS" },
- { "OPT_BS","ORG.GNUMERIC.OPT_BS" },
- { "OPT_BS_CARRYCOST","ORG.GNUMERIC.OPT_BS_CARRYCOST" },
- { "OPT_BS_DELTA","ORG.GNUMERIC.OPT_BS_DELTA" },
- { "OPT_BS_GAMMA","ORG.GNUMERIC.OPT_BS_GAMMA" },
- { "OPT_BS_RHO","ORG.GNUMERIC.OPT_BS_RHO" },
- { "OPT_BS_THETA","ORG.GNUMERIC.OPT_BS_THETA" },
- { "OPT_BS_VEGA","ORG.GNUMERIC.OPT_BS_VEGA" },
- { "OPT_COMPLEX_CHOOSER","ORG.GNUMERIC.OPT_COMPLEX_CHOOSER" },
- { "OPT_EURO_EXCHANGE","ORG.GNUMERIC.OPT_EURO_EXCHANGE" },
- { "OPT_EXEC","ORG.GNUMERIC.OPT_EXEC" },
- { "OPT_EXTENDIBLE_WRITER","ORG.GNUMERIC.OPT_EXTENDIBLE_WRITER" },
- { "OPT_FIXED_STRK_LKBK","ORG.GNUMERIC.OPT_FIXED_STRK_LKBK" },
- { "OPT_FLOAT_STRK_LKBK","ORG.GNUMERIC.OPT_FLOAT_STRK_LKBK" },
- { "OPT_FORWARD_START","ORG.GNUMERIC.OPT_FORWARD_START" },
- { "OPT_FRENCH","ORG.GNUMERIC.OPT_FRENCH" },
- { "OPT_GARMAN_KOHLHAGEN","ORG.GNUMERIC.OPT_GARMAN_KOHLHAGEN" },
- { "OPT_JUMP_DIFF","ORG.GNUMERIC.OPT_JUMP_DIFF" },
- { "OPT_MILTERSEN_SCHWARTZ","ORG.GNUMERIC.OPT_MILTERSEN_SCHWARTZ" },
- { "OPT_ON_OPTIONS","ORG.GNUMERIC.OPT_ON_OPTIONS" },
- { "OPT_RGW","ORG.GNUMERIC.OPT_RGW" },
- { "OPT_SIMPLE_CHOOSER","ORG.GNUMERIC.OPT_SIMPLE_CHOOSER" },
- { "OPT_SPREAD_APPROX","ORG.GNUMERIC.OPT_SPREAD_APPROX" },
- { "OPT_TIME_SWITCH","ORG.GNUMERIC.OPT_TIME_SWITCH" },
- { "PARETO","ORG.GNUMERIC.PARETO" },
- { "periodogram","ORG.GNUMERIC.periodogram" },
- { "PFACTOR","ORG.GNUMERIC.PFACTOR" },
- { "PROBBLOCK","ORG.GNUMERIC.PROBBLOCK" },
- { "RANDBERNOULLI","ORG.GNUMERIC.RANDBERNOULLI" },
- { "RANDBETA","ORG.GNUMERIC.RANDBETA" },
- { "RANDBINOM","ORG.GNUMERIC.RANDBINOM" },
- { "RANDCAUCHY","ORG.GNUMERIC.RANDCAUCHY" },
- { "RANDCHISQ","ORG.GNUMERIC.RANDCHISQ" },
- { "RANDDISCRETE","ORG.GNUMERIC.RANDDISCRETE" },
- { "RANDEXP","ORG.GNUMERIC.RANDEXP" },
- { "RANDEXPPOW","ORG.GNUMERIC.RANDEXPPOW" },
- { "RANDFDIST","ORG.GNUMERIC.RANDFDIST" },
- { "RANDGAMMA","ORG.GNUMERIC.RANDGAMMA" },
- { "RANDGEOM","ORG.GNUMERIC.RANDGEOM" },
- { "RANDGUMBEL","ORG.GNUMERIC.RANDGUMBEL" },
- { "RANDHYPERG","ORG.GNUMERIC.RANDHYPERG" },
- { "RANDLANDAU","ORG.GNUMERIC.RANDLANDAU" },
- { "RANDLAPLACE","ORG.GNUMERIC.RANDLAPLACE" },
- { "RANDLEVY","ORG.GNUMERIC.RANDLEVY" },
- { "RANDLOG","ORG.GNUMERIC.RANDLOG" },
- { "RANDLOGISTIC","ORG.GNUMERIC.RANDLOGISTIC" },
- { "RANDLOGNORM","ORG.GNUMERIC.RANDLOGNORM" },
- { "RANDNEGBINOM","ORG.GNUMERIC.RANDNEGBINOM" },
- { "RANDNORM","ORG.GNUMERIC.RANDNORM" },
- { "RANDNORMTAIL","ORG.GNUMERIC.RANDNORMTAIL" },
- { "RANDPARETO","ORG.GNUMERIC.RANDPARETO" },
- { "RANDPOISSON","ORG.GNUMERIC.RANDPOISSON" },
- { "RANDRAYLEIGH","ORG.GNUMERIC.RANDRAYLEIGH" },
- { "RANDRAYLEIGHTAIL","ORG.GNUMERIC.RANDRAYLEIGHTAIL" },
- { "RANDTDIST","ORG.GNUMERIC.RANDTDIST" },
- { "RANDUNIFORM","ORG.GNUMERIC.RANDUNIFORM" },
- { "RANDWEIBULL","ORG.GNUMERIC.RANDWEIBULL" },
- { "RAYLEIGH","ORG.GNUMERIC.RAYLEIGH" },
- { "RAYLEIGHTAIL","ORG.GNUMERIC.RAYLEIGHTAIL" },
- { "READDBTABLE","ORG.GNUMERIC.READDBTABLE" },
- { "R.DBETA","ORG.GNUMERIC.R.DBETA" },
- { "R.DBINOM","ORG.GNUMERIC.R.DBINOM" },
- { "R.DCAUCHY","ORG.GNUMERIC.R.DCAUCHY" },
- { "R.DCHISQ","ORG.GNUMERIC.R.DCHISQ" },
- { "R.DEXP","ORG.GNUMERIC.R.DEXP" },
- { "R.DF","ORG.GNUMERIC.R.DF" },
- { "R.DGAMMA","ORG.GNUMERIC.R.DGAMMA" },
- { "R.DGEOM","ORG.GNUMERIC.R.DGEOM" },
- { "R.DHYPER","ORG.GNUMERIC.R.DHYPER" },
- { "R.DLNORM","ORG.GNUMERIC.R.DLNORM" },
- { "R.DNBINOM","ORG.GNUMERIC.R.DNBINOM" },
- { "R.DNORM","ORG.GNUMERIC.R.DNORM" },
- { "R.DPOIS","ORG.GNUMERIC.R.DPOIS" },
- { "R.DT","ORG.GNUMERIC.R.DT" },
- { "R.DWEIBULL","ORG.GNUMERIC.R.DWEIBULL" },
- { "R.PBETA","ORG.GNUMERIC.R.PBETA" },
- { "R.PBINOM","ORG.GNUMERIC.R.PBINOM" },
- { "R.PCAUCHY","ORG.GNUMERIC.R.PCAUCHY" },
- { "R.PCHISQ","ORG.GNUMERIC.R.PCHISQ" },
- { "R.PEXP","ORG.GNUMERIC.R.PEXP" },
- { "R.PF","ORG.GNUMERIC.R.PF" },
- { "R.PGAMMA","ORG.GNUMERIC.R.PGAMMA" },
- { "R.PGEOM","ORG.GNUMERIC.R.PGEOM" },
- { "R.PHYPER","ORG.GNUMERIC.R.PHYPER" },
- { "R.PLNORM","ORG.GNUMERIC.R.PLNORM" },
- { "R.PNBINOM","ORG.GNUMERIC.R.PNBINOM" },
- { "R.PNORM","ORG.GNUMERIC.R.PNORM" },
- { "R.PPOIS","ORG.GNUMERIC.R.PPOIS" },
- { "R.PT","ORG.GNUMERIC.R.PT" },
- { "R.PWEIBULL","ORG.GNUMERIC.R.PWEIBULL" },
- { "R.QBETA","ORG.GNUMERIC.R.QBETA" },
- { "R.QBINOM","ORG.GNUMERIC.R.QBINOM" },
- { "R.QCAUCHY","ORG.GNUMERIC.R.QCAUCHY" },
- { "R.QCHISQ","ORG.GNUMERIC.R.QCHISQ" },
- { "R.QEXP","ORG.GNUMERIC.R.QEXP" },
- { "R.QF","ORG.GNUMERIC.R.QF" },
- { "R.QGAMMA","ORG.GNUMERIC.R.QGAMMA" },
- { "R.QGEOM","ORG.GNUMERIC.R.QGEOM" },
- { "R.QHYPER","ORG.GNUMERIC.R.QHYPER" },
- { "R.QLNORM","ORG.GNUMERIC.R.QLNORM" },
- { "R.QNBINOM","ORG.GNUMERIC.R.QNBINOM" },
- { "R.QNORM","ORG.GNUMERIC.R.QNORM" },
- { "R.QPOIS","ORG.GNUMERIC.R.QPOIS" },
- { "R.QT","ORG.GNUMERIC.R.QT" },
- { "R.QWEIBULL","ORG.GNUMERIC.R.QWEIBULL" },
- { "SIMTABLE","ORG.GNUMERIC.SIMTABLE" },
- { "SSMEDIAN","ORG.GNUMERIC.SSMEDIAN" },
- { "SUMA","ORG.GNUMERIC.SUMA" },
- { "UNIX2DATE","ORG.GNUMERIC.UNIX2DATE" },
+
+ { "ATL_LAST","ORG.GNUMERIC.ATL_LAST" },
+ { "BERNOULLI","ORG.GNUMERIC.BERNOULLI" },
+ { "BETA","ORG.GNUMERIC.BETA" },
+ { "BETALN","ORG.GNUMERIC.BETALN" },
+ { "CAUCHY","ORG.GNUMERIC.CAUCHY" },
+ { "COLUMNNUMBER","ORG.GNUMERIC.COLUMNNUMBER" },
+ { "CRONBACH","ORG.GNUMERIC.CRONBACH" },
+ { "CUM_BIV_NORM_DIST","ORG.GNUMERIC.CUM_BIV_NORM_DIST" },
+ { "DATE2UNIX","ORG.GNUMERIC.DATE2UNIX" },
+ { "DAYS360","ORG.GNUMERIC.DAYS360" },
+ { "DIMCIRC","ORG.GNUMERIC.DIMCIRC" },
+ { "ERROR","ORG.GNUMERIC.ERROR" },
+ { "EURO","ORG.GNUMERIC.EURO" },
+ { "EXECSQL","ORG.GNUMERIC.EXECSQL" },
+ { "EXPM1","ORG.GNUMERIC.EXPM1" },
+ { "EXPPOWDIST","ORG.GNUMERIC.EXPPOWDIST" },
+ { "EXPRESSION","ORG.GNUMERIC.EXPRESSION" },
+ { "FIB","ORG.GNUMERIC.FIB" },
+ { "G_DURATION","ORG.GNUMERIC.G_DURATION" },
+ { "GEOMDIST","ORG.GNUMERIC.GEOMDIST" },
+ { "GETENV","ORG.GNUMERIC.GETENV" },
+ { "G_PRODUCT","ORG.GNUMERIC.G_PRODUCT" },
+ { "HYPOT","ORG.GNUMERIC.HYPOT" },
+ { "IMARCCOS","ORG.GNUMERIC.IMARCCOS" },
+ { "IMARCCOSH","ORG.GNUMERIC.IMARCCOSH" },
+ { "IMARCCOT","ORG.GNUMERIC.IMARCCOT" },
+ { "IMARCCOTH","ORG.GNUMERIC.IMARCCOTH" },
+ { "IMARCCSC","ORG.GNUMERIC.IMARCCSC" },
+ { "IMARCCSCH","ORG.GNUMERIC.IMARCCSCH" },
+ { "IMARCSEC","ORG.GNUMERIC.IMARCSEC" },
+ { "IMARCSECH","ORG.GNUMERIC.IMARCSECH" },
+ { "IMARCSIN","ORG.GNUMERIC.IMARCSIN" },
+ { "IMARCSINH","ORG.GNUMERIC.IMARCSINH" },
+ { "IMARCTAN","ORG.GNUMERIC.IMARCTAN" },
+ { "IMARCTANH","ORG.GNUMERIC.IMARCTANH" },
+ { "IMCOSH","ORG.GNUMERIC.IMCOSH" },
+ { "IMCOTH","ORG.GNUMERIC.IMCOTH" },
+ { "IMINV","ORG.GNUMERIC.IMINV" },
+ { "IMNEG","ORG.GNUMERIC.IMNEG" },
+ { "IMSINH","ORG.GNUMERIC.IMSINH" },
+ { "IMTANH","ORG.GNUMERIC.IMTANH" },
+ { "INTERPOLATION","ORG.GNUMERIC.INTERPOLATION" },
+ { "INVSUMINV","ORG.GNUMERIC.INVSUMINV" },
+ { "ISOYEAR","ORG.GNUMERIC.ISOYEAR" },
+ { "ISPRIME","ORG.GNUMERIC.ISPRIME" },
+ { "ITHPRIME","ORG.GNUMERIC.ITHPRIME" },
+ { "KURTP","ORG.GNUMERIC.KURTP" },
+ { "LANDAU","ORG.GNUMERIC.LANDAU" },
+ { "LAPLACE","ORG.GNUMERIC.LAPLACE" },
+ { "LN1P","ORG.GNUMERIC.LN1P" },
+ { "LOG2","ORG.GNUMERIC.LOG2" },
+ { "LOGFIT","ORG.GNUMERIC.LOGFIT" },
+ { "LOGISTIC","ORG.GNUMERIC.LOGISTIC" },
+ { "LOGREG","ORG.GNUMERIC.LOGREG" },
+ { "NT_D","ORG.GNUMERIC.NT_D" },
+ { "NT_MU","ORG.GNUMERIC.NT_MU" },
+ { "NT_PHI","ORG.GNUMERIC.NT_PHI" },
+ { "NT_PI","ORG.GNUMERIC.NT_PI" },
+ { "NT_SIGMA","ORG.GNUMERIC.NT_SIGMA" },
+ { "OFFCAP","ORG.GNUMERIC.OFFCAP" },
+ { "OFFTRAF","ORG.GNUMERIC.OFFTRAF" },
+ { "OPT_2_ASSET_CORRELATION","ORG.GNUMERIC.OPT_2_ASSET_CORRELATION" },
+ { "OPT_AMER_EXCHANGE","ORG.GNUMERIC.OPT_AMER_EXCHANGE" },
+ { "OPT_BAW_AMER","ORG.GNUMERIC.OPT_BAW_AMER" },
+ { "OPT_BINOMIAL","ORG.GNUMERIC.OPT_BINOMIAL" },
+ { "OPT_BJER_STENS","ORG.GNUMERIC.OPT_BJER_STENS" },
+ { "OPT_BS","ORG.GNUMERIC.OPT_BS" },
+ { "OPT_BS_CARRYCOST","ORG.GNUMERIC.OPT_BS_CARRYCOST" },
+ { "OPT_BS_DELTA","ORG.GNUMERIC.OPT_BS_DELTA" },
+ { "OPT_BS_GAMMA","ORG.GNUMERIC.OPT_BS_GAMMA" },
+ { "OPT_BS_RHO","ORG.GNUMERIC.OPT_BS_RHO" },
+ { "OPT_BS_THETA","ORG.GNUMERIC.OPT_BS_THETA" },
+ { "OPT_BS_VEGA","ORG.GNUMERIC.OPT_BS_VEGA" },
+ { "OPT_COMPLEX_CHOOSER","ORG.GNUMERIC.OPT_COMPLEX_CHOOSER" },
+ { "OPT_EURO_EXCHANGE","ORG.GNUMERIC.OPT_EURO_EXCHANGE" },
+ { "OPT_EXEC","ORG.GNUMERIC.OPT_EXEC" },
+ { "OPT_EXTENDIBLE_WRITER","ORG.GNUMERIC.OPT_EXTENDIBLE_WRITER" },
+ { "OPT_FIXED_STRK_LKBK","ORG.GNUMERIC.OPT_FIXED_STRK_LKBK" },
+ { "OPT_FLOAT_STRK_LKBK","ORG.GNUMERIC.OPT_FLOAT_STRK_LKBK" },
+ { "OPT_FORWARD_START","ORG.GNUMERIC.OPT_FORWARD_START" },
+ { "OPT_FRENCH","ORG.GNUMERIC.OPT_FRENCH" },
+ { "OPT_GARMAN_KOHLHAGEN","ORG.GNUMERIC.OPT_GARMAN_KOHLHAGEN" },
+ { "OPT_JUMP_DIFF","ORG.GNUMERIC.OPT_JUMP_DIFF" },
+ { "OPT_MILTERSEN_SCHWARTZ","ORG.GNUMERIC.OPT_MILTERSEN_SCHWARTZ" },
+ { "OPT_ON_OPTIONS","ORG.GNUMERIC.OPT_ON_OPTIONS" },
+ { "OPT_RGW","ORG.GNUMERIC.OPT_RGW" },
+ { "OPT_SIMPLE_CHOOSER","ORG.GNUMERIC.OPT_SIMPLE_CHOOSER" },
+ { "OPT_SPREAD_APPROX","ORG.GNUMERIC.OPT_SPREAD_APPROX" },
+ { "OPT_TIME_SWITCH","ORG.GNUMERIC.OPT_TIME_SWITCH" },
+ { "PARETO","ORG.GNUMERIC.PARETO" },
+ { "periodogram","ORG.GNUMERIC.periodogram" },
+ { "PFACTOR","ORG.GNUMERIC.PFACTOR" },
+ { "PROBBLOCK","ORG.GNUMERIC.PROBBLOCK" },
+ { "RANDBERNOULLI","ORG.GNUMERIC.RANDBERNOULLI" },
+ { "RANDBETA","ORG.GNUMERIC.RANDBETA" },
+ { "RANDBINOM","ORG.GNUMERIC.RANDBINOM" },
+ { "RANDCAUCHY","ORG.GNUMERIC.RANDCAUCHY" },
+ { "RANDCHISQ","ORG.GNUMERIC.RANDCHISQ" },
+ { "RANDDISCRETE","ORG.GNUMERIC.RANDDISCRETE" },
+ { "RANDEXP","ORG.GNUMERIC.RANDEXP" },
+ { "RANDEXPPOW","ORG.GNUMERIC.RANDEXPPOW" },
+ { "RANDFDIST","ORG.GNUMERIC.RANDFDIST" },
+ { "RANDGAMMA","ORG.GNUMERIC.RANDGAMMA" },
+ { "RANDGEOM","ORG.GNUMERIC.RANDGEOM" },
+ { "RANDGUMBEL","ORG.GNUMERIC.RANDGUMBEL" },
+ { "RANDHYPERG","ORG.GNUMERIC.RANDHYPERG" },
+ { "RANDLANDAU","ORG.GNUMERIC.RANDLANDAU" },
+ { "RANDLAPLACE","ORG.GNUMERIC.RANDLAPLACE" },
+ { "RANDLEVY","ORG.GNUMERIC.RANDLEVY" },
+ { "RANDLOG","ORG.GNUMERIC.RANDLOG" },
+ { "RANDLOGISTIC","ORG.GNUMERIC.RANDLOGISTIC" },
+ { "RANDLOGNORM","ORG.GNUMERIC.RANDLOGNORM" },
+ { "RANDNEGBINOM","ORG.GNUMERIC.RANDNEGBINOM" },
+ { "RANDNORM","ORG.GNUMERIC.RANDNORM" },
+ { "RANDNORMTAIL","ORG.GNUMERIC.RANDNORMTAIL" },
+ { "RANDPARETO","ORG.GNUMERIC.RANDPARETO" },
+ { "RANDPOISSON","ORG.GNUMERIC.RANDPOISSON" },
+ { "RANDRAYLEIGH","ORG.GNUMERIC.RANDRAYLEIGH" },
+ { "RANDRAYLEIGHTAIL","ORG.GNUMERIC.RANDRAYLEIGHTAIL" },
+ { "RANDTDIST","ORG.GNUMERIC.RANDTDIST" },
+ { "RANDUNIFORM","ORG.GNUMERIC.RANDUNIFORM" },
+ { "RANDWEIBULL","ORG.GNUMERIC.RANDWEIBULL" },
+ { "RAYLEIGH","ORG.GNUMERIC.RAYLEIGH" },
+ { "RAYLEIGHTAIL","ORG.GNUMERIC.RAYLEIGHTAIL" },
+ { "READDBTABLE","ORG.GNUMERIC.READDBTABLE" },
+ { "R.DBETA","ORG.GNUMERIC.R.DBETA" },
+ { "R.DBINOM","ORG.GNUMERIC.R.DBINOM" },
+ { "R.DCAUCHY","ORG.GNUMERIC.R.DCAUCHY" },
+ { "R.DCHISQ","ORG.GNUMERIC.R.DCHISQ" },
+ { "R.DEXP","ORG.GNUMERIC.R.DEXP" },
+ { "R.DF","ORG.GNUMERIC.R.DF" },
+ { "R.DGAMMA","ORG.GNUMERIC.R.DGAMMA" },
+ { "R.DGEOM","ORG.GNUMERIC.R.DGEOM" },
+ { "R.DHYPER","ORG.GNUMERIC.R.DHYPER" },
+ { "R.DLNORM","ORG.GNUMERIC.R.DLNORM" },
+ { "R.DNBINOM","ORG.GNUMERIC.R.DNBINOM" },
+ { "R.DNORM","ORG.GNUMERIC.R.DNORM" },
+ { "R.DPOIS","ORG.GNUMERIC.R.DPOIS" },
+ { "R.DT","ORG.GNUMERIC.R.DT" },
+ { "R.DWEIBULL","ORG.GNUMERIC.R.DWEIBULL" },
+ { "R.PBETA","ORG.GNUMERIC.R.PBETA" },
+ { "R.PBINOM","ORG.GNUMERIC.R.PBINOM" },
+ { "R.PCAUCHY","ORG.GNUMERIC.R.PCAUCHY" },
+ { "R.PCHISQ","ORG.GNUMERIC.R.PCHISQ" },
+ { "R.PEXP","ORG.GNUMERIC.R.PEXP" },
+ { "R.PF","ORG.GNUMERIC.R.PF" },
+ { "R.PGAMMA","ORG.GNUMERIC.R.PGAMMA" },
+ { "R.PGEOM","ORG.GNUMERIC.R.PGEOM" },
+ { "R.PHYPER","ORG.GNUMERIC.R.PHYPER" },
+ { "R.PLNORM","ORG.GNUMERIC.R.PLNORM" },
+ { "R.PNBINOM","ORG.GNUMERIC.R.PNBINOM" },
+ { "R.PNORM","ORG.GNUMERIC.R.PNORM" },
+ { "R.PPOIS","ORG.GNUMERIC.R.PPOIS" },
+ { "R.PT","ORG.GNUMERIC.R.PT" },
+ { "R.PWEIBULL","ORG.GNUMERIC.R.PWEIBULL" },
+ { "R.QBETA","ORG.GNUMERIC.R.QBETA" },
+ { "R.QBINOM","ORG.GNUMERIC.R.QBINOM" },
+ { "R.QCAUCHY","ORG.GNUMERIC.R.QCAUCHY" },
+ { "R.QCHISQ","ORG.GNUMERIC.R.QCHISQ" },
+ { "R.QEXP","ORG.GNUMERIC.R.QEXP" },
+ { "R.QF","ORG.GNUMERIC.R.QF" },
+ { "R.QGAMMA","ORG.GNUMERIC.R.QGAMMA" },
+ { "R.QGEOM","ORG.GNUMERIC.R.QGEOM" },
+ { "R.QHYPER","ORG.GNUMERIC.R.QHYPER" },
+ { "R.QLNORM","ORG.GNUMERIC.R.QLNORM" },
+ { "R.QNBINOM","ORG.GNUMERIC.R.QNBINOM" },
+ { "R.QNORM","ORG.GNUMERIC.R.QNORM" },
+ { "R.QPOIS","ORG.GNUMERIC.R.QPOIS" },
+ { "R.QT","ORG.GNUMERIC.R.QT" },
+ { "R.QWEIBULL","ORG.GNUMERIC.R.QWEIBULL" },
+ { "SIMTABLE","ORG.GNUMERIC.SIMTABLE" },
+ { "SSMEDIAN","ORG.GNUMERIC.SSMEDIAN" },
+ { "SUMA","ORG.GNUMERIC.SUMA" },
+ { "UNIX2DATE","ORG.GNUMERIC.UNIX2DATE" },
/* { "ABS","ABS" }, */
/* { "ACCRINT","ACCRINT" }, */
@@ -1886,53 +1916,53 @@ odf_expr_func_handler (GnmConventionsOut *out, GnmExprFunction const *func)
/* { "YIELDDISC","YIELDDISC" }, */
/* { "YIELDMAT","YIELDMAT" }, */
/* { "ZTEST","ZTEST" }, */
- { NULL, NULL }
- };
- static GHashTable *namemap = NULL;
- static GHashTable *handlermap = NULL;
+ { NULL, NULL }
+ };
+ static GHashTable *namemap = NULL;
+ static GHashTable *handlermap = NULL;
- char const *name = gnm_func_get_name (func->func);
- gboolean (*handler) (GnmConventionsOut *out, GnmExprFunction const *func);
+ char const *name = gnm_func_get_name (func->func);
+ gboolean (*handler) (GnmConventionsOut *out, GnmExprFunction const *func);
- if (NULL == namemap) {
- guint i;
- namemap = g_hash_table_new (go_ascii_strcase_hash,
- go_ascii_strcase_equal);
- for (i = 0; sc_func_renames[i].gnm_name; i++)
- g_hash_table_insert (namemap,
- (gchar *) sc_func_renames[i].gnm_name,
- (gchar *) sc_func_renames[i].odf_name);
- }
- if (NULL == handlermap) {
- guint i;
- handlermap = g_hash_table_new (go_ascii_strcase_hash,
- go_ascii_strcase_equal);
- for (i = 0; sc_func_handlers[i].gnm_name; i++)
- g_hash_table_insert (handlermap,
- (gchar *) sc_func_handlers[i].gnm_name,
- sc_func_handlers[i].handler);
- }
+ if (NULL == namemap) {
+ guint i;
+ namemap = g_hash_table_new (go_ascii_strcase_hash,
+ go_ascii_strcase_equal);
+ for (i = 0; sc_func_renames[i].gnm_name; i++)
+ g_hash_table_insert (namemap,
+ (gchar *) sc_func_renames[i].gnm_name,
+ (gchar *) sc_func_renames[i].odf_name);
+ }
+ if (NULL == handlermap) {
+ guint i;
+ handlermap = g_hash_table_new (go_ascii_strcase_hash,
+ go_ascii_strcase_equal);
+ for (i = 0; sc_func_handlers[i].gnm_name; i++)
+ g_hash_table_insert (handlermap,
+ (gchar *) sc_func_handlers[i].gnm_name,
+ sc_func_handlers[i].handler);
+ }
- handler = g_hash_table_lookup (handlermap, name);
+ handler = g_hash_table_lookup (handlermap, name);
- if (handler == NULL || !handler (out, func)) {
- char const *new_name = g_hash_table_lookup (namemap, name);
- GString *target = out->accum;
-
- if (new_name == NULL) {
- char *new_u_name;
- if (*(name + 1) == '.')
- g_string_append (target, "ORG.GNUMERIC.");
- new_u_name = g_ascii_strup (name, -1);
- g_string_append (target, new_u_name);
- g_free (new_u_name);
- }
- else
- g_string_append (target, new_name);
+ if (handler == NULL || !handler (out, func)) {
+ char const *new_name = g_hash_table_lookup (namemap, name);
+ GString *target = out->accum;
- gnm_expr_list_as_string (func->argc, func->argv, out);
+ if (new_name == NULL) {
+ char *new_u_name;
+ if (*(name + 1) == '.')
+ g_string_append (target, "ORG.GNUMERIC.");
+ new_u_name = g_ascii_strup (name, -1);
+ g_string_append (target, new_u_name);
+ g_free (new_u_name);
}
- return;
+ else
+ g_string_append (target, new_name);
+
+ gnm_expr_list_as_string (func->argc, func->argv, out);
+ }
+ return;
}
diff --git a/src/func.c b/src/func.c
index e4a1018..fb8353d 100644
--- a/src/func.c
+++ b/src/func.c
@@ -880,6 +880,17 @@ gnm_func_add_placeholder (Workbook *scope,
return func;
}
+/* Utility routine to be used for import and analysis tools */
+GnmFunc *
+gnm_func_lookup_or_add_placeholder (char const *name, Workbook *scope, gboolean copy_name)
+{
+ GnmFunc * f = gnm_func_lookup (name, scope);
+ if (f == NULL)
+ f = gnm_func_add_placeholder (scope, name, "", copy_name);
+ return f;
+}
+
+
gpointer
gnm_func_get_user_data (GnmFunc const *func)
{
diff --git a/src/func.h b/src/func.h
index dab7eb8..550f4c4 100644
--- a/src/func.h
+++ b/src/func.h
@@ -215,6 +215,9 @@ GnmFunc *gnm_func_add_placeholder (Workbook *optional_scope, /* change scop
char const *name,
char const *type,
gboolean copy_name);
+GnmFunc *gnm_func_lookup_or_add_placeholder
+ (char const *name, Workbook *scope, /* change scope one day */
+ gboolean copy_name);
/* TODO */
void function_def_count_args (GnmFunc const *fn_def,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]