aboutsummaryrefslogtreecommitdiff
path: root/5.11.c
diff options
context:
space:
mode:
Diffstat (limited to '5.11.c')
-rw-r--r--5.11.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/5.11.c b/5.11.c
new file mode 100644
index 0000000..7f2fbf6
--- /dev/null
+++ b/5.11.c
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include <ctype.h>
+
+#define DEFTAB 8
+#define MAXSTOPS 65
+#define ON 1
+
+int stops[MAXSTOPS];
+int stop_position, detab_bool, entab_bool;
+
+void entab(void);
+void detab(void);
+
+int
+main(int argc, char **argv)
+{
+ int flag;
+ while (--argc > 0 && **++argv == '-')
+ while((flag = *++*argv))
+ switch (flag) {
+ case 'e' :
+ entab_bool = ON;
+ break;
+ case 'd' :
+ detab_bool = ON;
+ break;
+ case 's' :
+ if(*++*argv != '=')
+ argc = -1;
+ else
+ (*argv)++;
+
+ if (**argv == '\0')
+ argc = -1;
+
+ while (isdigit(**argv)) {
+ if (stop_position > MAXSTOPS)
+ argc = -1;
+
+ stops[stop_position] = stops[stop_position] * 10 + (**argv) - '0';
+ (*argv)++;
+ if (**argv == ',') {
+ (*argv)++;
+ if(isdigit(**argv) && stop_position < MAXSTOPS)
+ stop_position++;
+ }
+ }
+ stop_position++;
+
+ (*argv)--;
+ break;
+ default :
+ argc = -1;
+ printf("Err: illigal option %c\n", flag);
+ break;
+ }
+
+ if (argc || !entab_bool ^ detab_bool)
+ printf("Usage: tab (-e || -d) -s=s1,s2,s3,...,s%d\n", MAXSTOPS-1);
+ else if(entab_bool)
+ entab();
+ else if (detab_bool)
+ detab();
+
+ return 0;
+}
+
+void
+entab(void)
+{
+ char input;
+ int space, stop_now;
+
+ space = 0;
+ stop_now = 0;
+ stops[stop_position] = DEFTAB;
+
+ while((input = getchar()) != EOF)
+ switch(input) {
+ case ' ' :
+ space++;
+ break;
+ default :
+ while (space/stops[stop_now]) {
+ space -= stops[stop_now];
+
+ putchar('\t');
+
+ if (stop_now < stop_position)
+ stop_now++;
+ }
+
+ while (space) {
+ putchar(' ');
+ space--;
+ }
+
+ putchar(input);
+ break;
+ }
+}
+
+void
+detab(void)
+{
+ char input;
+ int count, space, stop_now;
+
+ count = 0;
+ stop_now = 0;
+ stops[stop_position] = DEFTAB;
+
+ while ((input = getchar()) != EOF)
+ switch (input) {
+ case '\n' :
+ count = 0;
+ putchar('\n');
+ break;
+ case '\t' :
+ space = stops[stop_now] - count%stops[stop_now];
+ count += space;
+ while (space--)
+ putchar(' ');
+ if (stop_now < stop_position)
+ stop_now++;
+ break;
+ default :
+ count++;
+ putchar(input);
+ break;
+ }
+}