aboutsummaryrefslogtreecommitdiff
path: root/ch1/1-21_entab.c
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-02-13 20:48:44 -0600
committerzlg <zlg@zlg.space>2013-02-13 20:48:44 -0600
commit5018e06c580dd21c958ec1672c26a3448faf0c55 (patch)
treecebbb56dad0a6b821cad3712c7977f6f9b0086ab /ch1/1-21_entab.c
parentFix 1-09's solution (diff)
downloadknr-5018e06c580dd21c958ec1672c26a3448faf0c55.tar.gz
knr-5018e06c580dd21c958ec1672c26a3448faf0c55.tar.bz2
knr-5018e06c580dd21c958ec1672c26a3448faf0c55.tar.xz
knr-5018e06c580dd21c958ec1672c26a3448faf0c55.zip
Add license file, reorganize project
Diffstat (limited to 'ch1/1-21_entab.c')
-rw-r--r--ch1/1-21_entab.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/ch1/1-21_entab.c b/ch1/1-21_entab.c
new file mode 100644
index 0000000..6037a14
--- /dev/null
+++ b/ch1/1-21_entab.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+
+/* The C Programming Language: 2nd Edition
+ * Exercise 1-21:
+ * "Write a program `entab` that replaces strings of blanks by the minimum
+ * number of tabs and blanks to achieve the same spacing. Use the same tab
+ * stops as for `detab`. When either a tab or a single blank would suffice to
+ * reach a tab stop, which should be given preference?"
+ *
+ * Answer: A blank. A tab character that comes after (tabstop - 1) blanks makes
+ * little-to-no sense and could mess up alignment in some environments.
+ *
+ */
+
+#define TABWIDTH 8
+
+int main(void) {
+ int column, c, spaces;
+ spaces = column = 0;
+ while ((c = getchar()) != EOF) {
+ // First thing's first, advance by a column.
+ column++;
+
+ if (c == ' ') {
+ /* Add to 'spaces' immediately, we'll decide if it needs to be
+ * output later.
+ */
+ spaces++;
+
+ if (column % TABWIDTH == 0 && spaces > 0) {
+ putchar('\t');
+ spaces = 0; // No spaces are left when we tab!
+ }
+
+ } else {
+ /* Be sure to output any leftover spaces when we come across a
+ * non-space character. This should allow for spaces between words
+ * that don't fall along the tabstop lines.
+ */
+
+ while (spaces > 0) {
+ putchar(' ');
+ spaces--;
+ }
+
+ // As usual, reset things on a newline.
+ if (c == '\n') {
+ column = 0;
+ spaces = 0;
+ }
+
+ // Now we can output whatever it is.
+ putchar(c);
+ }
+ }
+ return 0;
+}