sh: Eliminate some gotos.
This commit is contained in:
parent
7775dfac2f
commit
33c5acf038
@ -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 && --skipcount <= 0) {
|
||||
}
|
||||
evaltree(n->nbinary.ch2, flags);
|
||||
status = exitstatus;
|
||||
if (evalskip)
|
||||
goto skipping;
|
||||
}
|
||||
loopnest--;
|
||||
exitstatus = status;
|
||||
@ -648,15 +647,15 @@ evalbackcmd(union node *n, struct backcmd *result)
|
||||
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 backcmd *result)
|
||||
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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -173,21 +173,12 @@ openredirect(union node *redir, char memory[10])
|
||||
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 @@ openredirect(union node *redir, char memory[10])
|
||||
} 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 @@ openredirect(union node *redir, char memory[10])
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user