diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 741fd7b8b..d626c26f6 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,10 @@ +2001-02-01 Alexandre Oliva + + * libc/sys/sh/sys/syscall.h (SYS_get_argc, SYS_get_argN_len, + SYS_get_argN): + * libc/sys/sh/syscalls.c (__setup_argv_for_main, + __setup_argv_and_call_main): New. + 2001-01-31 Jeff Johnston * libc/include/stdio.h (FILENAME_MAX): Changed to use __FILENAME_MAX__ diff --git a/newlib/libc/sys/sh/sys/syscall.h b/newlib/libc/sys/sh/sys/syscall.h index f141df764..fd9ee7c51 100644 --- a/newlib/libc/sys/sh/sys/syscall.h +++ b/newlib/libc/sys/sh/sys/syscall.h @@ -27,5 +27,9 @@ #define SYS_pipe 42 #define SYS_execve 59 +#define SYS_argc 172 /* == 0xAC, for Argument Count :-) */ +#define SYS_argnlen 173 +#define SYS_argn 174 + #define SYS_utime 201 /* not really a system call */ #define SYS_wait 202 /* nor is this */ diff --git a/newlib/libc/sys/sh/syscalls.c b/newlib/libc/sys/sh/syscalls.c index 8380c7017..f0e924297 100644 --- a/newlib/libc/sys/sh/syscalls.c +++ b/newlib/libc/sys/sh/syscalls.c @@ -191,3 +191,31 @@ _gettimeofday (struct timeval *tv, struct timezone *tz) tv->tv_sec = __trap34 (SYS_time); return 0; } + +static inline int +__setup_argv_for_main (int argc) +{ + char **argv; + int i = argc; + + argv = __builtin_alloca ((1 + argc) * sizeof (*argv)); + + argv[i] = NULL; + while (i--) { + argv[i] = __builtin_alloca (1 + __trap34 (SYS_argnlen, i)); + __trap34 (SYS_argn, i, argv[i]); + } + + return main (argc, argv); +} + +int +__setup_argv_and_call_main () +{ + int argc = __trap34 (SYS_argc); + + if (argc <= 0) + return main (argc, NULL); + else + return __setup_argv_for_main (argc); +}