summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 43b35241..b04339af 100644
--- a/recipes-core/busybox/busybox_1.20.2.bbappend
+++ b/recipes-core/busybox/busybox_1.20.2.bbappend
@@ -1 +1,3 @@
1FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}/${MACHINE}:${THISDIR}/${PN}/${MACHINE}:${THISDIR}/${PN}-${PV}:${THISDIR}/${PN}:" 1FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}_${PV}:${THISDIR}/${PN}-${PV}/${MACHINE}:${THISDIR}/${PN}/${MACHINE}:${THISDIR}/${PN}-${PV}:${THISDIR}/${PN}:"
2
3SRC_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 00000000..e6a9d7ad
--- /dev/null
+++ b/recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch
@@ -0,0 +1,90 @@
1From ea664dde87d8e52df7d4003d988352a66562a945 Mon Sep 17 00:00:00 2001
2From: Denys Vlasenko <vda.linux@googlemail.com>
3Date: Fri, 22 Jun 2012 16:41:01 +0000
4Subject: awk: make -F STR interpret escape sequences. Closes 5126
5
6Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
7---
8diff --git a/editors/awk.c b/editors/awk.c
9index 71abca2..d69720d 100644
10--- a/editors/awk.c
11+++ b/editors/awk.c
12@@ -696,6 +696,10 @@ static char nextchar(char **s)
13 pps = *s;
14 if (c == '\\')
15 c = bb_process_escape_sequence((const char**)s);
16+ /* Example awk statement:
17+ * s = "abc\"def"
18+ * we must treat \" as "
19+ */
20 if (c == '\\' && *s == pps) { /* unrecognized \z? */
21 c = *(*s); /* yes, fetch z */
22 if (c)
23@@ -704,6 +708,15 @@ static char nextchar(char **s)
24 return c;
25 }
26
27+/* TODO: merge with strcpy_and_process_escape_sequences()?
28+ */
29+static void unescape_string_in_place(char *s1)
30+{
31+ char *s = s1;
32+ while ((*s1 = nextchar(&s)) != '\0')
33+ s1++;
34+}
35+
36 static ALWAYS_INLINE int isalnum_(int c)
37 {
38 return (isalnum(c) || c == '_');
39@@ -2992,7 +3005,7 @@ static int awk_exit(int r)
40 * otherwise return 0 */
41 static int is_assignment(const char *expr)
42 {
43- char *exprc, *val, *s, *s1;
44+ char *exprc, *val;
45
46 if (!isalnum_(*expr) || (val = strchr(expr, '=')) == NULL) {
47 return FALSE;
48@@ -3002,10 +3015,7 @@ static int is_assignment(const char *expr)
49 val = exprc + (val - expr);
50 *val++ = '\0';
51
52- s = s1 = val;
53- while ((*s1 = nextchar(&s)) != '\0')
54- s1++;
55-
56+ unescape_string_in_place(val);
57 setvar_u(newvar(exprc), val);
58 free(exprc);
59 return TRUE;
60@@ -3118,8 +3128,10 @@ int awk_main(int argc, char **argv)
61 opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, NULL);
62 argv += optind;
63 argc -= optind;
64- if (opt & 0x1)
65- setvar_s(intvar[FS], opt_F); // -F
66+ if (opt & 0x1) { /* -F */
67+ unescape_string_in_place(opt_F);
68+ setvar_s(intvar[FS], opt_F);
69+ }
70 while (list_v) { /* -v */
71 if (!is_assignment(llist_pop(&list_v)))
72 bb_show_usage();
73diff --git a/testsuite/awk.tests b/testsuite/awk.tests
74index e671907..d4c390d 100755
75--- a/testsuite/awk.tests
76+++ b/testsuite/awk.tests
77@@ -43,6 +43,11 @@ testing "awk long field sep" "awk -F-- '{ print NF, length(\$NF), \$NF }'" \
78 "" \
79 "a--\na--b--\na--b--c--\na--b--c--d--"
80
81+testing "awk -F handles escapes" "awk -F'\\x21' '{print \$1}'" \
82+ "a\n" \
83+ "" \
84+ "a!b\n"
85+
86 # '@(samp|code|file)\{' is an invalid extended regex (unmatched '{'),
87 # but gawk 3.1.5 does not bail out on it.
88 testing "awk gsub falls back to non-extended-regex" \
89--
90cgit v0.9.1