awk: fix FS assignment behavior. Closes 5108
No binary (build failed)
—
(log yok)
| @@ -1812,6 +1812,18 @@ static void handle_special(var *v) | |
| is_f0_split = FALSE; | |
| } else if (v == intvar[FS]) { | |
| + | /* |
| + | * The POSIX-2008 standard says that changing FS should have no effect on the |
| + | * current input line, but only on the next one. The language is: |
| + | * |
| + | * > Before the first reference to a field in the record is evaluated, the record |
| + | * > shall be split into fields, according to the rules in Regular Expressions, |
| + | * > using the value of FS that was current at the time the record was read. |
| + | * |
| + | * So, split up current line before assignment to FS: |
| + | */ |
| + | split_f0(); |
| + | |
| mk_splitter(getvar_s(v), &fsplitter); | |
| } else if (v == intvar[RS]) { | |
| @@ -217,4 +217,11 @@ end d | |
| testing "awk handles empty ()" \ | |
| "awk 'BEGIN {print()}' 2>&1" "awk: cmd. line:1: Empty sequence\n" "" "" | |
| + | testing "awk FS assignment" "awk '{FS=\":\"; print \$1}'" \ |
| + | "a:b\ne\n" \ |
| + | "" \ |
| + | "a:b c:d\ne:f g:h" |
| + | |
| + | # testing "description" "command" "result" "infile" "stdin" |
| + | |
| exit $FAILCOUNT | |