aboutsummaryrefslogtreecommitdiff
path: root/src/tools/entab/entab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/entab/entab.c')
-rw-r--r--src/tools/entab/entab.c199
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;
+}