diff options
Diffstat (limited to 'src/tools/entab/entab.c')
-rw-r--r-- | src/tools/entab/entab.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/tools/entab/entab.c b/src/tools/entab/entab.c new file mode 100644 index 00000000000..e04d8535737 --- /dev/null +++ b/src/tools/entab/entab.c @@ -0,0 +1,199 @@ +/* +** entab.c - add tabs to a text file +** by Bruce Momjian (root@candle.pha.pa.us) +** +** version 1.0 +** +** tabsize = 4 +** +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define NUL '\0' + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +void halt(); + +extern char *optarg; +extern int optind; + +int main(argc, argv) +int argc; +char **argv; +{ + int tab_size = 8, + min_spaces = 2, + protect_quotes = FALSE, + del_tabs = FALSE, + clip_lines = FALSE, + prv_spaces, + col_in_tab, + escaped, + nxt_spaces; + char in_line[BUFSIZ], + out_line[BUFSIZ], + *src, + *dst, + quote_char, + ch, + *cp; + FILE *in_file; + + if ((cp = strrchr(argv[0],'/')) != NULL) + ++cp; + else + cp = argv[0]; + if (strcmp(cp,"detab") == 0) + del_tabs = 1; + + while ((ch = getopt(argc, argv, "cdhqs:t:")) != -1) + switch (ch) + { + case 'c' : clip_lines = TRUE; break; + case 'd' : del_tabs = TRUE; break; + case 'q' : protect_quotes = TRUE; break; + case 's' : min_spaces = atoi(optarg); break; + case 't' : tab_size = atoi(optarg); break; + case 'h' : + case '?' : + halt("USAGE: %s [ -cdqst ] [file ...]\n\ + -c (clip trailing whitespace)\n\ + -d (delete tabs)\n\ + -q (protect quotes)\n\ + -s minimum_spaces\n\ + -t tab_width\n", + cp); + } + + argv += optind; + argc -= optind; + + do { + if (argc < 1) + in_file = stdin; + else + { + if ( (in_file=fopen(*argv,"r")) == NULL) + halt("PERROR: Can not open file %s\n",argv[0]); + argv++; + } + + escaped = FALSE; + + while (fgets(in_line, BUFSIZ, in_file) != NULL) + { + col_in_tab = 0; + prv_spaces = 0; + src = in_line; /* points to current processed char */ + dst = out_line; /* points to next unallocated char */ + if (escaped == FALSE) + quote_char = ' '; + escaped = FALSE; + while (*src != NUL) + { + col_in_tab++; + if (*src == ' ' || *src == '\t') + { + if (*src == '\t') + { + prv_spaces = prv_spaces + tab_size - col_in_tab + 1; + col_in_tab = tab_size; + } + else + prv_spaces++; + + if (col_in_tab == tab_size) + { + /* Is the next character going to be a tab? + Needed to do tab replacement in current spot if + next char is going to be a tab, ignoring + min_spaces */ + nxt_spaces = 0; + while (1) + { + if ( *(src+nxt_spaces+1) == NUL || + (*(src+nxt_spaces+1) != ' ' && + *(src+nxt_spaces+1) != '\t')) + break; + if (*(src+nxt_spaces+1) == ' ') + ++nxt_spaces; + if (*(src+nxt_spaces+1) == '\t' || + nxt_spaces == tab_size) + { + nxt_spaces = tab_size; + break; + } + } + if ((prv_spaces >= min_spaces || nxt_spaces == tab_size) && + quote_char == ' ' && + del_tabs == FALSE ) + { + *(dst++) = '\t'; + prv_spaces = 0; + } + else + { + for (; prv_spaces > 0; prv_spaces--) + *(dst++) = ' '; + } + } + } + else + { + for (; prv_spaces > 0; prv_spaces--) + *(dst++) = ' '; + if (*src == '\b') + col_in_tab -= 2; + if (escaped == FALSE && protect_quotes == TRUE) + { + if (*src == '\\') + escaped = TRUE; + if (*src == '"' || *src == '\'') + if (quote_char == ' ') + quote_char = *src; + else if (*src == quote_char) + quote_char = ' '; + } + else + if (*src != '\r' && *src != '\n') + escaped = FALSE; + + if (( *src == '\r' || *src == '\n') && + clip_lines == TRUE && escaped == FALSE) + { + while (dst > out_line && + (*(dst-1) == ' ' || *(dst-1) == '\t')) + dst--; + prv_spaces = 0; + } + *(dst++) = *src; + } + col_in_tab %= tab_size; + ++src; + } + /* for cases where the last line of file has no newline */ + if (clip_lines == TRUE && escaped == FALSE) + { + while (dst > out_line && + (*(dst-1) == ' ' || *(dst-1) == '\t')) + dst--; + prv_spaces = 0; + } + for (; prv_spaces > 0; prv_spaces--) + *(dst++) = ' '; + *dst = NUL; + if (fputs(out_line,stdout) == EOF) + halt("PERROR: Error writing output.\n"); + } + } while (--argc > 0); + return 0; +} |