poke-devel
[Top][All Lists]
Advanced

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

[PATCH 2/4] libpoke: Add new getter and setters for pk_vals


From: Mohammad-Reza Nabipoor
Subject: [PATCH 2/4] libpoke: Add new getter and setters for pk_vals
Date: Wed, 24 Mar 2021 02:03:08 +0430

2021-03-24  Mohammad-Reza Nabipoor  <m.nabipoor@yahoo.com>

        * libpoke/libpoke.h (pk_val_set_mapped): New function declaration.
        (pk_val_set_ios): Likewise.
        (pk_val_set_offset): Likewise.
        (pk_val_strict_p): Likewise.
        (pk_val_set_strict): Likewise.
        * libpoke/pk-val.c (pk_val_set_mapped): New function definition.
        (pk_val_set_ios): Likewise.
        (pk_val_set_offset): Likewise.
        (pk_val_strict_p): Likewise.
        (pk_val_set_strict): Likewise.
        * testsuite/poke.libpoke/values.c (test_simple_values_mapping):
        New tests.
---
 ChangeLog                       | 15 ++++++++
 libpoke/libpoke.h               | 32 ++++++++++++++++
 libpoke/pk-val.c                | 47 ++++++++++++++++++++++++
 testsuite/poke.libpoke/values.c | 65 +++++++++++++++++++++++++++++++++
 4 files changed, 159 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index d21e5cb2..2938f6ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2021-03-24  Mohammad-Reza Nabipoor  <m.nabipoor@yahoo.com>
+
+       * libpoke/libpoke.h (pk_val_set_mapped): New function declaration.
+       (pk_val_set_ios): Likewise.
+       (pk_val_set_offset): Likewise.
+       (pk_val_strict_p): Likewise.
+       (pk_val_set_strict): Likewise.
+       * libpoke/pk-val.c (pk_val_set_mapped): New function definition.
+       (pk_val_set_ios): Likewise.
+       (pk_val_set_offset): Likewise.
+       (pk_val_strict_p): Likewise.
+       (pk_val_set_strict): Likewise.
+       * testsuite/poke.libpoke/values.c (test_simple_values_mapping):
+       New tests.
+
 2021-03-24  Mohammad-Reza Nabipoor  <m.nabipoor@yahoo.com>
 
        * libpoke/pk-val.c (pk_val_offset): Fix the unit of offset to use
diff --git a/libpoke/libpoke.h b/libpoke/libpoke.h
index 38866718..d2875a4c 100644
--- a/libpoke/libpoke.h
+++ b/libpoke/libpoke.h
@@ -880,17 +880,49 @@ pk_val pk_array_type_bound (pk_val type) LIBPOKE_API;
 
 int pk_val_mapped_p (pk_val val) LIBPOKE_API;
 
+/* Set MAPPED predicate of the given value indicating whether the given
+   value is mapped or not.  VAL is expected to be either an array or a
+   struct, and MAPPED_P is expected to be an integral.
+   Return PK_OK on success, PK_EINVAL otherwise.  */
+
+int pk_val_set_mapped (pk_val val, pk_val mapped_p) LIBPOKE_API;
+
 /* Return the IOS identifier, an int<32>, in which the given value is
    mapped.  If the value is not mapped, return PK_NULL.  */
 
 pk_val pk_val_ios (pk_val val) LIBPOKE_API;
 
+/* Set the IOS, an int<32>, in which the given value is mapped.
+   VAL is expected to be either an array or a struct.
+   Return PK_OK on success, PK_EINVAL otherwise.  */
+
+int pk_val_set_ios (pk_val val, pk_val ios) LIBPOKE_API;
+
 /* Return the offset in which the given value is mapped.
    If the value is not mapped, return PK_NULL.  */
 
 pk_val pk_val_offset
 (pk_val val) LIBPOKE_API;
 
+/* Set the offset in which the given value is mapped.
+   VAL is expected to be either an array or a struct, and OFF is
+   expected to be an offset.
+   Return PK_OK on success, PK_EINVAL otherwise.  */
+
+int pk_val_set_offset (pk_val val, pk_val off) LIBPOKE_API;
+
+/* Return a boolean indicating whether data integrity for the given
+   value is enforced or not.  */
+
+int pk_val_strict_p (pk_val val) LIBPOKE_API;
+
+/* Set STRICT predicate of the given value indicating whether data
+   integrity is enforced or not. VAL is expected to be either an array
+   or a struct, and STRICT_P is expected to be an integral.
+   Return PK_OK on success, PK_EINVAL otherwise.  */
+
+int pk_val_set_strict (pk_val val, pk_val strict_p) LIBPOKE_API;
+
 /* Other operations on values.  */
 
 /* Return the type of the given value.  */
diff --git a/libpoke/pk-val.c b/libpoke/pk-val.c
index 2f530235..6556023f 100644
--- a/libpoke/pk-val.c
+++ b/libpoke/pk-val.c
@@ -136,12 +136,31 @@ pk_val_mapped_p (pk_val val)
   return PVM_VAL_MAPPED_P (val);
 }
 
+int
+pk_val_set_mapped (pk_val val, pk_val mapped_p)
+{
+  if (!(PVM_IS_ARR (val) || PVM_IS_SCT (val)) || !PVM_IS_INTEGRAL (mapped_p))
+    return PK_EINVAL;
+  PVM_VAL_SET_MAPPED_P (val, !!PVM_VAL_INTEGRAL (mapped_p));
+  return PK_OK;
+}
+
 pk_val
 pk_val_ios (pk_val val)
 {
   return PVM_VAL_IOS (val);
 }
 
