Add PGINDENT and support program.
This commit is contained in:
parent
448332a769
commit
fddc57bfcd
24
src/tools/PGINDENT
Normal file
24
src/tools/PGINDENT
Normal 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
29
src/tools/entab/Makefile
Normal 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
199
src/tools/entab/entab.c
Normal 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
51
src/tools/entab/entab.man
Normal 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
56
src/tools/entab/halt.c
Normal 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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user