Implement -i flag for expand and update the man page. Not sure if this is wanted, but as it is already mentioned in the source I thought it might as well be implemented.

 - Tuukka
diff --git a/expand.1 b/expand.1
index 98c66ab..6ae819b 100644
--- a/expand.1
+++ b/expand.1
@@ -13,6 +13,9 @@ are preserved into the output and decrement the column count for tab
 calculations.
 .SH OPTIONS
 .TP
+.BI \-i
+Only change tabs to spaces at the start of lines.
+.TP
 .BI \-t " n"
 Expand tabs to
 .I n
diff --git a/expand.c b/expand.c
index 2bcc668..61e67ee 100644
--- a/expand.c
+++ b/expand.c
@@ -1,4 +1,5 @@
 /* See LICENSE file for copyright and license details. */
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <wchar.h>
@@ -11,6 +12,8 @@ typedef struct {
 
 static int expand(Fdescr *f, int tabstop);
 
+static bool iflag = false;
+
 static void
 usage(void)
 {
@@ -26,7 +29,8 @@ main(int argc, char *argv[])
 
 	ARGBEGIN {
 	case 'i':
-		eprintf("not implemented\n");
+		iflag = true;
+		break;
 	case 't':
 		tabstop = estrtol(EARGF(usage()), 0);
 		break;
@@ -77,6 +81,7 @@ expand(Fdescr *dsc, int tabstop)
 {
 	int col = 0;
 	wint_t c;
+	bool bol = true;
 
 	for (;;) {
 		c = in(dsc);
@@ -85,22 +90,31 @@ expand(Fdescr *dsc, int tabstop)
 
 		switch (c) {
 		case '\t':
-			do {
-				col++;
-				out(' ');
-			} while (col & (tabstop - 1));
+			if (bol || !iflag) {
+				do {
+					col++;
+					out(' ');
+				} while (col & (tabstop - 1));
+			} else {
+				out('\t');
+				col += tabstop - col % tabstop;
+			}
 			break;
 		case '\b':
 			if (col)
 				col--;
+			bol = false;
 			out(c);
 			break;
 		case '\n':
 			col = 0;
+			bol = true;
 			out(c);
 			break;
 		default:
 			col++;
+			if (c != ' ')
+				bol = false;
 			out(c);
 			break;
 		}

Reply via email to