Author: jilles
Date: Sun Oct  5 21:51:36 2014
New Revision: 272575
URL: https://svnweb.freebsd.org/changeset/base/272575

Log:
  sh: Eliminate some gotos.

Modified:
  head/bin/sh/eval.c
  head/bin/sh/expand.c
  head/bin/sh/jobs.c
  head/bin/sh/redir.c
  head/bin/sh/trap.c

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c  Sun Oct  5 21:39:50 2014        (r272574)
+++ head/bin/sh/eval.c  Sun Oct  5 21:51:36 2014        (r272575)
@@ -316,9 +316,10 @@ evalloop(union node *n, int flags)
        loopnest++;
        status = 0;
        for (;;) {
-               evaltree(n->nbinary.ch1, EV_TESTED);
+               if (!evalskip)
+                       evaltree(n->nbinary.ch1, EV_TESTED);
                if (evalskip) {
-skipping:        if (evalskip == SKIPCONT && --skipcount <= 0) {
+                       if (evalskip == SKIPCONT && --skipcount <= 0) {
                                evalskip = 0;
                                continue;
                        }
@@ -337,8 +338,6 @@ skipping:     if (evalskip == SKIPCONT && 
                }
                evaltree(n->nbinary.ch2, flags);
                status = exitstatus;
-               if (evalskip)
-                       goto skipping;
        }
        loopnest--;
        exitstatus = status;
@@ -648,15 +647,15 @@ evalbackcmd(union node *n, struct backcm
        struct jmploc *savehandler;
        struct localvar *savelocalvars;
 
-       setstackmark(&smark);
        result->fd = -1;
        result->buf = NULL;
        result->nleft = 0;
        result->jp = NULL;
        if (n == NULL) {
                exitstatus = 0;
-               goto out;
+               return;
        }
+       setstackmark(&smark);
        exitstatus = oexitstatus;
        if (is_valid_fast_cmdsubst(n)) {
                savelocalvars = localvars;
@@ -698,7 +697,6 @@ evalbackcmd(union node *n, struct backcm
                result->fd = pip[0];
                result->jp = jp;
        }
-out:
        popstackmark(&smark);
        TRACE(("evalbackcmd done: fd=%d buf=%p nleft=%d jp=%p\n",
                result->fd, result->buf, result->nleft, result->jp));

Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c        Sun Oct  5 21:39:50 2014        (r272574)
+++ head/bin/sh/expand.c        Sun Oct  5 21:51:36 2014        (r272575)
@@ -328,24 +328,19 @@ exptilde(char *p, int flag)
 done:
        *p = '\0';
        if (*(startp+1) == '\0') {
-               if ((home = lookupvar("HOME")) == NULL)
-                       goto lose;
+               home = lookupvar("HOME");
        } else {
-               if ((pw = getpwnam(startp+1)) == NULL)
-                       goto lose;
-               home = pw->pw_dir;
+               pw = getpwnam(startp+1);
+               home = pw != NULL ? pw->pw_dir : NULL;
        }
-       if (*home == '\0')
-               goto lose;
        *p = c;
+       if (home == NULL || *home == '\0')
+               return (startp);
        if (quotes)
                STPUTS_QUOTES(home, SQSYNTAX, expdest);
        else
                STPUTS(home, expdest);
        return (p);
-lose:
-       *p = c;
-       return (startp);
 }
 
 

Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c  Sun Oct  5 21:39:50 2014        (r272574)
+++ head/bin/sh/jobs.c  Sun Oct  5 21:51:36 2014        (r272575)
@@ -373,13 +373,13 @@ showjob(struct job *jp, int mode)
                        strcat(statestr, " (core dumped)");
        }
 
-       for (ps = jp->ps ; ; ps++) {    /* for each process */
+       for (ps = jp->ps ; procno > 0 ; ps++, procno--) { /* for each process */
                if (mode == SHOWJOBS_PIDS || mode == SHOWJOBS_PGIDS) {
                        out1fmt("%d\n", (int)ps->pid);
-                       goto skip;
+                       continue;
                }
                if (mode != SHOWJOBS_VERBOSE && ps != jp->ps)
-                       goto skip;
+                       continue;
                if (jobno == curr && ps == jp->ps)
                        c = '+';
                else if (jobno == prev && ps == jp->ps)
@@ -410,8 +410,6 @@ showjob(struct job *jp, int mode)
                        out1c('\n');
                } else
                        printjobcmd(jp);
-skip:          if (--procno <= 0)
-                       break;
        }
 }
 

Modified: head/bin/sh/redir.c
==============================================================================
--- head/bin/sh/redir.c Sun Oct  5 21:39:50 2014        (r272574)
+++ head/bin/sh/redir.c Sun Oct  5 21:51:36 2014        (r272575)
@@ -173,21 +173,12 @@ openredirect(union node *redir, char mem
                fname = redir->nfile.expfname;
                if ((f = open(fname, O_RDONLY)) < 0)
                        error("cannot open %s: %s", fname, strerror(errno));
-movefd:
-               if (f != fd) {
-                       if (dup2(f, fd) == -1) {
-                               e = errno;
-                               close(f);
-                               error("%d: %s", fd, strerror(e));
-                       }
-                       close(f);
-               }
                break;
        case NFROMTO:
                fname = redir->nfile.expfname;
                if ((f = open(fname, O_RDWR|O_CREAT, 0666)) < 0)
                        error("cannot create %s: %s", fname, strerror(errno));
-               goto movefd;
+               break;
        case NTO:
                if (Cflag) {
                        fname = redir->nfile.expfname;
@@ -205,19 +196,19 @@ movefd:
                        } else
                                error("cannot create %s: %s", fname,
                                    strerror(EEXIST));
-                       goto movefd;
+                       break;
                }
                /* FALLTHROUGH */
        case NCLOBBER:
                fname = redir->nfile.expfname;
                if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
                        error("cannot create %s: %s", fname, strerror(errno));
-               goto movefd;
+               break;
        case NAPPEND:
                fname = redir->nfile.expfname;
                if ((f = open(fname, O_WRONLY|O_CREAT|O_APPEND, 0666)) < 0)
                        error("cannot create %s: %s", fname, strerror(errno));
-               goto movefd;
+               break;
        case NTOFD:
        case NFROMFD:
                if (redir->ndup.dupfd >= 0) {   /* if not ">&-" */
@@ -231,14 +222,22 @@ movefd:
                } else {
                        close(fd);
                }
-               break;
+               return;
        case NHERE:
        case NXHERE:
                f = openhere(redir);
-               goto movefd;
+               break;
        default:
                abort();
        }
