Add PGINDENT and support program.

This commit is contained in:
Bruce Momjian 1997-08-29 21:13:00 +00:00
parent 448332a769
commit fddc57bfcd
5 changed files with 359 additions and 0 deletions

24
src/tools/PGINDENT Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh
trap "rm -f /tmp/$$" 0 1 2 3 15
entab </dev/null >/dev/null
if [ "$?" -ne 0 ]
then echo "Go to the src/tools/entab directory and do a 'make' and 'make install'." >&2
echo "This will put the 'entab' command in your path." >&2
echo "Then run $0 again."
exit 1
fi
indent -st </dev/null >/dev/null
if [ "$?" -ne 0 ]
then echo "You do not appear to have 'indent' installed on your system." >&2
exit 1
fi
for FILE
do
cat $FILE |
sed 's;/\* *---;/*---;g' |
indent -bad -bap -bbb -bc -bl -d0 -ncdb -nce -cli1 -di16 -nfc1 \
-lp -nip -nbc -psl -di1 -i4 -st |
detab -t8 |
entab -qc -t4 |
sed 's;/\*---;/* ---;g' >/tmp/$$ && cat /tmp/$$ >$FILE
done

29
src/tools/entab/Makefile Normal file
View File

@ -0,0 +1,29 @@
#
# Makefile
#
#
TARGET = entab
BINDIR = /usr/local/bin
XFLAGS =
CFLAGS = -O
LIBS =
$(TARGET) : entab.o halt.o
$(CC) -o $(TARGET) $(XFLAGS) $(CFLAGS) entab.o halt.o $(LIBS)
entab.o : entab.c
$(CC) -c $(XFLAGS) $(CFLAGS) entab.c
halt.o : halt.c
$(CC) -c $(XFLAGS) $(CFLAGS) halt.c
clean:
rm -f *.o $(TARGET) log core
install:
make clean
make CFLAGS=-O
install -s -o bin -g bin $(TARGET) $(BINDIR)
rm -f $(BINDIR)/detab
ln /usr/local/bin/$(TARGET) $(BINDIR)/detab

199
src/tools/entab/entab.c Normal file
View File

@ -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;
}

51
src/tools/entab/entab.man Normal file
View File

@ -0,0 +1,51 @@
.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, root@candle.pha.pa.us

56
src/tools/entab/halt.c Normal file
View File

@ -0,0 +1,56 @@
/*
**
** halt.c
**
** This is used to print out error messages and exit
*/
#include <varargs.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
/*-------------------------------------------------------------------------
**
** halt - print error message, and call clean up routine or exit
**
**------------------------------------------------------------------------*/
/*VARARGS*/
void halt(va_alist)
va_dcl
{
va_list arg_ptr;
char *format, *pstr;
void (*sig_func)();
va_start(arg_ptr);
format = va_arg(arg_ptr,char *);
if (strncmp(format,"PERROR", 6) != 0)
vfprintf(stderr,format,arg_ptr);
else
{
for (pstr=format+6; *pstr == ' ' || *pstr == ':'; pstr++)
;
vfprintf(stderr,pstr,arg_ptr);
perror("");
}
va_end(arg_ptr);
fflush(stderr);
/* call one clean up function if defined */
if ( (sig_func = signal(SIGTERM, SIG_DFL)) != SIG_DFL &&
sig_func != SIG_IGN)
(*sig_func)(0);
else if ( (sig_func = signal(SIGHUP, SIG_DFL)) != SIG_DFL &&
sig_func != SIG_IGN)
(*sig_func)(0);
else if ( (sig_func = signal(SIGINT, SIG_DFL)) != SIG_DFL &&
sig_func != SIG_IGN)
(*sig_func)(0);
else if ( (sig_func = signal(SIGQUIT, SIG_DFL)) != SIG_DFL &&
sig_func != SIG_IGN)
(*sig_func)(0);
exit(1);
}