Remove entab and associated detritus.
We don't need this anymore, because pg_bsd_indent has been taught to follow the same tab-vs-space rules that entab used to enforce. Discussion: https://postgr.es/m/E1dAmxK-0006EE-1r@gemulon.postgresql.org Discussion: https://postgr.es/m/30527.1495162840@sss.pgh.pa.us
This commit is contained in:
parent
113b0045e2
commit
81f056c725
|
@ -1 +0,0 @@
|
||||||
/entab
|
|
|
@ -1,20 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile
|
|
||||||
#
|
|
||||||
#
|
|
||||||
TARGET = entab
|
|
||||||
BINDIR = /usr/local/bin
|
|
||||||
XFLAGS =
|
|
||||||
CFLAGS = -O $(XFLAGS)
|
|
||||||
LIBS =
|
|
||||||
|
|
||||||
$(TARGET): entab.o
|
|
||||||
$(CC) -o $@ $(CFLAGS) $^ $(LIBS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o $(TARGET) log core
|
|
||||||
|
|
||||||
install: $(TARGET)
|
|
||||||
install -s $(TARGET) $(BINDIR)
|
|
||||||
rm -f $(BINDIR)/detab
|
|
||||||
ln $(BINDIR)/$(TARGET) $(BINDIR)/detab
|
|
|
@ -1,51 +0,0 @@
|
||||||
.TH ENTAB 1 local
|
|
||||||
.SH NAME
|
|
||||||
entab - tab processor
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.nf
|
|
||||||
entab [-cdq] [-s min_spaces] [-t tab_width] [file ... ]
|
|
||||||
detab [-cq] [-s min_spaces] [-t tab_width] [file ... ]
|
|
||||||
.fi
|
|
||||||
.SH DESCRIPTION
|
|
||||||
Entab is a program designed to selectively add or remove tabs
|
|
||||||
from a file based on user-supplied criteria.
|
|
||||||
In default mode, entab prints the specified files to standard output
|
|
||||||
with the optimal mix of tabs and spaces.
|
|
||||||
Tabs default to every 8 characters, and tabs are used only when they
|
|
||||||
can replace more than one space, unlike 'col' which uses tabs wherever
|
|
||||||
possible.
|
|
||||||
.LP
|
|
||||||
The options are:
|
|
||||||
.in +0.5i
|
|
||||||
.nf
|
|
||||||
-c Clip trailing tabs and spaces from each line.
|
|
||||||
-d Delete all tabs from output
|
|
||||||
-q Protect single and double-quoted strings from tab replacement.
|
|
||||||
(This option is useful when operating on source code.
|
|
||||||
Line continuation with back-slashes is also understood.)
|
|
||||||
-s Minimum spaces needed to replace with a tab (default = 2).
|
|
||||||
-t Number of spaces in a tab stop (default = 8).
|
|
||||||
.fi
|
|
||||||
.in -0.5i
|
|
||||||
Detab is equivalent to entab -d.
|
|
||||||
.SH NOTES
|
|
||||||
Entab has improved tab handling for certain situations.
|
|
||||||
It only replaces tabs if there is a user-defined number of spaces
|
|
||||||
to be saved.
|
|
||||||
Other tab replacement programs put tabs wherever
|
|
||||||
possible, so if two words are separated by one space, and that
|
|
||||||
space is on a tab stop, a tab is inserted.
|
|
||||||
Then, when words are added to the left, the words are shifted over,
|
|
||||||
leaving a large gap.
|
|
||||||
The quote-protection option allows tab replacement without
|
|
||||||
quoted strings being changed.
|
|
||||||
Useful when strings in source code will not have the same tab stops
|
|
||||||
when executed in the program.
|
|
||||||
.LP
|
|
||||||
To change a text file created on a system with one size of tab
|
|
||||||
stop to display properly on a device with different tab setting,
|
|
||||||
use detab (or entab -d) to remove tabs from the file with the
|
|
||||||
tab size set to the original tab size, then use entab to re-tab
|
|
||||||
the file with the new tab size.
|
|
||||||
.SH AUTHOR
|
|
||||||
Bruce Momjian, bruce@momjian.us
|
|
|
@ -1,277 +0,0 @@
|
||||||
/*
|
|
||||||
* entab.c - adds/removes tabs from text files
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) || defined(__CYGWIN__)
|
|
||||||
#define PG_BINARY_R "rb"
|
|
||||||
#else
|
|
||||||
#define PG_BINARY_R "r"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NUL '\0'
|
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern char *optarg;
|
|
||||||
extern int optind;
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
output_accumulated_spaces(int *prv_spaces, char **dst)
|
|
||||||
{
|
|
||||||
for (; *prv_spaces > 0; (*prv_spaces)--)
|
|
||||||
*((*dst)++) = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
trim_trailing_whitespace(int *prv_spaces, char **dst, char *out_line)
|
|
||||||
{
|
|
||||||
while (*dst > out_line &&
|
|
||||||
(*((*dst) - 1) == ' ' || *((*dst) - 1) == '\t'))
|
|
||||||
(*dst)--;
|
|
||||||
*prv_spaces = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int tab_size = 8,
|
|
||||||
min_spaces = 2,
|
|
||||||
only_comment_periods = FALSE,
|
|
||||||
protect_quotes = FALSE,
|
|
||||||
protect_leading_whitespace = FALSE,
|
|
||||||
del_tabs = FALSE,
|
|
||||||
clip_lines = FALSE,
|
|
||||||
in_comment = FALSE,
|
|
||||||
was_period = FALSE,
|
|
||||||
prv_spaces,
|
|
||||||
col_in_tab,
|
|
||||||
escaped,
|
|
||||||
nxt_spaces,
|
|
||||||
in_leading_whitespace;
|
|
||||||
char in_line[BUFSIZ],
|
|
||||||
out_line[BUFSIZ],
|
|
||||||
*src,
|
|
||||||
*dst,
|
|
||||||
quote_char,
|
|
||||||
*cp;
|
|
||||||
int ch;
|
|
||||||
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, "cdhlmqs:t:")) != -1)
|
|
||||||
switch (ch)
|
|
||||||
{
|
|
||||||
case 'c':
|
|
||||||
clip_lines = TRUE;
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
del_tabs = TRUE;
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
protect_leading_whitespace = TRUE;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
/* only process text followed by periods in C comments */
|
|
||||||
only_comment_periods = 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 '?':
|
|
||||||
fprintf(stderr, "USAGE: %s [ -cdqst ] [file ...]\n\
|
|
||||||
-c (clip trailing whitespace)\n\
|
|
||||||
-d (delete tabs)\n\
|
|
||||||
-l (protect leading whitespace)\n\
|
|
||||||
-m (only C comment periods)\n\
|
|
||||||
-q (protect quotes)\n\
|
|
||||||
-s minimum_spaces\n\
|
|
||||||
-t tab_width\n",
|
|
||||||
cp);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
argv += optind;
|
|
||||||
argc -= optind;
|
|
||||||
|
|
||||||
/* process arguments */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (argc < 1)
|
|
||||||
in_file = stdin;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((in_file = fopen(*argv, PG_BINARY_R)) == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Cannot open file %s: %s\n", argv[0], strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
|
|
||||||
escaped = FALSE;
|
|
||||||
|
|
||||||
/* process lines */
|
|
||||||
while (fgets(in_line, sizeof(in_line), 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;
|
|
||||||
in_leading_whitespace = TRUE;
|
|
||||||
|
|
||||||
/* process line */
|
|
||||||
while (*src != NUL)
|
|
||||||
{
|
|
||||||
col_in_tab++;
|
|
||||||
|
|
||||||
/* look backward so we handle slash-star-slash properly */
|
|
||||||
if (!in_comment && src > in_line &&
|
|
||||||
*(src - 1) == '/' && *src == '*')
|
|
||||||
in_comment = TRUE;
|
|
||||||
else if (in_comment && *src == '*' && *(src + 1) == '/')
|
|
||||||
in_comment = FALSE;
|
|
||||||
|
|
||||||
/* Is this a potential space/tab replacement? */
|
|
||||||
if ((!only_comment_periods || (in_comment && was_period)) &&
|
|
||||||
(!protect_leading_whitespace || !in_leading_whitespace) &&
|
|
||||||
quote_char == ' ' && (*src == ' ' || *src == '\t'))
|
|
||||||
{
|
|
||||||
if (*src == '\t')
|
|
||||||
{
|
|
||||||
prv_spaces += tab_size - col_in_tab + 1;
|
|
||||||
col_in_tab = tab_size;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
prv_spaces++;
|
|
||||||
|
|
||||||
/* Are we at a tab stop? */
|
|
||||||
if (col_in_tab == tab_size)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Is the next character going to be a tab? We do tab
|
|
||||||
* replacement in the current spot if the next char is
|
|
||||||
* going to be a tab and ignore min_spaces.
|
|
||||||
*/
|
|
||||||
nxt_spaces = 0;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* Have we reached non-whitespace? */
|
|
||||||
if (*(src + nxt_spaces + 1) == NUL ||
|
|
||||||
(*(src + nxt_spaces + 1) != ' ' &&
|
|
||||||
*(src + nxt_spaces + 1) != '\t'))
|
|
||||||
break;
|
|
||||||
/* count spaces */
|
|
||||||
if (*(src + nxt_spaces + 1) == ' ')
|
|
||||||
++nxt_spaces;
|
|
||||||
/* Have we found a forward tab? */
|
|
||||||
if (*(src + nxt_spaces + 1) == '\t' ||
|
|
||||||
nxt_spaces == tab_size)
|
|
||||||
{
|
|
||||||
nxt_spaces = tab_size;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Do tab replacment for spaces? */
|
|
||||||
if ((prv_spaces >= min_spaces ||
|
|
||||||
nxt_spaces == tab_size) &&
|
|
||||||
del_tabs == FALSE)
|
|
||||||
{
|
|
||||||
*(dst++) = '\t';
|
|
||||||
prv_spaces = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
output_accumulated_spaces(&prv_spaces, &dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Not a potential space/tab replacement */
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* allow leading stars in comments */
|
|
||||||
if (in_leading_whitespace && *src != ' ' && *src != '\t' &&
|
|
||||||
(!in_comment || *src != '*'))
|
|
||||||
in_leading_whitespace = FALSE;
|
|
||||||
was_period = (*src == '.');
|
|
||||||
/* output accumulated spaces */
|
|
||||||
output_accumulated_spaces(&prv_spaces, &dst);
|
|
||||||
/* This can only happen in a quote. */
|
|
||||||
if (*src == '\t')
|
|
||||||
col_in_tab = 0;
|
|
||||||
/* visual backspace? */
|
|
||||||
if (*src == '\b')
|
|
||||||
col_in_tab -= 2;
|
|
||||||
/* Do we process quotes? */
|
|
||||||
if (escaped == FALSE && protect_quotes == TRUE)
|
|
||||||
{
|
|
||||||
if (*src == '\\')
|
|
||||||
escaped = TRUE;
|
|
||||||
/* Is this a quote character? */
|
|
||||||
if (*src == '"' || *src == '\'')
|
|
||||||
{
|
|
||||||
/* toggle quote mode */
|
|
||||||
if (quote_char == ' ')
|
|
||||||
quote_char = *src;
|
|
||||||
else if (*src == quote_char)
|
|
||||||
quote_char = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* newlines/CRs do not terminate escapes */
|
|
||||||
else if (*src != '\r' && *src != '\n')
|
|
||||||
escaped = FALSE;
|
|
||||||
|
|
||||||
/* reached newline/CR; clip line? */
|
|
||||||
if ((*src == '\r' || *src == '\n') &&
|
|
||||||
clip_lines == TRUE &&
|
|
||||||
quote_char == ' ' &&
|
|
||||||
escaped == FALSE)
|
|
||||||
trim_trailing_whitespace(&prv_spaces, &dst, out_line);
|
|
||||||
*(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)
|
|
||||||
trim_trailing_whitespace(&prv_spaces, &dst, out_line);
|
|
||||||
output_accumulated_spaces(&prv_spaces, &dst);
|
|
||||||
*dst = NUL;
|
|
||||||
|
|
||||||
if (fputs(out_line, stdout) == EOF)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Cannot write to output file %s: %s\n", argv[0], strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (--argc > 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -14,9 +14,7 @@ PREREQUISITES:
|
||||||
git clone https://git.postgresql.org/git/pg_bsd_indent.git
|
git clone https://git.postgresql.org/git/pg_bsd_indent.git
|
||||||
then follow the directions in README.pg_bsd_indent therein.
|
then follow the directions in README.pg_bsd_indent therein.
|
||||||
|
|
||||||
2) Install entab (src/tools/entab/).
|
2) Install perltidy. Please be sure it is v20090616 (older and newer
|
||||||
|
|
||||||
3) Install perltidy. Please be sure it is v20090616 (older and newer
|
|
||||||
versions make different formatting choices, and we want consistency). See
|
versions make different formatting choices, and we want consistency). See
|
||||||
https://sourceforge.net/projects/perltidy/files/perltidy/perltidy-20090616/
|
https://sourceforge.net/projects/perltidy/files/perltidy/perltidy-20090616/
|
||||||
|
|
||||||
|
|
|
@ -38,9 +38,8 @@ run_build($code_base) if ($build);
|
||||||
$typedefs_file ||= shift if @ARGV && $ARGV[0] !~ /\.[ch]$/;
|
$typedefs_file ||= shift if @ARGV && $ARGV[0] !~ /\.[ch]$/;
|
||||||
$typedefs_file ||= $ENV{PGTYPEDEFS};
|
$typedefs_file ||= $ENV{PGTYPEDEFS};
|
||||||
|
|
||||||
# build mode sets PGINDENT and PGENTAB
|
# build mode sets PGINDENT
|
||||||
$indent ||= $ENV{PGINDENT} || $ENV{INDENT} || "pg_bsd_indent";
|
$indent ||= $ENV{PGINDENT} || $ENV{INDENT} || "pg_bsd_indent";
|
||||||
my $entab = $ENV{PGENTAB} || "entab";
|
|
||||||
|
|
||||||
# no non-option arguments given. so do everything in the current directory
|
# no non-option arguments given. so do everything in the current directory
|
||||||
$code_base ||= '.' unless @ARGV;
|
$code_base ||= '.' unless @ARGV;
|
||||||
|
@ -57,16 +56,6 @@ my $filtered_typedefs_fh;
|
||||||
|
|
||||||
sub check_indent
|
sub check_indent
|
||||||
{
|
{
|
||||||
system("$entab < $devnull");
|
|
||||||
if ($?)
|
|
||||||
{
|
|
||||||
print STDERR
|
|
||||||
"Go to the src/tools/entab directory and do 'make' and 'make install'.\n",
|
|
||||||
"This will put the 'entab' command in your path.\n",
|
|
||||||
"Then run $0 again.\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
system("$indent -? < $devnull > $devnull 2>&1");
|
system("$indent -? < $devnull > $devnull 2>&1");
|
||||||
if ($? >> 8 != 1)
|
if ($? >> 8 != 1)
|
||||||
{
|
{
|
||||||
|
@ -288,46 +277,6 @@ sub run_indent
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# XXX Ideally we'd implement entab/detab in pure perl.
|
|
||||||
|
|
||||||
sub detab
|
|
||||||
{
|
|
||||||
my $source = shift;
|
|
||||||
|
|
||||||
my $tmp_fh = new File::Temp(TEMPLATE => "pgdetXXXXX");
|
|
||||||
print $tmp_fh $source;
|
|
||||||
$tmp_fh->close();
|
|
||||||
|
|
||||||
open(my $entab, '-|', "$entab -d -t4 -qc " . $tmp_fh->filename);
|
|
||||||
local ($/) = undef;
|
|
||||||
$source = <$entab>;
|
|
||||||
close($entab);
|
|
||||||
|
|
||||||
return $source;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub entab
|
|
||||||
{
|
|
||||||
my $source = shift;
|
|
||||||
|
|
||||||
my $tmp_fh = new File::Temp(TEMPLATE => "pgentXXXXX");
|
|
||||||
print $tmp_fh $source;
|
|
||||||
$tmp_fh->close();
|
|
||||||
|
|
||||||
open(
|
|
||||||
my $entab,
|
|
||||||
'-|',
|
|
||||||
"$entab -d -t8 -qc "
|
|
||||||
. $tmp_fh->filename
|
|
||||||
. " | $entab -t4 -qc | $entab -d -t4 -m");
|
|
||||||
local ($/) = undef;
|
|
||||||
$source = <$entab>;
|
|
||||||
close($entab);
|
|
||||||
|
|
||||||
return $source;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# for development diagnostics
|
# for development diagnostics
|
||||||
sub diff
|
sub diff
|
||||||
|
@ -395,11 +344,6 @@ sub run_build
|
||||||
|
|
||||||
$ENV{PGINDENT} = abs_path('pg_bsd_indent');
|
$ENV{PGINDENT} = abs_path('pg_bsd_indent');
|
||||||
|
|
||||||
chdir "../../entab";
|
|
||||||
system("make > $devnull 2>&1");
|
|
||||||
|
|
||||||
$ENV{PGENTAB} = abs_path('entab');
|
|
||||||
|
|
||||||
chdir $save_dir;
|
chdir $save_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,8 +366,6 @@ sub build_clean
|
||||||
|
|
||||||
system("rm -rf src/tools/pgindent/pg_bsd_indent");
|
system("rm -rf src/tools/pgindent/pg_bsd_indent");
|
||||||
system("rm -f src/tools/pgindent/tmp_typedefs.list");
|
system("rm -f src/tools/pgindent/tmp_typedefs.list");
|
||||||
|
|
||||||
system("git clean -q -f src/tools/entab");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,6 @@ command line option --indent:
|
||||||
|
|
||||||
pgindent --indent=/opt/extras/bsdindent
|
pgindent --indent=/opt/extras/bsdindent
|
||||||
|
|
||||||
Similarly, the entab program can be specified using the PGENTAB environment
|
|
||||||
variable, or using the --entab command line option.
|
|
||||||
|
|
||||||
pgindent also needs a file containing a list of typedefs. This can be
|
pgindent also needs a file containing a list of typedefs. This can be
|
||||||
specified using the PGTYPEDEFS environment variable, or via the command line
|
specified using the PGTYPEDEFS environment variable, or via the command line
|
||||||
--typedefs option. If neither is used, it will look for it within the
|
--typedefs option. If neither is used, it will look for it within the
|
||||||
|
|
Loading…
Reference in New Issue