[gnumeric] Handle ODF function CHISQDIST



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]