]> sourceware.org Git - newlib-cygwin.git/blobdiff - libgloss/arc/arc-main-helper.c
arc: libgloss: Introduce hostlink interface
[newlib-cygwin.git] / libgloss / arc / arc-main-helper.c
diff --git a/libgloss/arc/arc-main-helper.c b/libgloss/arc/arc-main-helper.c
new file mode 100644 (file)
index 0000000..e27e15b
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * arc-main-helper.c -- provide custom __setup_argv_and_call_main();
+ * This function uses _argc(), _argvlen(), _argv() and _setup_low_level().
+ * Description for these functions can be found below in this file.
+ *
+ * Copyright (c) 2024 Synopsys Inc.
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ *
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <alloca.h>
+
+/* Return number of arguments passed to host executable.  */
+extern int _argc (void);
+/*
+ * Return buffer length to be used for a given argument number.
+ * Buffer length includes '\0' character.
+ */
+extern uint32_t _argvlen (int a);
+/*
+ * Copy argument into buffer arg.
+ * arg must be no less than argvlen(a) length.
+ */
+extern int _argv (int a, char *arg);
+/* Custom setup.  Can be used to setup some port-specific stuff.  */
+extern int _setup_low_level (void);
+/* main function to call.  */
+extern int main (int argc, char **argv);
+
+/* Copy arguments from host to local stack and call main.  */
+int
+__setup_argv_and_call_main (void)
+{
+  int i;
+  int argc;
+  char **argv = NULL;
+
+  argc = _argc ();
+  if (argc > 0)
+    argv = alloca ((argc + 1) * sizeof (char *));
+
+  for (i = 0; i < argc; i++)
+    {
+      uint32_t arg_len;
+
+      arg_len = _argvlen (i);
+      if (arg_len == 0)
+       break;
+
+      argv[i] = alloca (arg_len);
+
+      if (_argv (i, argv[i]) < 0)
+       break;
+    }
+
+  if (argv)
+    argv[i] = NULL;
+
+  _setup_low_level ();
+
+  return main (i, argv);
+}
This page took 0.023573 seconds and 5 git commands to generate.