onetrueawk/awk

With a FS of 2 characters or more awk leaves --csv mode

wajap opened this issue · 4 comments

wajap commented

Normal behavior: echo 'aa,"bb"' | ./nawk_org --csv '{print $1 "|" $2}' gives aa|bb
But: echo 'aa,"bb"' | ./nawk_org -Fbb --csv '{print $1 "|" $2}' gives aa,"|" and no warning
Also: echo 'aa,"bb"' |/nawk_org --csv 'BEGIN{FS="bb"}{print $1 "|" $2}' gives:

 ./a.out: danger: don't set FS when --csv is in effect source line number 1
aa,"|"

Below a fix with also a warning when -F is used.

diff -ur org/lib.c new/lib.c
--- org/lib.c	2023-11-24 05:34:46.000000000 +0100
+++ new/lib.c	2023-11-27 13:55:10.000000000 +0100
@@ -399,7 +399,7 @@
 	i = 0;	/* number of fields accumulated here */
 	if (inputFS == NULL)	/* make sure we have a copy of FS */
 		savefs();
-	if (strlen(inputFS) > 1) {	/* it's a regular expression */
+	if (!CSV && strlen(inputFS) > 1) {	/* it's a regular expression */
 		i = refldbld(r, inputFS);
 	} else if (!CSV && (sep = *inputFS) == ' ') {	/* default whitespace */
 		for (i = 0; ; ) {
diff -ur org/main.c new/main.c
--- org/main.c	2023-11-24 05:34:46.000000000 +0100
+++ new/main.c	2023-11-27 13:55:10.000000000 +0100
@@ -157,6 +157,8 @@
 		}
 		if (strcmp(argv[1], "--csv") == 0) {	/* turn on csv input processing */
 			CSV = true;
+			if (fs)
+				WARNING("danger: don't set FS when --csv is in effect");
 			argc--;
 			argv++;
 			continue;
@@ -178,6 +180,8 @@
  			break;
 		case 'F':	/* set field separator */
 			fs = setfs(getarg(&argc, &argv, "no field separator"));
+			if (CSV)
+				WARNING("danger: don't set FS when --csv is in effect");
 			break;
 		case 'v':	/* -v a=1 to be done NOW.  one -v for each */
 			vn = getarg(&argc, &argv, "no variable name");
diff -ur org/testdir/T.csv new/testdir/T.csv
--- org/testdir/T.csv	2023-11-24 05:34:46.000000000 +0100
+++ new/testdir/T.csv	2023-11-27 13:55:10.000000000 +0100
@@ -17,7 +17,7 @@
 	sub(/try /, "")
 	prog = $0
 	printf("%3d  %s\n", nt, prog)
-	prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog)
+	prog = sprintf("%s '"'"'%s'"'"'", awk, prog)
 	# print "prog is", prog
 	nt2 = 0
 	while (getline > 0) {

plan9 commented

good catch, thanks.

plan9 commented

your fix included in the latest edition.

wajap commented

When FS is set with the -v option there is no warning
The change below fixes this.

diff -au org/main.c new/main.c
--- org/main.c	2023-11-27 20:31:28.000000000 +0100
+++ new/main.c	2023-12-09 11:24:04.323724500 +0100
@@ -157,8 +157,6 @@
 		}
 		if (strcmp(argv[1], "--csv") == 0) {	/* turn on csv input processing */
 			CSV = true;
-			if (fs)
-				WARNING("danger: don't set FS when --csv is in effect");
 			argc--;
 			argv++;
 			continue;
@@ -180,8 +178,6 @@
  			break;
 		case 'F':	/* set field separator */
 			fs = setfs(getarg(&argc, &argv, "no field separator"));
-			if (CSV)
-				WARNING("danger: don't set FS when --csv is in effect");
 			break;
 		case 'v':	/* -v a=1 to be done NOW.  one -v for each */
 			vn = getarg(&argc, &argv, "no variable name");
@@ -203,6 +199,8 @@
 		argc--;
 		argv++;
 	}
+	if (CSV && (fs != NULL || lookup("FS", symtab) != NULL))
+		WARNING("danger: don't set FS when --csv is in effect");
 	/* argv[1] is now the first argument */
 	if (npfile == 0) {	/* no -f; first argument is program */
 		if (argc <= 1) {

plan9 commented

ok, noted, fix pushed.