aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBogdan Purcareata <bogdan.purcareata@freescale.com>2013-05-16 12:09:44 +0300
committerBruce Ashfield <bruce.ashfield@windriver.com>2013-05-17 09:47:32 -0700
commitea1d9e46ad4392ad7e6d82fce95aa8500d48cbf9 (patch)
tree46fabe93930c0a46af4cb3eab20c5ca7590ca86d
parent1cbe97b642b44df5e60fb422164bd9773401db02 (diff)
busybox awk: make -F STR interpret escape sequences
Patch implements functionality mentioned in the title and has been applied to busybox 1.21.0. This patch is included into the meta-virtualization layer since it provides awk functionality to the lxc-clone command in the lxc containers package. Signed-off-by: Bogdan Purcareata <bogdan.purcareata@freescale.com> Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
-rw-r--r--recipes-core/busybox/busybox_1.20.2.bbappend4
-rw-r--r--recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch90
2 files changed, 93 insertions, 1 deletions
diff --git a/recipes-core/busybox/busybox_1.20.2.bbappend b/recipes-core/busybox/busybox_1.20.2.bbappend
index 43b3524..b04339a 100644
--- a/recipes-core/busybox/busybox_1.20.2.bbappend
+++ b/recipes-core/busybox/busybox_1.20.2.bbappend
@@ -1 +1,3 @@
-FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}/${MACHINE}:${THISDIR}/${PN}/${MACHINE}:${THISDIR}/${PN}-${PV}:${THISDIR}/${PN}:"
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}_${PV}:${THISDIR}/${PN}-${PV}/${MACHINE}:${THISDIR}/${PN}/${MACHINE}:${THISDIR}/${PN}-${PV}:${THISDIR}/${PN}:"
+
+SRC_URI += "file://busybox-awk-make--F-STR-interpret-escape.patch"
diff --git a/recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch b/recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch
new file mode 100644
index 0000000..e6a9d7a
--- /dev/null
+++ b/recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch
@@ -0,0 +1,90 @@
+From ea664dde87d8e52df7d4003d988352a66562a945 Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Fri, 22 Jun 2012 16:41:01 +0000
+Subject: awk: make -F STR interpret escape sequences. Closes 5126
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+diff --git a/editors/awk.c b/editors/awk.c
+index 71abca2..d69720d 100644
+--- a/editors/awk.c
++++ b/editors/awk.c
+@@ -696,6 +696,10 @@ static char nextchar(char **s)
+ pps = *s;
+ if (c == '\\')
+ c = bb_process_escape_sequence((const char**)s);
++ /* Example awk statement:
++ * s = "abc\"def"
++ * we must treat \" as "
++ */
+ if (c == '\\' && *s == pps) { /* unrecognized \z? */
+ c = *(*s); /* yes, fetch z */
+ if (c)
+@@ -704,6 +708,15 @@ static char nextchar(char **s)
+ return c;
+ }
+
++/* TODO: merge with strcpy_and_process_escape_sequences()?
++ */
++static void unescape_string_in_place(char *s1)
++{
++ char *s = s1;
++ while ((*s1 = nextchar(&s)) != '\0')
++ s1++;
++}
++
+ static ALWAYS_INLINE int isalnum_(int c)
+ {
+ return (isalnum(c) || c == '_');
+@@ -2992,7 +3005,7 @@ static int awk_exit(int r)
+ * otherwise return 0 */
+ static int is_assignment(const char *expr)
+ {
+- char *exprc, *val, *s, *s1;
++ char *exprc, *val;
+
+ if (!isalnum_(*expr) || (val = strchr(expr, '=')) == NULL) {
+ return FALSE;
+@@ -3002,10 +3015,7 @@ static int is_assignment(const char *expr)
+ val = exprc + (val - expr);
+ *val++ = '\0';
+
+- s = s1 = val;
+- while ((*s1 = nextchar(&s)) != '\0')
+- s1++;
+-
++ unescape_string_in_place(val);
+ setvar_u(newvar(exprc), val);
+ free(exprc);
+ return TRUE;
+@@ -3118,8 +3128,10 @@ int awk_main(int argc, char **argv)
+ opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, NULL);
+ argv += optind;
+ argc -= optind;
+- if (opt & 0x1)
+- setvar_s(intvar[FS], opt_F); // -F
++ if (opt & 0x1) { /* -F */
++ unescape_string_in_place(opt_F);
++ setvar_s(intvar[FS], opt_F);
++ }
+ while (list_v) { /* -v */
+ if (!is_assignment(llist_pop(&list_v)))
+ bb_show_usage();
+diff --git a/testsuite/awk.tests b/testsuite/awk.tests
+index e671907..d4c390d 100755
+--- a/testsuite/awk.tests
++++ b/testsuite/awk.tests
+@@ -43,6 +43,11 @@ testing "awk long field sep" "awk -F-- '{ print NF, length(\$NF), \$NF }'" \
+ "" \
+ "a--\na--b--\na--b--c--\na--b--c--d--"
+
++testing "awk -F handles escapes" "awk -F'\\x21' '{print \$1}'" \
++ "a\n" \
++ "" \
++ "a!b\n"
++
+ # '@(samp|code|file)\{' is an invalid extended regex (unmatched '{'),
+ # but gawk 3.1.5 does not bail out on it.
+ testing "awk gsub falls back to non-extended-regex" \
+--
+cgit v0.9.1