From ea1d9e46ad4392ad7e6d82fce95aa8500d48cbf9 Mon Sep 17 00:00:00 2001 From: Bogdan Purcareata Date: Thu, 16 May 2013 12:09:44 +0300 Subject: 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 Signed-off-by: Bruce Ashfield --- recipes-core/busybox/busybox_1.20.2.bbappend | 4 +- .../busybox-awk-make--F-STR-interpret-escape.patch | 90 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 recipes-core/busybox/busybox_1.20.2/busybox-awk-make--F-STR-interpret-escape.patch (limited to 'recipes-core') 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 @@ -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 00000000..e6a9d7ad --- /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 +Date: Fri, 22 Jun 2012 16:41:01 +0000 +Subject: awk: make -F STR interpret escape sequences. Closes 5126 + +Signed-off-by: Denys Vlasenko +--- +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 -- cgit v1.2.3-54-g00ecf