[template-glib] expr-eval: add builtin cast functions



commit c982a343d525bbd91157ce24a85b16814ce99f82
Author: Christian Hergert <chergert redhat com>
Date:   Fri May 6 15:21:01 2022 -0700

    expr-eval: add builtin cast functions
    
    For various sizes/floating point/double.

 src/tmpl-expr-eval.c    | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/tmpl-expr-scanner.l |  8 ++++++++
 src/tmpl-expr-types.h   |  8 ++++++++
 3 files changed, 64 insertions(+)
---
diff --git a/src/tmpl-expr-eval.c b/src/tmpl-expr-eval.c
index 7287001..fb9f5af 100644
--- a/src/tmpl-expr-eval.c
+++ b/src/tmpl-expr-eval.c
@@ -75,6 +75,15 @@ DECLARE_BUILTIN (sin)
 DECLARE_BUILTIN (tan)
 DECLARE_BUILTIN (cos)
 DECLARE_BUILTIN (typeof)
+DECLARE_BUILTIN (cast_byte)
+DECLARE_BUILTIN (cast_char)
+DECLARE_BUILTIN (cast_i32)
+DECLARE_BUILTIN (cast_u32)
+DECLARE_BUILTIN (cast_i64)
+DECLARE_BUILTIN (cast_u64)
+DECLARE_BUILTIN (cast_float)
+DECLARE_BUILTIN (cast_double)
+
 static GHashTable *fast_dispatch;
 static BuiltinFunc builtin_funcs [] = {
   builtin_abs,
@@ -91,6 +100,14 @@ static BuiltinFunc builtin_funcs [] = {
   builtin_tan,
   builtin_cos,
   builtin_printerr,
+  builtin_cast_byte,
+  builtin_cast_char,
+  builtin_cast_i32,
+  builtin_cast_u32,
+  builtin_cast_i64,
+  builtin_cast_u64,
+  builtin_cast_float,
+  builtin_cast_double,
 };
 
 static inline guint
@@ -2112,6 +2129,37 @@ BUILTIN_MATH (sin)
 BUILTIN_MATH (tan)
 BUILTIN_MATH (cos)
 
+#define BUILTIN_CAST(func,type)                   \
+static gboolean                                   \
+builtin_cast_##func (const GValue  *value,        \
+                     GValue        *return_value, \
+                     GError       **error)        \
+{                                                 \
+  g_value_init (return_value, type);              \
+                                                  \
+  if (!g_value_transform (value, return_value))   \
+    {                                             \
+      g_set_error (error,                         \
+                   TMPL_ERROR,                    \
+                   TMPL_ERROR_RUNTIME_ERROR,      \
+                   "Cannot convert %s to %s",     \
+                   G_VALUE_TYPE_NAME (value),     \
+                   g_type_name (type));           \
+      return FALSE;                               \
+    }                                             \
+                                                  \
+  return TRUE;                                    \
+}
+
+BUILTIN_CAST (byte, G_TYPE_UCHAR)
+BUILTIN_CAST (char, G_TYPE_CHAR)
+BUILTIN_CAST (i32, G_TYPE_INT)
+BUILTIN_CAST (u32, G_TYPE_UINT)
+BUILTIN_CAST (i64, G_TYPE_INT64)
+BUILTIN_CAST (u64, G_TYPE_UINT64)
+BUILTIN_CAST (float, G_TYPE_FLOAT)
+BUILTIN_CAST (double, G_TYPE_DOUBLE)
+
 static gboolean
 builtin_print (const GValue  *value,
                GValue        *return_value,
diff --git a/src/tmpl-expr-scanner.l b/src/tmpl-expr-scanner.l
index c203b7a..d12dc67 100644
--- a/src/tmpl-expr-scanner.l
+++ b/src/tmpl-expr-scanner.l
@@ -108,6 +108,14 @@ TmplExprParser *parser = yyextra;
 "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; }
+"char"     { yylval->fn = TMPL_EXPR_BUILTIN_CAST_CHAR; return BUILTIN; }
+"byte"     { yylval->fn = TMPL_EXPR_BUILTIN_CAST_BYTE; return BUILTIN; }
+"i32"      { yylval->fn = TMPL_EXPR_BUILTIN_CAST_I32; return BUILTIN; }
+"u32"      { yylval->fn = TMPL_EXPR_BUILTIN_CAST_U32; return BUILTIN; }
+"i64"      { yylval->fn = TMPL_EXPR_BUILTIN_CAST_I64; return BUILTIN; }
+"u64"      { yylval->fn = TMPL_EXPR_BUILTIN_CAST_U64; return BUILTIN; }
+"float"    { yylval->fn = TMPL_EXPR_BUILTIN_CAST_FLOAT; return BUILTIN; }
+"double"   { yylval->fn = TMPL_EXPR_BUILTIN_CAST_DOUBLE; 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 9ecccb0..a91c541 100644
--- a/src/tmpl-expr-types.h
+++ b/src/tmpl-expr-types.h
@@ -98,6 +98,14 @@ typedef enum
   TMPL_EXPR_BUILTIN_TAN,
   TMPL_EXPR_BUILTIN_COS,
   TMPL_EXPR_BUILTIN_PRINTERR,
+  TMPL_EXPR_BUILTIN_CAST_BYTE,
+  TMPL_EXPR_BUILTIN_CAST_CHAR,
+  TMPL_EXPR_BUILTIN_CAST_I32,
+  TMPL_EXPR_BUILTIN_CAST_U32,
+  TMPL_EXPR_BUILTIN_CAST_I64,
+  TMPL_EXPR_BUILTIN_CAST_U64,
+  TMPL_EXPR_BUILTIN_CAST_FLOAT,
+  TMPL_EXPR_BUILTIN_CAST_DOUBLE,
 } TmplExprBuiltin;
 
 TMPL_AVAILABLE_IN_ALL


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