about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-11-14 16:19:36 +0100
committerChristian Neukirchen <chneukirchen@gmail.com>2015-11-14 16:19:36 +0100
commit0d4ac83e644c13cdba4349c6a8b3d3ade5ff6ec7 (patch)
tree00493cd662af0474515867ef57ab8ca15b125e52
parent0f4aaae2f5add0e6373f7d018cbfe490338eb63e (diff)
downloadarr-0d4ac83e644c13cdba4349c6a8b3d3ade5ff6ec7.tar.gz
arr-0d4ac83e644c13cdba4349c6a8b3d3ade5ff6ec7.tar.xz
arr-0d4ac83e644c13cdba4349c6a8b3d3ade5ff6ec7.zip
Fill up argument list with implicit stdin
-rw-r--r--arr.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/arr.c b/arr.c
index 755c54e..1ab96cd 100644
--- a/arr.c
+++ b/arr.c
@@ -222,17 +222,23 @@ main(int argc, char *argv[]) {
 	/* fmt(">>%{3 1*1:4}<<\n", a); */
 	/* fmt("%zz%%zz\n", a); */
 
-	// default to stdin when no file arguments are given
-	if (argc == 2) {
-		argv[argc] = "-";
-		argc++;
+        // number of implicit stdin arguments
+        int stdins = 0;
+
+	if (argc < 2) {
+		fprintf(stderr, "Usage: %s FMT FILES...\n", argv[0]);
+		exit(1);
 	}
 
-	FILE **files = calloc(argc, sizeof (FILE *));
-	char **lines = calloc(argc, sizeof (char *));
+	// default to stdin when no file arguments are given
+	if (argc == 2)
+		stdins++;
+
+	FILE **files = calloc(argc+stdins, sizeof (FILE *));
+	char **lines = calloc(argc+stdins, sizeof (char *));
 	int i;
-	for (i = 1; i < argc-1; i++)
-		if (strcmp(argv[i+1], "-") == 0)
+	for (i = 1; i < argc-1+stdins; i++)
+		if (i >= argc-1 || strcmp(argv[i+1], "-") == 0)
 			files[i] = stdin;
 		else
 			files[i] = fopen(argv[i], "r"); // XXX error handling
@@ -242,7 +248,7 @@ main(int argc, char *argv[]) {
 	int delim = '\n';
 	while (1) {
 		eof = 0;
-		for (i = 1; i < argc-1; i++) {
+		for (i = 1; i < argc-1+stdins; i++) {
 			int read = getdelim(lines+i, &len, delim, files[i]);
 			// XXX error handling
 			if (lines[i][read-1] == delim)  // strip delimiter