usr.bin/make 2nd try: O modifyer
Max Okumoto
okumoto at ucsd.edu
Wed Dec 1 05:16:52 PST 2004
Add O modifier to make.
This patch was missed in last round of commits. I guess my mega patch
caused more problems. Back to small patches. :-)
---------------------
PatchSet 320, 321
Date: 2003/09/18 04:15:57
Author: marcel, ru
Log:
Implement the O modifier. The O modifier sorts the words in a
variable. The implementation is based upon the patch sent to
arch@, but modified to be compatible with NetBSD. The modifier
that does a reverse sort has been dropped for now, but the
ability to add one later has been preserved.
Document the `O' modifier.
Members:
var.c:1.42->1.43
make.1:1.63->1.64
Members:
Index: var.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/var.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- var.c 15 Jan 2003 22:36:15 -0000 1.42
+++ var.c 18 Sep 2003 03:15:57 -0000 1.43
@@ -608,6 +608,48 @@
/*-
*-----------------------------------------------------------------------
+ * VarSortWords --
+ * Sort the words in the string.
+ *
+ * Input:
+ * str String whose words should be sorted
+ * cmp A comparison function to control the ordering
+ *
+ * Results:
+ * A string containing the words sorted
+ *
+ * Side Effects:
+ * None.
+ *
+ *-----------------------------------------------------------------------
+ */
+static char *
+VarSortWords(char *str, int (*cmp)(const void *, const void *))
+{
+ Buffer buf;
+ char **av;
+ int ac, i;
+
+ buf = Buf_Init(0);
+ av = brk_string(str, &ac, FALSE);
+ qsort((void*)(av + 1), ac - 1, sizeof(char*), cmp);
+ for (i = 1; i < ac; i++) {
+ Buf_AddBytes(buf, strlen(av[i]), (Byte *)av[i]);
+ Buf_AddByte(buf, (Byte)((i < ac - 1) ? ' ' : '\0'));
+ }
+ str = (char *)Buf_GetAll(buf, (int *)NULL);
+ Buf_Destroy(buf, FALSE);
+ return (str);
+}
+
+static int
+SortIncreasing(const void *l, const void *r)
+{
+ return (strcmp(*(const char* const*)l, *(const char* const*)r));
+}
+
+/*-
+ *-----------------------------------------------------------------------
* VarGetPattern --
* Pass through the tstr looking for 1) escaped delimiters,
* '$'s and backslashes (place the escaped character in
@@ -1114,7 +1156,7 @@
DEBUGF(VAR, ("Applying :%c to \"%s\"\n", *tstr, str));
switch (*tstr) {
- case 'U':
+ case 'U':
if (tstr[1] == endc || tstr[1] == ':') {
Buffer buf;
buf = Buf_Init(MAKE_BSIZE);
@@ -1448,6 +1490,14 @@
free(pattern.matches);
break;
}
+ case 'O':
+ if (tstr[1] == endc || tstr[1] == ':') {
+ newStr = VarSortWords(str, SortIncreasing);
+ cp = tstr + 1;
+ termc = *cp;
+ break;
+ }
+ /* FALLTHROUGH */
case 'Q':
if (tstr[1] == endc || tstr[1] == ':') {
newStr = VarQuote (str);
Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -r1.63 -r1.64
--- make.1 14 Sep 2003 12:31:33 -0000 1.63
+++ make.1 2 Oct 2003 18:38:23 -0000 1.64
@@ -652,6 +652,8 @@
.Cm M ,
but selects all words which do not match
the rest of the modifier.
+.It Cm O
+Order every word in the variable alphabetically.
.It Cm Q
Quotes every shell meta-character in the variable, so that it can be passed
safely through recursive invocations of
More information about the Submit
mailing list