From f85bb632e267d657c4678ffe6289ea4e35ae2dcd Mon Sep 17 00:00:00 2001 From: dtb Date: Mon, 21 Nov 2022 14:14:22 -0500 Subject: [PATCH] recursion --- pscat/pscat.c | 50 +++++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/pscat/pscat.c b/pscat/pscat.c index b8c8a93..f671a8a 100644 --- a/pscat/pscat.c +++ b/pscat/pscat.c @@ -7,44 +7,36 @@ static char *program_name = "pscat"; -/* Originally designed to use parentheses but changed to brackets to escape the - * hassle of escaping them from the Bourne shell. */ #define L_PAREN '[' #define R_PAREN ']' -int main(int argc, char *argv[]){ - char **psstart; +int +forking(char **argv){ int child; - int i; - unsigned int retval; - int terms; + char **corr; - retval = 0; + corr = corresponding_arg(argv, L_PAREN, R_PAREN); + *corr = NULL; + if(fork() == 0){ + execvp(argv[1], argv+1); + }else{ + wait(&child); + argv = corr; + if(*++argv == NULL) + return WIFEXITED(child) * WEXITSTATUS(child); + else + return forking(argv); + } +} - if((terms = check_arg(++argv, L_PAREN, R_PAREN)) == 0){ +int main(int argc, char *argv[]){ + + if((check_arg(++argv, L_PAREN, R_PAREN)) == 0){ fprintf(stderr, "Usage: %s \"[\" [utility [argument...]] \"]\" ...\n", argv[-1] == NULL ? program_name : argv[-1] ); return EX_USAGE; - } - - /* loop starts with *argv -> the next L_PAREN */ - for(i = 0; i < terms; ++i){ - psstart = argv + 1; - argv = corresponding_arg(argv, L_PAREN, R_PAREN); - /* *argv -> the corresponding R_PAREN. turn it into NULL to - * terminate the argument list to send to execvp(3) */ - *argv = NULL; - if(fork() == 0){ - execvp(psstart[0], psstart); - }else - wait(&child); - /* interpret status information from wait(2) */ - if(WIFEXITED(child)) - retval += WEXITSTATUS(child); - ++argv; - } - - return retval; + }else + return forking(argv); }