[template-glib] expr: cleanup math builtins



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]