Module Name:    src
Committed By:   rillig
Date:           Mon Jul 20 21:33:13 UTC 2020

Modified Files:
        src/usr.bin/make: var.c

Log Message:
make(1): extract :ts<separator> modifier into separate function


To generate a diff of this commit:
cvs rdiff -u -r1.288 -r1.289 src/usr.bin/make/var.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.288 src/usr.bin/make/var.c:1.289
--- src/usr.bin/make/var.c:1.288	Mon Jul 20 20:56:39 2020
+++ src/usr.bin/make/var.c	Mon Jul 20 21:33:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.288 2020/07/20 20:56:39 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.289 2020/07/20 21:33:13 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.288 2020/07/20 20:56:39 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.289 2020/07/20 21:33:13 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)var.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: var.c,v 1.288 2020/07/20 20:56:39 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.289 2020/07/20 21:33:13 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -2599,101 +2599,101 @@ VarModify_Copy(GNode *ctx MAKE_ATTR_UNUS
     SepBuf_AddBytes(buf, word, strlen(word));
 }
 
-/* :tA, :tu, :tl, etc. */
+/* :ts<separator> */
+static Boolean
+ApplyModifier_ToSep(ApplyModifiersState *st)
+{
+    const char *sep = st->tstr + 2;
+
+    if (sep[0] != st->endc && (sep[1] == st->endc || sep[1] == ':')) {
+	/* ":ts<unrecognised><endc>" or ":ts<unrecognised>:" */
+	st->parsestate.varSpace = sep[0];
+	st->cp = sep + 1;
+    } else if (sep[0] == st->endc || sep[0] == ':') {
+	/* ":ts<endc>" or ":ts:" */
+	st->parsestate.varSpace = 0;	/* no separator */
+	st->cp = sep;
+    } else if (sep[0] == '\\') {
+	const char *xp = sep + 1;
+	int base = 8;		/* assume octal */
+
+	switch (sep[1]) {
+	case 'n':
+	    st->parsestate.varSpace = '\n';
+	    st->cp = sep + 2;
+	    break;
+	case 't':
+	    st->parsestate.varSpace = '\t';
+	    st->cp = sep + 2;
+	    break;
+	case 'x':
+	    base = 16;
+	    xp++;
+	    goto get_numeric;
+	case '0':
+	    base = 0;
+	    goto get_numeric;
+	default:
+	    if (!isdigit((unsigned char)sep[1]))
+		return FALSE;	/* ":ts<backslash><unrecognised>". */
+
+	    char *end;
+	get_numeric:
+	    st->parsestate.varSpace = strtoul(sep + 1 + (sep[1] == 'x'), &end, base);
+	    if (*end != ':' && *end != st->endc)
+	        return FALSE;
+	    st->cp = end;
+	    break;
+	}
+    } else {
+	return FALSE;		/* Found ":ts<unrecognised><unrecognised>". */
+    }
+
+    st->termc = *st->cp;
+    st->newStr = VarModify(st->ctxt, &st->parsestate, st->nstr,
+			   VarModify_Copy, NULL);
+    return TRUE;
+}
+
+/* :tA, :tu, :tl, :ts<separator>, etc. */
 static Boolean
 ApplyModifier_To(ApplyModifiersState *st)
 {
     st->cp = st->tstr + 1;	/* make sure it is set */
-    if (st->tstr[1] != st->endc && st->tstr[1] != ':') {
-	if (st->tstr[1] == 's') {
-	    /* Use the char (if any) at st->tstr[2] as the word separator. */
-
-	    if (st->tstr[2] != st->endc &&
-		(st->tstr[3] == st->endc || st->tstr[3] == ':')) {
-		/* ":ts<unrecognised><endc>" or
-		 * ":ts<unrecognised>:" */
-		st->parsestate.varSpace = st->tstr[2];
-		st->cp = st->tstr + 3;
-	    } else if (st->tstr[2] == st->endc || st->tstr[2] == ':') {
-		/* ":ts<endc>" or ":ts:" */
-		st->parsestate.varSpace = 0;	/* no separator */
-		st->cp = st->tstr + 2;
-	    } else if (st->tstr[2] == '\\') {
-		const char *xp = &st->tstr[3];
-		int base = 8;	/* assume octal */
-
-		switch (st->tstr[3]) {
-		case 'n':
-		    st->parsestate.varSpace = '\n';
-		    st->cp = st->tstr + 4;
-		    break;
-		case 't':
-		    st->parsestate.varSpace = '\t';
-		    st->cp = st->tstr + 4;
-		    break;
-		case 'x':
-		    base = 16;
-		    xp++;
-		    goto get_numeric;
-		case '0':
-		    base = 0;
-		    goto get_numeric;
-		default:
-		    if (isdigit((unsigned char)st->tstr[3])) {
-			char *ep;
-		    get_numeric:
-			st->parsestate.varSpace = strtoul(xp, &ep, base);
-			if (*ep != ':' && *ep != st->endc)
-			    return FALSE;
-			st->cp = ep;
-		    } else {
-			/* ":ts<backslash><unrecognised>". */
-			return FALSE;
-		    }
-		    break;
-		}
-	    } else {
-		/* Found ":ts<unrecognised><unrecognised>". */
-		return FALSE;
-	    }
+    if (st->tstr[1] == st->endc || st->tstr[1] == ':')
+	return FALSE;		/* Found ":t<endc>" or ":t:". */
 
-	    st->termc = *st->cp;
-	    st->newStr = VarModify(st->ctxt, &st->parsestate, st->nstr,
-				   VarModify_Copy, NULL);
-	} else if (st->tstr[2] == st->endc || st->tstr[2] == ':') {
-	    /* Check for two-character options: ":tu", ":tl" */
-	    if (st->tstr[1] == 'A') {	/* absolute path */
-		st->newStr = VarModify(
-			st->ctxt, &st->parsestate, st->nstr, VarRealpath, NULL);
-		st->cp = st->tstr + 2;
-		st->termc = *st->cp;
-	    } else if (st->tstr[1] == 'u') {
-		char *dp = bmake_strdup(st->nstr);
-		for (st->newStr = dp; *dp; dp++)
-		    *dp = toupper((unsigned char)*dp);
-		st->cp = st->tstr + 2;
-		st->termc = *st->cp;
-	    } else if (st->tstr[1] == 'l') {
-		char *dp = bmake_strdup(st->nstr);
-		for (st->newStr = dp; *dp; dp++)
-		    *dp = tolower((unsigned char)*dp);
-		st->cp = st->tstr + 2;
-		st->termc = *st->cp;
-	    } else if (st->tstr[1] == 'W' || st->tstr[1] == 'w') {
-		st->parsestate.oneBigWord = (st->tstr[1] == 'W');
-		st->newStr = st->nstr;
-		st->cp = st->tstr + 2;
-		st->termc = *st->cp;
-	    } else {
-		/* Found ":t<unrecognised>:" or ":t<unrecognised><endc>". */
-		return FALSE;
-	    }
-	} else {
-	    /* Found ":t<unrecognised><unrecognised>". */
-	    return FALSE;
-	}
+    if (st->tstr[1] == 's')
+	return ApplyModifier_ToSep(st);
+
+    if (st->tstr[2] != st->endc && st->tstr[2] != ':')
+	return FALSE;		/* Found ":t<unrecognised><unrecognised>". */
+
+    /* Check for two-character options: ":tu", ":tl" */
+    if (st->tstr[1] == 'A') {	/* absolute path */
+	st->newStr = VarModify(
+		st->ctxt, &st->parsestate, st->nstr, VarRealpath, NULL);
+	st->cp = st->tstr + 2;
+	st->termc = *st->cp;
+    } else if (st->tstr[1] == 'u') {
+	char *dp = bmake_strdup(st->nstr);
+	for (st->newStr = dp; *dp; dp++)
+	    *dp = toupper((unsigned char)*dp);
+	st->cp = st->tstr + 2;
+	st->termc = *st->cp;
+    } else if (st->tstr[1] == 'l') {
+	char *dp = bmake_strdup(st->nstr);
+	for (st->newStr = dp; *dp; dp++)
+	    *dp = tolower((unsigned char)*dp);
+	st->cp = st->tstr + 2;
+	st->termc = *st->cp;
+    } else if (st->tstr[1] == 'W' || st->tstr[1] == 'w') {
+	st->parsestate.oneBigWord = (st->tstr[1] == 'W');
+	st->newStr = st->nstr;
+	st->cp = st->tstr + 2;
+	st->termc = *st->cp;
     } else {
-	/* Found ":t<endc>" or ":t:". */
+	/* Found ":t<unrecognised>:" or ":t<unrecognised><endc>". */
 	return FALSE;
     }
     return TRUE;

Reply via email to