+       if (f != fd) {
+               if (dup2(f, fd) == -1) {
+                       e = errno;
+                       close(f);
+                       error("%d: %s", fd, strerror(e));
+               }
+               close(f);
+       }
 }
 
 

Modified: head/bin/sh/trap.c
==============================================================================
--- head/bin/sh/trap.c  Sun Oct  5 21:39:50 2014        (r272574)
+++ head/bin/sh/trap.c  Sun Oct  5 21:51:36 2014        (r272575)
@@ -510,28 +510,25 @@ exitshell_savedstatus(void)
                        exiting_exitstatus = oexitstatus;
        }
        exitstatus = oexitstatus = exiting_exitstatus;
-       if (setjmp(loc1.loc)) {
-               goto l1;
+       if (!setjmp(loc1.loc)) {
+               handler = &loc1;
+               if ((p = trap[0]) != NULL && *p != '\0') {
+                       /*
+                        * Reset evalskip, or the trap on EXIT could be
+                        * interrupted if the last command was a "return".
+                        */
+                       evalskip = 0;
+                       trap[0] = NULL;
+                       evalstring(p, 0);
+               }
        }
-       if (setjmp(loc2.loc)) {
-               goto l2;
-       }
-       handler = &loc1;
-       if ((p = trap[0]) != NULL && *p != '\0') {
-               /*
-                * Reset evalskip, or the trap on EXIT could be
-                * interrupted if the last command was a "return".
-                */
-               evalskip = 0;
-               trap[0] = NULL;
-               evalstring(p, 0);
-       }
-l1:   handler = &loc2;                 /* probably unnecessary */
-       flushall();
+       if (!setjmp(loc2.loc)) {
+               handler = &loc2;                /* probably unnecessary */
+               flushall();
 #if JOBS
-       setjobctl(0);
+               setjobctl(0);
 #endif
-l2:
+       }
        if (sig != 0 && sig != SIGSTOP && sig != SIGTSTP && sig != SIGTTIN &&
            sig != SIGTTOU) {
                signal(sig, SIG_DFL);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to