[template-glib] expr: cleanup math builtins
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [template-glib] expr: cleanup math builtins
- Date: Wed, 4 May 2022 22:07:20 +0000 (UTC)
commit ba76c86ac3bb876c09c8a17c459744c3e35a67ca
Author: Christian Hergert <chergert redhat com>
Date: Wed May 4 14:49:48 2022 -0700
expr: cleanup math builtins
And add cos/sin/tan builtins
src/tmpl-expr-eval.c | 109 +++++++++++++++++++-----------------------------
src/tmpl-expr-scanner.l | 3 ++
src/tmpl-expr-types.h | 3 ++
3 files changed, 50 insertions(+), 65 deletions(-)
---
diff --git a/src/tmpl-expr-eval.c b/src/tmpl-expr-eval.c
index 9927416..956d71a 100644
--- a/src/tmpl-expr-eval.c
+++ b/src/tmpl-expr-eval.c
@@ -71,6 +71,15 @@ static gboolean builtin_repr (const GValue *value,
static gboolean builtin_sqrt (const GValue *value,
GValue *return_value,
GError **error);
+static gboolean builtin_sin (const GValue *value,
+ GValue *return_value,
+ GError **error);
+static gboolean builtin_tan (const GValue *value,
+ GValue *return_value,
+ GError **error);
+static gboolean builtin_cos (const GValue *value,
+ GValue *return_value,
+ GError **error);
static gboolean builtin_typeof (const GValue *value,
GValue *return_value,
GError **error);
@@ -99,6 +108,9 @@ static BuiltinFunc builtin_funcs [] = {
builtin_sqrt,
builtin_typeof,
builtin_assert,
+ builtin_sin,
+ builtin_tan,
+ builtin_cos,
};
static inline guint
@@ -1787,56 +1799,40 @@ failure:
return FALSE;
}
-static gboolean
-builtin_ceil (const GValue *value,
- GValue *return_value,
- GError **error)
-{
- if (G_VALUE_HOLDS_DOUBLE (value))
- {
- g_value_init (return_value, G_TYPE_DOUBLE);
- g_value_set_double (return_value, ceil (g_value_get_double (value)));
- return TRUE;
- }
-
- throw_type_mismatch (error, value, NULL, "requires double parameter");
-
- return FALSE;
+#define BUILTIN_MATH(func) \
+static gboolean \
+builtin_##func (const GValue *value, \
+ GValue *return_value, \
+ GError **error) \
+{ \
+ GValue translated = G_VALUE_INIT; \
+ \
+ if (!G_VALUE_HOLDS_DOUBLE (value)) \
+ { \
+ if (!g_value_transform (value, &translated)) \
+ { \
+ g_set_error (error, \
+ TMPL_ERROR, \
+ TMPL_ERROR_RUNTIME_ERROR, \
+ "Cannot convert %s to double", \
+ G_VALUE_TYPE_NAME (value)); \
+ return FALSE; \
+ } \
+ value = &translated; \
+ } \
+ \
+ g_value_init (return_value, G_TYPE_DOUBLE); \
+ g_value_set_double (return_value, func (g_value_get_double (value))); \
+ return TRUE; \
}
-static gboolean
-builtin_floor (const GValue *value,
- GValue *return_value,
- GError **error)
-{
- if (G_VALUE_HOLDS_DOUBLE (value))
- {
- g_value_init (return_value, G_TYPE_DOUBLE);
- g_value_set_double (return_value, floor (g_value_get_double (value)));
- return TRUE;
- }
-
- throw_type_mismatch (error, value, NULL, "requires double parameter");
-
- return FALSE;
-}
-
-static gboolean
-builtin_log (const GValue *value,
- GValue *return_value,
- GError **error)
-{
- if (G_VALUE_HOLDS_DOUBLE (value))
- {
- g_value_init (return_value, G_TYPE_DOUBLE);
- g_value_set_double (return_value, log (g_value_get_double (value)));
- return TRUE;
- }
-
- throw_type_mismatch (error, value, NULL, "requires double parameter");
-
- return FALSE;
-}
+BUILTIN_MATH (ceil)
+BUILTIN_MATH (floor)
+BUILTIN_MATH (log)
+BUILTIN_MATH (sqrt)
+BUILTIN_MATH (sin)
+BUILTIN_MATH (tan)
+BUILTIN_MATH (cos)
static gboolean
builtin_print (const GValue *value,
@@ -1855,23 +1851,6 @@ builtin_print (const GValue *value,
return TRUE;
}
-static gboolean
-builtin_sqrt (const GValue *value,
- GValue *return_value,
- GError **error)
-{
- if (G_VALUE_HOLDS_DOUBLE (value))
- {
- g_value_init (return_value, G_TYPE_DOUBLE);
- g_value_set_double (return_value, sqrt (g_value_get_double (value)));
- return TRUE;
- }
-
- throw_type_mismatch (error, value, NULL, "requires double parameter");
-
- return FALSE;
-}
-
static gboolean
builtin_typeof (const GValue *value,
GValue *return_value,
diff --git a/src/tmpl-expr-scanner.l b/src/tmpl-expr-scanner.l
index 0a787d4..72ad036 100644
--- a/src/tmpl-expr-scanner.l
+++ b/src/tmpl-expr-scanner.l
@@ -91,6 +91,9 @@ TmplExprParser *parser = yyextra;
"repr" { yylval->fn = TMPL_EXPR_BUILTIN_REPR; return BUILTIN; }
"sqrt" { yylval->fn = TMPL_EXPR_BUILTIN_SQRT; return BUILTIN; }
"typeof" { yylval->fn = TMPL_EXPR_BUILTIN_TYPEOF; return BUILTIN; }
+"sin" { yylval->fn = TMPL_EXPR_BUILTIN_SIN; return BUILTIN; }
+"tan" { yylval->fn = TMPL_EXPR_BUILTIN_TAN; return BUILTIN; }
+"cos" { yylval->fn = TMPL_EXPR_BUILTIN_COS; return BUILTIN; }
/* string literals */
L?\"(\\.|[^\\"])*\" { yylval->s = copy_literal (yytext); return STRING_LITERAL; }
diff --git a/src/tmpl-expr-types.h b/src/tmpl-expr-types.h
index 79caf36..079c02e 100644
--- a/src/tmpl-expr-types.h
+++ b/src/tmpl-expr-types.h
@@ -91,6 +91,9 @@ typedef enum
TMPL_EXPR_BUILTIN_SQRT,
TMPL_EXPR_BUILTIN_TYPEOF,
TMPL_EXPR_BUILTIN_ASSERT,
+ TMPL_EXPR_BUILTIN_SIN,
+ TMPL_EXPR_BUILTIN_TAN,
+ TMPL_EXPR_BUILTIN_COS,
} TmplExprBuiltin;
TMPL_AVAILABLE_IN_ALL
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]