/* Make the structure name match the typedef. */
typedef struct bar {
	int level;
} BAR;
typedef int          foo;       /* This is foo. */
typedef const long   baz;       /* This is baz. */


static char *function(int _arg, const char *_arg2, struct foo *_arg3,
    struct bar *_arg4);
static void usage(void);

/*
 * All major routines should have a comment briefly describing what
 * they do.  The comment before the "main" routine should describe
 * what the program does.
 */
int
main(int argc, char *argv[])
{
	char *ep;
	long num;
	int  ch;

	while ((ch = getopt(argc, argv, "abNn:")) != -1)
	{
		switch (ch)             /* Indent the switch. */
		{
		case 'a':               /* Don't indent the case. */
			aflag = 1;      /* Indent case body one tab. */

		/* FALLTHROUGH */
		case 'b':
			bflag = 1;
			break;

		case 'N':
			Nflag = 1;
			break;

		case 'n':
			num = strtol(optarg, &ep, 10);
			if ((num <= 0) || (*ep != '\0')) {
				warnx("illegal number, -n argument -- %s",
				    optarg);
				usage();
			}
			break;

		case '?':
		default:
			usage();
			/* NOTREACHED */
		}
	}
	argc -= optind;
	argv += optind;

	for (p = buf; *p != '\0'; ++p)
	{
		/* nothing */
	}
	for ( ; ; )
	{
		stmt;
	}
	for ( ; ; )
	{
		zed = a + really + long + statement + that + needs +
		    two + lines + gets + indented + four + spaces +
		    on + the + second + and + subsequent + lines;
	}
	for ( ; ; )
	{
		if (cond) {
			stmt;
		}
	}
	if (val != NULL) {
		val = realloc(val, newsize);
	}

	fcn_call(with, a, really, long, list, of, parameters,
	    that, spans, two, lines);

	for ( ; cnt < 15; cnt++)
	{
		stmt1;
		stmt2;
	}

	almod = (chunk_is_single_line_comment(pc) &&
	    cpd.settings[UO_indent_relative_single_line_comments].b) ?
	    ALMODE_KEEP_REL : ALMODE_KEEP_ABS;

	/* Indentation is an 8 character tab.  Second level indents are four spaces.
	 * If you have to wrap a long statement, put the operator at the end of the
	 * line.
	 */

	while (cnt < 20 && this_variable_name_is_too_long &&
	    ep != NULL)
	{
		zappy = a + really + long + statement + that + needs +
		    two + lines + gets + indented + four + spaces +
		    on + the + second + and + subsequent + lines;
	}

	// Do not add whitespace at the end of a line, and only use tabs followed by
	// spaces to form the indentation.  Do not use more spaces than a tab will
	// produce and do not use spaces in front of tabs.
	//
	// Closing and opening braces go on the same line as the else.  Braces that
	// are not necessary may be left out.

	if (test) {
		stmt;
	} else if (bar) {
		stmt;
		stmt;
	} else{
		stmt;
	}

	// No spaces after function names.  Commas have a space after them.  No spa-
	// ces after `(' or `[' or preceding `]' or `)' characters.

	error = function(a1, a2);
	if (error != 0) {
		exit(error);
	}

	// Unary operators do not require spaces, binary operators do.  Do not use
	// parentheses unless they are required for precedence or unless the state-
	// ment is confusing without them.  Remember that other people may confuse
	// easier than you.  Do YOU understand the following?

	a = b->c[0] + ~d == (e || f) || g && h ? i : j >> 1;
	k = !(l & FLAGS);


	// Exits should be 0 on success, or 1 on failure.

	exit(0);           /*
	                    * Avoid obvious comments such as
	                    * "Exit 0 on success."
	                    */
}


static char *
function(a1, a2, fl, a4)
int a1, a2;                  /* Declare ints, too, don't default them. */

float fl;                    /* Beware double vs. float prototype differences. */
int   a4;                    /* List in order declared. */
{
}