+int
+pk_val_set_ios (pk_val val, pk_val ios)
+{
+  if (!(PVM_IS_ARR (val) || PVM_IS_SCT (val)) || !PVM_IS_INTEGRAL (ios)
+      || !PVM_IS_INT (ios) || PVM_VAL_INT_SIZE (ios) != 32)
+    return PK_EINVAL;
+  PVM_VAL_SET_IOS (val, ios);
+  return PK_OK;
+}
+
 pk_val
 pk_val_offset (pk_val val)
 {
@@ -165,6 +184,34 @@ pk_val_offset (pk_val val)
                             pvm_make_ulong (1, 64));
 }
 
+int
+pk_val_set_offset (pk_val val, pk_val off)
+{
+  uint64_t v;
+
+  if (!(PVM_IS_ARR (val) || PVM_IS_SCT (val)) || !PVM_IS_OFF (off))
+    return PK_EINVAL;
+  v = PVM_VAL_INTEGRAL (PVM_VAL_OFF_MAGNITUDE (off))
+      * PVM_VAL_INTEGRAL (PVM_VAL_OFF_UNIT (off));
+  PVM_VAL_SET_OFFSET (val, pvm_make_ulong (v, 64));
+  return PK_OK;
+}
+
+int
+pk_val_strict_p (pk_val val)
+{
+  return PVM_VAL_STRICT_P (val);
+}
+
+int
+pk_val_set_strict (pk_val val, pk_val strict_p)
+{
+  if (!(PVM_IS_ARR (val) || PVM_IS_SCT (val)) || !PVM_IS_INTEGRAL (strict_p))
+    return PK_EINVAL;
+  PVM_VAL_SET_STRICT_P (val, !!PVM_VAL_INTEGRAL (strict_p));
+  return PK_OK;
+}
+
 int
 pk_type_code (pk_val val)
 {
diff --git a/testsuite/poke.libpoke/values.c b/testsuite/poke.libpoke/values.c
index 6d94eded..71688c44 100644
--- a/testsuite/poke.libpoke/values.c
+++ b/testsuite/poke.libpoke/values.c
@@ -154,6 +154,70 @@ test_simple_values ()
 #undef T
 }
 
+void
+test_simple_values_mapping ()
+{
+  pk_val simple_values[] = {
+    pk_make_int (1, 23),
+    pk_make_int (2, 46),
+    pk_make_uint (3, 23),
+    pk_make_uint (4, 46),
+    pk_make_string ("Poke"),
+    pk_make_offset (pk_make_uint (5, 64), pk_make_uint (6, 64)),
+  };
+  const int N = sizeof (simple_values) / sizeof (simple_values[0]);
+  pk_val i32 = pk_make_int (0, 32);
+  pk_val u64 = pk_make_uint (0, 64);
+  pk_val off = pk_make_offset (u64, pk_make_uint (1, 64));
+
+/* test case */
+#define T(cond, ...)                                                          \
+  do                                                                          \
+    {                                                                         \
+      if (cond)                                                               \
+        pass (__VA_ARGS__);                                                   \
+      else                                                                    \
+        fail (__VA_ARGS__);                                                   \
+    }                                                                         \
+  while (0)
+
+  T (i32 != PK_NULL, "%s: i32 != PK_NULL", __func__);
+  T (u64 != PK_NULL, "%s: u64 != PK_NULL", __func__);
+  T (off != PK_NULL, "%s: off != PK_NULL", __func__);
+  for (int i = 0; i < N; i++)
+    T (simple_values[i] != PK_NULL, "%s: simple_values[%d] != PK_NULL",
+       __func__, i);
+
+  for (int i = 0; i < N; i++)
+    {
+      /* getters */
+      T (pk_val_ios (simple_values[i]) == PK_NULL,
+         "%s: pk_val_ios (simple_values[%d]) == PK_NULL", __func__, i);
+      T (pk_val_offset (simple_values[i]) == PK_NULL,
+         "%s: pk_val_offset (simple_values[%d]) == PK_NULL", __func__, i);
+      T (pk_val_mapped_p (simple_values[i]) == 0,
+         "%s: pk_val_mapped_p (simple_values[%d]) == 0", __func__, i);
+      T (pk_val_strict_p (simple_values[i]) == 0,
+         "%s: pk_val_strict_p (simple_values[%d]) == 0", __func__, i);
+
+      /* setters: don't work for simple values! */
+      T (pk_val_set_ios (simple_values[i], i32) == PK_EINVAL,
+         "%s: pk_val_set_ios (simple_values[%d], i32) == PK_EINVAL", __func__,
+         i);
+      T (pk_val_set_offset (simple_values[i], off) == PK_EINVAL,
+         "%s: pk_val_set_offset (simple_values[%d], off) == PK_EINVAL",
+         __func__, i);
+      T (pk_val_set_mapped (simple_values[i], u64) == PK_EINVAL,
+         "%s: pk_val_set_mapped (simple_values[%d], u64) == PK_EINVAL",
+         __func__, i);
+      T (pk_val_set_strict (simple_values[i], u64) == PK_EINVAL,
+         "%s: pk_val_set_strict (simple_values[%d], u64) == PK_EINVAL",
+         __func__, i);
+    }
+
+#undef T
+}
+
 #define STARTS_WITH(PREFIX, STR) (strncmp (PREFIX, STR, strlen (PREFIX)) == 0)
 
 void
@@ -266,6 +330,7 @@ int
 main (int argc, char *argv[])
 {
   test_simple_values ();
+  test_simple_values_mapping ();
   test_pk_val_equal_p ();
 
   totals ();
-- 
2.31.0



reply via email to

[Prev in Thread] Current Thread [Next in Thread]