svn commit: r255073 - head/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Fri Aug 30 13:25:16 UTC 2013


Author: jilles
Date: Fri Aug 30 13:25:15 2013
New Revision: 255073
URL: http://svnweb.freebsd.org/changeset/base/255073

Log:
  sh: Add a function for the case where one token is required in the parse.

Modified:
  head/bin/sh/parser.c

Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c	Fri Aug 30 12:09:59 2013	(r255072)
+++ head/bin/sh/parser.c	Fri Aug 30 13:25:15 2013	(r255073)
@@ -121,6 +121,7 @@ static int readtoken(void);
 static int xxreadtoken(void);
 static int readtoken1(int, const char *, const char *, int);
 static int noexpand(char *);
+static void consumetoken(int);
 static void synexpect(int) __dead2;
 static void synerror(const char *) __dead2;
 static void setprompt(int);
@@ -413,8 +414,7 @@ command(void)
 		n1->type = NIF;
 		if ((n1->nif.test = list(0, 0)) == NULL)
 			synexpect(-1);
-		if (readtoken() != TTHEN)
-			synexpect(TTHEN);
+		consumetoken(TTHEN);
 		n1->nif.ifpart = list(0, 0);
 		n2 = n1;
 		while (readtoken() == TELIF) {
@@ -423,8 +423,7 @@ command(void)
 			n2->type = NIF;
 			if ((n2->nif.test = list(0, 0)) == NULL)
 				synexpect(-1);
-			if (readtoken() != TTHEN)
-				synexpect(TTHEN);
+			consumetoken(TTHEN);
 			n2->nif.ifpart = list(0, 0);
 		}
 		if (lasttoken == TELSE)
@@ -433,27 +432,20 @@ command(void)
 			n2->nif.elsepart = NULL;
 			tokpushback++;
 		}
-		if (readtoken() != TFI)
-			synexpect(TFI);
+		consumetoken(TFI);
 		checkkwd = CHKKWD | CHKALIAS;
 		break;
 	case TWHILE:
-	case TUNTIL: {
-		int got;
+	case TUNTIL:
 		n1 = (union node *)stalloc(sizeof (struct nbinary));
 		n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL;
 		if ((n1->nbinary.ch1 = list(0, 0)) == NULL)
 			synexpect(-1);
-		if ((got=readtoken()) != TDO) {
-TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
-			synexpect(TDO);
-		}
+		consumetoken(TDO);
 		n1->nbinary.ch2 = list(0, 0);
-		if (readtoken() != TDONE)
-			synexpect(TDONE);
+		consumetoken(TDONE);
 		checkkwd = CHKKWD | CHKALIAS;
 		break;
-	}
 	case TFOR:
 		if (readtoken() != TWORD || quoteflag || ! goodname(wordtext))
 			synerror("Bad for loop variable");
@@ -501,15 +493,13 @@ TRACE(("expecting DO got %s %s\n", tokna
 		else
 			synexpect(-1);
 		n1->nfor.body = list(0, 0);
-		if (readtoken() != t)
-			synexpect(t);
+		consumetoken(t);
 		checkkwd = CHKKWD | CHKALIAS;
 		break;
 	case TCASE:
 		n1 = (union node *)stalloc(sizeof (struct ncase));
 		n1->type = NCASE;
-		if (readtoken() != TWORD)
-			synexpect(TWORD);
+		consumetoken(TWORD);
 		n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg));
 		n2->type = NARG;
 		n2->narg.text = wordtext;
@@ -562,15 +552,13 @@ TRACE(("expecting DO got %s %s\n", tokna
 		n1->type = NSUBSHELL;
 		n1->nredir.n = list(0, 0);
 		n1->nredir.redirect = NULL;
-		if (readtoken() != TRP)
-			synexpect(TRP);
+		consumetoken(TRP);
 		checkkwd = CHKKWD | CHKALIAS;
 		is_subshell = 1;
 		break;
 	case TBEGIN:
 		n1 = list(0, 0);
-		if (readtoken() != TEND)
-			synexpect(TEND);
+		consumetoken(TEND);
 		checkkwd = CHKKWD | CHKALIAS;
 		break;
 	/* A simple command must have at least one redirection or word. */
@@ -659,8 +647,7 @@ simplecmd(union node **rpp, union node *
 		} else if (lasttoken == TLP && app == &args->narg.next
 					    && rpp == orig_rpp) {
 			/* We have a function */
-			if (readtoken() != TRP)
-				synexpect(TRP);
+			consumetoken(TRP);
 			funclinno = plinno;
 			/*
 			 * - Require plain text.
@@ -734,8 +721,7 @@ parsefname(void)
 {
 	union node *n = redirnode;
 
-	if (readtoken() != TWORD)
-		synexpect(-1);
+	consumetoken(TWORD);
 	if (n->type == NHERE) {
 		struct heredoc *here = heredoc;
 		struct heredoc *p;
@@ -1094,10 +1080,8 @@ done:
 
 	if (oldstyle)
 		doprompt = saveprompt;
-	else {
-		if (readtoken() != TRP)
-			synexpect(TRP);
-	}
+	else
+		consumetoken(TRP);
 
 	(*nlpp)->n = n;
         if (oldstyle) {
@@ -1880,6 +1864,14 @@ isassignment(const char *p)
 }
 
 
+static void
+consumetoken(int token)
+{
+	if (readtoken() != token)
+		synexpect(token);
+}
+
+
 /*
  * Called when an unexpected token is read during the parse.  The argument
  * is the token that is expected, or -1 if more than one type of token can


More information about the svn-src-all mailing list