v04i089: comp.sources.misc submission
chad at anasaz.UUCP
chad at anasaz.UUCP
Sun Sep 25 11:26:27 AEST 1988
Posting-number: Volume 4, Issue 89
Submitted-by: "A. Nonymous" <chad at anasaz.UUCP>
Archive-name: indent
This is a filter that allows you to expand/contract the leading white
space in a file. It is useful to change the indentation for nesting
levels in C source, or handling source created with an editor who's
tabstops are not where your editor thinks they are. For example, the
C Beautifier cb(1) adjusts its indent level by one full hardware tab
for each "{" or "}". I like my indent level to be 4 spaces, so I do:
"cb -s foo.c | indent | hold foo.c"
If you wanted an indent of 2 you could do:
"cb -s foo.c | indent -r4 | hold foo.c"
If you wanted an indent of 6 you could do:
"cb -s foo.c | indent -r4 -e3 | hold foo.c"
There are obviously many other permutations. You also have control
over whether the output file will use spaces only or a combination of
spaces and tabs in the leading white space:
"indent -r1 foo.c | hold foo.c"
will convert leading white space to spaces & tabs with no other change
to the file.
---------------
"I read the news today, oh boy!" --John Lennon
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
| DCF, Inc. | UUCP: ...ncar!noao!nud!anasaz!dcfinc!chad |
| 14623 North 49th Place | Ma Bell: (602) 953-1392 |
| Scottsdale, AZ 85254 | Loran: N-33deg37min20sec W-111deg58min26sec |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
| Disclaimer: These ARE the opinions of my employer! |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: indent.c Makefile test_file
# Wrapped by chad at dcfinc on Tue Sep 20 19:58:43 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'indent.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'indent.c'\"
else
echo shar: Extracting \"'indent.c'\" \(4160 characters\)
sed "s/^X//" >'indent.c' <<'END_OF_FILE'
X/* indent.c - Adjust indentation of file - 1.2 */
X
X/*
X** This filter will adjust the indentation of an existing file. It
X** is most useful for C source created with an editor program that
X** doesn't agree with your notion of tab stop locations. I use it to
X** make the output of cb(1) have a nesting level of 4, rather than 8.
X** In the spirit of Unix tools, I'm sure you will find other uses.
X*/
X
X/*
X** Author:
X** Chad R. Larson This program is placed in the
X** DCF, Inc. Public Domain. You may do with
X** 14623 North 49th Place it as you please.
X** Scottsdale, AZ 85254
X*/
X
X/*
X** Usage is "indent [-tn] [-rn] [-en] [-s] [file]"
X** Where:
X** -tn Set hardware tab stop (for both input and output)
X** to n. If this option is omitted, n=8.
X** -rn Set reduction factor to n. That is, if n=3 each
X** output line will be indented 1/3 as much as its
X** corresponding input line. Default value for n is 2.
X** -en Set expansion factor to n. That is, if n=3 each
X** output line will be indented 3 times as much as its
X** corresponding input line. Default value for n is 1.
X** The -e and -r options may be used in conjunction,
X** for example to get a two thirds indentation reduction.
X** -s Supress tabs in output. Normally, multiple leading
X** spaces will be replaced with the necessary amount of
X** tab characters to reduce the size of the output file.
X** Note this option only applies to leading white space.
X** No other tabs will be affected.
X** If no output file is specified, the standard input will be read.
X** Output is to the standard output. Error messages will be printed
X** on standard error (pretty standard, hmmm?).
X*/
X
X#include <stdio.h>
X
X#define FALSE 0
X#define TRUE ~FALSE
X#define MAX_LINE 512
X
X/* linked in later */
Xvoid exit();
X
X/* give the operator a clue */
Xvoid usage(prog_name)
Xchar *prog_name;
X{
X (void) fprintf(stderr, "%s version 1.2 - 9/20/88\n", prog_name);
X (void) fprintf(stderr,
X "Usage: %s [-tn] [-rn] [-en] [-s] [file]\n", prog_name);
X exit(1);
X}
X
X/* here it is */
Xvoid main(argc, argv)
Xint argc;
Xchar *argv[];
X{
X int expand = 1; /* expansion factor */
X int reduce = 2; /* reduction factor */
X int tabsize = 8; /* hardware tab size */
X int tabflag = TRUE; /* insert tabs in output? */
X int c; /* generic character */
X int i; /* generic integer */
X extern int optind; /* argument index */
X extern char *optarg; /* argument to options */
X FILE *infile; /* input file descriptor */
X char inbuf[MAX_LINE]; /* input buffer */
X char outbuf[MAX_LINE]; /* output buffer */
X register char *ip, *op; /* buffer in & out pointers */
X register int count; /* whitespace counter */
X
X /* sort out the command line options, if any */
X while ((c = getopt(argc, argv, "st:r:e:")) != EOF)
X switch (c) {
X case 's':
X tabflag = FALSE;
X break;
X case 't':
X tabsize = atoi(optarg);
X break;
X case 'r':
X reduce = atoi(optarg);
X break;
X case 'e':
X expand = atoi(optarg);
X break;
X case '?':
X usage(argv[0]);
X }
X
X /* open input file or stdin as required */
X if (argv[optind] != NULL) {
X if ((infile = fopen(argv[optind], "r")) == NULL) {
X (void) fprintf(stderr,
X "%s: Cannot open %s\n", argv[0], argv[optind]);
X exit(2);
X }
X } else {
X if (isatty(fileno(stdin)) == 0)
X infile = stdin;
X else
X usage(argv[0]);
X }
X
X /* options are parsed, input file is open, let's go! */
X while ((ip = fgets(inbuf, MAX_LINE, infile)) != NULL) {
X
X /* count leading white space */
X count = 0;
X while ((c = *ip++) == ' ' || c == '\t')
X switch (c) {
X case ' ':
X count++;
X break;
X case '\t':
X count += tabsize - (count % tabsize);
X break;
X }
X ip--;
X
X /* ratio the white space */
X count = (count * expand) / reduce;
X
X /* put proper white space in output buffer */
X op = outbuf;
X if (tabflag) {
X i = count / tabsize;
X while (i--)
X *op++ = '\t';
X count = count % tabsize;
X }
X while (count--)
X *op++ = ' ';
X
X /* copy rest of input to output */
X while (*op++ = *ip++);
X
X /* dump the output buffer */
X (void) fputs(outbuf, stdout);
X }
X exit(0);
X}
END_OF_FILE
if test 4160 -ne `wc -c <'indent.c'`; then
echo shar: \"'indent.c'\" unpacked with wrong size!
fi
# end of 'indent.c'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(239 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile for indent - 1.1
X# Last changed 9/20/88 19:57:16
X
XBINDIR = /usr/local/bin
X
Xindent: indent.c
X $(CC) $(CFLAGS) indent.c -o indent
X
Xinstall: indent
X strip indent
X -ln indent $(BINDIR)
X touch install
X
Xlint:
X lint -p indent.c >Lint
END_OF_FILE
if test 239 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'test_file' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'test_file'\"
else
echo shar: Extracting \"'test_file'\" \(201 characters\)
sed "s/^X//" >'test_file' <<'END_OF_FILE'
XTest file for indent:
XNo indent.
X One tab.
X Two tabs.
X Three tabs.
X One space.
X Seven spaces.
X Eight spaces.
X Nine spaces.
X Three spaces, one tab.
X One tab, three spaces.
END_OF_FILE
if test 201 -ne `wc -c <'test_file'`; then
echo shar: \"'test_file'\" unpacked with wrong size!
fi
# end of 'test_file'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sources.misc
mailing list