4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-21 00:07:36 +08:00
newlib-cygwin/libgloss/arc/arc-main-helper.c

74 lines
1.9 KiB
C
Raw Permalink Normal View History

/*
* 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);
}