mirror of https://github.com/postgres/postgres
parent
448332a769
commit
fddc57bfcd
@ -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 |
||||
@ -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
|
||||
|
||||
@ -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; |
||||
} |
||||
@ -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 |
||||
@ -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…
Reference in new issue