summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c
new file mode 100644
index 000000000..1374c8dd8
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/samples/basic/src/native_impl.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include "bh_platform.h"
+#include "wasm_export.h"
+#include "math.h"
+
+// The first parameter is not exec_env because it is invoked by native funtions
+void
+reverse(char *str, int len)
+{
+ int i = 0, j = len - 1, temp;
+ while (i < j) {
+ temp = str[i];
+ str[i] = str[j];
+ str[j] = temp;
+ i++;
+ j--;
+ }
+}
+
+// The first parameter exec_env must be defined using type wasm_exec_env_t
+// which is the calling convention for exporting native API by WAMR.
+//
+// Converts a given integer x to string str[].
+// digit is the number of digits required in the output.
+// If digit is more than the number of digits in x,
+// then 0s are added at the beginning.
+int
+intToStr(wasm_exec_env_t exec_env, int x, char *str, int str_len, int digit)
+{
+ int i = 0;
+
+ printf("calling into native function: %s\n", __FUNCTION__);
+
+ while (x) {
+ // native is responsible for checking the str_len overflow
+ if (i >= str_len) {
+ return -1;
+ }
+ str[i++] = (x % 10) + '0';
+ x = x / 10;
+ }
+
+ // If number of digits required is more, then
+ // add 0s at the beginning
+ while (i < digit) {
+ if (i >= str_len) {
+ return -1;
+ }
+ str[i++] = '0';
+ }
+
+ reverse(str, i);
+
+ if (i >= str_len)
+ return -1;
+ str[i] = '\0';
+ return i;
+}
+
+int
+get_pow(wasm_exec_env_t exec_env, int x, int y)
+{
+ printf("calling into native function: %s\n", __FUNCTION__);
+ return (int)pow(x, y);
+}
+
+int32_t
+calculate_native(wasm_exec_env_t exec_env, int32_t n, int32_t func1,
+ int32_t func2)
+{
+ printf("calling into native function: %s, n=%d, func1=%d, func2=%d\n",
+ __FUNCTION__, n, func1, func2);
+
+ uint32_t argv[] = { n };
+ if (!wasm_runtime_call_indirect(exec_env, func1, 1, argv)) {
+ printf("call func1 failed\n");
+ return 0xDEAD;
+ }
+
+ uint32_t n1 = argv[0];
+ printf("call func1 and return n1=%d\n", n1);
+
+ if (!wasm_runtime_call_indirect(exec_env, func2, 1, argv)) {
+ printf("call func2 failed\n");
+ return 0xDEAD;
+ }
+
+ uint32_t n2 = argv[0];
+ printf("call func2 and return n2=%d\n", n2);
+ return n1 + n2;
+}