diff options
Diffstat (limited to '5.12.c')
-rw-r--r-- | 5.12.c | 161 |
1 files changed, 161 insertions, 0 deletions
@@ -0,0 +1,161 @@ +#include <stdio.h> +#include <ctype.h> + +#define DEFTAB 8 +#define MAXSTOPS 65 +#define ON 1 + +int stops[MAXSTOPS]; +int stop_position, m, n; + +void entab(void); +void detab(void); + +int +main(int argc, char **argv) +{ + char flag; + int detab_bool = 0, entab_bool = 0, mnloop_bool = 0; + + while (--argc > 0 && (**++argv == '-' || **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 : + if (isdigit(flag)) { + if (*(*argv - 1) == '+') + for (mnloop_bool = 1; isdigit(**argv); (*argv)++) + n = n * 10 + (**argv) - '0'; + else if (*(*argv - 1) == '-') + for (mnloop_bool = 1; isdigit(**argv); (*argv)++) + m = m * 10 + (**argv) - '0'; + + if(mnloop_bool) { + (*argv)--; + mnloop_bool = 0; + } + } + + else { + argc = -1; + printf("Err: illigal option %c\n", flag); + } + + break; + } + + if (argc || !entab_bool ^ detab_bool || !m != !n) + printf("Usage: tab (-e || -d) (-s=s1,s2,s3,...,s%d || -m +n)\n", MAXSTOPS-1); + else if(entab_bool) + entab(); + else if (detab_bool) + detab(); + + return 0; +} + +void +entab(void) +{ + char input; + int space, stop_now, count; + + count = 0; + space = 0; + stop_now = 0; + stops[stop_position] = DEFTAB; + + while((input = getchar()) != EOF) + switch(input) { + case ' ' : + space++; + count++; + break; + case '\n' : + count = 0; + break; + default : + if (count >= m) + stops[stop_position] = m; + + 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 : + if (count++ >= m) + stops[stop_position] = n; + + putchar(input); + break; + } +} |