new version from James Gosling <jag@Sun.COM>
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 16 Sep 1988 03:19:17 +0000 (19:19 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 16 Sep 1988 03:19:17 +0000 (19:19 -0800)
SCCS-vsn: usr.bin/indent/Makefile 5.9
SCCS-vsn: usr.bin/indent/args.c 5.5
SCCS-vsn: usr.bin/indent/indent.1 6.5
SCCS-vsn: usr.bin/indent/indent.c 5.9
SCCS-vsn: usr.bin/indent/indent_codes.h 5.6
SCCS-vsn: usr.bin/indent/indent_globs.h 5.7
SCCS-vsn: usr.bin/indent/io.c 5.8
SCCS-vsn: usr.bin/indent/lexi.c 5.9
SCCS-vsn: usr.bin/indent/parse.c 5.7
SCCS-vsn: usr.bin/indent/pr_comment.c 5.7

usr/src/usr.bin/indent/Makefile
usr/src/usr.bin/indent/args.c
usr/src/usr.bin/indent/indent.1
usr/src/usr.bin/indent/indent.c
usr/src/usr.bin/indent/indent_codes.h
usr/src/usr.bin/indent/indent_globs.h
usr/src/usr.bin/indent/io.c
usr/src/usr.bin/indent/lexi.c
usr/src/usr.bin/indent/parse.c
usr/src/usr.bin/indent/pr_comment.c

index ed78f3b..e0943f2 100644 (file)
 # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
 # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-#      @(#)Makefile    5.8 (Berkeley) %G%
+#      @(#)Makefile    5.9 (Berkeley) %G%
 #
 CFLAGS=        -O
 LIBC=  /lib/libc.a
 SRCS=  indent.c io.c lexi.c parse.c pr_comment.c args.c
 OBJS=  indent.o io.o lexi.o parse.o pr_comment.o args.o
 #
 CFLAGS=        -O
 LIBC=  /lib/libc.a
 SRCS=  indent.c io.c lexi.c parse.c pr_comment.c args.c
 OBJS=  indent.o io.o lexi.o parse.o pr_comment.o args.o
+MAN=   indent.0
 
 all: indent
 
 
 all: indent
 
-indent:        ${OBJS} ${LIBC}
+indent: ${OBJS} ${LIBC}
        ${CC} -o $@ ${CFLAGS} ${OBJS}
 
        ${CC} -o $@ ${CFLAGS} ${OBJS}
 
-clean: FRC
+clean:
        rm -f ${OBJS} core indent
 
        rm -f ${OBJS} core indent
 
-depend: FRC
+cleandir: clean
+       rm -f ${MAN} tags .depend
+
+depend: ${SRCS}
        mkdep ${CFLAGS} ${SRCS}
 
        mkdep ${CFLAGS} ${SRCS}
 
-install: FRC
+install: ${MAN}
        install -s -o bin -g bin -m 755 indent ${DESTDIR}/usr/ucb/indent
        install -s -o bin -g bin -m 755 indent ${DESTDIR}/usr/ucb/indent
+       install -c -o bin -g bin -m 444 indent.0 ${DESTDIR}/usr/man/cat1
 
 
-lint: FRC
+lint: ${SRCS}
        lint ${CFLAGS} ${SRCS}
 
        lint ${CFLAGS} ${SRCS}
 
-tags: FRC
+tags: ${SRCS}
        ctags ${SRCS}
        ctags ${SRCS}
-
-FRC:
-
-# DO NOT DELETE THIS LINE -- mkdep uses it.
-# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
-
-indent.o: indent.c
-indent.o:indent_globs.h
-indent.o: /usr/include/stdio.h
-indent.o:indent_codes.h
-io.o: io.c
-io.o:indent_globs.h
-io.o: /usr/include/stdio.h
-lexi.o: lexi.c
-lexi.o:indent_globs.h
-lexi.o: /usr/include/stdio.h
-lexi.o:indent_codes.h
-lexi.o: /usr/include/ctype.h
-parse.o: parse.c
-parse.o:./indent_globs.h
-parse.o: /usr/include/stdio.h
-parse.o:./indent_codes.h
-pr_comment.o: pr_comment.c
-pr_comment.o:indent_globs.h
-pr_comment.o: /usr/include/stdio.h
-args.o: args.c
-args.o:indent_globs.h
-args.o: /usr/include/stdio.h /usr/include/sys/types.h /usr/include/ctype.h
-
-# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
index 5c6aa25..2aca4b8 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,34 +9,35 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)args.c     5.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)args.c     5.5 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
- * Argument scanning and profile reading code.  Default parameters
- * are set here as well.
+ * Argument scanning and profile reading code.  Default parameters are set
+ * here as well.
  */
 
 #include "indent_globs.h"
 #include <sys/types.h>
 #include <ctype.h>
 
  */
 
 #include "indent_globs.h"
 #include <sys/types.h>
 #include <ctype.h>
 
-char *getenv(), *index();
+char       *getenv(), *index();
 
 /* profile types */
 #define        PRO_SPECIAL     1       /* special case */
 #define        PRO_BOOL        2       /* boolean */
 #define        PRO_INT         3       /* integer */
 
 /* profile types */
 #define        PRO_SPECIAL     1       /* special case */
 #define        PRO_BOOL        2       /* boolean */
 #define        PRO_INT         3       /* integer */
+#define PRO_FONT       4       /* troff font */
 
 /* profile specials for booleans */
 #define        ON              1       /* turn it on */
 
 /* profile specials for booleans */
 #define        ON              1       /* turn it on */
@@ -48,82 +50,94 @@ char *getenv(), *index();
 #define        KEY             4       /* type (keyword) */
 
 /*
 #define        KEY             4       /* type (keyword) */
 
 /*
- * N.B.: because of the way the table here is scanned, options
- * whose names are substrings of other options must occur later;
- * that is, with -lp vs -l, -lp must be first.  Also, while (most)
- * booleans occur more than once, the last default value is the
- * one actually assigned.
+ * N.B.: because of the way the table here is scanned, options whose names are
+ * substrings of other options must occur later; that is, with -lp vs -l, -lp
+ * must be first.  Also, while (most) booleans occur more than once, the last
+ * default value is the one actually assigned.
  */
 struct pro {
  */
 struct pro {
-    char *p_name;              /* name, eg -bl, -cli */
-    int   p_type;              /* type (int, bool, special) */
-    int   p_default;           /* the default value (if int) */
-    int   p_special;           /* depends on type */
-    int  *p_obj;               /* the associated variable */
-} pro[] = {
-    "npro",    PRO_SPECIAL,    0,      IGN,    0,
-    "lc",      PRO_INT,        0,      0,      &block_comment_max_col,
-    "lp",      PRO_BOOL,       true,   ON,     &lineup_to_parens,
-    "nlp",     PRO_BOOL,       true,   OFF,    &lineup_to_parens,
-    "l",       PRO_INT,        78,     0,      &max_col,
-    "psl",     PRO_BOOL,       true,   ON,     &procnames_start_line,
-    "npsl",    PRO_BOOL,       true,   OFF,    &procnames_start_line,
-    "fc1",     PRO_BOOL,       true,   ON,     &format_col1_comments,
-    "nfc1",    PRO_BOOL,       true,   OFF,    &format_col1_comments,
-    "pcs",     PRO_BOOL,       false,  ON,     &proc_calls_space,
-    "npcs",    PRO_BOOL,       false,  OFF,    &proc_calls_space,
-    "ip",      PRO_BOOL,       true,   ON,     &ps.indent_parameters,
-    "nip",     PRO_BOOL,       true,   OFF,    &ps.indent_parameters,
- /* see set_defaults for initialization of -cli */
-    "cli",     PRO_SPECIAL,    0,      CLI,    0,
-    "ci",      PRO_INT,        0,      0,      &continuation_indent,
-    "cdb",     PRO_BOOL,       true,   ON,  &comment_delimiter_on_blankline,
-    "ncdb",    PRO_BOOL,       true,   OFF, &comment_delimiter_on_blankline,
-    "i",       PRO_INT,        8,      0,      &ps.ind_size,
-    "cd",      PRO_INT,        0,      0,      &ps.decl_com_ind,
-    "ce",      PRO_BOOL,       true,   ON,     &cuddle_else,
-    "nce",     PRO_BOOL,       true,   OFF,    &cuddle_else,
-    "c",       PRO_INT,        33,     0,      &ps.com_ind,
-    "v",       PRO_BOOL,       false,  ON,     &verbose,
-    "nv",      PRO_BOOL,       false,  OFF,    &verbose,
-    "dj",      PRO_BOOL,       false,  ON,     &ps.ljust_decl,
-    "ndj",     PRO_BOOL,       false,  OFF,    &ps.ljust_decl,
- /* don't ask *me* why -bc/-nbc is backwards.... */
-    "bc",      PRO_BOOL,       true,   OFF,    &ps.leave_comma,
-    "nbc",     PRO_BOOL,       true,   ON,     &ps.leave_comma,
-    "di",      PRO_INT,        16,     0,      &ps.decl_indent,
-    "d",       PRO_INT,        0,      0,      &ps.unindent_displace,
-    "br",      PRO_BOOL,       true,   ON,     &btype_2,
-    "bl",      PRO_BOOL,       true,   OFF,    &btype_2,
-    "st",      PRO_SPECIAL,    0,      STDIN,  0,
-    "ei",      PRO_BOOL,       true,   ON,     &ps.else_if,
-    "nei",     PRO_BOOL,       true,   OFF,    &ps.else_if,
-    "sc",      PRO_BOOL,       true,   ON,     &star_comment_cont,
-    "nsc",     PRO_BOOL,       true,   OFF,    &star_comment_cont,
-    "bap",     PRO_BOOL,       false,  ON,     &blanklines_after_procs,
-    "nbap",    PRO_BOOL,       false,  OFF,    &blanklines_after_procs,
-    "sob",     PRO_BOOL,       false,  ON,     &swallow_optional_blanklines,
-    "nsob",    PRO_BOOL,       false,  OFF,    &swallow_optional_blanklines,
-    "bad",     PRO_BOOL,       false,  ON,  &blanklines_after_declarations,
-    "nbad",    PRO_BOOL,       false,  OFF, &blanklines_after_declarations,
-    "bbb",     PRO_BOOL,       false,  ON,  &blanklines_before_blockcomments,
-    "nbbb",    PRO_BOOL,       false,  OFF, &blanklines_before_blockcomments,
-    "ps",      PRO_BOOL,       false,  ON,     &pointer_as_binop,
-    "nps",     PRO_BOOL,       false,  OFF,    &pointer_as_binop,
-    "troff",   PRO_BOOL,       false,  ON,     &troff,
-    "T",       PRO_SPECIAL,    0,      KEY,    0,
- /* whew! */
-    0,         0,              0,      0,      0
+    char       *p_name;                /* name, eg -bl, -cli */
+    int         p_type;                /* type (int, bool, special) */
+    int         p_default;     /* the default value (if int) */
+    int         p_special;     /* depends on type */
+    int        *p_obj;         /* the associated variable */
+}           pro[] = {
+
+    "T", PRO_SPECIAL, 0, KEY, 0,
+    "bacc", PRO_BOOL, false, ON, &blanklines_around_conditional_compilation,
+    "badp", PRO_BOOL, false, ON, &blanklines_after_declarations_at_proctop,
+    "bad", PRO_BOOL, false, ON, &blanklines_after_declarations,
+    "bap", PRO_BOOL, false, ON, &blanklines_after_procs,
+    "bbb", PRO_BOOL, false, ON, &blanklines_before_blockcomments,
+    "bc", PRO_BOOL, true, OFF, &ps.leave_comma,
+    "bl", PRO_BOOL, true, OFF, &btype_2,
+    "br", PRO_BOOL, true, ON, &btype_2,
+    "bs", PRO_BOOL, false, ON, &Bill_Shannon,
+    "cdb", PRO_BOOL, true, ON, &comment_delimiter_on_blankline,
+    "cd", PRO_INT, 0, 0, &ps.decl_com_ind,
+    "ce", PRO_BOOL, true, ON, &cuddle_else,
+    "ci", PRO_INT, 0, 0, &continuation_indent,
+    "cli", PRO_SPECIAL, 0, CLI, 0,
+    "c", PRO_INT, 33, 0, &ps.com_ind,
+    "di", PRO_INT, 16, 0, &ps.decl_indent,
+    "dj", PRO_BOOL, false, ON, &ps.ljust_decl,
+    "d", PRO_INT, 0, 0, &ps.unindent_displace,
+    "eei", PRO_BOOL, false, ON, &extra_expression_indent,
+    "ei", PRO_BOOL, true, ON, &ps.else_if,
+    "fbc", PRO_FONT, 0, 0, (int *) &blkcomf,
+    "fbx", PRO_FONT, 0, 0, (int *) &boxcomf,
+    "fb", PRO_FONT, 0, 0, (int *) &bodyf,
+    "fc1", PRO_BOOL, true, ON, &format_col1_comments,
+    "fc", PRO_FONT, 0, 0, (int *) &scomf,
+    "fk", PRO_FONT, 0, 0, (int *) &keywordf,
+    "fs", PRO_FONT, 0, 0, (int *) &stringf,
+    "ip", PRO_BOOL, true, ON, &ps.indent_parameters,
+    "i", PRO_INT, 8, 0, &ps.ind_size,
+    "lc", PRO_INT, 0, 0, &block_comment_max_col,
+    "lp", PRO_BOOL, true, ON, &lineup_to_parens,
+    "l", PRO_INT, 78, 0, &max_col,
+    "nbacc", PRO_BOOL, false, OFF, &blanklines_around_conditional_compilation,
+    "nbadp", PRO_BOOL, false, OFF, &blanklines_after_declarations_at_proctop,
+    "nbad", PRO_BOOL, false, OFF, &blanklines_after_declarations,
+    "nbap", PRO_BOOL, false, OFF, &blanklines_after_procs,
+    "nbbb", PRO_BOOL, false, OFF, &blanklines_before_blockcomments,
+    "nbc", PRO_BOOL, true, ON, &ps.leave_comma,
+    "nbs", PRO_BOOL, false, OFF, &Bill_Shannon,
+    "ncdb", PRO_BOOL, true, OFF, &comment_delimiter_on_blankline,
+    "nce", PRO_BOOL, true, OFF, &cuddle_else,
+    "ndj", PRO_BOOL, false, OFF, &ps.ljust_decl,
+    "neei", PRO_BOOL, false, OFF, &extra_expression_indent,
+    "nei", PRO_BOOL, true, OFF, &ps.else_if,
+    "nfc1", PRO_BOOL, true, OFF, &format_col1_comments,
+    "nip", PRO_BOOL, true, OFF, &ps.indent_parameters,
+    "nlp", PRO_BOOL, true, OFF, &lineup_to_parens,
+    "npcs", PRO_BOOL, false, OFF, &proc_calls_space,
+    "npro", PRO_SPECIAL, 0, IGN, 0,
+    "npsl", PRO_BOOL, true, OFF, &procnames_start_line,
+    "nps", PRO_BOOL, false, OFF, &pointer_as_binop,
+    "nsc", PRO_BOOL, true, OFF, &star_comment_cont,
+    "nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines,
+    "nv", PRO_BOOL, false, OFF, &verbose,
+    "pcs", PRO_BOOL, false, ON, &proc_calls_space,
+    "psl", PRO_BOOL, true, ON, &procnames_start_line,
+    "ps", PRO_BOOL, false, ON, &pointer_as_binop,
+    "sc", PRO_BOOL, true, ON, &star_comment_cont,
+    "sob", PRO_BOOL, false, ON, &swallow_optional_blanklines,
+    "st", PRO_SPECIAL, 0, STDIN, 0,
+    "troff", PRO_BOOL, false, ON, &troff,
+    "v", PRO_BOOL, false, ON, &verbose,
+    /* whew! */
+    0, 0, 0, 0, 0
 };
 
 /*
 };
 
 /*
- * set_profile reads $HOME/.indent.pro and ./.indent.pro and
- * handles arguments given in these files.
+ * set_profile reads $HOME/.indent.pro and ./.indent.pro and handles arguments
+ * given in these files.
  */
 set_profile()
 {
     register FILE *f;
  */
 set_profile()
 {
     register FILE *f;
-    char fname[BUFSIZ];
+    char        fname[BUFSIZ];
     static char pro[] = ".indent.pro";
 
     sprintf(fname, "%s/%s", getenv("HOME"), pro);
     static char pro[] = ".indent.pro";
 
     sprintf(fname, "%s/%s", getenv("HOME"), pro);
@@ -140,30 +154,21 @@ set_profile()
 scan_profile(f)
     register FILE *f;
 {
 scan_profile(f)
     register FILE *f;
 {
-    register char *p, *arg;
-    char buf[BUFSIZ];
+    register char *p;
+    char        buf[BUFSIZ];
 
 
-    while (fgets(buf, sizeof buf, f)) {
-       if ((p = index(buf, '\n')) != NULL)
-           *p = 0;
-       if (verbose)
-           printf("profile: %s\n", buf);
+    while (1) {
        p = buf;
        p = buf;
-       for (;;) {
-           while (isspace(*p))
-               p++;
-           if (*p == 0)
-               break;
-           arg = p;
-           while (*p) {
-               if (isspace(*p)) {
-                   *p++ = 0;
-                   break;
-               }
-               p++;
-           }
-           set_option(arg);
+       while ((*p = getc(f)) != EOF && *p > ' ')
+           p++;
+       if (p != buf) {
+           *p++ = 0;
+           if (verbose)
+               printf("profile: %s\n", buf);
+           set_option(buf);
        }
        }
+       else if (*p == EOF)
+           return;
     }
 }
 
     }
 }
 
@@ -189,12 +194,12 @@ set_defaults()
     register struct pro *p;
 
     /*
     register struct pro *p;
 
     /*
-     * Because ps.case_indent is a float, we can't initialize it
-     * from the table:
+     * Because ps.case_indent is a float, we can't initialize it from the
+     * table:
      */
     ps.case_indent = 0.0;      /* -cli0.0 */
     for (p = pro; p->p_name; p++)
      */
     ps.case_indent = 0.0;      /* -cli0.0 */
     for (p = pro; p->p_name; p++)
-       if (p->p_type != PRO_SPECIAL)
+       if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT)
            *p->p_obj = p->p_default;
 }
 
            *p->p_obj = p->p_default;
 }
 
@@ -213,58 +218,66 @@ set_option(arg)
 found:
     switch (p->p_type) {
 
 found:
     switch (p->p_type) {
 
-       case PRO_SPECIAL:
-           switch (p->p_special) {
-
-               case IGN:
-                   break;
-
-               case CLI:
-                   if (*param_start == 0)
-                       goto need_param;
-                   ps.case_indent = atof(param_start);
-                   break;
+    case PRO_SPECIAL:
+       switch (p->p_special) {
 
 
-               case STDIN:
-                   if (input == 0)
-                       input = stdin;
-                   if (output == 0)
-                       output = stdout;
-                   break;
-
-               case KEY:
-                   if (*param_start == 0)
-                       goto need_param;
-                   addkey(param_start, 4);
-                   break;
+       case IGN:
+           break;
 
 
-               default:
-                   fprintf(stderr, "\
-indent: set_option: internal error: p_special %d\n", p->p_special);
-                   exit(1);
-           }
+       case CLI:
+           if (*param_start == 0)
+               goto need_param;
+           ps.case_indent = atof(param_start);
            break;
 
            break;
 
-       case PRO_BOOL:
-           if (p->p_special == OFF)
-               *p->p_obj = false;
-           else
-               *p->p_obj = true;
+       case STDIN:
+           if (input == 0)
+               input = stdin;
+           if (output == 0)
+               output = stdout;
            break;
 
            break;
 
-       case PRO_INT:
-           if (*param_start == 0) {
-need_param:
-               fprintf(stderr, "indent: ``%s'' requires a parameter\n",
-                       arg - 1);
-               exit(1);
+       case KEY:
+           if (*param_start == 0)
+               goto need_param;
+           {
+               register char *str = (char *) malloc(strlen(param_start) + 1);
+               strcpy(str, param_start);
+               addkey(str, 4);
            }
            }
-           *p->p_obj = atoi(param_start);
            break;
 
        default:
            break;
 
        default:
-           fprintf(stderr, "indent: set_option: internal error: p_type %d\n",
-                   p->p_type);
+           fprintf(stderr, "\
+indent: set_option: internal error: p_special %d\n", p->p_special);
+           exit(1);
+       }
+       break;
+
+    case PRO_BOOL:
+       if (p->p_special == OFF)
+           *p->p_obj = false;
+       else
+           *p->p_obj = true;
+       break;
+
+    case PRO_INT:
+       if (*param_start == 0) {
+    need_param:
+           fprintf(stderr, "indent: ``%s'' requires a parameter\n",
+                   arg - 1);
            exit(1);
            exit(1);
+       }
+       *p->p_obj = atoi(param_start);
+       break;
+
+    case PRO_FONT:
+       parsefont((struct fstate *) p->p_obj, param_start);
+       break;
+
+    default:
+       fprintf(stderr, "indent: set_option: internal error: p_type %d\n",
+               p->p_type);
+       exit(1);
     }
 }
     }
 }
index 00757f5..72c5447 100644 (file)
@@ -1,11 +1,25 @@
-.\" Copyright (c) 1983 Regents of the University of California.
-.\" All rights reserved.  The Berkeley software License Agreement
-.\" specifies the terms and conditions for redistribution.
+.\" Copyright (c) 1985 Sun Microsystems, Inc.
+.\" Copyright (c) 1980 The Regents of the University of California.
+.\" Copyright (c) 1976 Board of Trustees of the University of Illinois.
+.\" All rights reserved.
 .\"
 .\"
-.\"    @(#)indent.1    6.4 (Berkeley) %G%
+.\" Redistribution and use in source and binary forms are permitted
+.\" provided that the above copyright notice and this paragraph are
+.\" duplicated in all such forms and that any documentation,
+.\" advertising materials, and other materials related to such
+.\" distribution and use acknowledge that the software was developed
+.\" by the University of California, Berkeley, the University of Illinois,
+.\" Urbana, and Sun Microsystems, Inc.  The name of either University
+.\" or Sun Microsystems may not be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+.\" WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+.\" 
+.\"    @(#)indent.1    6.5 (Berkeley) %G%
 .\"
 .\"
-.TH INDENT 1 ""
-.UC 5
+
+.TH INDENT 1 "
 .SH NAME
 indent \- indent and format C program source
 .SH SYNOPSIS
 .SH NAME
 indent \- indent and format C program source
 .SH SYNOPSIS
@@ -16,7 +30,8 @@ indent \- indent and format C program source
 [\ \fB\-bap\fR\ |\ \fB\-nbap\fR\ ]
 [\ \fB\-bbb\fR\ |\ \fB\-nbbb\fR\ ]
 [\ \fB\-bc\fR\ |\ \fB\-nbc\fR\ ]
 [\ \fB\-bap\fR\ |\ \fB\-nbap\fR\ ]
 [\ \fB\-bbb\fR\ |\ \fB\-nbbb\fR\ ]
 [\ \fB\-bc\fR\ |\ \fB\-nbc\fR\ ]
-[\ \fB\-bl\fR\ |\ \fB\-br\fR\ ]
+[\ \fB\-bl\fR\ ]
+[\ \fB\-br\fR\ ]
 [\ \fB\-c\fIn\fR\ ]
 [\ \fB\-cd\fIn\fR\ ]
 [\ \fB\-cdb\fR\ |\ \fB\-ncdb\fR\ ]
 [\ \fB\-c\fIn\fR\ ]
 [\ \fB\-cd\fIn\fR\ ]
 [\ \fB\-cdb\fR\ |\ \fB\-ncdb\fR\ ]
@@ -25,17 +40,14 @@ indent \- indent and format C program source
 [\ \fB\-cli\fIn\fR\ ]
 [\ \fB\-d\fIn\fR\ ]
 [\ \fB\-di\fIn\fR\ ]
 [\ \fB\-cli\fIn\fR\ ]
 [\ \fB\-d\fIn\fR\ ]
 [\ \fB\-di\fIn\fR\ ]
-[\ \fB\-dj\fR\ |\ \fB\-ndj\fR\ ]
-[\ \fB\-ei\fR\ |\ \fB\-nei\fR\ ]
 [\ \fB\-fc1\fR\ |\ \fB\-nfc1\fR\ ]
 [\ \fB\-i\fIn\fR\ ]
 [\ \fB\-ip\fR\ |\ \fB\-nip\fR\ ]
 [\ \fB\-l\fIn\fR\ ]
 [\ \fB\-lc\fIn\fR\ ]
 [\ \fB\-lp\fR\ |\ \fB\-nlp\fR\ ]
 [\ \fB\-fc1\fR\ |\ \fB\-nfc1\fR\ ]
 [\ \fB\-i\fIn\fR\ ]
 [\ \fB\-ip\fR\ |\ \fB\-nip\fR\ ]
 [\ \fB\-l\fIn\fR\ ]
 [\ \fB\-lc\fIn\fR\ ]
 [\ \fB\-lp\fR\ |\ \fB\-nlp\fR\ ]
-[\ \fB\-npro\fR\ ]
 [\ \fB\-pcs\fR\ |\ \fB\-npcs\fR\ ]
 [\ \fB\-pcs\fR\ |\ \fB\-npcs\fR\ ]
-[\ \fB\-ps\fR\ |\ \fB\-nps\fR\ ]
+[\ \fB\-npro\fR\ ]
 [\ \fB\-psl\fR\ |\ \fB\-npsl\fR\ ]
 [\ \fB\-sc\fR\ |\ \fB\-nsc\fR\ ]
 [\ \fB\-sob\fR\ |\ \fB\-nsob\fR\ ]
 [\ \fB\-psl\fR\ |\ \fB\-npsl\fR\ ]
 [\ \fB\-sc\fR\ |\ \fB\-nsc\fR\ ]
 [\ \fB\-sob\fR\ |\ \fB\-nsob\fR\ ]
@@ -43,14 +55,6 @@ indent \- indent and format C program source
 [\ \fB\-troff\fR\ ]
 [\ \fB\-v\fR\ |\ \fB\-nv\fR\ ]
 .SH DESCRIPTION
 [\ \fB\-troff\fR\ ]
 [\ \fB\-v\fR\ |\ \fB\-nv\fR\ ]
 .SH DESCRIPTION
-.IX  indent  ""  "\fLindent\fP \(em format C source"
-.IX  "programming tools"  "indent"  ""  "\fLindent\fP \(em format C source"
-.IX  "languages"  "indent"  ""  "\fLindent\fP \(em format C source"
-.IX  "C programming language"  "indent"  ""  "\fLindent\fP \(em format C source"
-.IX  "pretty printer"  "indent"  ""  "\fLindent\fP \(em format C source"
-.IX  "format C programs" "" "format C programs \(em \fLindent\fP"
-.IX  "code formatter"  "indent"  ""  "\fLindent\fP \(em format C source"
-.IX  "cb"  "indent"  "\fLcb\fP"  "try \fLindent\fP \(em format C source"
 .I Indent
 is a \fBC\fR program formatter.  It reformats the \fBC\fR program in the
 \fIinput-file\fR according to the switches.  The switches which can be
 .I Indent
 is a \fBC\fR program formatter.  It reformats the \fBC\fR program in the
 \fIinput-file\fR according to the switches.  The switches which can be
@@ -78,19 +82,19 @@ checks to make sure it is different from
 The options listed below control the formatting style imposed by
 .IR indent .
 .TP 15
 The options listed below control the formatting style imposed by
 .IR indent .
 .TP 15
-.BR \-bad , \-nbad
-If
-.B \-bad
-is specified, a blank line is forced after every block of
-declarations.  Default:  
-.BR \-nbad .
-.TP 15
 .BR \-bap , \-nbap
 If
 .B \-bap
 is specified, a blank line is forced after every procedure body.  Default:
 .B \-nbap.
 .TP 15
 .BR \-bap , \-nbap
 If
 .B \-bap
 is specified, a blank line is forced after every procedure body.  Default:
 .B \-nbap.
 .TP 15
+.BR \-bad , \-nbad
+If
+.B \-bad
+is specified, a blank line is forced after every block of
+declarations.  Default:  
+.B \-nbad.
+.TP 15
 .BR \-bbb , \-nbbb
 If
 .B \-bbb
 .BR \-bbb , \-nbbb
 If
 .B \-bbb
@@ -103,7 +107,7 @@ If
 is specified, then a newline is forced after each comma in a declaration. 
 .B \-nbc
 turns off this option.  The default is
 is specified, then a newline is forced after each comma in a declaration. 
 .B \-nbc
 turns off this option.  The default is
-.BR \-nbc .
+.BR \-bc .
 .TP 15
 .BR \-br , \-bl
 Specifying
 .TP 15
 .BR \-br , \-bl
 Specifying
@@ -155,14 +159,13 @@ Rather than like this:
        /* this is a comment */
 .ft R
 .fi
        /* this is a comment */
 .ft R
 .fi
-This only affects block comments, not comments to the right of
-code. The default is
-.BR \-cdb .
+This only affects block comments, not comments to the right of code. The default is
+.B \-cdb .
 .TP 15
 .BI \-ce , \-nce
 .TP 15
 .BI \-ce , \-nce
-Enables (disables) forcing `else's to cuddle up to the immediately preceding
+Enables (disables) forcing `else's to cuddle up to the immediatly preceeding
 `}'.  The default is
 `}'.  The default is
-.BR \-ce .
+.B \-ce .
 .TP 15
 .BI \-ci n
 Sets the continuation indent to be \fIn\fR.  Continuation
 .TP 15
 .BI \-ci n
 Sets the continuation indent to be \fIn\fR.  Continuation
@@ -175,17 +178,16 @@ indicate the nesting, unless \fB\-lp\fR is in effect.
 Causes case labels to be indented
 .I n
 tab stops to the right of the containing \fBswitch\fR statement.
 Causes case labels to be indented
 .I n
 tab stops to the right of the containing \fBswitch\fR statement.
-\fB\-cli0.5\fR causes case labels to be indented half a tab stop.  The
+\fB-cli0.5\fR causes case labels to be indented half a tab stop.  The
 default is
 default is
-.BR \-cli0 .
-(This is the only option that takes a fractional argument.)
+.B \-cli0 .
 .TP 15
 .BI \-d n
 Controls the placement of comments which are not to the
 .TP 15
 .BI \-d n
 Controls the placement of comments which are not to the
-right of code.  Specifying
+right of code.  The default
 .B \-d1
 means that such comments are placed one indentation level to the
 .B \-d1
 means that such comments are placed one indentation level to the
-left of code.  The default
+left of code.  Specifying
 .B \-d0
 lines up these comments with the code.  See the section on comment
 indentation below.
 .B \-d0
 lines up these comments with the code.  See the section on comment
 indentation below.
@@ -193,8 +195,8 @@ indentation below.
 .BI \-di n
 Specifies the indentation, in character positions, from a declaration keyword
 to the following identifier.  The default is
 .BI \-di n
 Specifies the indentation, in character positions, from a declaration keyword
 to the following identifier.  The default is
-.BR \-di16 .
-.TP 15
+.B \-di16 .
+.if 0 \{.TP 15
 .BR \-dj , \-ndj
 .B \-dj
 left justifies declarations.
 .BR \-dj , \-ndj
 .B \-dj
 left justifies declarations.
@@ -205,14 +207,13 @@ indents declarations the same as code.  The default is
 .BI \-ei , \-nei
 Enables (disables) special
 .B else-if
 .BI \-ei , \-nei
 Enables (disables) special
 .B else-if
-processing.  If enabled,
+processing.  If it's enabled,
 .BR if "s"
 following
 .BR else "s"
 .BR if "s"
 following
 .BR else "s"
-will have the same indentation as the preceding
+will have the same indendation as the preceeding
 .B if
 .B if
-statement.  The default is
-.BR \-ei .
+statement.\}
 .TP 15
 .BI \-fc1 , \-nfc1
 Enables (disables) the formatting of comments that start in column 1.
 .TP 15
 .BI \-fc1 , \-nfc1
 Enables (disables) the formatting of comments that start in column 1.
@@ -221,22 +222,25 @@ hand formatted by the programmer.  In such cases, \fB\-nfc1\fR should be
 used.  The default is \fB\-fc1\fR.
 .TP 15
 .BI \-i n
 used.  The default is \fB\-fc1\fR.
 .TP 15
 .BI \-i n
-The number of spaces for one indentation level.  The default is 8.
+The number of spaces for one indentation level.  The default is 4.
 .TP 15
 .BI \-ip , \-nip
 Enables (disables) the indentation of parameter declarations from the left
 margin.  The default is
 .TP 15
 .BI \-ip , \-nip
 Enables (disables) the indentation of parameter declarations from the left
 margin.  The default is
-.BR \-ip .
+.B \-ip .
 .TP 15
 .BI \-l n
 .TP 15
 .BI \-l n
-Maximum length of an output line.  The default is 78.
+Maximum length of an output line.  The default is 75.
+.TP 15
+.B \-npro
+Causes the profile files, `./.indent.pro' and `~/.indent.pro', to be ignored.
 .TP 15
 .BI \-lp , \-nlp
 Lines up code surrounded by parenthesis in continuation lines.  If a line
 has a left paren which is not closed on that line, then continuation lines
 will be lined up to start at the character position just after the left
 .TP 15
 .BI \-lp , \-nlp
 Lines up code surrounded by parenthesis in continuation lines.  If a line
 has a left paren which is not closed on that line, then continuation lines
 will be lined up to start at the character position just after the left
-paren.  For example, here is how a piece of continued code looks with
-\fB\-nlp\fR in effect:
+paren.  For example, here is how a piece of continued code looks with -nlp
+in effect:
 .ne 2
 .nf
 .ft L
 .ne 2
 .nf
 .ft L
@@ -245,57 +249,45 @@ paren.  For example, here is how a piece of continued code looks with
 .ft R
 .fi
 .ne 5
 .ft R
 .fi
 .ne 5
-With \fB\-lp\fR in effect (the default) the code looks somewhat clearer:
+With \fB-lp\fR in effect (the default) the code looks somewhat clearer:
 .nf
 .ft L
 .nf
 .ft L
-.ta \w'    p1 = first_procedure('u
     p1 = first_procedure(second_procedure(p2, p3),
     p1 = first_procedure(second_procedure(p2, p3),
-       third_procedure(p4, p5));
+                         third_procedure(p4, p5));
 .ft R
 .fi
 .ne 5
 .ft R
 .fi
 .ne 5
-Inserting two more newlines we get:
+Inserting a couple more newlines we get:
 .nf
 .ft L
 .nf
 .ft L
-.ta \w'    p1 = first_procedure('u +\w'second_procedure('u
     p1 = first_procedure(second_procedure(p2,
     p1 = first_procedure(second_procedure(p2,
-               p3),
-.ta \w'    p1 = first_procedure('u +\w'third_procedure('u
-       third_procedure(p4,
-               p5));
+                                          p3),
+                         third_procedure(p4,
+                                         p5));
 .ft R
 .fi
 .TP 15
 .ft R
 .fi
 .TP 15
-.B \-npro
-Causes the profile files, `./.indent.pro' and `~/.indent.pro', to be ignored.
-.TP 15
-.BR \-pcs , \-npcs
-If true (\fB\-pcs\fR) all procedure calls will have a space inserted between
-the name and the `('.  The default is 
-.BR \-npcs .
-.TP 15
-.BR \-ps , \-nps
-If true (\fB\-ps\fR) the pointer following operator `\->' will be
-surrounded by spaces on either side.  The default is
-.BR \-nps .
+.B \-pcs , \-npcs
+If true (\fB-pcs\fR) all procedure calls will have a space inserted between
+the name and the '('.  The default is 
+.B \-npcs
 .TP 15
 .TP 15
-.BR \-psl , \-npsl
-If true (\fB\-psl\fR) the names of procedures being defined are placed in
+.B \-psl , \-npsl
+If true (\fB-psl\fR) the names of procedures being defined are placed in
 column 1 \- their types, if any, will be left on the previous lines.  The
 default is 
 column 1 \- their types, if any, will be left on the previous lines.  The
 default is 
-.BR \-psl .
+.B -psl
 .TP 15
 .TP 15
-.BR \-sc , \-nsc
+.BI \-sc , \-nsc
 Enables (disables) the placement of asterisks (`*'s) at the left edge of all
 Enables (disables) the placement of asterisks (`*'s) at the left edge of all
-comments.  The default is
-.BR \-sc .
+comments.
 .TP 15
 .BR \-sob , \-nsob
 If
 .B \-sob
 is specified, indent will swallow optional blank lines.  You can use this to
 get rid of blank lines after declarations.  Default:
 .TP 15
 .BR \-sob , \-nsob
 If
 .B \-sob
 is specified, indent will swallow optional blank lines.  You can use this to
 get rid of blank lines after declarations.  Default:
-.BR \-nsob .
+.B \-nsob
 .TP 15
 .B \-st
 Causes
 .TP 15
 .B \-st
 Causes
@@ -312,20 +304,20 @@ appear in your program that are defined by \fBtypedef\fRs \- nothing will be
 harmed if you miss a few, but the program won't be formatted as nicely as
 it should.  This sounds like a painful thing to have to do, but it's really
 a symptom of a problem in C: \fBtypedef\fR causes a syntactic change in the
 harmed if you miss a few, but the program won't be formatted as nicely as
 it should.  This sounds like a painful thing to have to do, but it's really
 a symptom of a problem in C: \fBtypedef\fR causes a syntactic change in the
-language and \fIindent\fR can't find all \fBtypedef\fRs.
+laguage and \fIindent\fR can't find all \fBtypedef\fRs.
 .TP 15
 .B \-troff
 Causes
 .B indent
 to format the program for processing by troff.  It will produce a fancy
 listing in much the same spirit as
 .TP 15
 .B \-troff
 Causes
 .B indent
 to format the program for processing by troff.  It will produce a fancy
 listing in much the same spirit as
-.BR vgrind .
+.BR vgrind.
 If the output file is not specified, the default is standard output,
 rather than formatting in place.
 .TP 15
 .BR \-v , \-nv
 .B \-v
 If the output file is not specified, the default is standard output,
 rather than formatting in place.
 .TP 15
 .BR \-v , \-nv
 .B \-v
-turns on `verbose' mode;
+turns on `verbose' mode,
 .B \-nv
 turns it off.  When in verbose mode,
 .I indent
 .B \-nv
 turns it off.  When in verbose mode,
 .I indent
@@ -338,15 +330,13 @@ You may set up your own `profile' of defaults to
 .I indent
 by creating a file called
 .BI . indent . pro
 .I indent
 by creating a file called
 .BI . indent . pro
-in either your login directory and/or the current directory and including
-whatever switches you like.  Switches in `.indent.pro' in the current
-directory override those in your login directory (with the exception of
-.B -T
-type definitions, which just accumulate).  If
+in either your login directory or the current directory and including
+whatever switches you like.  A `.indent.pro' in the current directory takes
+precedence over the one in your login directory.  If
 .I indent
 is run and a profile file exists, then it is read to set up the program's
 .I indent
 is run and a profile file exists, then it is read to set up the program's
-defaults.  The switches should be separated by spaces, tabs or newlines.
-Switches on the command line, however, override profile switches.
+defaults.  Switches on the command line, though, always override profile
+switches.  The switches should be separated by spaces, tabs or newlines.
 .LP
 .B Comments
 .LP
 .LP
 .B Comments
 .LP
@@ -382,10 +372,10 @@ automatically extended in extreme cases.
 .B Preprocessor lines
 .LP
 In general, \fIindent\fR leaves preprocessor lines alone.  The only
 .B Preprocessor lines
 .LP
 In general, \fIindent\fR leaves preprocessor lines alone.  The only
-reformatting that it will do is to straighten up trailing comments.  It
-leaves embedded comments alone.  Conditional compilation
+reformmatting that it will do is to straighten up trailing comments.  It
+leaves imbedded comments alone.  Conditional compilation
 (\fB#ifdef...#endif\fR) is recognized and \fIindent\fR attempts to correctly
 (\fB#ifdef...#endif\fR) is recognized and \fIindent\fR attempts to correctly
-compensate for the syntactic peculiarities introduced.
+compensate for the syntactic peculiarites introduced.
 .LP
 .B C syntax
 .LP
 .LP
 .B C syntax
 .LP
@@ -403,11 +393,10 @@ is handled properly.
 .br
 \&./.indent.pro        profile file
 .br
 .br
 \&./.indent.pro        profile file
 .br
-~/.indent.pro  profile file
 .SH BUGS
 .I Indent
 has even more switches than \fIls\fR.
 .SH BUGS
 .I Indent
 has even more switches than \fIls\fR.
-.sp
+
 .ne 5
 A common mistake that often causes grief is typing:
 .nf
 .ne 5
 A common mistake that often causes grief is typing:
 .nf
index 311bd98..13004e7 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,10 +9,10 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
 #ifndef lint
 char copyright[] =
 
 #ifndef lint
 char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
-Copyright (c) 1976 Board of Trustees of the University of Illinois.\n\
+"@(#) Copyright (c) 1985 Sun Microsystems, Inc.\n\
+ @(#) Copyright (c) 1980 The Regents of the University of California.\n\
+ @(#) Copyright (c) 1976 Board of Trustees of the University of Illinois.\n\
  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)indent.c   5.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)indent.c   5.9 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
-/*
-NAME:
-indent main program
-  
-FUNCTION:
-This is the main program of the indent program.  Indent will take a C
-program source and reformat it into a semi-reasonable form.
-  
-ALGORITHM:
-The routine lexi scans tokens and passes them back one at a time to the
-main routine.  The subroutine parse takes care of much of the work of
-figuring indentation level.  
-  
-1) Call lexi
-2) Enter a monster switch statement on the code returned by lexi.  If 
-the indentation level for the line yet to be printed should be 
-changed, set the variable ps.ind_level.  If the indentation level for
-the following line should be changed, set the variable ps.i_l_follow.
-
-*/
-#include "indent_globs.h"
-#include "indent_codes.h"
-
-char       *in_name = "Standard Input";        /* will always point to name of
-                                        * input file */
-char       *out_name = "Standard Output";      /* will always point to
-                                                * name of output file */
-char        bakfile[32] = "";
+#include "indent_globs.h";
+#include "indent_codes.h";
+#include <sys/param.h>
+#include <ctype.h>
+
+char       *in_name = "Standard Input";        /* will always point to name of input
+                                        * file */
+char       *out_name = "Standard Output";      /* will always point to name
+                                                * of output file */
+char        bakfile[MAXPATHLEN] = "";
 
 main(argc, argv)
     int         argc;
     char      **argv;
 {
 
 main(argc, argv)
     int         argc;
     char      **argv;
 {
-    extern int found_err;      /* if any error occurred */
 
     int         dec_ind;       /* current indentation for declarations */
     int         di_stack[20];  /* a stack of structure indentation levels */
 
     int         dec_ind;       /* current indentation for declarations */
     int         di_stack[20];  /* a stack of structure indentation levels */
-    int         flushed_nl;    /* used when buffering up comments to
-                                * remember that a newline was passed over */
+    int         flushed_nl;    /* used when buffering up comments to remember
+                                * that a newline was passed over */
     int         force_nl;      /* when true, code must be broken */
     int         force_nl;      /* when true, code must be broken */
-    int         hd_type;       /* used to store type of stmt for if
-                                * (...), for (...), etc */
+    int         hd_type;       /* used to store type of stmt for if (...),
+                                * for (...), etc */
     register int i;            /* local loop counter */
     register int j;            /* local loop counter */
     register int i;            /* local loop counter */
     register int j;            /* local loop counter */
-    int         scase;         /* set to true when we see a case, so we
-                                * will know what to do with the following
-                                * colon */
+    int         scase;         /* set to true when we see a case, so we will
+                                * know what to do with the following colon */
     int         sp_sw;         /* when true, we are in the expressin of
                                 * if(...), while(...), etc. */
     int         squest;                /* when this is positive, we have seen a ?
     int         sp_sw;         /* when true, we are in the expressin of
                                 * if(...), while(...), etc. */
     int         squest;                /* when this is positive, we have seen a ?
@@ -92,12 +74,19 @@ main(argc, argv)
 
 
     ps.p_stack[0] = stmt;      /* this is the parser's stack */
 
 
     ps.p_stack[0] = stmt;      /* this is the parser's stack */
-    ps.last_nl = true;         /* this is true if the last thing scanned
-                                * was a newline */
+    ps.last_nl = true;         /* this is true if the last thing scanned was
+                                * a newline */
     ps.last_token = semicolon;
     ps.last_token = semicolon;
+    combuf = (char *) malloc(bufsize);
+    labbuf = (char *) malloc(bufsize);
+    codebuf = (char *) malloc(bufsize);
+    l_com = combuf + bufsize - 5;
+    l_lab = labbuf + bufsize - 5;
+    l_code = codebuf + bufsize - 5;
     combuf[0] = codebuf[0] = labbuf[0] = ' ';  /* set up code, label, and
                                                 * comment buffers */
     combuf[1] = codebuf[1] = labbuf[1] = '\0';
     combuf[0] = codebuf[0] = labbuf[0] = ' ';  /* set up code, label, and
                                                 * comment buffers */
     combuf[1] = codebuf[1] = labbuf[1] = '\0';
+    ps.else_if = 1;            /* Default else-if special processing to on */
     s_lab = e_lab = labbuf + 1;
     s_code = e_code = codebuf + 1;
     s_com = e_com = combuf + 1;
     s_lab = e_lab = labbuf + 1;
     s_code = e_code = codebuf + 1;
     s_com = e_com = combuf + 1;
@@ -124,28 +113,44 @@ main(argc, argv)
 
 
     /*--------------------------------------------------*\
 
 
     /*--------------------------------------------------*\
-    |   COMMAND LINE SCAN
+    |                  COMMAND LINE SCAN                |
     \*--------------------------------------------------*/
 
     \*--------------------------------------------------*/
 
-    set_defaults();
+#ifdef undef
+    max_col = 78;              /* -l78 */
+    lineup_to_parens = 1;      /* -lp */
+    ps.ljust_decl = 0;         /* -ndj */
+    ps.com_ind = 33;           /* -c33 */
+    star_comment_cont = 1;     /* -sc */
+    ps.ind_size = 8;           /* -i8 */
+    verbose = 0;
+    ps.decl_indent = 16;       /* -di16 */
+    ps.indent_parameters = 1;  /* -ip */
+    ps.decl_com_ind = 0;       /* if this is not set to some positive value
+                                * by an arg, we will set this equal to
+                                * ps.com_ind */
+    btype_2 = 1;               /* -br */
+    cuddle_else = 1;           /* -ce */
+    ps.unindent_displace = 0;  /* -d0 */
+    ps.case_indent = 0;                /* -cli0 */
+    format_col1_comments = 1;  /* -fc1 */
+    procnames_start_line = 1;  /* -psl */
+    proc_calls_space = 0;      /* -npcs */
+    comment_delimiter_on_blankline = 1;        /* -cdb */
+    ps.leave_comma = 1;                /* -nbc */
+#endif
 
 
-    /*
-     * Unfortunately, we must look for -npro here because the profiles
-     * are read before the command line arguments.
-     */
     for (i = 1; i < argc; ++i)
        if (strcmp(argv[i], "-npro") == 0)
            break;
     for (i = 1; i < argc; ++i)
        if (strcmp(argv[i], "-npro") == 0)
            break;
+    set_defaults();
     if (i >= argc)
        set_profile();
 
     if (i >= argc)
        set_profile();
 
-    input = 0;                 /* cancel -st if it was in the profiles, */
-    output = 0;                        /* as it doesn't make any sense there. */
-
     for (i = 1; i < argc; ++i) {
 
        /*
     for (i = 1; i < argc; ++i) {
 
        /*
-        * look thru args (if any) for changes to defaults 
+        * look thru args (if any) for changes to defaults
         */
        if (argv[i][0] != '-') {/* no flag on parameter */
            if (input == 0) {   /* we must have the input file */
         */
        if (argv[i][0] != '-') {/* no flag on parameter */
            if (input == 0) {   /* we must have the input file */
@@ -156,7 +161,8 @@ main(argc, argv)
                    exit(1);
                }
                continue;
                    exit(1);
                }
                continue;
-           } else if (output == 0) {   /* we have the output file */
+           }
+           else if (output == 0) {     /* we have the output file */
                out_name = argv[i];     /* remember name of output file */
                if (strcmp(in_name, out_name) == 0) {   /* attempt to overwrite
                                                         * the file */
                out_name = argv[i];     /* remember name of output file */
                if (strcmp(in_name, out_name) == 0) {   /* attempt to overwrite
                                                         * the file */
@@ -172,12 +178,12 @@ main(argc, argv)
            }
            fprintf(stderr, "indent: unknown parameter: %s\n", argv[i]);
            exit(1);
            }
            fprintf(stderr, "indent: unknown parameter: %s\n", argv[i]);
            exit(1);
-       } else
+       }
+       else
            set_option(argv[i]);
            set_option(argv[i]);
-
     }                          /* end of for */
     if (input == 0) {
     }                          /* end of for */
     if (input == 0) {
-       printf("Usage: indent file [ outfile ] [ options ]\n");
+       fprintf(stderr, "indent: usage: indent file [ outfile ] [ options ]\n");
        exit(1);
     }
     if (output == 0)
        exit(1);
     }
     if (output == 0)
@@ -187,24 +193,35 @@ main(argc, argv)
            out_name = in_name;
            bakcopy();
        }
            out_name = in_name;
            bakcopy();
        }
-
-    /*
-     * Adjust parameters that are out of range, or set defaults if
-     * no values were specified.
-     */
     if (ps.com_ind <= 1)
     if (ps.com_ind <= 1)
-       ps.com_ind = 2;         /* dont put normal comments before column
-                                * 2 */
+       ps.com_ind = 2;         /* dont put normal comments before column 2 */
+    if (troff) {
+       if (bodyf.font[0] == 0)
+           parsefont(&bodyf, "R");
+       if (scomf.font[0] == 0)
+           parsefont(&scomf, "I");
+       if (blkcomf.font[0] == 0)
+           blkcomf = scomf, blkcomf.size += 2;
+       if (boxcomf.font[0] == 0)
+           boxcomf = blkcomf;
+       if (stringf.font[0] == 0)
+           parsefont(&stringf, "L");
+       if (keywordf.font[0] == 0)
+           parsefont(&keywordf, "B");
+       writefdef(&bodyf, 'B');
+       writefdef(&scomf, 'C');
+       writefdef(&blkcomf, 'L');
+       writefdef(&boxcomf, 'X');
+       writefdef(&stringf, 'S');
+       writefdef(&keywordf, 'K');
+    }
     if (block_comment_max_col <= 0)
        block_comment_max_col = max_col;
     if (ps.decl_com_ind <= 0)  /* if not specified by user, set this */
     if (block_comment_max_col <= 0)
        block_comment_max_col = max_col;
     if (ps.decl_com_ind <= 0)  /* if not specified by user, set this */
-       ps.decl_com_ind = ps.ljust_decl ? ps.com_ind - 8 : ps.com_ind;
-    if (ps.decl_com_ind <= 1)
-       ps.decl_com_ind = 2;
+       ps.decl_com_ind = ps.ljust_decl ? (ps.com_ind <= 10 ? 2 : ps.com_ind - 8) : ps.com_ind;
     if (continuation_indent == 0)
        continuation_indent = ps.ind_size;
     if (continuation_indent == 0)
        continuation_indent = ps.ind_size;
-    fill_buffer();             /* get first batch of stuff into input
-                                * buffer */
+    fill_buffer();             /* get first batch of stuff into input buffer */
 
     parse(semicolon);
     {
 
     parse(semicolon);
     {
@@ -232,153 +249,148 @@ main(argc, argv)
                beg = p;
        fprintf(output, ".Fn \"%s\"\n", beg);
     }
                beg = p;
        fprintf(output, ".Fn \"%s\"\n", beg);
     }
-
     /*
     /*
-     * START OF MAIN LOOP 
+     * START OF MAIN LOOP
      */
 
      */
 
-    while (1) {                        /* this is the main loop.  it will go
-                                * until we reach eof */
+    while (1) {                        /* this is the main loop.  it will go until we
+                                * reach eof */
        int         is_procname;
 
        type_code = lexi();     /* lexi reads one token.  The actual
        int         is_procname;
 
        type_code = lexi();     /* lexi reads one token.  The actual
-                                * characters read are stored in "token".
-                                * lexi returns a code indicating the type
-                                * of token */
+                                * characters read are stored in "token". lexi
+                                * returns a code indicating the type of token */
        is_procname = ps.procname[0];
 
        /*
        is_procname = ps.procname[0];
 
        /*
-        * The following code moves everything following an if (), while
-        * (), else, etc. up to the start of the following stmt to a
-        * buffer.  This allows proper handling of both kinds of brace
-        * placement. 
+        * The following code moves everything following an if (), while (),
+        * else, etc. up to the start of the following stmt to a buffer. This
+        * allows proper handling of both kinds of brace placement.
         */
 
        flushed_nl = false;
        while (ps.search_brace) {       /* if we scanned an if(), while(),
         */
 
        flushed_nl = false;
        while (ps.search_brace) {       /* if we scanned an if(), while(),
-                                        * etc., we might need to copy
-                                        * stuff into a buffer we must
-                                        * loop, copying stuff into
-                                        * save_com, until we find the
-                                        * start of the stmt which follows
+                                        * etc., we might need to copy stuff
+                                        * into a buffer we must loop, copying
+                                        * stuff into save_com, until we find
+                                        * the start of the stmt which follows
                                         * the if, or whatever */
            switch (type_code) {
                                         * the if, or whatever */
            switch (type_code) {
-               case newline:
-                   ++line_no;
-                   flushed_nl = true;
-               case form_feed:
-                   break;      /* form feeds and newlines found here will
-                                * be ignored */
-
-               case lbrace:    /* this is a brace that starts the
-                                * compound stmt */
-                   if (sc_end == 0) {  /* ignore buffering if a comment
-                                        * wasnt stored up */
-                       ps.search_brace = false;
-                       goto check_type;
-                   }
-                   if (btype_2) {
-                       save_com[0] = '{';      /* we either want to put
-                                                * the brace right after
-                                                * the if */
-                       goto sw_buffer; /* go to common code to get out of
+           case newline:
+               ++line_no;
+               flushed_nl = true;
+           case form_feed:
+               break;          /* form feeds and newlines found here will be
+                                * ignored */
+
+           case lbrace:        /* this is a brace that starts the compound
+                                * stmt */
+               if (sc_end == 0) {      /* ignore buffering if a comment wasnt
+                                        * stored up */
+                   ps.search_brace = false;
+                   goto check_type;
+               }
+               if (btype_2) {
+                   save_com[0] = '{';  /* we either want to put the brace
+                                        * right after the if */
+                   goto sw_buffer;     /* go to common code to get out of
                                         * this loop */
                                         * this loop */
+               }
+           case comment:       /* we have a comment, so we must copy it into
+                                * the buffer */
+               if (!flushed_nl || sc_end != 0) {
+                   if (sc_end == 0) {  /* if this is the first comment, we
+                                        * must set up the buffer */
+                       save_com[0] = save_com[1] = ' ';
+                       sc_end = &(save_com[2]);
                    }
                    }
-               case comment:   /* we have a comment, so we must copy it
-                                * into the buffer */
-                   if (!flushed_nl) {
-                       if (sc_end == 0) {      /* if this is the first
-                                                * comment, we must set up
-                                                * the buffer */
-                           save_com[0] = save_com[1] = ' ';
-                           sc_end = &(save_com[2]);
-                       } else {
-                           *sc_end++ = '\n';   /* add newline between
+                   else {
+                       *sc_end++ = '\n';       /* add newline between
                                                 * comments */
                                                 * comments */
-                           *sc_end++ = ' ';
-                           --line_no;
-                       }
-                       *sc_end++ = '/';        /* copy in start of
-                                                * comment */
-                       *sc_end++ = '*';
+                       *sc_end++ = ' ';
+                       --line_no;
+                   }
+                   *sc_end++ = '/';    /* copy in start of comment */
+                   *sc_end++ = '*';
 
 
-                       for (;;) {      /* loop until we get to the end of
-                                        * the comment */
-                           *sc_end = *buf_ptr++;
-                           if (buf_ptr >= buf_end)
-                               fill_buffer();
+                   for (;;) {  /* loop until we get to the end of the comment */
+                       *sc_end = *buf_ptr++;
+                       if (buf_ptr >= buf_end)
+                           fill_buffer();
 
 
-                           if (*sc_end++ == '*' && *buf_ptr == '/')
-                               break;  /* we are at end of comment */
+                       if (*sc_end++ == '*' && *buf_ptr == '/')
+                           break;      /* we are at end of comment */
 
 
-                           if (sc_end >= &(save_com[sc_size])) {       /* check for temp buffer
-                                                                        * overflow */
-                               diag(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever.");
-                               fflush(output);
-                               exit(1);
-                           }
+                       if (sc_end >= &(save_com[sc_size])) {   /* check for temp buffer
+                                                                * overflow */
+                           diag(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever.");
+                           fflush(output);
+                           exit(1);
                        }
                        }
-                       *sc_end++ = '/';        /* add ending slash */
-                       if (++buf_ptr >= buf_end)       /* get past / in buffer */
-                           fill_buffer();
-                       break;
                    }
                    }
-               default:        /* it is the start of a normal statment */
-                   if (flushed_nl)     /* if we flushed a newline, make
-                                        * sure it is put back */
-                       force_nl = true;
-                   if (type_code == sp_paren && *token == 'i'
+                   *sc_end++ = '/';    /* add ending slash */
+                   if (++buf_ptr >= buf_end)   /* get past / in buffer */
+                       fill_buffer();
+                   break;
+               }
+           default:            /* it is the start of a normal statment */
+               if (flushed_nl) /* if we flushed a newline, make sure it is
+                                * put back */
+                   force_nl = true;
+               if (type_code == sp_paren && *token == 'i'
                        && last_else && ps.else_if
                        || type_code == sp_nparen && *token == 'e'
                        && e_code != s_code && e_code[-1] == '}')
                        && last_else && ps.else_if
                        || type_code == sp_nparen && *token == 'e'
                        && e_code != s_code && e_code[-1] == '}')
-                       force_nl = false;
-
-                   if (sc_end == 0) {  /* ignore buffering if comment
-                                        * wasnt saved up */
-                       ps.search_brace = false;
-                       goto check_type;
-                   }
-                   if (force_nl) {     /* if we should insert a nl here,
-                                        * put it into the buffer */
-                       force_nl = false;
-                       --line_no;      /* this will be re-increased when
-                                        * the nl is read from the buffer */
-                       *sc_end++ = '\n';
-                       *sc_end++ = ' ';
-                       if (verbose && !flushed_nl)     /* print error msg if
-                                                        * the line was not
-                                                        * already broken */
-                           diag(0, "Line broken");
-                       flushed_nl = false;
-                   }
-                   for (t_ptr = token; *t_ptr; ++t_ptr)
-                       *sc_end++ = *t_ptr;     /* copy token into temp
-                                                * buffer */
+                   force_nl = false;
 
 
-           sw_buffer:
-                   ps.search_brace = false;    /* stop looking for start
-                                                * of stmt */
-                   bp_save = buf_ptr;  /* save current input buffer */
-                   be_save = buf_end;
-                   buf_ptr = save_com; /* fix so that subsequent calls to
+               if (sc_end == 0) {      /* ignore buffering if comment wasnt
+                                        * saved up */
+                   ps.search_brace = false;
+                   goto check_type;
+               }
+               if (force_nl) { /* if we should insert a nl here, put it into
+                                * the buffer */
+                   force_nl = false;
+                   --line_no;  /* this will be re-increased when the nl is
+                                * read from the buffer */
+                   *sc_end++ = '\n';
+                   *sc_end++ = ' ';
+                   if (verbose && !flushed_nl) /* print error msg if the line
+                                                * was not already broken */
+                       diag(0, "Line broken");
+                   flushed_nl = false;
+               }
+               for (t_ptr = token; *t_ptr; ++t_ptr)
+                   *sc_end++ = *t_ptr; /* copy token into temp buffer */
+               ps.procname[0] = 0;
+
+       sw_buffer:
+               ps.search_brace = false;        /* stop looking for start of
+                                                * stmt */
+               bp_save = buf_ptr;      /* save current input buffer */
+               be_save = buf_end;
+               buf_ptr = save_com;     /* fix so that subsequent calls to
                                         * lexi will take tokens out of
                                         * save_com */
                                         * lexi will take tokens out of
                                         * save_com */
-                   *sc_end++ = ' ';    /* add trailing blank, just in
-                                        * case */
-                   buf_end = sc_end;
-                   sc_end = 0;
-                   break;
+               *sc_end++ = ' ';/* add trailing blank, just in case */
+               buf_end = sc_end;
+               sc_end = 0;
+               break;
            }                   /* end of switch */
            }                   /* end of switch */
-           if (type_code != 0) /* we must make this check, just in case
-                                * there was an unexpected EOF */
+           if (type_code != 0) /* we must make this check, just in case there
+                                * was an unexpected EOF */
                type_code = lexi();     /* read another token */
                type_code = lexi();     /* read another token */
-           is_procname = ps.procname[0];
-       }                       /* end of while (serach_brace) */
+           /* if (ps.search_brace) ps.procname[0] = 0; */
+           if ((is_procname = ps.procname[0]) && flushed_nl
+                   && !procnames_start_line && ps.in_decl
+                   && type_code == ident)
+               flushed_nl = 0;
+       }                       /* end of while (search_brace) */
        last_else = 0;
 check_type:
        if (type_code == 0) {   /* we got eof */
            if (s_lab != e_lab || s_code != e_code
        last_else = 0;
 check_type:
        if (type_code == 0) {   /* we got eof */
            if (s_lab != e_lab || s_code != e_code
-               || s_com != e_com)      /* must dump end of line */
+                   || s_com != e_com)  /* must dump end of line */
                dump_line();
            if (ps.tos > 1)     /* check for balanced braces */
                diag(1, "Stuff missing from end of file.");
                dump_line();
            if (ps.tos > 1)     /* check for balanced braces */
                diag(1, "Stuff missing from end of file.");
@@ -390,22 +402,17 @@ check_type:
                       (1.0 * ps.com_lines) / code_lines);
            }
            fflush(output);
                       (1.0 * ps.com_lines) / code_lines);
            }
            fflush(output);
-           exit(ps.tos > 1 || found_err);
+           exit(1);
        }
        if (
        }
        if (
-           (type_code != comment) &&
-           (type_code != newline) &&
-           (type_code != preesc) &&
-           (type_code != form_feed)) {
-           if (
-               force_nl
-               &&
-               (type_code != semicolon) &&
-               (
-                type_code != lbrace
-                ||
-                !btype_2
-                )) {           /* we should force a broken line here */
+               (type_code != comment) &&
+               (type_code != newline) &&
+               (type_code != preesc) &&
+               (type_code != form_feed)) {
+           if (force_nl &&
+                   (type_code != semicolon) &&
+                   (type_code != lbrace || !btype_2)) {
+               /* we should force a broken line here */
                if (verbose && !flushed_nl)
                    diag(0, "Line broken");
                flushed_nl = false;
                if (verbose && !flushed_nl)
                    diag(0, "Line broken");
                flushed_nl = false;
@@ -413,665 +420,705 @@ check_type:
                ps.want_blank = false;  /* dont insert blank at line start */
                force_nl = false;
            }
                ps.want_blank = false;  /* dont insert blank at line start */
                force_nl = false;
            }
-           ps.in_stmt = true;  /* turn on flag which causes an extra
-                                * level of indentation. this is turned
-                                * off by a ; or '}' */
-           if (s_com != e_com) {       /* the turkey has embedded a
-                                        * comment in a line. fix it */
+           ps.in_stmt = true;  /* turn on flag which causes an extra level of
+                                * indentation. this is turned off by a ; or
+                                * '}' */
+           if (s_com != e_com) {       /* the turkey has embedded a comment
+                                        * in a line. fix it */
                *e_code++ = ' ';
                *e_code++ = ' ';
-               for (t_ptr = s_com; *t_ptr; ++t_ptr)
+               for (t_ptr = s_com; *t_ptr; ++t_ptr) {
+                   check_size(code);
                    *e_code++ = *t_ptr;
                    *e_code++ = *t_ptr;
+               }
                *e_code++ = ' ';
                *e_code = '\0'; /* null terminate code sect */
                ps.want_blank = false;
                e_com = s_com;
            }
                *e_code++ = ' ';
                *e_code = '\0'; /* null terminate code sect */
                ps.want_blank = false;
                e_com = s_com;
            }
-       } else if (type_code != comment)        /* preserve force_nl thru
-                                                * a comment */
-           force_nl = false;
-
-       /*
-        * cancel forced newline after newline, form feed, etc 
-        */
+       }
+       else if (type_code != comment)  /* preserve force_nl thru a comment */
+           force_nl = false;   /* cancel forced newline after newline, form
+                                * feed, etc */
 
 
 
 
 
 
-       /*----------------------------------------------------*\
-       |   do switch on type of token scanned
-       \*----------------------------------------------------*/
+       /*-----------------------------------------------------*\
+       |          do switch on type of token scanned           |
+       \*-----------------------------------------------------*/
+       check_size(code);
        switch (type_code) {    /* now, decide what to do with the token */
 
        switch (type_code) {    /* now, decide what to do with the token */
 
-           case form_feed:     /* found a form feed in line */
-               ps.use_ff = true;       /* a form feed is treated much
-                                        * like a newline */
+       case form_feed: /* found a form feed in line */
+           ps.use_ff = true;   /* a form feed is treated much like a newline */
+           dump_line();
+           ps.want_blank = false;
+           break;
+
+       case newline:
+           if (ps.last_token != comma || ps.p_l_follow > 0
+                   || !ps.leave_comma || ps.block_init || !break_comma || s_com != e_com) {
                dump_line();
                ps.want_blank = false;
                dump_line();
                ps.want_blank = false;
-               break;
-
-           case newline:
-               if (ps.last_token != comma || ps.p_l_follow > 0
-                   || !ps.leave_comma || !break_comma || s_com != e_com) {
-                   dump_line();
-                   ps.want_blank = false;
-               }
-               ++line_no;      /* keep track of input line number */
-               break;
+           }
+           ++line_no;          /* keep track of input line number */
+           break;
 
 
-           case lparen:        /* got a '(' or '[' */
-               ++ps.p_l_follow;/* count parens to make Healy happy */
-               if (ps.want_blank && *token != '[' &&
+       case lparen:            /* got a '(' or '[' */
+           ++ps.p_l_follow;    /* count parens to make Healy happy */
+           if (ps.want_blank && *token != '[' &&
                    (ps.last_token != ident || proc_calls_space
                    (ps.last_token != ident || proc_calls_space
-                    || (ps.its_a_keyword && !ps.sizeof_keyword)))
-                   *e_code++ = ' ';
-               if (ps.in_decl && !ps.block_init)
-                   if (troff && !ps.dumped_decl_indent) {
-                       ps.dumped_decl_indent = 1;
-                       sprintf(e_code, "\\c\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
-                       e_code += strlen(e_code);
-                   } else {
-                       while ((e_code - s_code) < dec_ind)
-                           *e_code++ = ' ';
-                       *e_code++ = token[0];
-               } else
+             || (ps.its_a_keyword && (!ps.sizeof_keyword || Bill_Shannon))))
+               *e_code++ = ' ';
+           if (ps.in_decl && !ps.block_init)
+               if (troff && !ps.dumped_decl_indent && !is_procname && ps.last_token == decl) {
+                   ps.dumped_decl_indent = 1;
+                   sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
+                   e_code += strlen(e_code);
+               }
+               else {
+                   while ((e_code - s_code) < dec_ind) {
+                       check_size(code);
+                       *e_code++ = ' ';
+                   }
                    *e_code++ = token[0];
                    *e_code++ = token[0];
-               ps.paren_indents[ps.p_l_follow - 1] = e_code - s_code;
-               ps.want_blank = false;
-               if (ps.in_or_st && *token == '(') {
-
-                   /*
-                    * this is a kluge to make sure that declarations will
-                    * be aligned right if proc decl has an explicit type
-                    * on it, i.e. "int a(x) {..." 
-                    */
-                   parse(semicolon);   /* I said this was a kluge... */
-                   ps.in_or_st = false;        /* turn off flag for
-                                                * structure decl or
-                                                * initialization */
                }
                }
-               if (ps.sizeof_keyword) ps.sizeof_mask |= 1<<ps.p_l_follow;
-               break;
+           else
+               *e_code++ = token[0];
+           ps.paren_indents[ps.p_l_follow - 1] = e_code - s_code;
+           if (sp_sw && ps.p_l_follow == 1 && extra_expression_indent
+                   && ps.paren_indents[0] < 2 * ps.ind_size)
+               ps.paren_indents[0] = 2 * ps.ind_size;
+           ps.want_blank = false;
+           if (ps.in_or_st && *token == '(' && ps.tos <= 2) {
+               /*
+                * this is a kluge to make sure that declarations will be
+                * aligned right if proc decl has an explicit type on it, i.e.
+                * "int a(x) {..."
+                */
+               parse(semicolon);       /* I said this was a kluge... */
+               ps.in_or_st = false;    /* turn off flag for structure decl or
+                                        * initialization */
+           }
+           if (ps.sizeof_keyword)
+               ps.sizeof_mask |= 1 << ps.p_l_follow;
+           break;
 
 
-           case rparen:        /* got a ')' or ']' */
-               if (ps.cast_mask & (1 << ps.p_l_follow) & ~ps.sizeof_mask) {
-                   ps.last_u_d = true;
-                   ps.cast_mask &= (1 << ps.p_l_follow) - 1;
-               }
-               ps.sizeof_mask &= (1 << ps.p_l_follow) - 1;
-               if (--ps.p_l_follow < 0) {
-                   ps.p_l_follow = 0;
-                   diag(0, "Extra %c", *token);
-               }
-               if (e_code == s_code)   /* if the paren starts the line */
-                   ps.paren_level = ps.p_l_follow;     /* then indent it */
+       case rparen:            /* got a ')' or ']' */
+           if (ps.cast_mask & (1 << ps.p_l_follow) & ~ps.sizeof_mask) {
+               ps.last_u_d = true;
+               ps.cast_mask &= (1 << ps.p_l_follow) - 1;
+           }
+           ps.sizeof_mask &= (1 << ps.p_l_follow) - 1;
+           if (--ps.p_l_follow < 0) {
+               ps.p_l_follow = 0;
+               diag(0, "Extra %c", *token);
+           }
+           if (e_code == s_code)       /* if the paren starts the line */
+               ps.paren_level = ps.p_l_follow; /* then indent it */
 
 
-               *e_code++ = token[0];
-               ps.want_blank = true;
+           *e_code++ = token[0];
+           ps.want_blank = true;
 
 
-               if (sp_sw && (ps.p_l_follow == 0)) {    /* check for end of if
+           if (sp_sw && (ps.p_l_follow == 0)) {        /* check for end of if
                                                         * (...), or some such */
                                                         * (...), or some such */
-                   sp_sw = false;
-                   force_nl = true;    /* must force newline after if */
-                   ps.last_u_d = true; /* inform lexi that a following
+               sp_sw = false;
+               force_nl = true;/* must force newline after if */
+               ps.last_u_d = true;     /* inform lexi that a following
                                         * operator is unary */
                                         * operator is unary */
-                   ps.in_stmt = false; /* dont use stmt continuation
+               ps.in_stmt = false;     /* dont use stmt continuation
                                         * indentation */
 
                                         * indentation */
 
-                   parse(hd_type);     /* let parser worry about if, or
-                                        * whatever */
-               }
-               ps.search_brace = btype_2;      /* this should insure that
-                                                * constructs such as
-                                                * main(){...} and
-                                                * int[]{...} have their
-                                                * braces put in the right
-                                                * place */
-               break;
+               parse(hd_type); /* let parser worry about if, or whatever */
+           }
+           ps.search_brace = btype_2;  /* this should insure that constructs
+                                        * such as main(){...} and int[]{...}
+                                        * have their braces put in the right
+                                        * place */
+           break;
 
 
-           case unary_op:      /* this could be any unary operation */
-               if (ps.want_blank)
-                   *e_code++ = ' ';
+       case unary_op:          /* this could be any unary operation */
+           if (ps.want_blank)
+               *e_code++ = ' ';
 
 
-               if (troff && !ps.dumped_decl_indent && ps.in_decl) {
-                   sprintf(e_code, "\\c\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
-                   ps.dumped_decl_indent = 1;
-                   e_code += strlen(e_code);
-               } else {
-                   char       *res = token;
+           if (troff && !ps.dumped_decl_indent && ps.in_decl && !is_procname) {
+               sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
+               ps.dumped_decl_indent = 1;
+               e_code += strlen(e_code);
+           }
+           else {
+               char       *res = token;
 
 
-                   if (ps.in_decl && !ps.block_init) { /* if this is a unary op
+               if (ps.in_decl && !ps.block_init) {     /* if this is a unary op
                                                         * in a declaration, we
                                                         * should indent this
                                                         * token */
                                                         * in a declaration, we
                                                         * should indent this
                                                         * token */
-                       for (i = 0; token[i]; ++i);     /* find length of token */
-                       while ((e_code - s_code) < (dec_ind - i))
-                           *e_code++ = ' ';    /* pad it */
+                   for (i = 0; token[i]; ++i); /* find length of token */
+                   while ((e_code - s_code) < (dec_ind - i)) {
+                       check_size(code);
+                       *e_code++ = ' ';        /* pad it */
                    }
                    }
-                   if (troff && token[0] == '-' && token[1] == '>')
-                       res = "\\(->";
-                   for (t_ptr = res; *t_ptr; ++t_ptr)
-                       *e_code++ = *t_ptr;
                }
                }
-               ps.want_blank = false;
-               break;
+               if (troff && token[0] == '-' && token[1] == '>')
+                   res = "\\(->";
+               for (t_ptr = res; *t_ptr; ++t_ptr) {
+                   check_size(code);
+                   *e_code++ = *t_ptr;
+               }
+           }
+           ps.want_blank = false;
+           break;
 
 
-           case binary_op:     /* any binary operation */
-       do_binary:
-               if (ps.want_blank)
-                   *e_code++ = ' ';
-               {
-                   char       *res = token;
-
-                   if (troff)
-                       switch (token[0]) {
-                           case '<':
-                               if (token[1] == '=')
-                                   res = "\\(<=";
-                               break;
-                           case '>':
-                               if (token[1] == '=')
-                                   res = "\\(>=";
-                               break;
-                           case '!':
-                               if (token[1] == '=')
-                                   res = "\\(!=";
-                               break;
-                           case '|':
-                               if (token[1] == '|')
-                                   res = "\\(br\\(br";
-                               else if (token[1] == 0)
-                                   res = "\\(br";
-                               break;
-                           case '-':
-                               if (token[1] == '>')
-                                   res = "\\(->";
-                       }
-                   for (t_ptr = res; *t_ptr; ++t_ptr)
-                       *e_code++ = *t_ptr;     /* move the operator */
+       case binary_op: /* any binary operation */
+    do_binary:
+           if (ps.want_blank)
+               *e_code++ = ' ';
+           {
+               char       *res = token;
+
+               if (troff)
+                   switch (token[0]) {
+                   case '<':
+                       if (token[1] == '=')
+                           res = "\\(<=";
+                       break;
+                   case '>':
+                       if (token[1] == '=')
+                           res = "\\(>=";
+                       break;
+                   case '!':
+                       if (token[1] == '=')
+                           res = "\\(!=";
+                       break;
+                   case '|':
+                       if (token[1] == '|')
+                           res = "\\(br\\(br";
+                       else if (token[1] == 0)
+                           res = "\\(br";
+                       break;
+                   }
+               for (t_ptr = res; *t_ptr; ++t_ptr) {
+                   check_size(code);
+                   *e_code++ = *t_ptr; /* move the operator */
                }
                }
-               ps.want_blank = true;
-               break;
+           }
+           ps.want_blank = true;
+           break;
 
 
-           case postop:        /* got a trailing ++ or -- */
-               *e_code++ = token[0];
-               *e_code++ = token[1];
-               ps.want_blank = true;
-               break;
+       case postop:            /* got a trailing ++ or -- */
+           *e_code++ = token[0];
+           *e_code++ = token[1];
+           ps.want_blank = true;
+           break;
 
 
-           case question:      /* got a ? */
-               squest++;       /* this will be used when a later colon
+       case question:          /* got a ? */
+           squest++;           /* this will be used when a later colon
                                 * appears so we can distinguish the
                                 * <c>?<n>:<n> construct */
                                 * appears so we can distinguish the
                                 * <c>?<n>:<n> construct */
+           if (ps.want_blank)
+               *e_code++ = ' ';
+           *e_code++ = '?';
+           ps.want_blank = true;
+           break;
+
+       case casestmt:          /* got word 'case' or 'default' */
+           scase = true;       /* so we can process the later colon properly */
+           goto copy_id;
+
+       case colon:             /* got a ':' */
+           if (squest > 0) {   /* it is part of the <c>?<n>: <n> construct */
+               --squest;
                if (ps.want_blank)
                    *e_code++ = ' ';
                if (ps.want_blank)
                    *e_code++ = ' ';
-               *e_code++ = '?';
+               *e_code++ = ':';
                ps.want_blank = true;
                break;
                ps.want_blank = true;
                break;
-
-           case casestmt:      /* got word 'case' or 'default' */
-               scase = true;   /* so we can process the later colon
-                                * properly */
-               goto copy_id;
-
-           case colon: /* got a ':' */
-               if (squest > 0) {       /* it is part of the <c>?<n>: <n>
-                                        * construct */
-                   --squest;
-                   if (ps.want_blank)
-                       *e_code++ = ' ';
-                   *e_code++ = ':';
-                   ps.want_blank = true;
-                   break;
-               }
-               if (ps.in_decl) {
-                   *e_code++ = ':';
-                   ps.want_blank = false;
-                   break;
-               }
-               ps.in_stmt = false;     /* seeing a label does not imply
-                                        * we are in a stmt */
-               for (t_ptr = s_code; *t_ptr; ++t_ptr)
-                   *e_lab++ = *t_ptr;  /* turn everything so far into a
-                                        * label */
-               e_code = s_code;
-               *e_lab++ = ':';
-               *e_lab++ = ' ';
-               *e_lab = '\0';
-
-               force_nl = ps.pcase = scase;    /* ps.pcase will be used
-                                                * by dump_line to decide
-                                                * how to indent the
-                                                * label. force_nl will
-                                                * force a case n: to be
-                                                * on a line by itself */
-               scase = false;
+           }
+           if (ps.in_decl) {
+               *e_code++ = ':';
                ps.want_blank = false;
                break;
                ps.want_blank = false;
                break;
+           }
+           ps.in_stmt = false; /* seeing a label does not imply we are in a
+                                * stmt */
+           for (t_ptr = s_code; *t_ptr; ++t_ptr)
+               *e_lab++ = *t_ptr;      /* turn everything so far into a label */
+           e_code = s_code;
+           *e_lab++ = ':';
+           *e_lab++ = ' ';
+           *e_lab = '\0';
+
+           force_nl = ps.pcase = scase;        /* ps.pcase will be used by
+                                                * dump_line to decide how to
+                                                * indent the label. force_nl
+                                                * will force a case n: to be
+                                                * on a line by itself */
+           scase = false;
+           ps.want_blank = false;
+           break;
 
 
-           case semicolon:     /* got a ';' */
-               ps.in_or_st = false;    /* we are not in an initialization
-                                        * or structure declaration */
-               scase = false;  /* these will only need resetting in a
-                                * error */
-               squest = 0;
-               if (ps.last_token == rparen)
-                   ps.in_parameter_declaration = 0;
-               ps.cast_mask = 0;
-               ps.sizeof_mask = 0;
-               ps.block_init = 0;
-               ps.just_saw_decl--;
-
-               if (ps.in_decl && s_code == e_code && !ps.block_init)
-                   while ((e_code - s_code) < (dec_ind - 1))
-                       *e_code++ = ' ';
+       case semicolon: /* got a ';' */
+           ps.in_or_st = false;/* we are not in an initialization or
+                                * structure declaration */
+           scase = false;      /* these will only need resetting in a error */
+           squest = 0;
+           if (ps.last_token == rparen)
+               ps.in_parameter_declaration = 0;
+           ps.cast_mask = 0;
+           ps.sizeof_mask = 0;
+           ps.block_init = 0;
+           ps.block_init_level = 0;
+           ps.just_saw_decl--;
+
+           if (ps.in_decl && s_code == e_code && !ps.block_init)
+               while ((e_code - s_code) < (dec_ind - 1)) {
+                   check_size(code);
+                   *e_code++ = ' ';
+               }
 
 
-               ps.in_decl = (ps.dec_nest > 0); /* if we were in a first
-                                                * level structure
-                                                * declaration, we arent
-                                                * any more */
+           ps.in_decl = (ps.dec_nest > 0);     /* if we were in a first level
+                                                * structure declaration, we
+                                                * arent any more */
 
 
-               if ((!sp_sw || hd_type != forstmt) && ps.p_l_follow > 0) {
+           if ((!sp_sw || hd_type != forstmt) && ps.p_l_follow > 0) {
 
 
-                   /*
-                    * This should be true iff there were unbalanced
-                    * parens in the stmt.  It is a bit complicated,
-                    * because the semicolon might be in a for stmt 
-                    */
-                   diag(1, "Unbalanced parens");
-                   ps.p_l_follow = 0;
-                   if (sp_sw) {/* this is a check for a if, while, etc.
-                                * with unbalanced parens */
-                       sp_sw = false;
-                       parse(hd_type); /* dont lose the if, or whatever */
-                   }
-               }
-               *e_code++ = ';';
-               ps.want_blank = true;
-               ps.in_stmt = (ps.p_l_follow > 0);       /* we are no longer in
-                                                        * the middle of a stmt */
-
-               if (!sp_sw) {   /* if not if for (;;) */
-                   parse(semicolon);   /* let parser know about end of
-                                        * stmt */
-                   force_nl = true;    /* force newline after a end of
-                                        * stmt */
+               /*
+                * This should be true iff there were unbalanced parens in the
+                * stmt.  It is a bit complicated, because the semicolon might
+                * be in a for stmt
+                */
+               diag(1, "Unbalanced parens");
+               ps.p_l_follow = 0;
+               if (sp_sw) {    /* this is a check for a if, while, etc. with
+                                * unbalanced parens */
+                   sp_sw = false;
+                   parse(hd_type);     /* dont lose the if, or whatever */
                }
                }
-               break;
+           }
+           *e_code++ = ';';
+           ps.want_blank = true;
+           ps.in_stmt = (ps.p_l_follow > 0);   /* we are no longer in the
+                                                * middle of a stmt */
+
+           if (!sp_sw) {       /* if not if for (;;) */
+               parse(semicolon);       /* let parser know about end of stmt */
+               force_nl = true;/* force newline after a end of stmt */
+           }
+           break;
 
 
-           case lbrace:        /* got a '{' */
-               ps.in_stmt = false;     /* dont indent the {} */
-               if (!ps.block_init)
-                   force_nl = true;    /* force other stuff on same line
-                                        * as '{' onto new line */
+       case lbrace:            /* got a '{' */
+           ps.in_stmt = false; /* dont indent the {} */
+           if (!ps.block_init)
+               force_nl = true;/* force other stuff on same line as '{' onto
+                                * new line */
+           else if (ps.block_init_level <= 0)
+               ps.block_init_level = 1;
+           else
+               ps.block_init_level++;
 
 
-               if (s_code != e_code && !ps.block_init) {
-                   if (!btype_2) {
-                       dump_line();
-                       ps.want_blank = false;
-                   } else if (ps.in_parameter_declaration && !ps.in_or_st) {
-                       ps.i_l_follow = 0;
-                       dump_line();
-                       ps.want_blank = false;
-                   }
-               }
-               if (ps.in_parameter_declaration)
-                   prefix_blankline_requested = 0;
-
-               if (ps.p_l_follow > 0) {        /* check for preceding
-                                                * unbalanced parens */
-                   diag(1, "Unbalanced parens");
-                   ps.p_l_follow = 0;
-                   if (sp_sw) {/* check for unclosed if, for, etc. */
-                       sp_sw = false;
-                       parse(hd_type);
-                       ps.ind_level = ps.i_l_follow;
-                   }
+           if (s_code != e_code && !ps.block_init) {
+               if (!btype_2) {
+                   dump_line();
+                   ps.want_blank = false;
                }
                }
-               if (s_code == e_code)
-                   ps.ind_stmt = false;        /* dont put extra
-                                                * indentation on line
-                                                * with '{' */
-               if (ps.in_decl && ps.in_or_st) {        /* this is either a
-                                                        * structure declaration
-                                                        * or an init */
-                   di_stack[ps.dec_nest++] = dec_ind;
-                   dec_ind = 0;
-               } else {
-                   ps.decl_on_line = false;    /* we cant be in the
-                                                * middle of a
-                                                * declaration, so dont do
-                                                * special indentation of
-                                                * comments */
-                   ps.in_parameter_declaration = 0;
+               else if (ps.in_parameter_declaration && !ps.in_or_st) {
+                   ps.i_l_follow = 0;
+                   dump_line();
+                   ps.want_blank = false;
                }
                }
-               parse(lbrace);  /* let parser know about this */
-               if (ps.want_blank)      /* put a blank before '{' if '{'
-                                        * is not at start of line */
-                   *e_code++ = ' ';
-               ps.want_blank = false;
-               *e_code++ = '{';
-               ps.just_saw_decl = 0;
-               break;
+           }
+           if (ps.in_parameter_declaration)
+               prefix_blankline_requested = 0;
 
 
-           case rbrace:        /* got a '}' */
-               if (ps.p_l_follow) {    /* check for unclosed if, for,
-                                        * else. */
-                   diag(1, "Unbalanced parens");
-                   ps.p_l_follow = 0;
+           if (ps.p_l_follow > 0) {    /* check for preceeding unbalanced
+                                        * parens */
+               diag(1, "Unbalanced parens");
+               ps.p_l_follow = 0;
+               if (sp_sw) {    /* check for unclosed if, for, etc. */
                    sp_sw = false;
                    sp_sw = false;
+                   parse(hd_type);
+                   ps.ind_level = ps.i_l_follow;
                }
                }
-               ps.just_saw_decl = 0;
-               if (s_code != e_code && !ps.block_init) {       /* '}' must be first on
-                                                                * line */
-                   if (verbose)
-                       diag(0, "Line broken");
-                   dump_line();
-               }
-               *e_code++ = '}';
-               ps.want_blank = true;
-               ps.in_stmt = ps.ind_stmt = false;
-               if (ps.dec_nest > 0) {  /* we are in multi-level structure
-                                        * declaration */
-                   dec_ind = di_stack[--ps.dec_nest];
-                   if (ps.dec_nest == 0 && !ps.in_parameter_declaration)
-                       ps.just_saw_decl = 2;
-                   ps.in_decl = true;
-               }
-               prefix_blankline_requested = 0;
-               parse(rbrace);  /* let parser know about this */
-               ps.search_brace = cuddle_else && ps.p_stack[ps.tos] == ifhead && ps.il[ps.tos] >= ps.ind_level;
-               if (ps.tos <= 1 && blanklines_after_procs && ps.dec_nest <= 0)
+           }
+           if (s_code == e_code)
+               ps.ind_stmt = false;    /* dont put extra indentation on line
+                                        * with '{' */
+           if (ps.in_decl && ps.in_or_st) {    /* this is either a structure
+                                                * declaration or an init */
+               di_stack[ps.dec_nest++] = dec_ind;
+               /* ?            dec_ind = 0; */
+           }
+           else {
+               ps.decl_on_line = false;        /* we cant be in the middle of
+                                                * a declaration, so dont do
+                                                * special indentation of
+                                                * comments */
+               if (blanklines_after_declarations_at_proctop
+                       && ps.in_parameter_declaration)
                    postfix_blankline_requested = 1;
                    postfix_blankline_requested = 1;
-               break;
-
-           case swstmt:        /* got keyword "switch" */
-               sp_sw = true;
-               hd_type = swstmt;       /* keep this for when we have seen
-                                        * the expression */
-               goto copy_id;   /* go move the token into buffer */
-
-           case sp_paren:      /* token is if, while, for */
-               sp_sw = true;   /* the interesting stuff is done after the
-                                * expression is scanned */
-               hd_type = (*token == 'i' ? ifstmt :
-                          (*token == 'w' ? whilestmt : forstmt));
-
-               /*
-                * remember the type of header for later use by parser 
-                */
-               goto copy_id;   /* copy the token into line */
+               ps.in_parameter_declaration = 0;
+           }
+           dec_ind = 0;
+           parse(lbrace);      /* let parser know about this */
+           if (ps.want_blank)  /* put a blank before '{' if '{' is not at
+                                * start of line */
+               *e_code++ = ' ';
+           ps.want_blank = false;
+           *e_code++ = '{';
+           ps.just_saw_decl = 0;
+           break;
 
 
-           case sp_nparen:     /* got else, do */
-               ps.in_stmt = false;
-               if (*token == 'e') {
-                   if (e_code != s_code && (!cuddle_else || e_code[-1] != '}')) {
-                       if (verbose)
-                           diag(0, "Line broken");
-                       dump_line();    /* make sure this starts a line */
-                       ps.want_blank = false;
-                   }
-                   force_nl = true;    /* also, following stuff must go
-                                        * onto new line */
-                   last_else = 1;
-                   parse(elselit);
-               } else {
-                   if (e_code != s_code) {     /* make sure this starts a
-                                                * line */
-                       if (verbose)
-                           diag(0, "Line broken");
-                       dump_line();
-                       ps.want_blank = false;
-                   }
-                   force_nl = true;    /* also, following stuff must go
-                                        * onto new line */
-                   last_else = 0;
-                   parse(dolit);
-               }
-               goto copy_id;   /* move the token into line */
-
-           case decl:          /* we have a declaration type (int,
-                                * register, etc.) */
-               parse(decl);    /* let parser worry about indentation */
-               if (ps.last_token == rparen && ps.tos <= 1)
-                   ps.in_parameter_declaration = 1;
-               if (ps.in_parameter_declaration && ps.indent_parameters && ps.dec_nest == 0) {
-                   ps.ind_level = ps.i_l_follow = 1;
-                   ps.ind_stmt = 0;
-               }
-               ps.in_or_st = true;     /* this might be a structure or
-                                        * initialization declaration */
-               ps.in_decl = ps.decl_on_line = true;
-               if ( /* !ps.in_or_st && */ ps.dec_nest <= 0)
+       case rbrace:            /* got a '}' */
+           if (ps.p_stack[ps.tos] == decl && !ps.block_init)   /* semicolons can be
+                                                                * omitted in
+                                                                * declarations */
+               parse(semicolon);
+           if (ps.p_l_follow) {/* check for unclosed if, for, else. */
+               diag(1, "Unbalanced parens");
+               ps.p_l_follow = 0;
+               sp_sw = false;
+           }
+           ps.just_saw_decl = 0;
+           ps.block_init_level--;
+           if (s_code != e_code && !ps.block_init) {   /* '}' must be first on
+                                                        * line */
+               if (verbose)
+                   diag(0, "Line broken");
+               dump_line();
+           }
+           *e_code++ = '}';
+           ps.want_blank = true;
+           ps.in_stmt = ps.ind_stmt = false;
+           if (ps.dec_nest > 0) {      /* we are in multi-level structure
+                                        * declaration */
+               dec_ind = di_stack[--ps.dec_nest];
+               if (ps.dec_nest == 0 && !ps.in_parameter_declaration)
                    ps.just_saw_decl = 2;
                    ps.just_saw_decl = 2;
-               prefix_blankline_requested = 0;
-               for (i = 0; token[i++];);       /* get length of token */
+               ps.in_decl = true;
+           }
+           prefix_blankline_requested = 0;
+           parse(rbrace);      /* let parser know about this */
+           ps.search_brace = cuddle_else && ps.p_stack[ps.tos] == ifhead
+               && ps.il[ps.tos] >= ps.ind_level;
+           if (ps.tos <= 1 && blanklines_after_procs && ps.dec_nest <= 0)
+               postfix_blankline_requested = 1;
+           break;
 
 
-               /*
-                * dec_ind = e_code - s_code + (ps.decl_indent>i ?
-                * ps.decl_indent : i); 
-                */
-               dec_ind = ps.decl_indent > 0 ? ps.decl_indent : i;
-               goto copy_id;
+       case swstmt:            /* got keyword "switch" */
+           sp_sw = true;
+           hd_type = swstmt;   /* keep this for when we have seen the
+                                * expression */
+           goto copy_id;       /* go move the token into buffer */
 
 
-           case ident: /* got an identifier or constant */
-               if (ps.in_decl) {       /* if we are in a declaration, we
-                                        * must indent identifier */
-                   if (ps.want_blank)
-                       *e_code++ = ' ';
+       case sp_paren:          /* token is if, while, for */
+           sp_sw = true;       /* the interesting stuff is done after the
+                                * expression is scanned */
+           hd_type = (*token == 'i' ? ifstmt :
+                      (*token == 'w' ? whilestmt : forstmt));
+
+           /*
+            * remember the type of header for later use by parser
+            */
+           goto copy_id;       /* copy the token into line */
+
+       case sp_nparen: /* got else, do */
+           ps.in_stmt = false;
+           if (*token == 'e') {
+               if (e_code != s_code && (!cuddle_else || e_code[-1] != '}')) {
+                   if (verbose)
+                       diag(0, "Line broken");
+                   dump_line();/* make sure this starts a line */
+                   ps.want_blank = false;
+               }
+               force_nl = true;/* also, following stuff must go onto new line */
+               last_else = 1;
+               parse(elselit);
+           }
+           else {
+               if (e_code != s_code) { /* make sure this starts a line */
+                   if (verbose)
+                       diag(0, "Line broken");
+                   dump_line();
                    ps.want_blank = false;
                    ps.want_blank = false;
-                   if (is_procname == 0 || !procnames_start_line) {
-                       if (!ps.block_init)
-                           if (troff && !ps.dumped_decl_indent) {
-                               sprintf(e_code, "\\c\n.De %dp+\200p\n", dec_ind * 7);
-                               ps.dumped_decl_indent = 1;
-                               e_code += strlen(e_code);
-                           } else
-                               while ((e_code - s_code) < dec_ind)
-                                   *e_code++ = ' ';
-                   } else {
-                       if (dec_ind && s_code != e_code)
-                           dump_line();
-                       dec_ind = 0;
-                       ps.want_blank = false;
-                   }
-               } else if (sp_sw && ps.p_l_follow == 0) {
-                   sp_sw = false;
-                   force_nl = true;
-                   ps.last_u_d = true;
-                   ps.in_stmt = false;
-                   parse(hd_type);
                }
                }
-       copy_id:
+               force_nl = true;/* also, following stuff must go onto new line */
+               last_else = 0;
+               parse(dolit);
+           }
+           goto copy_id;       /* move the token into line */
+
+       case decl:              /* we have a declaration type (int, register,
+                                * etc.) */
+           parse(decl);        /* let parser worry about indentation */
+           if (ps.last_token == rparen && ps.tos <= 1) {
+               ps.in_parameter_declaration = 1;
+               if (s_code != e_code) {
+                   dump_line();
+                   ps.want_blank = 0;
+               }
+           }
+           if (ps.in_parameter_declaration && ps.indent_parameters && ps.dec_nest == 0) {
+               ps.ind_level = ps.i_l_follow = 1;
+               ps.ind_stmt = 0;
+           }
+           ps.in_or_st = true; /* this might be a structure or initialization
+                                * declaration */
+           ps.in_decl = ps.decl_on_line = true;
+           if ( /* !ps.in_or_st && */ ps.dec_nest <= 0)
+               ps.just_saw_decl = 2;
+           prefix_blankline_requested = 0;
+           for (i = 0; token[i++];);   /* get length of token */
+
+           /*
+            * dec_ind = e_code - s_code + (ps.decl_indent>i ? ps.decl_indent
+            * : i);
+            */
+           dec_ind = ps.decl_indent > 0 ? ps.decl_indent : i;
+           goto copy_id;
+
+       case ident:             /* got an identifier or constant */
+           if (ps.in_decl) {   /* if we are in a declaration, we must indent
+                                * identifier */
                if (ps.want_blank)
                    *e_code++ = ' ';
                if (ps.want_blank)
                    *e_code++ = ' ';
-               if (troff && ps.its_a_keyword) {
-                   *e_code++ = BACKSLASH;
-                   *e_code++ = 'f';
-                   *e_code++ = 'B';
+               ps.want_blank = false;
+               if (is_procname == 0 || !procnames_start_line) {
+                   if (!ps.block_init)
+                       if (troff && !ps.dumped_decl_indent) {
+                           sprintf(e_code, "\n.De %dp+\200p\n", dec_ind * 7);
+                           ps.dumped_decl_indent = 1;
+                           e_code += strlen(e_code);
+                       }
+                       else
+                           while ((e_code - s_code) < dec_ind) {
+                               check_size(code);
+                               *e_code++ = ' ';
+                           }
                }
                }
-               for (t_ptr = token; *t_ptr; ++t_ptr)
+               else {
+                   if (dec_ind && s_code != e_code)
+                       dump_line();
+                   dec_ind = 0;
+                   ps.want_blank = false;
+               }
+           }
+           else if (sp_sw && ps.p_l_follow == 0) {
+               sp_sw = false;
+               force_nl = true;
+               ps.last_u_d = true;
+               ps.in_stmt = false;
+               parse(hd_type);
+           }
+    copy_id:
+           if (ps.want_blank)
+               *e_code++ = ' ';
+           if (troff && ps.its_a_keyword) {
+               e_code = chfont(&bodyf, &keywordf, e_code);
+               for (t_ptr = token; *t_ptr; ++t_ptr) {
+                   check_size(code);
+                   *e_code++ = keywordf.allcaps && islower(*t_ptr)
+                       ? toupper(*t_ptr) : *t_ptr;
+               }
+               e_code = chfont(&keywordf, &bodyf, e_code);
+           }
+           else
+               for (t_ptr = token; *t_ptr; ++t_ptr) {
+                   check_size(code);
                    *e_code++ = *t_ptr;
                    *e_code++ = *t_ptr;
-               if (troff && ps.its_a_keyword) {
-                   *e_code++ = BACKSLASH;
-                   *e_code++ = 'f';
-                   *e_code++ = 'R';
                }
                }
-               ps.want_blank = true;
-               break;
+           ps.want_blank = true;
+           break;
 
 
-           case period:        /* treat a period kind of like a binary
+       case period:            /* treat a period kind of like a binary
                                 * operation */
                                 * operation */
-               *e_code++ = '.';/* move the period into line */
-               ps.want_blank = false;  /* dont put a blank after a period */
-               break;
+           *e_code++ = '.';    /* move the period into line */
+           ps.want_blank = false;      /* dont put a blank after a period */
+           break;
 
 
-           case comma:
-               ps.want_blank = (s_code != e_code);     /* only put blank after
-                                                        * comma if comma does
-                                                        * not start the line */
-               if (ps.in_decl && is_procname == 0 && !ps.block_init)
-                   while ((e_code - s_code) < (dec_ind - 1))
-                       *e_code++ = ' ';
+       case comma:
+           ps.want_blank = (s_code != e_code); /* only put blank after comma
+                                                * if comma does not start the
+                                                * line */
+           if (ps.in_decl && is_procname == 0 && !ps.block_init)
+               while ((e_code - s_code) < (dec_ind - 1)) {
+                   check_size(code);
+                   *e_code++ = ' ';
+               }
 
 
-               *e_code++ = ',';
-               if (ps.p_l_follow == 0) {
+           *e_code++ = ',';
+           if (ps.p_l_follow == 0) {
+               if (ps.block_init_level <= 0)
                    ps.block_init = 0;
                    ps.block_init = 0;
-                   if (break_comma && !ps.leave_comma)
-                       force_nl = true;
-               }
-               break;
+               if (break_comma && !ps.leave_comma)
+                   force_nl = true;
+           }
+           break;
 
 
-           case preesc:        /* got the character '#' */
-               if ((s_com != e_com) ||
+       case preesc:            /* got the character '#' */
+           if ((s_com != e_com) ||
                    (s_lab != e_lab) ||
                    (s_code != e_code))
                    (s_lab != e_lab) ||
                    (s_code != e_code))
-                   dump_line();
-               *e_lab++ = '#'; /* move whole line to 'label' buffer */
-               {
-                   int         in_comment = 0;
-                   char       *com_start = 0;
-                   char        quote = 0;
-                   char       *com_end = 0;
-
-                   while (*buf_ptr != '\n' || in_comment) {
-                       *e_lab = *buf_ptr++;
-                       if (buf_ptr >= buf_end)
-                           fill_buffer();
-                       switch (*e_lab++) {
-                           case BACKSLASH:
-                               if (troff)
-                                   *e_lab++ = BACKSLASH;
-                               if (!in_comment) {
-                                   *e_lab++ = *buf_ptr++;
-                                   if (buf_ptr >= buf_end)
-                                       fill_buffer();
-                               }
-                               break;
-                           case '/':
-                               if (*buf_ptr == '*' && !in_comment && !quote) {
-                                   in_comment = 1;
-                                   *e_lab++ = *buf_ptr++;
-                                   com_start = e_lab - 2;
-                               }
-                               break;
-                           case '"':
-                               if (quote == '"')
-                                   quote = 0;
-                               break;
-                           case '\'':
-                               if (quote == '\'')
-                                   quote = 0;
-                               break;
-                           case '*':
-                               if (*buf_ptr == '/' && in_comment) {
-                                   in_comment = 0;
-                                   *e_lab++ = *buf_ptr++;
-                                   com_end = e_lab;
-                               }
-                               break;
+               dump_line();
+           *e_lab++ = '#';     /* move whole line to 'label' buffer */
+           {
+               int         in_comment = 0;
+               int         com_start = 0;
+               char        quote = 0;
+               int         com_end = 0;
+
+               while (*buf_ptr != '\n' || in_comment) {
+                   check_size(lab);
+                   *e_lab = *buf_ptr++;
+                   if (buf_ptr >= buf_end)
+                       fill_buffer();
+                   switch (*e_lab++) {
+                   case BACKSLASH:
+                       if (troff)
+                           *e_lab++ = BACKSLASH;
+                       if (!in_comment) {
+                           *e_lab++ = *buf_ptr++;
+                           if (buf_ptr >= buf_end)
+                               fill_buffer();
+                       }
+                       break;
+                   case '/':
+                       if (*buf_ptr == '*' && !in_comment && !quote) {
+                           in_comment = 1;
+                           *e_lab++ = *buf_ptr++;
+                           com_start = e_lab - s_lab - 2;
+                       }
+                       break;
+                   case '"':
+                       if (quote == '"')
+                           quote = 0;
+                       break;
+                   case '\'':
+                       if (quote == '\'')
+                           quote = 0;
+                       break;
+                   case '*':
+                       if (*buf_ptr == '/' && in_comment) {
+                           in_comment = 0;
+                           *e_lab++ = *buf_ptr++;
+                           com_end = e_lab - s_lab;
                        }
                        }
+                       break;
                    }
                    }
-                   while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
-                       e_lab--;
-                   if (e_lab == com_end && bp_save == 0) {     /* comment on
+               }
+
+               while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
+                   e_lab--;
+               if (e_lab - s_lab == com_end && bp_save == 0) { /* comment on
                                                                 * preprocessor line */
                                                                 * preprocessor line */
-                       if (sc_end == 0)        /* if this is the first
-                                                * comment, we must set up
-                                                * the buffer */
-                           sc_end = &(save_com[0]);
-                       else {
-                           *sc_end++ = '\n';   /* add newline between
+                   if (sc_end == 0)    /* if this is the first comment, we
+                                        * must set up the buffer */
+                       sc_end = &(save_com[0]);
+                   else {
+                       *sc_end++ = '\n';       /* add newline between
                                                 * comments */
                                                 * comments */
-                           *sc_end++ = ' ';
-                           --line_no;
-                       }
-                       bcopy(com_start, sc_end, com_end - com_start);
-                       sc_end += com_end - com_start;
-                       e_lab = com_start;
-                       while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
-                           e_lab--;
-                       bp_save = buf_ptr;      /* save current input
-                                                * buffer */
-                       be_save = buf_end;
-                       buf_ptr = save_com;     /* fix so that subsequent
-                                                * calls to lexi will take
-                                                * tokens out of save_com */
-                       *sc_end++ = ' ';        /* add trailing blank,
-                                                * just in case */
-                       buf_end = sc_end;
-                       sc_end = 0;
+                       *sc_end++ = ' ';
+                       --line_no;
                    }
                    }
-                   *e_lab = '\0';      /* null terminate line */
-                   ps.pcase = false;
+                   bcopy(s_lab + com_start, sc_end, com_end - com_start);
+                   sc_end += com_end - com_start;
+                   if (sc_end >= &save_com[sc_size])
+                       abort();
+                   e_lab = s_lab + com_start;
+                   while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
+                       e_lab--;
+                   bp_save = buf_ptr;  /* save current input buffer */
+                   be_save = buf_end;
+                   buf_ptr = save_com; /* fix so that subsequent calls to
+                                        * lexi will take tokens out of
+                                        * save_com */
+                   *sc_end++ = ' ';    /* add trailing blank, just in case */
+                   buf_end = sc_end;
+                   sc_end = 0;
                }
                }
-               if (strncmp(s_lab, "#if", 3) == 0)
-                   if (ifdef_level < sizeof state_stack / sizeof state_stack[0]) {
-                       match_state[ifdef_level].tos = -1;
-                       state_stack[ifdef_level++] = ps;
-                   } else
-                       diag(1, "#if stack overflow");
-               else if (strncmp(s_lab, "#else", 5) == 0)
-                   if (ifdef_level <= 0)
-                       diag(1, "Unmatched #else");
-                   else {
-                       match_state[ifdef_level - 1] = ps;
-                       ps = state_stack[ifdef_level - 1];
-               } else if (strncmp(s_lab, "#endif", 6) == 0)
-                   if (ifdef_level <= 0)
-                       diag(1, "Unmatched #endif");
-                   else {
-                       ifdef_level--;
-#ifdef undef
+               *e_lab = '\0';  /* null terminate line */
+               ps.pcase = false;
+           }
+
+           if (strncmp(s_lab, "#if", 3) == 0) {
+               if (blanklines_around_conditional_compilation) {
+                   register    c;
+                   prefix_blankline_requested++;
+                   while ((c = getc(input)) == '\n');
+                   ungetc(c, input);
+               }
+               if (ifdef_level < sizeof state_stack / sizeof state_stack[0]) {
+                   match_state[ifdef_level].tos = -1;
+                   state_stack[ifdef_level++] = ps;
+               }
+               else
+                   diag(1, "#if stack overflow");
+           }
+           else if (strncmp(s_lab, "#else", 5) == 0)
+               if (ifdef_level <= 0)
+                   diag(1, "Unmatched #else");
+               else {
+                   match_state[ifdef_level - 1] = ps;
+                   ps = state_stack[ifdef_level - 1];
+               }
+           else if (strncmp(s_lab, "#endif", 6) == 0) {
+               if (ifdef_level <= 0)
+                   diag(1, "Unmatched #endif");
+               else {
+                   ifdef_level--;
 
 
-                       /*
-                        * This match needs to be more intelligent before
-                        * the message is useful 
-                        */
-                       if (match_state[ifdef_level].tos >= 0
-                           && bcmp(&ps, &match_state[ifdef_level], sizeof ps))
-                           diag(0, "Syntactically inconsistant #ifdef alternatives.");
+#ifdef undef
+                   /*
+                    * This match needs to be more intelligent before the
+                    * message is useful
+                    */
+                   if (match_state[ifdef_level].tos >= 0
+                         && bcmp(&ps, &match_state[ifdef_level], sizeof ps))
+                       diag(0, "Syntactically inconsistant #ifdef alternatives.");
 #endif
 #endif
-                   }
-               break;          /* subsequent processing of the newline
-                                * character will cause the line to be
-                                * printed */
-
-           case comment:       /* we have gotten a /*  this is a biggie */
-       proc_comment:
-               if (flushed_nl) {       /* we should force a broken line
-                                        * here */
-                   flushed_nl = false;
-                   dump_line();
-                   ps.want_blank = false;      /* dont insert blank at
-                                                * line start */
-                   force_nl = false;
                }
                }
-               pr_comment();
-               break;
+               if (blanklines_around_conditional_compilation) {
+                   postfix_blankline_requested++;
+                   n_real_blanklines = 0;
+               }
+           }
+           break;              /* subsequent processing of the newline
+                                * character will cause the line to be printed */
+
+       case comment:           /* we have gotten a /*  this is a biggie */
+    proc_comment:
+           if (flushed_nl) {   /* we should force a broken line here */
+               flushed_nl = false;
+               dump_line();
+               ps.want_blank = false;  /* dont insert blank at line start */
+               force_nl = false;
+           }
+           pr_comment();
+           break;
        }                       /* end of big switch stmt */
        }                       /* end of big switch stmt */
-       *e_code = '\0';         /* make sure code section is null
-                                * terminated */
+
+       *e_code = '\0';         /* make sure code section is null terminated */
        if (type_code != comment && type_code != newline && type_code != preesc)
            ps.last_token = type_code;
     }                          /* end of main while (1) loop */
 };
 
 /*
        if (type_code != comment && type_code != newline && type_code != preesc)
            ps.last_token = type_code;
     }                          /* end of main while (1) loop */
 };
 
 /*
- * copy input file to backup file.  If in_name is /blah/blah/blah/file, then
- * backup file will be "file.BAK".  Then make the backup file the input and
- * original input file the output.
+ * copy input file to backup file if in_name is /blah/blah/blah/file, then
+ * backup file will be ".Bfile" then make the backup file the input and
+ * original input file the output
  */
 bakcopy()
 {
     int         n,
                 bakchn;
  */
 bakcopy()
 {
     int         n,
                 bakchn;
-    char        buff[BUFSIZ];
+    char        buff[8 * 1024];
     register char *p;
     register char *p;
-    char *rindex();
 
 
-    if ((p = rindex(in_name, '/')) != NULL)
+    /* construct file name .Bfile */
+    for (p = in_name; *p; p++);        /* skip to end of string */
+    while (p > in_name && *p != '/')   /* find last '/' */
+       p--;
+    if (*p == '/')
        p++;
        p++;
-    else
-       p = in_name;
     sprintf(bakfile, "%s.BAK", p);
 
     /* copy in_name to backup file */
     sprintf(bakfile, "%s.BAK", p);
 
     /* copy in_name to backup file */
@@ -1080,10 +1127,10 @@ bakcopy()
        fprintf(stderr, "indent: can't create backup file \"%s\"\n", bakfile);
        exit(1);
     }
        fprintf(stderr, "indent: can't create backup file \"%s\"\n", bakfile);
        exit(1);
     }
-    while ((n = read(fileno(input), buff, sizeof buff)) > 0)
+    while (n = read(fileno(input), buff, sizeof buff))
        if (write(bakchn, buff, n) != n) {
            fprintf(stderr, "indent: error writing backup file \"%s\"\n",
        if (write(bakchn, buff, n) != n) {
            fprintf(stderr, "indent: error writing backup file \"%s\"\n",
-               bakfile);
+                   bakfile);
            exit(1);
        }
     if (n < 0) {
            exit(1);
        }
     if (n < 0) {
@@ -1095,13 +1142,13 @@ bakcopy()
 
     /* re-open backup file as the input file */
     input = fopen(bakfile, "r");
 
     /* re-open backup file as the input file */
     input = fopen(bakfile, "r");
-    if (input == NULL) {
+    if (input == 0) {
        fprintf(stderr, "indent: can't re-open backup file\n");
        exit(1);
     }
     /* now the original input file will be the output */
     output = fopen(in_name, "w");
        fprintf(stderr, "indent: can't re-open backup file\n");
        exit(1);
     }
     /* now the original input file will be the output */
     output = fopen(in_name, "w");
-    if (output == NULL) {
+    if (output == 0) {
        fprintf(stderr, "indent: can't create %s\n", in_name);
        unlink(bakfile);
        exit(1);
        fprintf(stderr, "indent: can't create %s\n", in_name);
        unlink(bakfile);
        exit(1);
index 42423d4..5d2c1a6 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,33 +9,17 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)indent_codes.h      5.5 (Berkeley) %G%
+ *     @(#)indent_codes.h      5.6 (Berkeley) %G%
  */
 
  */
 
-/*
-FILE NAME:
-       indent_codes.h
-
-PURPOSE:
-       This include file contains defines for codes used within indent.  They
-       are here so that codes passed between and within routines can be
-       referenced symbolically.
-
-GLOBALS:
-       No global variables, just a bunch of defines
-
-FUNCTIONS:
-       None
-*/\f
-
 #define newline                1
 #define lparen         2
 #define rparen         3
 #define newline                1
 #define lparen         2
 #define rparen         3
index 36d73b5..90c39c6 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)indent_globs.h      5.6 (Berkeley) %G%
+ *     @(#)indent_globs.h      5.7 (Berkeley) %G%
  */
 
  */
 
-/*
-FILE NAME:
-       indent_globs.h
-
-PURPOSE:
-       This include file contains the declarations for all global variables
-       used in indent.
-
-GLOBALS:
-       The names of all of the variables will not be repeated here.  The 
-       declarations start on the next page.
-
-FUNCTIONS:
-       None
-*/
-
 #include <stdio.h>
 
 #define BACKSLASH '\\'
 #include <stdio.h>
 
 #define BACKSLASH '\\'
-#define bufsize 600       /* size of internal buffers */
-#define inp_bufs 600      /* size of input buffer */
-#define sc_size 5000      /* size of save_com buffer */
-#define label_offset 2    /* number of levels a label is placed to left of code 
-                  */
+#define bufsize 200            /* size of internal buffers */
+#define inp_bufs 600           /* size of input buffer */
+#define sc_size 5000           /* size of save_com buffer */
+#define label_offset 2         /* number of levels a label is placed to left
+                                * of code */
 
 
-#define tabsize 8  /* the size of a tab */
-#define tabmask 0177770           /* mask used when figuring length of lines with tabs */
+#define tabsize 8              /* the size of a tab */
+#define tabmask 0177770                /* mask used when figuring length of lines
+                                * with tabs */
 
 
 #define false 0
 #define true  1
 
 
 
 
 #define false 0
 #define true  1
 
 
-FILE   *input;     /* the fid for the input file */
-FILE   *output;    /* the output file */
-
-char    labbuf[bufsize];       /* buffer for label */
-char   *s_lab;     /* start ... */
-char   *e_lab;     /* .. and end of stored label */
-
-char    codebuf[bufsize];      /* buffer for code section */
-char   *s_code;    /* start ... */
-char   *e_code;    /* .. and end of stored code */
-
-char    combuf[bufsize];       /* buffer for comments */
-char   *s_com;     /* start ... */
-char   *e_com;     /* ... and end of stored comments */
-
-char    in_buffer[inp_bufs];   /* input buffer */
-char   *buf_ptr;   /* ptr to next character to be taken from in_buffer */
-char   *buf_end;   /* ptr to first after last char in in_buffer */
-
-char    save_com[sc_size];     /* input text is saved here when looking for the brace
-                     after an if, while, etc */
-char   *sc_end;    /* pointer into save_com buffer */
-
-char   *bp_save;   /* saved value of buf_ptr when taking input from
-                     save_com */
-char   *be_save;   /* similarly saved value of buf_end */
-
-char    token[bufsize];        /* the last token scanned */
-
-
-
-int    blanklines_after_declarations;
-int    blanklines_before_blockcomments;
-int    blanklines_after_procs;
-int    swallow_optional_blanklines;
-int    n_real_blanklines;
-int    prefix_blankline_requested;
-int    postfix_blankline_requested;
-int     break_comma;   /* when true and not in parens, break after a comma */
-int     btype_2;   /* when true, brace should be on same line as if,
-                     while, etc */
-float   case_ind;  /* indentation level to be used for a "case n:" */
-int     code_lines;/* count of lines with code */
-int     had_eof;   /* set to true when input is exhausted */
-int     line_no;   /* the current line number. */
-int     max_col;   /* the maximum allowable line length */
-int     pointer_as_binop;      /* when true, "->" is treated as a binary
-                                  operator (giving, e.g., "p -> f") */
-int     verbose;   /* when true, non-essential error messages are printed 
-                  */
-int    cuddle_else;            /* true if else should cuddle up to '}' */
-int    star_comment_cont;      /* true iff comment continuation lines should
-                                  have stars at the beginning of each line.
-                                  */
-int     comment_delimiter_on_blankline;
-int     troff;                 /* true iff were generating troff input */
-int    procnames_start_line;   /* if true, the names of procedures being
-                                  defined get placed in column 1 (ie. a
-                                  newline is placed between the type of the
-                                  procedure and its name) */
-int    proc_calls_space;       /* If true, procedure calls look like:
-                                  foo(bar) rather than foo (bar) */
-int    format_col1_comments;   /* If comments which start in column 1 are to
-                                  be magically reformatted (just like comments that
-                                  begin in later columns) */
-int    inhibit_formatting;     /* true if INDENT OFF is in effect */
-int    suppress_blanklines;    /* set iff following blanklines should be
-                                  suppressed */
-int    continuation_indent;    /* set to the indentation between the edge of
-                                  code and continuation lines */
-int    lineup_to_parens;       /* if true, continued code within parens will
-                                  be lined up to the open paren */
-int    block_comment_max_col;
+FILE       *input;             /* the fid for the input file */
+FILE       *output;            /* the output file */
+
+#define check_size(name) \
+       if (e_/**/name >= l_/**/name) { \
+           register nsize = l_/**/name-s_/**/name+400; \
+           name/**/buf = (char *) realloc(name/**/buf, nsize); \
+           e_/**/name = name/**/buf + (e_/**/name-s_/**/name) + 1; \
+           l_/**/name = name/**/buf + nsize - 5; \
+           s_/**/name = name/**/buf + 1; \
+       }
+
+char       *labbuf;            /* buffer for label */
+char       *s_lab;             /* start ... */
+char       *e_lab;             /* .. and end of stored label */
+char       *l_lab;             /* limit of label buffer */
+
+char       *codebuf;           /* buffer for code section */
+char       *s_code;            /* start ... */
+char       *e_code;            /* .. and end of stored code */
+char       *l_code;            /* limit of code section */
+
+char       *combuf;            /* buffer for comments */
+char       *s_com;             /* start ... */
+char       *e_com;             /* ... and end of stored comments */
+char       *l_com;             /* limit of comment buffer */
+
+char        in_buffer[inp_bufs];/* input buffer */
+char       *buf_ptr;           /* ptr to next character to be taken from
+                                * in_buffer */
+char       *buf_end;           /* ptr to first after last char in in_buffer */
 
 
+char        save_com[sc_size]; /* input text is saved here when looking for
+                                * the brace after an if, while, etc */
+char       *sc_end;            /* pointer into save_com buffer */
+
+char       *bp_save;           /* saved value of buf_ptr when taking input
+                                * from save_com */
+char       *be_save;           /* similarly saved value of buf_end */
+
+char        token[bufsize];    /* the last token scanned */
+
+
+int         pointer_as_binop;
+int         blanklines_after_declarations;
+int         blanklines_before_blockcomments;
+int         blanklines_after_procs;
+int         blanklines_around_conditional_compilation;
+int         swallow_optional_blanklines;
+int         n_real_blanklines;
+int         prefix_blankline_requested;
+int         postfix_blankline_requested;
+int         break_comma;       /* when true and not in parens, break after a
+                                * comma */
+int         btype_2;           /* when true, brace should be on same line as
+                                * if, while, etc */
+float       case_ind;          /* indentation level to be used for a "case
+                                * n:" */
+int         code_lines;                /* count of lines with code */
+int         had_eof;           /* set to true when input is exhausted */
+int         line_no;           /* the current line number. */
+int         max_col;           /* the maximum allowable line length */
+int         verbose;           /* when true, non-essential error messages are
+                                * printed */
+int         cuddle_else;       /* true if else should cuddle up to '}' */
+int         star_comment_cont; /* true iff comment continuation lines should
+                                * have stars at the beginning of each line. */
+int         comment_delimiter_on_blankline;
+int         troff;             /* true iff were generating troff input */
+int         procnames_start_line;      /* if true, the names of procedures
+                                        * being defined get placed in column
+                                        * 1 (ie. a newline is placed between
+                                        * the type of the procedure and its
+                                        * name) */
+int         proc_calls_space;  /* If true, procedure calls look like:
+                                * foo(bar) rather than foo (bar) */
+int         format_col1_comments;      /* If comments which start in column 1
+                                        * are to be magically reformatted
+                                        * (just like comments that begin in
+                                        * later columns) */
+int         inhibit_formatting;        /* true if INDENT OFF is in effect */
+int         suppress_blanklines;/* set iff following blanklines should be
+                                * suppressed */
+int         continuation_indent;/* set to the indentation between the edge of
+                                * code and continuation lines */
+int         lineup_to_parens;  /* if true, continued code within parens will
+                                * be lined up to the open paren */
+int         Bill_Shannon;      /* true iff a blank should always be inserted
+                                * after sizeof */
+int         blanklines_after_declarations_at_proctop;  /* This is vaguely
+                                                        * similar to
+                                                        * blanklines_after_decla
+                                                        * rations except that
+                                                        * it only applies to
+                                                        * the first set of
+                                                        * declarations in a
+                                                        * procedure (just after
+                                                        * the first '{') and it
+                                                        * causes a blank line
+                                                        * to be generated even
+                                                        * if there are no
+                                                        * declarations */
+int         block_comment_max_col;
+int         extra_expression_indent;   /* True if continuation lines from the
+                                        * expression part of "if(e)",
+                                        * "while(e)", "for(e;e;e)" should be
+                                        * indented an extra tab stop so that
+                                        * they don't conflict with the code
+                                        * that follows */
+
+/* -troff font state information */
+
+struct fstate {
+    char        font[4];
+    char        size;
+    int         allcaps:1;
+};
+char       *chfont();
+
+struct fstate
+            keywordf,          /* keyword font */
+            stringf,           /* string font */
+            boxcomf,           /* Box comment font */
+            blkcomf,           /* Block comment font */
+            scomf,             /* Same line comment font */
+            bodyf;             /* major body font */
+
+
+#define STACKSIZE 150
 
 struct parser_state {
     int         last_token;
 
 struct parser_state {
     int         last_token;
-    int         p_stack[50];   /* this is the parsers stack */
-    int         il[50];                /* this stack stores indentation levels */
-    float       cstk[50];      /* used to store case stmt indentation
-                                * levels */
+    struct fstate cfont;       /* Current font */
+    int         p_stack[STACKSIZE];    /* this is the parsers stack */
+    int         il[STACKSIZE]; /* this stack stores indentation levels */
+    float       cstk[STACKSIZE];/* used to store case stmt indentation levels */
     int         box_com;       /* set to true when we are in a "boxed"
     int         box_com;       /* set to true when we are in a "boxed"
-                                * comment. In that case, the first
-                                * non-blank char should be lined up with
-                                * the / in /* */
+                                * comment. In that case, the first non-blank
+                                * char should be lined up with the / in /* */
     int         comment_delta,
                 n_comment_delta;
     int         cast_mask;     /* indicates which close parens close off
                                 * casts */
     int         comment_delta,
                 n_comment_delta;
     int         cast_mask;     /* indicates which close parens close off
                                 * casts */
-    int                sizeof_mask;    /* indicates which close parens close off
-                                  sizeof''s */
+    int         sizeof_mask;   /* indicates which close parens close off
+                                * sizeof''s */
     int         block_init;    /* true iff inside a block initialization */
     int         block_init;    /* true iff inside a block initialization */
-    int         last_nl;       /* this is true if the last thing scanned
-                                * was a newline */
+    int         block_init_level;      /* The level of brace nesting in an
+                                        * initialization */
+    int         last_nl;       /* this is true if the last thing scanned was
+                                * a newline */
     int         in_or_st;      /* Will be true iff there has been a
     int         in_or_st;      /* Will be true iff there has been a
-                                * declarator (e.g. int or char) and no
-                                * left paren since the last semicolon.
-                                * When true, a '{' is starting a
-                                * structure definition or an
-                                * initialization list */
-    int         bl_line;       /* set to 1 by dump_line if the line is
-                                * blank */
-    int         col_1;         /* set to true if the last token started
-                                * in column 1 */
+                                * declarator (e.g. int or char) and no left
+                                * paren since the last semicolon. When true,
+                                * a '{' is starting a structure definition or
+                                * an initialization list */
+    int         bl_line;       /* set to 1 by dump_line if the line is blank */
+    int         col_1;         /* set to true if the last token started in
+                                * column 1 */
     int         com_col;       /* this is the column in which the current
                                 * coment should start */
     int         com_col;       /* this is the column in which the current
                                 * coment should start */
-    int         com_ind;       /* the column in which comments to the
-                                * right of code should start */
-    int         com_lines;     /* the number of lines with comments, set
-                                * by dump_line */
-    int         dec_nest;      /* current nesting level for structure or
-                                * init */
+    int         com_ind;       /* the column in which comments to the right
+                                * of code should start */
+    int         com_lines;     /* the number of lines with comments, set by
+                                * dump_line */
+    int         dec_nest;      /* current nesting level for structure or init */
     int         decl_com_ind;  /* the column in which comments after
                                 * declarations should be put */
     int         decl_com_ind;  /* the column in which comments after
                                 * declarations should be put */
-    int         decl_on_line;  /* set to true if this line of code has
-                                * part of a declaration on it */
-    int         i_l_follow;    /* the level to which ind_level should be
-                                * set after the current line is printed */
-    int         in_decl;       /* set to true when we are in a
-                                * declaration stmt.  The processing of
-                                * braces is then slightly different */
+    int         decl_on_line;  /* set to true if this line of code has part
+                                * of a declaration on it */
+    int         i_l_follow;    /* the level to which ind_level should be set
+                                * after the current line is printed */
+    int         in_decl;       /* set to true when we are in a declaration
+                                * stmt.  The processing of braces is then
+                                * slightly different */
     int         in_stmt;       /* set to 1 while in a stmt */
     int         ind_level;     /* the current indentation level */
     int         ind_size;      /* the size of one indentation level */
     int         in_stmt;       /* set to 1 while in a stmt */
     int         ind_level;     /* the current indentation level */
     int         ind_size;      /* the size of one indentation level */
-    int         ind_stmt;      /* set to 1 if next line should have an
-                                * extra indentation level because we are
-                                * in the middle of a stmt */
-    int         last_u_d;      /* set to true after scanning a token
-                                * which forces a following operator to be
-                                * unary */
+    int         ind_stmt;      /* set to 1 if next line should have an extra
+                                * indentation level because we are in the
+                                * middle of a stmt */
+    int         last_u_d;      /* set to true after scanning a token which
+                                * forces a following operator to be unary */
     int         leave_comma;   /* if true, never break declarations after
                                 * commas */
     int         ljust_decl;    /* true if declarations should be left
                                 * justified */
     int         leave_comma;   /* if true, never break declarations after
                                 * commas */
     int         ljust_decl;    /* true if declarations should be left
                                 * justified */
-    int         out_coms;      /* the number of comments processed, set
-                                * by pr_comment */
+    int         out_coms;      /* the number of comments processed, set by
+                                * pr_comment */
     int         out_lines;     /* the number of lines written, set by
                                 * dump_line */
     int         out_lines;     /* the number of lines written, set by
                                 * dump_line */
-    int         p_l_follow;    /* used to remember how to indent
-                                * following statement */
+    int         p_l_follow;    /* used to remember how to indent following
+                                * statement */
     int         paren_level;   /* parenthesization level. used to indent
                                 * within stmts */
     short       paren_indents[20];     /* column positions of each paren */
     int         pcase;         /* set to 1 if the current line label is a
     int         paren_level;   /* parenthesization level. used to indent
                                 * within stmts */
     short       paren_indents[20];     /* column positions of each paren */
     int         pcase;         /* set to 1 if the current line label is a
-                                * case.  It is printed differently from 
-                                * a regular label */
-    int         search_brace;  /* set to true by parse when it is
-                                * necessary to buffer up all info up to
-                                * the start of a stmt after an if, while,
-                                * etc */
-    int         unindent_displace;     /* comments not to the right of
-                                        * code will be placed this many
-                                        * indentation levels to the left
-                                        * of code */
-    int         use_ff;                /* set to one if the current line should
-                                * be terminated with a form feed */
-    int         want_blank;    /* set to true when the following token
-                                * should be prefixed by a blank. (Said
-                                * prefixing is ignored in some cases.) */
-    int         else_if;       /* True iff else if pairs should be
-                                * handled specially */
-    int         decl_indent;   /* column to indent declared identifiers
-                                * to */
+                                * case.  It is printed differently from a
+                                * regular label */
+    int         search_brace;  /* set to true by parse when it is necessary
+                                * to buffer up all info up to the start of a
+                                * stmt after an if, while, etc */
+    int         unindent_displace;     /* comments not to the right of code
+                                        * will be placed this many
+                                        * indentation levels to the left of
+                                        * code */
+    int         use_ff;                /* set to one if the current line should be
+                                * terminated with a form feed */
+    int         want_blank;    /* set to true when the following token should
+                                * be prefixed by a blank. (Said prefixing is
+                                * ignored in some cases.) */
+    int         else_if;       /* True iff else if pairs should be handled
+                                * specially */
+    int         decl_indent;   /* column to indent declared identifiers to */
     int         its_a_keyword;
     int         its_a_keyword;
-    int                sizeof_keyword;
+    int         sizeof_keyword;
     int         dumped_decl_indent;
     int         dumped_decl_indent;
-    float       case_indent;   /* The distance to indent case labels from
-                                * the switch statement */
+    float       case_indent;   /* The distance to indent case labels from the
+                                * switch statement */
     int         in_parameter_declaration;
     int         indent_parameters;
     int         tos;           /* pointer to top of stack */
     char        procname[100]; /* The name of the current procedure */
     int         in_parameter_declaration;
     int         indent_parameters;
     int         tos;           /* pointer to top of stack */
     char        procname[100]; /* The name of the current procedure */
-    int                just_saw_decl;
+    int         just_saw_decl;
 }           ps;
 
 }           ps;
 
-int ifdef_level;
+int         ifdef_level;
 struct parser_state state_stack[5];
 struct parser_state match_state[5];
 struct parser_state state_stack[5];
 struct parser_state match_state[5];
index e015715..136a88a 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)io.c       5.7 (Berkeley) %G%";
+static char sccsid[] = "@(#)io.c       5.8 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
-/*
- * FILE NAME:
- *     io.c
- * PURPOSE:
- *     Contains routines to handle i/o related stuff for indent.
- * GLOBALS:
- *     None
- * FUNCTIONS:
- *     dump_line
- *     fill_buffer
- *     pad_output
- *     count_spaces
- *     eqin
- *     cmp
- *
- */\f
-/*-
- *
- *                       Copyright (C) 1976
- *                             by the
- *                       Board of Trustees
- *                             of the
- *                     University of Illinois
- *
- *                      All rights reserved
- *
- *
- * NAME:
- *     dump_line
- *
- * FUNCTION:
- *     Does the actual printing of the stored up line
- *
- * ALGORITHM:
- *     For each of the label, code, and comment sections which are used on 
- *     this line:
- *
- *     1) Use pad_output to get the section aligned properly.
- *     2) write the section
- *
- *     The indentation level used for the code is set by ps.ind_level.  After
- *     printing, ps.ind_level is set to ps.i_l_follow.
- *
- *     An extra level of indentation is added if ps.ind_stmt is 1.  After 
- *     printing, ps.ind_stmt is set to 1 iff the line just printed has an
- *     unterminated, non-declaration statement.
- *
- * HISTORY:
- *     initial coding  November 1976   D A Willcox of CAC
- *
- */\f
-#include "indent_globs.h"
+#include "indent_globs.h";
+#include <ctype.h>
 
 
 
 
-
-int         ff = 014;          /* used to write a form feed */
 int         comment_open;
 static      paren_target;
 
 dump_line()
 {                              /* dump_line is the routine that actually
 int         comment_open;
 static      paren_target;
 
 dump_line()
 {                              /* dump_line is the routine that actually
-                                * effects the printing of the new source.
-                                * It prints the label section, followed
-                                * by the code section with the
-                                * appropriate nesting level, followed by
-                                * any comments */
+                                * effects the printing of the new source. It
+                                * prints the label section, followed by the
+                                * code section with the appropriate nesting
+                                * level, followed by any comments */
     register int cur_col,
                 temp_col,
                 target_col;
     register int cur_col,
                 temp_col,
                 target_col;
+    static      not_first_line;
 
     if (ps.procname[0]) {
 
     if (ps.procname[0]) {
-       if (troff)
+       if (troff) {
+           if (comment_open) {
+               comment_open = 0;
+               fprintf(output, ".*/\n");
+           }
            fprintf(output, ".Pr \"%s\"\n", ps.procname);
            fprintf(output, ".Pr \"%s\"\n", ps.procname);
+       }
        ps.ind_level = 0;
        ps.procname[0] = 0;
     }
     if (s_code == e_code && s_lab == e_lab && s_com == e_com) {
        ps.ind_level = 0;
        ps.procname[0] = 0;
     }
     if (s_code == e_code && s_lab == e_lab && s_com == e_com) {
-       if (suppress_blanklines>0) suppress_blanklines--;
+       if (suppress_blanklines > 0)
+           suppress_blanklines--;
        else {
        else {
-       ps.bl_line = true;
-       n_real_blanklines++;
+           ps.bl_line = true;
+           n_real_blanklines++;
        }
     }
     else if (!inhibit_formatting) {
        suppress_blanklines = 0;
        ps.bl_line = false;
        }
     }
     else if (!inhibit_formatting) {
        suppress_blanklines = 0;
        ps.bl_line = false;
-       if (prefix_blankline_requested)
+       if (prefix_blankline_requested && not_first_line)
            if (swallow_optional_blanklines) {
                if (n_real_blanklines == 1)
                    n_real_blanklines = 0;
            if (swallow_optional_blanklines) {
                if (n_real_blanklines == 1)
                    n_real_blanklines = 0;
@@ -121,8 +76,8 @@ dump_line()
        n_real_blanklines = 0;
        if (ps.ind_level == 0)
            ps.ind_stmt = 0;    /* this is a class A kludge. dont do
        n_real_blanklines = 0;
        if (ps.ind_level == 0)
            ps.ind_stmt = 0;    /* this is a class A kludge. dont do
-                                * additional statement indentation if we
-                                * are at bracket level 0 */
+                                * additional statement indentation if we are
+                                * at bracket level 0 */
 
        if (e_lab != s_lab || e_code != s_code)
            ++code_lines;       /* keep count of lines with code */
 
        if (e_lab != s_lab || e_code != s_code)
            ++code_lines;       /* keep count of lines with code */
@@ -161,7 +116,7 @@ dump_line()
            }
            cur_col = pad_output(cur_col, target_col);
            for (p = s_code; p < e_code; p++)
            }
            cur_col = pad_output(cur_col, target_col);
            for (p = s_code; p < e_code; p++)
-               if (*p == (char)0200)
+               if (*p == (char) 0200)
                    fprintf(output, "%d", target_col * 7);
                else
                    putc(*p, output);
                    fprintf(output, "%d", target_col * 7);
                else
                    putc(*p, output);
@@ -169,10 +124,11 @@ dump_line()
        }
        if (s_com != e_com)
            if (troff) {
        }
        if (s_com != e_com)
            if (troff) {
+               int         all_here = 0;
                register char *p;
 
                if (e_com[-1] == '/' && e_com[-2] == '*')
                register char *p;
 
                if (e_com[-1] == '/' && e_com[-2] == '*')
-                   e_com -= 2;
+                   e_com -= 2, all_here++;
                while (e_com > s_com && e_com[-1] == ' ')
                    e_com--;
                *e_com = 0;
                while (e_com > s_com && e_com[-1] == ' ')
                    e_com--;
                *e_com = 0;
@@ -180,25 +136,44 @@ dump_line()
                while (*p == ' ')
                    p++;
                if (p[0] == '/' && p[1] == '*')
                while (*p == ' ')
                    p++;
                if (p[0] == '/' && p[1] == '*')
-                   p += 2;
+                   p += 2, all_here++;
                else if (p[0] == '*')
                    p += p[1] == '/' ? 2 : 1;
                while (*p == ' ')
                    p++;
                if (*p == 0)
                    goto inhibit_newline;
                else if (p[0] == '*')
                    p += p[1] == '/' ? 2 : 1;
                while (*p == ' ')
                    p++;
                if (*p == 0)
                    goto inhibit_newline;
-               if (!comment_open) {
+               if (comment_open < 2 && ps.box_com) {
+                   comment_open = 0;
+                   fprintf(output, ".*/\n");
+               }
+               if (comment_open == 0) {
                    if ('a' <= *p && *p <= 'z')
                        *p = *p + 'A' - 'a';
                    if ('a' <= *p && *p <= 'z')
                        *p = *p + 'A' - 'a';
-                   if (s_code != e_code || s_lab != e_lab) {
-                       fprintf(output, "\\c\n./* %dp 1 %dp\n",
-                               ps.com_col * 7, target_col * 7);
+                   if (e_com - p < 50 && all_here == 2) {
+                       register char *follow = p;
+                       fprintf(output, "\n.nr C! \\w\1");
+                       while (follow < e_com) {
+                           switch (*follow) {
+                           case '\n':
+                               putc(' ', output);
+                           case 1:
+                               break;
+                           case '\\':
+                               putc('\\', output);
+                           default:
+                               putc(*follow, output);
+                           }
+                           follow++;
+                       }
+                       putc(1, output);
                    }
                    }
-                   else
-                       fprintf(output, "./* %dp 0 %dp\n",
-                               ps.com_col * 7, target_col * 7);
+                   fprintf(output, "\n./* %dp %d %dp\n",
+                           ps.com_col * 7,
+                           (s_code != e_code || s_lab != e_lab) - ps.box_com,
+                           target_col * 7);
                }
                }
-               comment_open = 1;
+               comment_open = 1 + ps.box_com;
                while (*p) {
                    if (*p == BACKSLASH)
                        putc(BACKSLASH, output);
                while (*p) {
                    if (*p == BACKSLASH)
                        putc(BACKSLASH, output);
@@ -210,23 +185,27 @@ dump_line()
                register char *com_st = s_com;
 
                target += ps.comment_delta;
                register char *com_st = s_com;
 
                target += ps.comment_delta;
+               while (*com_st == '\t')
+                   com_st++, target += 8;      /* ? */
                while (target <= 0)
                while (target <= 0)
-                   if (*s_com == ' ')
-                       target++, s_com++;
-                   else if (*s_com == '\t')
-                       target = ((target - 1) & ~7) + 9, s_com++;
+                   if (*com_st == ' ')
+                       target++, com_st++;
+                   else if (*com_st == '\t')
+                       target = ((target - 1) & ~7) + 9, com_st++;
                    else
                        target = 1;
                    else
                        target = 1;
-               if (cur_col > target) { /* if comment cant fit on this
-                                        * line, put it on next line */
+               if (cur_col > target) { /* if comment cant fit on this line,
+                                        * put it on next line */
                    putc('\n', output);
                    cur_col = 1;
                    ++ps.out_lines;
                }
                    putc('\n', output);
                    cur_col = 1;
                    ++ps.out_lines;
                }
+               while (e_com > com_st && isspace(e_com[-1]))
+                   e_com--;
                cur_col = pad_output(cur_col, target);
                if (!ps.box_com) {
                cur_col = pad_output(cur_col, target);
                if (!ps.box_com) {
-                   if (star_comment_cont && com_st[1] != '*')
-                       if (com_st[1] == ' ' && com_st[0] == ' ')
+                   if (star_comment_cont && (com_st[1] != '*' || e_com <= com_st + 1))
+                       if (com_st[1] == ' ' && com_st[0] == ' ' && e_com > com_st + 1)
                            com_st[1] = '*';
                        else
                            fwrite(" * ", com_st[0] == '\t' ? 2 : com_st[0] == '*' ? 1 : 3, 1, output);
                            com_st[1] = '*';
                        else
                            fwrite(" * ", com_st[0] == '\t' ? 2 : com_st[0] == '*' ? 1 : 3, 1, output);
@@ -251,13 +230,13 @@ inhibit_newline:
        postfix_blankline_requested = 0;
     }
     ps.decl_on_line = ps.in_decl;      /* if we are in the middle of a
        postfix_blankline_requested = 0;
     }
     ps.decl_on_line = ps.in_decl;      /* if we are in the middle of a
-                                        * declaration, remember that fact
-                                        * for proper comment indentation */
+                                        * declaration, remember that fact for
+                                        * proper comment indentation */
     ps.ind_stmt = ps.in_stmt & ~ps.in_decl;    /* next line should be
                                                 * indented if we have not
     ps.ind_stmt = ps.in_stmt & ~ps.in_decl;    /* next line should be
                                                 * indented if we have not
-                                                * completed this stmt and
-                                                * if we are not in the
-                                                * middle of a declaration */
+                                                * completed this stmt and if
+                                                * we are not in the middle of
+                                                * a declaration */
     ps.use_ff = false;
     ps.dumped_decl_indent = 0;
     *(e_lab = s_lab) = '\0';   /* reset buffers */
     ps.use_ff = false;
     ps.dumped_decl_indent = 0;
     *(e_lab = s_lab) = '\0';   /* reset buffers */
@@ -266,10 +245,12 @@ inhibit_newline:
     ps.ind_level = ps.i_l_follow;
     ps.paren_level = ps.p_l_follow;
     paren_target = -ps.paren_indents[ps.paren_level - 1];
     ps.ind_level = ps.i_l_follow;
     ps.paren_level = ps.p_l_follow;
     paren_target = -ps.paren_indents[ps.paren_level - 1];
+    not_first_line = 1;
     return;
 };
 
     return;
 };
 
-compute_code_target() {
+compute_code_target()
+{
     register    target_col = ps.ind_size * ps.ind_level + 1;
 
     if (ps.paren_level)
     register    target_col = ps.ind_size * ps.ind_level + 1;
 
     if (ps.paren_level)
@@ -280,7 +261,7 @@ compute_code_target() {
            register    t = paren_target;
 
            if ((w = count_spaces(t, s_code) - max_col) > 0
            register    t = paren_target;
 
            if ((w = count_spaces(t, s_code) - max_col) > 0
-               && count_spaces(target_col, s_code) <= max_col) {
+                   && count_spaces(target_col, s_code) <= max_col) {
                t -= w + 1;
                if (t > target_col)
                    target_col = t;
                t -= w + 1;
                if (t > target_col)
                    target_col = t;
@@ -296,27 +277,26 @@ compute_code_target() {
 compute_label_target()
 {
     return
 compute_label_target()
 {
     return
-       ps.pcase ? (int) (case_ind * ps.ind_size) +1
+       ps.pcase ? (int) (case_ind * ps.ind_size) + 1
        : *s_lab == '#' ? 1
        : *s_lab == '#' ? 1
-       : ps.ind_size * (ps.ind_level - label_offset) +1;
+       : ps.ind_size * (ps.ind_level - label_offset) + 1;
 }
 
 
 /*
 }
 
 
 /*
- * Copyright (C) 1976 by the Board of Trustees of the University of
- * Illinois 
- *
- * All rights reserved 
- *
- *
- * NAME: fill_buffer 
- *
- * FUNCTION: Reads one block of input into input_buffer 
- *
- * HISTORY: initial coding     November 1976   D A Willcox of CAC 1/7/77
- * A Willcox of CAC    Added check for switch back to partly full input
- * buffer from temporary buffer 
- *
+ * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
+ * 
+ * All rights reserved
+ * 
+ * 
+ * NAME: fill_buffer
+ * 
+ * FUNCTION: Reads one block of input into input_buffer
+ * 
+ * HISTORY: initial coding     November 1976   D A Willcox of CAC 1/7/77 A
+ * Willcox of CAC      Added check for switch back to partly full input
+ * buffer from temporary buffer
+ * 
  */\f
 int
 fill_buffer()
  */\f
 int
 fill_buffer()
@@ -326,14 +306,13 @@ fill_buffer()
     register int i;
     register FILE *f = input;
 
     register int i;
     register FILE *f = input;
 
-    if (bp_save != 0) {                /* there is a partly filled input buffer
-                                * left */
+    if (bp_save != 0) {                /* there is a partly filled input buffer left */
        buf_ptr = bp_save;      /* dont read anything, just switch buffers */
        buf_end = be_save;
        bp_save = be_save = 0;
        if (buf_ptr < buf_end)
        buf_ptr = bp_save;      /* dont read anything, just switch buffers */
        buf_end = be_save;
        bp_save = be_save = 0;
        if (buf_ptr < buf_end)
-           return;             /* only return if there is really
-                                * something in this buffer */
+           return;             /* only return if there is really something in
+                                * this buffer */
     }
     p = in_buffer;
     buf_ptr = p;
     }
     p = in_buffer;
     buf_ptr = p;
@@ -358,7 +337,7 @@ fill_buffer()
                while (*p == ' ' || *p == '\t')
                    p++;
                if (p[0] == 'I' && p[1] == 'N' && p[2] == 'D' && p[3] == 'E'
                while (*p == ' ' || *p == '\t')
                    p++;
                if (p[0] == 'I' && p[1] == 'N' && p[2] == 'D' && p[3] == 'E'
-                   && p[4] == 'N' && p[5] == 'T') {
+                       && p[4] == 'N' && p[5] == 'T') {
                    p += 6;
                    while (*p == ' ' || *p == '\t')
                        p++;
                    p += 6;
                    while (*p == ' ' || *p == '\t')
                        p++;
@@ -395,37 +374,36 @@ fill_buffer()
 };
 
 /*
 };
 
 /*
- * Copyright (C) 1976 by the Board of Trustees of the University of
- * Illinois 
- *
- * All rights reserved 
- *
- *
- * NAME: pad_output 
- *
- * FUNCTION: Writes tabs and spaces to move the current column up to the
- * desired position. 
- *
- * ALGORITHM: Put tabs and/or blanks into pobuf, then write pobuf. 
- *
+ * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
+ * 
+ * All rights reserved
+ * 
+ * 
+ * NAME: pad_output
+ * 
+ * FUNCTION: Writes tabs and spaces to move the current column up to the desired
+ * position.
+ * 
+ * ALGORITHM: Put tabs and/or blanks into pobuf, then write pobuf.
+ * 
  * PARAMETERS: current         integer         The current column target
  * PARAMETERS: current         integer         The current column target
- * nteger              The desired column 
- *
- * RETURNS: Integer value of the new column.  (If current >= target, no
- * action is taken, and current is returned. 
- *
- * GLOBALS: None 
- *
- * CALLS: write (sys) 
- *
- * CALLED BY: dump_line 
- *
- * HISTORY: initial coding     November 1976   D A Willcox of CAC 
- *
+ * nteger              The desired column
+ * 
+ * RETURNS: Integer value of the new column.  (If current >= target, no action is
+ * taken, and current is returned.
+ * 
+ * GLOBALS: None
+ * 
+ * CALLS: write (sys)
+ * 
+ * CALLED BY: dump_line
+ * 
+ * HISTORY: initial coding     November 1976   D A Willcox of CAC
+ * 
  */\f
  */\f
-pad_output(current, target)    /* writes tabs and blanks (if necessary)
-                                * to get the current output position up
-                                * to the target column */
+pad_output(current, target)    /* writes tabs and blanks (if necessary) to
+                                * get the current output position up to the
+                                * target column */
     int         current;       /* the current column value */
     int         target;                /* position we want it at */
 {
     int         current;       /* the current column value */
     int         target;                /* position we want it at */
 {
@@ -449,32 +427,30 @@ pad_output(current, target)       /* writes tabs and blanks (if necessary)
 };
 
 /*
 };
 
 /*
- * Copyright (C) 1976 by the Board of Trustees of the University of
- * Illinois 
- *
- * All rights reserved 
- *
- *
- * NAME: count_spaces 
- *
+ * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
+ * 
+ * All rights reserved
+ * 
+ * 
+ * NAME: count_spaces
+ * 
  * FUNCTION: Find out where printing of a given string will leave the current
  * FUNCTION: Find out where printing of a given string will leave the current
- * character position on output. 
- *
+ * character position on output.
+ * 
  * ALGORITHM: Run thru input string and add appropriate values to current
  * ALGORITHM: Run thru input string and add appropriate values to current
- * position. 
- *
- * RETURNS: Integer value of position after printing "buffer" starting in
- * column "current". 
- *
- * HISTORY: initial coding     November 1976   D A Willcox of CAC 
- *
+ * position.
+ * 
+ * RETURNS: Integer value of position after printing "buffer" starting in column
+ * "current".
+ * 
+ * HISTORY: initial coding     November 1976   D A Willcox of CAC
+ * 
  */\f
 int
 count_spaces(current, buffer)
  */\f
 int
 count_spaces(current, buffer)
-
 /*
  * this routine figures out where the character position will be after
 /*
  * this routine figures out where the character position will be after
- * printing the text in buffer starting at column "current" 
+ * printing the text in buffer starting at column "current"
  */
     int         current;
     char       *buffer;
  */
     int         current;
     char       *buffer;
@@ -487,32 +463,29 @@ count_spaces(current, buffer)
     for (buf = buffer; *buf != '\0'; ++buf) {
        switch (*buf) {
 
     for (buf = buffer; *buf != '\0'; ++buf) {
        switch (*buf) {
 
-           case '\n':
-           case 014:           /* form feed */
-               cur = 1;
-               break;
+       case '\n':
+       case 014:               /* form feed */
+           cur = 1;
+           break;
 
 
-           case '\t':
-               cur = ((cur - 1) & tabmask) + tabsize + 1;
-               break;
+       case '\t':
+           cur = ((cur - 1) & tabmask) + tabsize + 1;
+           break;
 
 
-           case '\b':           /* this is a backspace */
-               --cur;
-               break;
+       case '\b':               /* this is a backspace */
+           --cur;
+           break;
 
 
-           default:
-               ++cur;
-               break;
+       default:
+           ++cur;
+           break;
        }                       /* end of switch */
     }                          /* end of for loop */
     return (cur);
 };
 
        }                       /* end of switch */
     }                          /* end of for loop */
     return (cur);
 };
 
-int    found_err;
 diag(level, msg, a, b)
 {
 diag(level, msg, a, b)
 {
-    if (level)
-       found_err = 1;
     if (output == stdout) {
        fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
        fprintf(stdout, msg, a, b);
     if (output == stdout) {
        fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
        fprintf(stdout, msg, a, b);
@@ -524,3 +497,94 @@ diag(level, msg, a, b)
        fprintf(stderr, "\n");
     }
 }
        fprintf(stderr, "\n");
     }
 }
+
+writefdef(f, nm)
+    register struct fstate *f;
+{
+    fprintf(output, ".ds f%c %s\n.nr s%c %d\n",
+           nm, f->font, nm, f->size);
+}
+
+char       *
+chfont(of, nf, s)
+    register struct fstate *of,
+               *nf;
+    char       *s;
+{
+    if (of->font[0] != nf->font[0]
+           || of->font[1] != nf->font[1]) {
+       *s++ = '\\';
+       *s++ = 'f';
+       if (nf->font[1]) {
+           *s++ = '(';
+           *s++ = nf->font[0];
+           *s++ = nf->font[1];
+       }
+       else
+           *s++ = nf->font[0];
+    }
+    if (nf->size != of->size) {
+       *s++ = '\\';
+       *s++ = 's';
+       if (nf->size < of->size) {
+           *s++ = '-';
+           *s++ = '0' + of->size - nf->size;
+       }
+       else {
+           *s++ = '+';
+           *s++ = '0' + nf->size - of->size;
+       }
+    }
+    return s;
+}
+
+
+setfont(f)
+    register struct fstate *f;
+{
+    if (f->font[0] != ps.cfont.font[0]
+           || f->font[1] != ps.cfont.font[1])
+       fprintf(output, f->font[1] ? "\\f(%s" : "\\f%s", f->font);
+    if (f->size != ps.cfont.size)
+       fprintf(output, "\\s%d", f->size);
+    ps.cfont = *f;
+}
+
+parsefont(f, s0)
+    register struct fstate *f;
+    char       *s0;
+{
+    register char *s = s0;
+    int         sizedelta = 0;
+    bzero(f, sizeof *f);
+    while (*s) {
+       if (isdigit(*s))
+           f->size = f->size * 10 + *s - '0';
+       else if (isupper(*s))
+           if (f->font[0])
+               f->font[1] = *s;
+           else
+               f->font[0] = *s;
+       else if (*s == 'c')
+           f->allcaps = 1;
+       else if (*s == '+')
+           sizedelta++;
+       else if (*s == '-')
+           sizedelta--;
+       else {
+           fprintf(stderr, "indent: bad font specification: %s\n", s0);
+           exit(1);
+       }
+       s++;
+    }
+    if (f->font[0] == 0)
+       f->font[0] = 'R';
+    if (bodyf.size == 0)
+       bodyf.size = 11;
+    if (f->size == 0)
+       f->size = bodyf.size + sizedelta;
+    else if (sizedelta > 0)
+       f->size += bodyf.size;
+    else
+       f->size = bodyf.size - f->size;
+}
index d743952..dacca37 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,74 +9,27 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)lexi.c     5.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)lexi.c     5.9 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
- * NAME:
- *     lexi
- *
- * FUNCTION:
- *     This is the token scanner for indent
- *
- * ALGORITHM:
- *     1) Strip off intervening blanks and/or tabs.
- *     2) If it is an alphanumeric token, move it to the token buffer "token".
- *        Check if it is a special reserved word that indent will want to
- *        know about.
- *     3) Non-alphanumeric tokens are handled with a big switch statement.  A
- *        flag is kept to remember if the last token was a "unary delimiter",
- *        which forces a following operator to be unary as opposed to binary.
- *
- * PARAMETERS:
- *     None
- *
- * RETURNS:
- *     An integer code indicating the type of token scanned.
- *
- * GLOBALS:
- *     buf_ptr =
- *     had_eof
- *     ps.last_u_d =   Set to true iff this token is a "unary delimiter"
- *
- * CALLS:
- *     fill_buffer
- *     printf (lib)
- *
- * CALLED BY:
- *     main
- *
- * NOTES:
- *     Start of comment is passed back so that the comment can be scanned by
- *     pr_comment.
- *
- *     Strings and character literals are returned just like identifiers.
- *
- * HISTORY:
- *     initial coding  November 1976   D A Willcox of CAC
- *     1/7/77          D A Willcox of CAC      Fix to provide proper handling
- *                                             of "int a -1;"
- *
- */\f
-
-/*
- * Here we have the token scanner for indent.  It scans off one token and
- * puts it in the global variable "token".  It returns a code, indicating
- * the type of token scanned. 
+ * Here we have the token scanner for indent.  It scans off one token and puts
+ * it in the global variable "token".  It returns a code, indicating the type
+ * of token scanned.
  */
 
  */
 
-#include "indent_globs.h"
-#include "indent_codes.h"
+#include "indent_globs.h";
+#include "indent_codes.h";
 #include "ctype.h"
 
 #define alphanum 1
 #include "ctype.h"
 
 #define alphanum 1
@@ -120,15 +74,15 @@ struct templ specials[100] =
 };
 
 char        chartype[128] =
 };
 
 char        chartype[128] =
-{                              /* this is used to facilitate the decision
-                                * of what type (alphanumeric, operator)
-                                * each character is */
+{                              /* this is used to facilitate the decision of
+                                * what type (alphanumeric, operator) each
+                                * character is */
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 3, 0, 0, 1, 3, 3, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 3, 0, 0, 1, 3, 3, 0,
-    0, 0, 3, 3, 0, 3, 3, 3,
+    0, 0, 3, 3, 0, 3, 0, 3,
     1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 0, 0, 3, 3, 3, 3,
     0, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 0, 0, 3, 3, 3, 3,
     0, 1, 1, 1, 1, 1, 1, 1,
@@ -144,12 +98,12 @@ char        chartype[128] =
 
 
 
 
 
 
-int 
+int
 lexi()
 {
     register char *tok;                /* local pointer to next char in token */
 lexi()
 {
     register char *tok;                /* local pointer to next char in token */
-    int         unary_delim;   /* this is set to 1 if the current token 
-                                *
+    int         unary_delim;   /* this is set to 1 if the current token
+                                * 
                                 * forces a following operator to be unary */
     static int  last_code;     /* the last token type returned */
     static int  l_struct;      /* set to 1 if the last token was 'struct' */
                                 * forces a following operator to be unary */
     static int  last_code;     /* the last token type returned */
     static int  l_struct;      /* set to 1 if the last token was 'struct' */
@@ -159,33 +113,64 @@ lexi()
     tok = token;               /* point to start of place to save token */
     unary_delim = false;
     ps.col_1 = ps.last_nl;     /* tell world that this token started in
     tok = token;               /* point to start of place to save token */
     unary_delim = false;
     ps.col_1 = ps.last_nl;     /* tell world that this token started in
-                                * column 1 iff the last thing scanned was
-                                * nl */
+                                * column 1 iff the last thing scanned was nl */
     ps.last_nl = false;
 
     while (*buf_ptr == ' ' || *buf_ptr == '\t') {      /* get rid of blanks */
     ps.last_nl = false;
 
     while (*buf_ptr == ' ' || *buf_ptr == '\t') {      /* get rid of blanks */
-       ps.col_1 = false;       /* leading blanks imply token is not in
-                                * column 1 */
+       ps.col_1 = false;       /* leading blanks imply token is not in column
+                                * 1 */
        if (++buf_ptr >= buf_end)
            fill_buffer();
     }
 
        if (++buf_ptr >= buf_end)
            fill_buffer();
     }
 
-    /* Scan an alphanumeric token.  Note that we must also handle
-     * stuff like "1.0e+03" and "7e-6". */
-    if (chartype[*buf_ptr & 0177] == alphanum) {       /* we have a character
-                                                        * or number */
-       register char *j;       /* used for searching thru list of 
+    /* Scan an alphanumeric token */
+    if (chartype[*buf_ptr] == alphanum || buf_ptr[0] == '.' && isdigit(buf_ptr[1])) {
+       /*
+        * we have a character or number
+        */
+       register char *j;       /* used for searching thru list of
+                                * 
                                 * reserved words */
        register struct templ *p;
                                 * reserved words */
        register struct templ *p;
-       register int c;
 
 
-       do {                    /* copy it over */
-           *tok++ = *buf_ptr++;
-           if (buf_ptr >= buf_end)
-               fill_buffer();
-       } while (chartype[c = *buf_ptr & 0177] == alphanum ||
-               isdigit(token[0]) && (c == '+' || c == '-') &&
-               (tok[-1] == 'e' || tok[-1] == 'E'));
+       if (isdigit(*buf_ptr) || buf_ptr[0] == '.' && isdigit(buf_ptr[1])) {
+           int         seendot = 0,
+                       seenexp = 0;
+           if (*buf_ptr == '0' &&
+                   (buf_ptr[1] == 'x' || buf_ptr[1] == 'X')) {
+               *tok++ = *buf_ptr++;
+               *tok++ = *buf_ptr++;
+               while (isxdigit(*buf_ptr))
+                   *tok++ = *buf_ptr++;
+           }
+           else
+               while (1) {
+                   if (*buf_ptr == '.')
+                       if (seendot)
+                           break;
+                       else
+                           seendot++;
+                   *tok++ = *buf_ptr++;
+                   if (!isdigit(*buf_ptr) && *buf_ptr != '.')
+                       if ((*buf_ptr != 'E' && *buf_ptr != 'e') || seenexp)
+                           break;
+                       else {
+                           seenexp++;
+                           seendot++;
+                           *tok++ = *buf_ptr++;
+                           if (*buf_ptr == '+' || *buf_ptr == '-')
+                               *tok++ = *buf_ptr++;
+                       }
+               }
+           if (*buf_ptr == 'L' || *buf_ptr == 'l')
+               *tok++ = *buf_ptr++;
+       }
+       else
+           while (chartype[*buf_ptr] == alphanum) {    /* copy it over */
+               *tok++ = *buf_ptr++;
+               if (buf_ptr >= buf_end)
+                   fill_buffer();
+           }
        *tok++ = '\0';
        while (*buf_ptr == ' ' || *buf_ptr == '\t') {   /* get rid of blanks */
            if (++buf_ptr >= buf_end)
        *tok++ = '\0';
        while (*buf_ptr == ' ' || *buf_ptr == '\t') {   /* get rid of blanks */
            if (++buf_ptr >= buf_end)
@@ -193,9 +178,8 @@ lexi()
        }
        ps.its_a_keyword = false;
        ps.sizeof_keyword = false;
        }
        ps.its_a_keyword = false;
        ps.sizeof_keyword = false;
-       if (l_struct) {         /* if last token was 'struct', then this
-                                * token should be treated as a
-                                * declaration */
+       if (l_struct) {         /* if last token was 'struct', then this token
+                                * should be treated as a declaration */
            l_struct = false;
            last_code = ident;
            ps.last_u_d = true;
            l_struct = false;
            last_code = ident;
            ps.last_u_d = true;
@@ -206,16 +190,15 @@ lexi()
                                 * return */
 
        /*
                                 * return */
 
        /*
-        * This loop will check if the token is a keyword. 
+        * This loop will check if the token is a keyword.
         */
        for (p = specials; (j = p->rwd) != 0; p++) {
            tok = token;        /* point at scanned token */
            if (*j++ != *tok++ || *j++ != *tok++)
                continue;       /* This test depends on the fact that
         */
        for (p = specials; (j = p->rwd) != 0; p++) {
            tok = token;        /* point at scanned token */
            if (*j++ != *tok++ || *j++ != *tok++)
                continue;       /* This test depends on the fact that
-                                * identifiers are always at least 1
-                                * character long (ie. the first two bytes
-                                * of the identifier are always
-                                * meaningful) */
+                                * identifiers are always at least 1 character
+                                * long (ie. the first two bytes of the
+                                * identifier are always meaningful) */
            if (tok[-1] == 0)
                break;          /* If its a one-character identifier */
            while (*tok++ == *j)
            if (tok[-1] == 0)
                break;          /* If its a one-character identifier */
            while (*tok++ == *j)
@@ -228,57 +211,61 @@ lexi()
            ps.its_a_keyword = true;
            ps.last_u_d = true;
            switch (p->rwcode) {
            ps.its_a_keyword = true;
            ps.last_u_d = true;
            switch (p->rwcode) {
-               case 1: /* it is a switch */
-                   return (swstmt);
-               case 2: /* a case or default */
-                   return (casestmt);
-
-               case 3: /* a "struct" */
-                   if (ps.p_l_follow)
-                       break;  /* inside parens: cast */
-                   l_struct = true;
-
-                   /*
-                    * Next time around, we will want to know that we have
-                    * had a 'struct' 
-                    */
-               case 4: /* one of the declaration keywords */
-                   if (ps.p_l_follow) {
-                       ps.cast_mask |= 1 << ps.p_l_follow;
-                       break;  /* inside parens: cast */
-                   }
-                   last_code = decl;
-                   return (decl);
+           case 1:             /* it is a switch */
+               return (swstmt);
+           case 2:             /* a case or default */
+               return (casestmt);
+
+           case 3:             /* a "struct" */
+               if (ps.p_l_follow)
+                   break;      /* inside parens: cast */
+               l_struct = true;
+
+               /*
+                * Next time around, we will want to know that we have had a
+                * 'struct'
+                */
+           case 4:             /* one of the declaration keywords */
+               if (ps.p_l_follow) {
+                   ps.cast_mask |= 1 << ps.p_l_follow;
+                   break;      /* inside parens: cast */
+               }
+               last_code = decl;
+               return (decl);
 
 
-               case 5: /* if, while, for */
-                   return (sp_paren);
+           case 5:             /* if, while, for */
+               return (sp_paren);
 
 
-               case 6: /* do, else */
-                   return (sp_nparen);
+           case 6:             /* do, else */
+               return (sp_nparen);
 
 
-               case 7:
-                   ps.sizeof_keyword = true;
-               default:        /* all others are treated like any other
+           case 7:
+               ps.sizeof_keyword = true;
+           default:            /* all others are treated like any other
                                 * identifier */
                                 * identifier */
-                   return (ident);
+               return (ident);
            }                   /* end of switch */
        }                       /* end of if (found_it) */
            }                   /* end of switch */
        }                       /* end of if (found_it) */
-       if (*buf_ptr == '(' && ps.tos <= 1 && ps.ind_level == 0
-           && (buf_ptr[1] != ')' || buf_ptr[2] != ';')) {
+       if (*buf_ptr == '(' && ps.tos <= 1 && ps.ind_level == 0) {
+           register char *p = buf_ptr;
+           while (p < buf_end)
+               if (*p++ == ')' && *p == ';')
+                   goto not_proc;
            strncpy(ps.procname, token, sizeof ps.procname - 1);
            ps.in_parameter_declaration = 1;
            strncpy(ps.procname, token, sizeof ps.procname - 1);
            ps.in_parameter_declaration = 1;
+    not_proc:;
        }
        }
-
        /*
         * The following hack attempts to guess whether or not the current
         * token is in fact a declaration keyword -- one that has been
        /*
         * The following hack attempts to guess whether or not the current
         * token is in fact a declaration keyword -- one that has been
-        * typedefd 
+        * typedefd
         */
         */
-       if (((*buf_ptr == '*' && buf_ptr[1] != '=') || isalpha(*buf_ptr))
-           && !ps.p_l_follow
-           && (ps.last_token == rparen || ps.last_token == semicolon ||
-               ps.last_token == decl ||
-               ps.last_token == lbrace || ps.last_token == rbrace)) {
+       if (((*buf_ptr == '*' && buf_ptr[1] != '=') || isalpha(*buf_ptr) || *buf_ptr == '_')
+               && !ps.p_l_follow
+               && !ps.block_init
+               && (ps.last_token == rparen || ps.last_token == semicolon ||
+                   ps.last_token == decl ||
+                   ps.last_token == lbrace || ps.last_token == rbrace)) {
            ps.its_a_keyword = true;
            ps.last_u_d = true;
            last_code = decl;
            ps.its_a_keyword = true;
            ps.last_u_d = true;
            last_code = decl;
@@ -290,227 +277,230 @@ lexi()
        last_code = ident;
        return (ident);         /* the ident is not in the list */
     }                          /* end of procesing for alpanum character */
        last_code = ident;
        return (ident);         /* the ident is not in the list */
     }                          /* end of procesing for alpanum character */
-    /* Scan a non-alphanumeric token */
+    /* l l l Scan a non-alphanumeric token */
 
 
-    *tok++ = *buf_ptr;         /* if it is only a one-character token, it
-                                * is moved here */
+    *tok++ = *buf_ptr;         /* if it is only a one-character token, it is
+                                * moved here */
     *tok = '\0';
     if (++buf_ptr >= buf_end)
        fill_buffer();
 
     switch (*token) {
     *tok = '\0';
     if (++buf_ptr >= buf_end)
        fill_buffer();
 
     switch (*token) {
-       case '\n':
-           unary_delim = ps.last_u_d;
-           ps.last_nl = true;  /* remember that we just had a newline */
-           code = (had_eof ? 0 : newline);
-
-           /*
-            * if data has been exausted, the newline is a dummy, and we
-            * should return code to stop 
-            */
-           break;
+    case '\n':
+       unary_delim = ps.last_u_d;
+       ps.last_nl = true;      /* remember that we just had a newline */
+       code = (had_eof ? 0 : newline);
 
 
-       case '\'':              /* start of quoted character */
-       case '"':               /* start of string */
-           qchar = *token;
-           if (troff) {
-               tok[-1] = '`';
-               if (qchar == '"')
-                   *tok++ = '`';
-               *tok++ = BACKSLASH;
-               *tok++ = 'f';
-               *tok++ = 'L';
-           }
-           do {                /* copy the string */
-               while (1) {     /* move one character or [/<char>]<char> */
-                   if (*buf_ptr == '\n') {
-                       printf("%d: Unterminated literal\n", line_no);
-                       goto stop_lit;
+       /*
+        * if data has been exausted, the newline is a dummy, and we should
+        * return code to stop
+        */
+       break;
+
+    case '\'':                 /* start of quoted character */
+    case '"':                  /* start of string */
+       qchar = *token;
+       if (troff) {
+           tok[-1] = '`';
+           if (qchar == '"')
+               *tok++ = '`';
+           tok = chfont(&bodyf, &stringf, tok);
+       }
+       do {                    /* copy the string */
+           while (1) {         /* move one character or [/<char>]<char> */
+               if (*buf_ptr == '\n') {
+                   printf("%d: Unterminated literal\n", line_no);
+                   goto stop_lit;
+               }
+               *tok = *buf_ptr++;
+               if (buf_ptr >= buf_end)
+                   fill_buffer();
+               if (had_eof || ((tok - token) > (bufsize - 2))) {
+                   printf("Unterminated literal\n");
+                   ++tok;
+                   goto stop_lit;
+                   /* get outof literal copying loop */
+               }
+               if (*tok == BACKSLASH) {        /* if escape, copy extra char */
+                   if (*buf_ptr == '\n')       /* check for escaped newline */
+                       ++line_no;
+                   if (troff) {
+                       *++tok = BACKSLASH;
+                       if (*buf_ptr == BACKSLASH)
+                           *++tok = BACKSLASH;
                    }
                    }
-                   *tok = *buf_ptr++;
+                   *++tok = *buf_ptr++;
+                   ++tok;      /* we must increment this again because we
+                                * copied two chars */
                    if (buf_ptr >= buf_end)
                        fill_buffer();
                    if (buf_ptr >= buf_end)
                        fill_buffer();
-                   if (had_eof || ((tok - token) > (bufsize - 2))) {
-                       printf("Unterminated literal\n");
-                       ++tok;
-                       goto stop_lit;
-                       /* get outof literal copying loop */
-                   }
-                   if (*tok == BACKSLASH) {    /* if escape, copy extra
-                                                * char */
-                       if (*buf_ptr == '\n')   /* check for escaped
-                                                * newline */
-                           ++line_no;
-                       if (troff) {
-                           *++tok = BACKSLASH;
-                           if (*buf_ptr == BACKSLASH)
-                               *++tok = BACKSLASH;
-                       }
-                       *++tok = *buf_ptr++;
-                       ++tok;  /* we must increment this again because we
-                                * copied two chars */
-                       if (buf_ptr >= buf_end)
-                           fill_buffer();
-                   }
-                   else
-                       break;  /* we copied one character */
-               }               /* end of while (1) */
-           } while (*tok++ != qchar);
-           if (troff) {
-               tok[-1] = BACKSLASH;
-               *tok++ = 'f';
-               *tok++ = 'R';
+               }
+               else
+                   break;      /* we copied one character */
+           }                   /* end of while (1) */
+       } while (*tok++ != qchar);
+       if (troff) {
+           tok = chfont(&stringf, &bodyf, tok - 1);
+           if (qchar == '"')
                *tok++ = '\'';
                *tok++ = '\'';
-               if (qchar == '"')
-                   *tok++ = '\'';
-           }
-    stop_lit:
-           code = ident;
-           break;
-
-       case ('('):
-       case ('['):
-           unary_delim = true;
-           code = lparen;
-           break;
-
-       case (')'):
-       case (']'):
-           code = rparen;
-           break;
-
-       case '#':
-           unary_delim = ps.last_u_d;
-           code = preesc;
-           break;
-
-       case '?':
-           unary_delim = true;
-           code = question;
-           break;
-
-       case (':'):
-           code = colon;
-           unary_delim = true;
-           break;
-
-       case (';'):
-           unary_delim = true;
-           code = semicolon;
-           break;
-
-       case ('{'):
-           unary_delim = true;
-
-           /*
-            * if (ps.in_or_st) ps.block_init = 1; 
-            */
-           code = ps.block_init ? lparen : lbrace;
-           break;
-
-       case ('}'):
-           unary_delim = true;
-           code = ps.block_init ? rparen : rbrace;
-           break;
+       }
+stop_lit:
+       code = ident;
+       break;
+
+    case ('('):
+    case ('['):
+       unary_delim = true;
+       code = lparen;
+       break;
+
+    case (')'):
+    case (']'):
+       code = rparen;
+       break;
+
+    case '#':
+       unary_delim = ps.last_u_d;
+       code = preesc;
+       break;
+
+    case '?':
+       unary_delim = true;
+       code = question;
+       break;
+
+    case (':'):
+       code = colon;
+       unary_delim = true;
+       break;
+
+    case (';'):
+       unary_delim = true;
+       code = semicolon;
+       break;
+
+    case ('{'):
+       unary_delim = true;
 
 
-       case 014:               /* a form feed */
-           unary_delim = ps.last_u_d;
-           ps.last_nl = true;  /* remember this so we can set 'ps.col_1'
+       /*
+        * if (ps.in_or_st) ps.block_init = 1;
+        */
+       /* ?    code = ps.block_init ? lparen : lbrace; */
+       code = lbrace;
+       break;
+
+    case ('}'):
+       unary_delim = true;
+       /* ?    code = ps.block_init ? rparen : rbrace; */
+       code = rbrace;
+       break;
+
+    case 014:                  /* a form feed */
+       unary_delim = ps.last_u_d;
+       ps.last_nl = true;      /* remember this so we can set 'ps.col_1'
                                 * right */
                                 * right */
-           code = form_feed;
-           break;
-
-       case (','):
-           unary_delim = true;
-           code = comma;
-           break;
-
-       case '.':
-           unary_delim = false;
-           code = period;
-           break;
-
-       case '-':
-       case '+':               /* check for -, +, --, ++ */
-           code = (ps.last_u_d ? unary_op : binary_op);
-           unary_delim = true;
-
-           if (*buf_ptr == token[0]) {
-               /* check for doubled character */
-               *tok++ = *buf_ptr++;
-               /* buffer overflow will be checked at end of loop */
-               if (last_code == ident || last_code == rparen) {
-                   code = (ps.last_u_d ? unary_op : postop);
-                   /* check for following ++ or -- */
-                   unary_delim = false;
-               }
-           }
-           else if (*buf_ptr == '=')
-               /* check for operator += */
-               *tok++ = *buf_ptr++;
-           else if (token[0] == '-' && *buf_ptr == '>') {
-               /* check for operator -> */
-               *tok++ = *buf_ptr++;
-               if (!pointer_as_binop) {
-                   code = unary_op;
-                   unary_delim = false;
-                   ps.want_blank = false;
-               }
-           }
-           /* buffer overflow will be checked at end of switch */
-
-           break;
-
-       case '=':
-           if (ps.in_or_st)
-               ps.block_init = 1;
-           if (chartype[*buf_ptr] == opchar) { /* we have two char
-                                                * assignment */
-               tok[-1] = *buf_ptr++;
-               if ((tok[-1] == '<' || tok[-1] == '>') && tok[-1] == *buf_ptr)
-                   *tok++ = *buf_ptr++;
-               *tok++ = '=';   /* Flip =+ to += */
-               *tok = 0;
+       code = form_feed;
+       break;
+
+    case (','):
+       unary_delim = true;
+       code = comma;
+       break;
+
+    case '.':
+       unary_delim = false;
+       code = period;
+       break;
+
+    case '-':
+    case '+':                  /* check for -, +, --, ++ */
+       code = (ps.last_u_d ? unary_op : binary_op);
+       unary_delim = true;
+
+       if (*buf_ptr == token[0]) {
+           /* check for doubled character */
+           *tok++ = *buf_ptr++;
+           /* buffer overflow will be checked at end of loop */
+           if (last_code == ident || last_code == rparen) {
+               code = (ps.last_u_d ? unary_op : postop);
+               /* check for following ++ or -- */
+               unary_delim = false;
            }
            }
-           code = binary_op;
-           unary_delim = true;
-           break;
-           /* can drop thru!!! */
-
-       case '>':
-       case '<':
-       case '!':               /* ops like <, <<, <=, !=, etc */
-           if (*buf_ptr == '>' || *buf_ptr == '<' || *buf_ptr == '=') {
-               *tok++ = *buf_ptr;
-               if (++buf_ptr >= buf_end)
-                   fill_buffer();
+       }
+       else if (*buf_ptr == '=')
+           /* check for operator += */
+           *tok++ = *buf_ptr++;
+       else if (*buf_ptr == '>') {
+           /* check for operator -> */
+           *tok++ = *buf_ptr++;
+           if (!pointer_as_binop) {
+               unary_delim = false;
+               code = unary_op;
+               ps.want_blank = false;
            }
            }
-           if (*buf_ptr == '=')
+       }
+       break;                  /* buffer overflow will be checked at end of
+                                * switch */
+
+    case '=':
+       if (ps.in_or_st)
+           ps.block_init = 1;
+#ifdef undef
+       if (chartype[*buf_ptr] == opchar) {     /* we have two char assignment */
+           tok[-1] = *buf_ptr++;
+           if ((tok[-1] == '<' || tok[-1] == '>') && tok[-1] == *buf_ptr)
                *tok++ = *buf_ptr++;
                *tok++ = *buf_ptr++;
-           code = (ps.last_u_d ? unary_op : binary_op);
-           unary_delim = true;
-           break;
+           *tok++ = '=';       /* Flip =+ to += */
+           *tok = 0;
+       }
+#else
+       if (*buf_ptr == '=') {/* == */
+           *tok++ = '=';       /* Flip =+ to += */
+           buf_ptr++;
+           *tok = 0;
+       }
+#endif
+       code = binary_op;
+       unary_delim = true;
+       break;
+       /* can drop thru!!! */
+
+    case '>':
+    case '<':
+    case '!':                  /* ops like <, <<, <=, !=, etc */
+       if (*buf_ptr == '>' || *buf_ptr == '<' || *buf_ptr == '=') {
+           *tok++ = *buf_ptr;
+           if (++buf_ptr >= buf_end)
+               fill_buffer();
+       }
+       if (*buf_ptr == '=')
+           *tok++ = *buf_ptr++;
+       code = (ps.last_u_d ? unary_op : binary_op);
+       unary_delim = true;
+       break;
 
 
-       default:
-           if (token[0] == '/' && *buf_ptr == '*') {
-               /* it is start of comment */
-               *tok++ = '*';
+    default:
+       if (token[0] == '/' && *buf_ptr == '*') {
+           /* it is start of comment */
+           *tok++ = '*';
 
 
-               if (++buf_ptr >= buf_end)
-                   fill_buffer();
+           if (++buf_ptr >= buf_end)
+               fill_buffer();
 
 
-               code = comment;
-               unary_delim = ps.last_u_d;
-               break;
-           }
-           while (*(tok - 1) == *buf_ptr || *buf_ptr == '=') {
-               /* handle ||, &&, etc, and also things as in int *****i */
-               *tok++ = *buf_ptr;
-               if (++buf_ptr >= buf_end)
-                   fill_buffer();
-           }
-           code = (ps.last_u_d ? unary_op : binary_op);
-           unary_delim = true;
+           code = comment;
+           unary_delim = ps.last_u_d;
+           break;
+       }
+       while (*(tok - 1) == *buf_ptr || *buf_ptr == '=') {
+           /*
+            * handle ||, &&, etc, and also things as in int *****i
+            */
+           *tok++ = *buf_ptr;
+           if (++buf_ptr >= buf_end)
+               fill_buffer();
+       }
+       code = (ps.last_u_d ? unary_op : binary_op);
+       unary_delim = true;
 
 
     }                          /* end of switch */
 
 
     }                          /* end of switch */
@@ -525,10 +515,11 @@ lexi()
     return (code);
 };
 
     return (code);
 };
 
-/* Add the given keyword to the keyword table, using val as the keyword type
-   */
-addkey (key, val)
-char       *key;
+/*
+ * Add the given keyword to the keyword table, using val as the keyword type
+ */
+addkey(key, val)
+    char       *key;
 {
     register struct templ *p = specials;
     while (p->rwd)
 {
     register struct templ *p = specials;
     while (p->rwd)
@@ -538,7 +529,7 @@ char       *key;
            p++;
     if (p >= specials + sizeof specials / sizeof specials[0])
        return;                 /* For now, table overflows are silently
            p++;
     if (p >= specials + sizeof specials / sizeof specials[0])
        return;                 /* For now, table overflows are silently
-                                  ignored */
+                                * ignored */
     p->rwd = key;
     p->rwcode = val;
     p[1].rwd = 0;
     p->rwd = key;
     p->rwcode = val;
     p[1].rwd = 0;
index c86317b..e17c15b 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,56 +9,21 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)parse.c    5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)parse.c    5.7 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
-/*
- * FILE NAME:
- *     parse.c
- *
- * PURPOSE:
- *     Contains the routines which keep track of the parse stack.
- *
- * GLOBALS:
- *     ps.p_stack =    The parse stack, set by both routines
- *     ps.il =         Stack of indentation levels, set by parse
- *     ps.cstk =               Stack of case statement indentation levels, set by parse
- *     ps.tos =                Pointer to top of stack, set by both routines.
- *
- * FUNCTIONS:
- *     parse
- *     reduce
- */\f
-/*-
- * Copyright (C) 1976 by the Board of Trustees of the University of Illinois 
- *
- * All rights reserved 
- *
- *
- * NAME: parse 
- *
- * FUNCTION: Parse is given one input which is a "maxi token" just scanned
- * from input.  Maxi tokens are signifigant constructs such as else, {,
- * do, if (...), etc.  Parse works with reduce to maintain a parse stack
- * of these constructs.  Parse is responsible for the "shift" portion of
- * the parse algorithm, and reduce handles the "reduce" portion. 
- *
- * HISTORY: initial coding     November 1976   D A Willcox of CAC 
- *
- */\f
-
-#include "./indent_globs.h"
-#include "./indent_codes.h"
+#include "./indent_globs.h";
+#include "./indent_codes.h";
 
 
 
 
 
 
@@ -70,269 +36,274 @@ parse(tk)
 #ifdef debug
     printf("%2d - %s\n", tk, token);
 #endif
 #ifdef debug
     printf("%2d - %s\n", tk, token);
 #endif
+
     while (ps.p_stack[ps.tos] == ifhead && tk != elselit) {
        /* true if we have an if without an else */
        ps.p_stack[ps.tos] = stmt;      /* apply the if(..) stmt ::= stmt
     while (ps.p_stack[ps.tos] == ifhead && tk != elselit) {
        /* true if we have an if without an else */
        ps.p_stack[ps.tos] = stmt;      /* apply the if(..) stmt ::= stmt
-                                * reduction */
+                                        * reduction */
        reduce();               /* see if this allows any reduction */
     }
 
 
        reduce();               /* see if this allows any reduction */
     }
 
 
-    switch (tk) {              /* go on and figure out what to do with
-                                * the input */
+    switch (tk) {              /* go on and figure out what to do with the
+                                * input */
 
 
-       case decl:              /* scanned a declaration word */
-           ps.search_brace = btype_2;
-           /* indicate that following brace should be on same line */
-           if (ps.p_stack[ps.tos] != decl) {   /* only put one declaration onto
-                                        * stack */
-               break_comma = true;     /* while in declaration, newline
-                                        * should be forced after comma */
-               ps.p_stack[++ps.tos] = decl;
-               ps.il[ps.tos] = ps.i_l_follow;
-
-               if (ps.ljust_decl) {    /* only do if we want left
-                                        * justified declarations */
-                   ps.ind_level = 0;
-                   for (i = ps.tos - 1; i > 0; --i)
-                       if (ps.p_stack[i] == decl)
-                           ++ps.ind_level;     /* indentation is number
-                                                * of declaration levels
-                                                * deep we are */
-                   ps.i_l_follow = ps.ind_level;
-               }
-           }
-           break;
-
-       case ifstmt:            /* scanned if (...) */
-           if (ps.p_stack[ps.tos] == elsehead && ps.else_if)   /* "else if ..." */
-               ps.i_l_follow = ps.il[ps.tos];
-       case dolit:             /* 'do' */
-       case forstmt:           /* for (...) */
-           ps.p_stack[++ps.tos] = tk;
-           ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
-           ++ps.i_l_follow;    /* subsequent statements should be
-                                * indented 1 */
-           ps.search_brace = btype_2;
-           break;
-
-       case lbrace:            /* scanned { */
-           break_comma = false;/* don't break comma in an initial list */
-           if (ps.p_stack[ps.tos] == stmt || ps.p_stack[ps.tos] == decl
-                   || ps.p_stack[ps.tos] == stmtl)
-               ++ps.i_l_follow;        /* it is a random, isolated stmt group or
-                                * a declaration */
-           else {
-               if (s_code == e_code) {
-                   /* only do this if there is nothing on the line */
-                   --ps.ind_level;
-                   /* it is a group as part of a while, for, etc. */
-                   if (ps.p_stack[ps.tos] == swstmt && ps.case_indent)
-                       --ps.ind_level;
-                   /*
-                    * for a switch, brace should be two levels out from
-                    * the code 
-                    */
-               }
-           }
-
-           ps.p_stack[++ps.tos] = lbrace;
-           ps.il[ps.tos] = ps.ind_level;
-           ps.p_stack[++ps.tos] = stmt;
-           /* allow null stmt between braces */
+    case decl:                 /* scanned a declaration word */
+       ps.search_brace = btype_2;
+       /* indicate that following brace should be on same line */
+       if (ps.p_stack[ps.tos] != decl) {       /* only put one declaration
+                                                * onto stack */
+           break_comma = true; /* while in declaration, newline should be
+                                * forced after comma */
+           ps.p_stack[++ps.tos] = decl;
            ps.il[ps.tos] = ps.i_l_follow;
            ps.il[ps.tos] = ps.i_l_follow;
-           break;
 
 
-       case whilestmt:         /* scanned while (...) */
-           if (ps.p_stack[ps.tos] == dohead) {
-               /* it is matched with do stmt */
-               ps.ind_level = ps.i_l_follow = ps.il[ps.tos];
-               ps.p_stack[++ps.tos] = whilestmt;
-               ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
+           if (ps.ljust_decl) {/* only do if we want left justified
+                                * declarations */
+               ps.ind_level = 0;
+               for (i = ps.tos - 1; i > 0; --i)
+                   if (ps.p_stack[i] == decl)
+                       ++ps.ind_level; /* indentation is number of
+                                        * declaration levels deep we are */
+               ps.i_l_follow = ps.ind_level;
            }
            }
-           else {              /* it is a while loop */
-               ps.p_stack[++ps.tos] = whilestmt;
-               ps.il[ps.tos] = ps.i_l_follow;
-               ++ps.i_l_follow;
-               ps.search_brace = btype_2;
+       }
+       break;
+
+    case ifstmt:               /* scanned if (...) */
+       if (ps.p_stack[ps.tos] == elsehead && ps.else_if)       /* "else if ..." */
+           ps.i_l_follow = ps.il[ps.tos];
+    case dolit:                /* 'do' */
+    case forstmt:              /* for (...) */
+       ps.p_stack[++ps.tos] = tk;
+       ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
+       ++ps.i_l_follow;        /* subsequent statements should be indented 1 */
+       ps.search_brace = btype_2;
+       break;
+
+    case lbrace:               /* scanned { */
+       break_comma = false;    /* don't break comma in an initial list */
+       if (ps.p_stack[ps.tos] == stmt || ps.p_stack[ps.tos] == decl
+               || ps.p_stack[ps.tos] == stmtl)
+           ++ps.i_l_follow;    /* it is a random, isolated stmt group or a
+                                * declaration */
+       else {
+           if (s_code == e_code) {
+               /*
+                * only do this if there is nothing on the line
+                */
+               --ps.ind_level;
+               /*
+                * it is a group as part of a while, for, etc.
+                */
+               if (ps.p_stack[ps.tos] == swstmt && ps.case_indent >= 1)
+                   --ps.ind_level;
+               /*
+                * for a switch, brace should be two levels out from the code
+                */
            }
            }
+       }
 
 
-           break;
-
-       case elselit:           /* scanned an else */
+       ps.p_stack[++ps.tos] = lbrace;
+       ps.il[ps.tos] = ps.ind_level;
+       ps.p_stack[++ps.tos] = stmt;
+       /* allow null stmt between braces */
+       ps.il[ps.tos] = ps.i_l_follow;
+       break;
+
+    case whilestmt:            /* scanned while (...) */
+       if (ps.p_stack[ps.tos] == dohead) {
+           /* it is matched with do stmt */
+           ps.ind_level = ps.i_l_follow = ps.il[ps.tos];
+           ps.p_stack[++ps.tos] = whilestmt;
+           ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
+       }
+       else {                  /* it is a while loop */
+           ps.p_stack[++ps.tos] = whilestmt;
+           ps.il[ps.tos] = ps.i_l_follow;
+           ++ps.i_l_follow;
+           ps.search_brace = btype_2;
+       }
 
 
-           if (ps.p_stack[ps.tos] != ifhead)
-               diag(1,"Unmatched 'else'");
-           else {
-               ps.ind_level = ps.il[ps.tos];           /* indentation for else should be same as for if */
-               ps.i_l_follow = ps.ind_level + 1;       /* everything following should be in 1 level */
-               ps.p_stack[ps.tos] = elsehead;
-               /* remember if with else */
-               ps.search_brace = btype_2;
-           }
+       break;
 
 
-           break;
+    case elselit:              /* scanned an else */
 
 
-       case rbrace:            /* scanned a } */
-           /* stack should have <lbrace> <stmt> or <lbrace> <stmtl> */
-           if (ps.p_stack[ps.tos - 1] == lbrace) {
-               ps.ind_level = ps.i_l_follow = ps.il[--ps.tos];
-               ps.p_stack[ps.tos] = stmt;
-           }
-           else
-               diag(1,"Stmt nesting error.");
-           break;
+       if (ps.p_stack[ps.tos] != ifhead)
+           diag(1, "Unmatched 'else'");
+       else {
+           ps.ind_level = ps.il[ps.tos];       /* indentation for else should
+                                                * be same as for if */
+           ps.i_l_follow = ps.ind_level + 1;   /* everything following should
+                                                * be in 1 level */
+           ps.p_stack[ps.tos] = elsehead;
+           /* remember if with else */
+           ps.search_brace = btype_2 | ps.else_if;
+       }
+       break;
 
 
-       case swstmt:            /* had switch (...) */
-           ps.p_stack[++ps.tos] = swstmt;
-           ps.cstk[ps.tos] = case_ind;
-           /* save current case indent level */
-           ps.il[ps.tos] = ps.i_l_follow;
-           case_ind = ps.i_l_follow + ps.case_indent;  /* cases should be one
+    case rbrace:               /* scanned a } */
+       /* stack should have <lbrace> <stmt> or <lbrace> <stmtl> */
+       if (ps.p_stack[ps.tos - 1] == lbrace) {
+           ps.ind_level = ps.i_l_follow = ps.il[--ps.tos];
+           ps.p_stack[ps.tos] = stmt;
+       }
+       else
+           diag(1, "Stmt nesting error.");
+       break;
+
+    case swstmt:               /* had switch (...) */
+       ps.p_stack[++ps.tos] = swstmt;
+       ps.cstk[ps.tos] = case_ind;
+       /* save current case indent level */
+       ps.il[ps.tos] = ps.i_l_follow;
+       case_ind = ps.i_l_follow + ps.case_indent;      /* cases should be one
                                                         * level down from
                                                         * switch */
                                                         * level down from
                                                         * switch */
-           ps.i_l_follow += ps.case_indent + 1;        /* statements should be
-                                                * two levels in */
-           ps.search_brace = btype_2;
-           break;
+       ps.i_l_follow + = ps.case_indent + 1;   /* statements should be two
+                                                * levels in */
+       ps.search_brace = btype_2;
+       break;
 
 
-       case semicolon:         /* this indicates a simple stmt */
-           break_comma = false;/* turn off flag to break after commas in
-                                * declaration */
-           ps.p_stack[++ps.tos] = stmt;
-           ps.il[ps.tos] = ps.ind_level;
-           break;
+    case semicolon:            /* this indicates a simple stmt */
+       break_comma = false;    /* turn off flag to break after commas in a
+                                * declaration */
+       ps.p_stack[++ps.tos] = stmt;
+       ps.il[ps.tos] = ps.ind_level;
+       break;
 
 
-       default:                /* this is an error */
-           diag(1,"Unknown code to parser");
-           return;
+    default:                   /* this is an error */
+       diag(1, "Unknown code to parser");
+       return;
 
 
     }                          /* end of switch */
 
     reduce();                  /* see if any reduction can be done */
 
 
     }                          /* end of switch */
 
     reduce();                  /* see if any reduction can be done */
+
 #ifdef debug
     for (i = 1; i <= ps.tos; ++i)
        printf("(%d %d)", ps.p_stack[i], ps.il[i]);
     printf("\n");
 #endif
 #ifdef debug
     for (i = 1; i <= ps.tos; ++i)
        printf("(%d %d)", ps.p_stack[i], ps.il[i]);
     printf("\n");
 #endif
+
     return;
 }
     return;
 }
-\f/* 
- * Copyright (C) 1976 by the Board of Trustees of the University of Illinois 
- *
- * All rights reserved 
- *
- *
- * NAME: reduce 
- *
- * FUNCTION: Implements the reduce part of the parsing algorithm 
- *
- * ALGORITHM: The following reductions are done.  Reductions are repeated
- * until no more are possible. 
- *
+
+/*
+ * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
+ * 
+ * All rights reserved
+ * 
+ * 
+ * NAME: reduce
+ * 
+ * FUNCTION: Implements the reduce part of the parsing algorithm
+ * 
+ * ALGORITHM: The following reductions are done.  Reductions are repeated until
+ * no more are possible.
+ * 
  * Old TOS             New TOS <stmt> <stmt>   <stmtl> <stmtl> <stmt>  <stmtl> do
  * Old TOS             New TOS <stmt> <stmt>   <stmtl> <stmtl> <stmt>  <stmtl> do
- * <stmt>      "dostmt" if <stmt>      "ifstmt" switch <stmt>  <stmt>
- * decl <stmt> <stmt> "ifelse" <stmt>  <stmt> for <stmt>       <stmt>
- * while <stmt>        <stmt> "dostmt" while   <stmt> 
- *
+ * <stmt>      "dostmt" if <stmt>      "ifstmt" switch <stmt>  <stmt> decl
+ * <stmt>      <stmt> "ifelse" <stmt>  <stmt> for <stmt>       <stmt> while
+ * <stmt>      <stmt> "dostmt" while   <stmt>
+ * 
  * On each reduction, ps.i_l_follow (the indentation for the following line) is
  * On each reduction, ps.i_l_follow (the indentation for the following line) is
- * set to the indentation level associated with the old TOS. 
- *
- * PARAMETERS: None 
- *
- * RETURNS: Nothing 
- *
- * GLOBALS: ps.cstk ps.i_l_follow = ps.il ps.p_stack = ps.tos = 
- *
- * CALLS: None 
- *
+ * set to the indentation level associated with the old TOS.
+ * 
+ * PARAMETERS: None
+ * 
+ * RETURNS: Nothing
+ * 
+ * GLOBALS: ps.cstk ps.i_l_follow = ps.il ps.p_stack = ps.tos =
+ * 
+ * CALLS: None
+ * 
  * CALLED BY: parse \1c
  * CALLED BY: parse \1c
- *
- * HISTORY: initial coding     November 1976   D A Willcox of CAC 
- *
+ * 
+ * HISTORY: initial coding     November 1976   D A Willcox of CAC
+ * 
  */\f
 /*----------------------------------------------*\
  */\f
 /*----------------------------------------------*\
- * |   REDUCTION PHASE
+|   REDUCTION PHASE                                |
 \*----------------------------------------------*/
 \*----------------------------------------------*/
-reduce() {
+reduce()
+{
 
     register int i;
 
 
     register int i;
 
-    for (;;) {                 /* keep looping until there is nothing
-                                * left to reduce */
+    for (;;) {                 /* keep looping until there is nothing left to
+                                * reduce */
 
        switch (ps.p_stack[ps.tos]) {
 
 
        switch (ps.p_stack[ps.tos]) {
 
-           case stmt: 
-               switch (ps.p_stack[ps.tos - 1]) {
-
-                   case stmt: 
-                   case stmtl: 
-                       /* stmtl stmt or stmt stmt */
-                       ps.p_stack[--ps.tos] = stmtl;
-                       break;
-
-                   case dolit: /* <do> <stmt> */
-                       ps.p_stack[--ps.tos] = dohead;
-                       ps.i_l_follow = ps.il[ps.tos];
-                       break;
-
-                   case ifstmt: 
-                       /* <if> <stmt> */
-                       ps.p_stack[--ps.tos] = ifhead;
-                       for (i = ps.tos - 1;
-                               (
-                                   ps.p_stack[i] != stmt
-                                   &&
-                                   ps.p_stack[i] != stmtl
-                                   &&
-                                   ps.p_stack[i] != lbrace
-                               );
-                               --i);
-                       ps.i_l_follow = ps.il[i];
-                       /*
-                        * for the time being, we will assume that there
-                        * is no else on this if, and set the indentation
-                        * level accordingly. If an else is scanned, it
-                        * will be fixed up later 
-                        */
-                       break;
-
-                   case swstmt: 
-                       /* <switch> <stmt> */
-                       case_ind = ps.cstk[ps.tos - 1];
-
-                   case decl:  /* finish of a declaration */
-                   case elsehead: 
-                       /* <<if> <stmt> else> <stmt> */
-                   case forstmt: 
-                       /* <for> <stmt> */
-                   case whilestmt: 
-                       /* <while> <stmt> */
-                       ps.p_stack[--ps.tos] = stmt;
-                       ps.i_l_follow = ps.il[ps.tos];
-                       break;
-
-                   default:    /* <anything else> <stmt> */
-                       return;
-
-               }               /* end of section for <stmt> on top of
-                                * stack */
+       case stmt:
+           switch (ps.p_stack[ps.tos - 1]) {
+
+           case stmt:
+           case stmtl:
+               /* stmtl stmt or stmt stmt */
+               ps.p_stack[--ps.tos] = stmtl;
                break;
 
                break;
 
-           case whilestmt:     /* while (...) on top */
-               if (ps.p_stack[ps.tos - 1] == dohead) {
-                   /* it is termination of a do while */
-                   ps.p_stack[--ps.tos] = stmt;
-                   break;
-               }
-               else
-                   return;
+           case dolit: /* <do> <stmt> */
+               ps.p_stack[--ps.tos] = dohead;
+               ps.i_l_follow = ps.il[ps.tos];
+               break;
+
+           case ifstmt:
+               /* <if> <stmt> */
+               ps.p_stack[--ps.tos] = ifhead;
+               for (i = ps.tos - 1;
+                       (
+                        ps.p_stack[i] != stmt
+                        &&
+                        ps.p_stack[i] != stmtl
+                        &&
+                        ps.p_stack[i] != lbrace
+                        );
+                       --i);
+               ps.i_l_follow = ps.il[i];
+               /*
+                * for the time being, we will assume that there is no else on
+                * this if, and set the indentation level accordingly. If an
+                * else is scanned, it will be fixed up later
+                */
+               break;
 
 
-           default:            /* anything else on top */
+           case swstmt:
+               /* <switch> <stmt> */
+               case_ind = ps.cstk[ps.tos - 1];
+
+           case decl:          /* finish of a declaration */
+           case elsehead:
+               /* <<if> <stmt> else> <stmt> */
+           case forstmt:
+               /* <for> <stmt> */
+           case whilestmt:
+               /* <while> <stmt> */
+               ps.p_stack[--ps.tos] = stmt;
+               ps.i_l_follow = ps.il[ps.tos];
+               break;
+
+           default:            /* <anything else> <stmt> */
+               return;
+
+           }                   /* end of section for <stmt> on top of stack */
+           break;
+
+       case whilestmt: /* while (...) on top */
+           if (ps.p_stack[ps.tos - 1] == dohead) {
+               /* it is termination of a do while */
+               ps.p_stack[--ps.tos] = stmt;
+               break;
+           }
+           else
                return;
 
                return;
 
+       default:                /* anything else on top */
+           return;
+
        }
     }
 }
        }
     }
 }
index 81dd6d6..163cb37 100644 (file)
@@ -1,5 +1,6 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1985 Sun Microsystems, Inc.
+ * Copyright (c) 1980 The Regents of the University of California.
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  * All rights reserved.
  *
@@ -8,17 +9,17 @@
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
  * duplicated in all such forms and that any documentation,
  * advertising materials, and other materials related to such
  * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley and the University
- * of Illinois, Urbana.  The name of either
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * by the University of California, Berkeley, the University of Illinois,
+ * Urbana, and Sun Microsystems, Inc.  The name of either University
+ * or Sun Microsystems may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)pr_comment.c       5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)pr_comment.c       5.7 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -35,24 +36,25 @@ static char sccsid[] = "@(#)pr_comment.c    5.6 (Berkeley) %G%";
  *        comment.
  *     3) If lines should be filled, then scan thru input_buffer copying
  *        characters to com_buf.  Remember where the last blank, tab, or
  *        comment.
  *     3) If lines should be filled, then scan thru input_buffer copying
  *        characters to com_buf.  Remember where the last blank, tab, or
- *        newline was.  When line is filled, print up to last blank and 
+ *        newline was.  When line is filled, print up to last blank and
  *        continue copying.
  *
  * HISTORY:
  *     November 1976   D A Willcox of CAC      Initial coding
  *        continue copying.
  *
  * HISTORY:
  *     November 1976   D A Willcox of CAC      Initial coding
- *     12/6/76         D A Willcox of CAC      Modification to handle 
+ *     12/6/76         D A Willcox of CAC      Modification to handle
  *                                             UNIX-style comments
  *
  */\f
 
 /*
  *                                             UNIX-style comments
  *
  */\f
 
 /*
- * this routine processes comments.  It makes an attempt to keep comments
- * from going over the max line length.  If a line is too long, it moves
- * everything from the last blank to the next comment line.  Blanks and
- * tabs from the beginning of the input line are removed 
+ * this routine processes comments.  It makes an attempt to keep comments from
+ * going over the max line length.  If a line is too long, it moves everything
+ * from the last blank to the next comment line.  Blanks and tabs from the
+ * beginning of the input line are removed
  */
 
  */
 
-#include "indent_globs.h"
+
+#include "indent_globs.h";
 
 
 pr_comment()
 
 
 pr_comment()
@@ -65,37 +67,36 @@ pr_comment()
                                 * buffer */
     char        achar;
     char       *t_ptr;         /* used for moving string */
                                 * buffer */
     char        achar;
     char       *t_ptr;         /* used for moving string */
-    int         unix_comment;  /* tri-state variable used to decide if it
-                                * is a unix-style comment. 0 means only
-                                * blanks since /*, 1 means regular style
-                                * comment, 2 means unix style comment */
+    int         unix_comment;  /* tri-state variable used to decide if it is
+                                * a unix-style comment. 0 means only blanks
+                                * since /*, 1 means regular style comment, 2
+                                * means unix style comment */
     int         break_delim = comment_delimiter_on_blankline;
     int         break_delim = comment_delimiter_on_blankline;
-    int                l_just_saw_decl = ps.just_saw_decl;
+    int         l_just_saw_decl = ps.just_saw_decl;
     /*
     /*
-     * int         ps.last_nl = 0;     /* true iff the last significant
-     * thing weve seen is a newline 
+     * int         ps.last_nl = 0;     /* true iff the last significant thing
+     * weve seen is a newline
      */
     int         one_liner = 1; /* true iff this comment is a one-liner */
     adj_max_col = max_col;
     ps.just_saw_decl = 0;
     last_bl = 0;               /* no blanks found so far */
      */
     int         one_liner = 1; /* true iff this comment is a one-liner */
     adj_max_col = max_col;
     ps.just_saw_decl = 0;
     last_bl = 0;               /* no blanks found so far */
-    ps.box_com = col_1_com = false;    /* at first, assume that we are
-                                        * not in a boxed comment or some
-                                        * other comment that should not
-                                        * be touched */
+    ps.box_com = col_1_com = false;    /* at first, assume that we are not in
+                                        * a boxed comment or some other
+                                        * comment that should not be touched */
     ++ps.out_coms;             /* keep track of number of comments */
     ++ps.out_coms;             /* keep track of number of comments */
-    unix_comment = 1;          /* set flag to let us figure out if there
-                                * is a unix-style comment ** DISABLED:
-                                * use 0 to reenable this hack! */
+    unix_comment = 1;          /* set flag to let us figure out if there is a
+                                * unix-style comment ** DISABLED: use 0 to
+                                * reenable this hack! */
 
     /* Figure where to align and how to treat the comment */
 
 
     /* Figure where to align and how to treat the comment */
 
-    if (ps.col_1 && !format_col1_comments) {   /* if comment starts in
-                                                * column 1 it should not
-                                                * be touched */
+    if (ps.col_1 && !format_col1_comments) {   /* if comment starts in column
+                                                * 1 it should not be touched */
        col_1_com = ps.box_com = true;
        ps.com_col = 1;
        col_1_com = ps.box_com = true;
        ps.com_col = 1;
-    } else {
+    }
+    else {
        if (*buf_ptr == '-' || *buf_ptr == '*') {
            ps.box_com = true;  /* a comment with a '-' or '*' immediately
                                 * after the /* is assumed to be a boxed
        if (*buf_ptr == '-' || *buf_ptr == '*') {
            ps.box_com = true;  /* a comment with a '-' or '*' immediately
                                 * after the /* is assumed to be a boxed
@@ -106,14 +107,15 @@ pr_comment()
        if ( /* ps.bl_line && */ (s_lab == e_lab) && (s_code == e_code)) {
            /* klg: check only if this line is blank */
            /*
        if ( /* ps.bl_line && */ (s_lab == e_lab) && (s_code == e_code)) {
            /* klg: check only if this line is blank */
            /*
-            * If this (*and previous lines are*) blank, dont put comment
-            * way out at left 
+            * If this (*and previous lines are*) blank, dont put comment way
+            * out at left
             */
            ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
            adj_max_col = block_comment_max_col;
            if (ps.com_col <= 1)
                ps.com_col = 1 + !format_col1_comments;
             */
            ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
            adj_max_col = block_comment_max_col;
            if (ps.com_col <= 1)
                ps.com_col = 1 + !format_col1_comments;
-       } else {
+       }
+       else {
            register    target_col;
            break_delim = 0;
            if (s_code != e_code)
            register    target_col;
            break_delim = 0;
            if (s_code != e_code)
@@ -133,11 +135,10 @@ pr_comment()
     if (ps.box_com) {
        buf_ptr[-2] = 0;
        ps.n_comment_delta = 1 - count_spaces(1, in_buffer);
     if (ps.box_com) {
        buf_ptr[-2] = 0;
        ps.n_comment_delta = 1 - count_spaces(1, in_buffer);
-       ps.comment_delta = 0;
        buf_ptr[-2] = '/';
        buf_ptr[-2] = '/';
-    } else {
+    }
+    else {
        ps.n_comment_delta = 0;
        ps.n_comment_delta = 0;
-       ps.comment_delta = 0;
        while (*buf_ptr == ' ' || *buf_ptr == '\t')
            buf_ptr++;
     }
        while (*buf_ptr == ' ' || *buf_ptr == '\t')
            buf_ptr++;
     }
@@ -148,9 +149,15 @@ pr_comment()
        *e_com++ = ' ';
 
     *e_com = '\0';
        *e_com++ = ' ';
 
     *e_com = '\0';
-    now_col = count_spaces(ps.com_col, s_com); /* figure what column we
-                                                * would be in if we
-                                                * printed the comment now */
+    if (troff) {
+       now_col = 1;
+       adj_max_col = 80;
+    }
+    else
+       now_col = count_spaces(ps.com_col, s_com);      /* figure what column we
+                                                        * would be in if we
+                                                        * printed the comment
+                                                        * now */
 
     /* Start to copy the comment */
 
 
     /* Start to copy the comment */
 
@@ -158,82 +165,85 @@ pr_comment()
                                 * copied */
        if (*buf_ptr > 040 && *buf_ptr != '*')
            ps.last_nl = 0;
                                 * copied */
        if (*buf_ptr > 040 && *buf_ptr != '*')
            ps.last_nl = 0;
+       check_size(com);
        switch (*buf_ptr) {     /* this checks for various spcl cases */
        switch (*buf_ptr) {     /* this checks for various spcl cases */
-           case 014:           /* check for a form feed */
-               if (!ps.box_com) {      /* in a text comment, break the
-                                        * line here */
-                   ps.use_ff = true;
-                   /* fix so dump_line uses a form feed */
-                   dump_line();
-                   last_bl = 0;
+       case 014:               /* check for a form feed */
+           if (!ps.box_com) {  /* in a text comment, break the line here */
+               ps.use_ff = true;
+               /* fix so dump_line uses a form feed */
+               dump_line();
+               last_bl = 0;
+               *e_com++ = ' ';
+               *e_com++ = '*';
+               *e_com++ = ' ';
+               while (*++buf_ptr == ' ' || *buf_ptr == '\t');
+           }
+           else {
+               if (++buf_ptr >= buf_end)
+                   fill_buffer();
+               *e_com++ = 014;
+           }
+           break;
+
+       case '\n':
+           if (had_eof) {      /* check for unexpected eof */
+               printf("Unterminated comment\n");
+               *e_com = '\0';
+               dump_line();
+               return;
+           }
+           one_liner = 0;
+           if (ps.box_com || ps.last_nl) {     /* if this is a boxed comment,
+                                                * we dont ignore the newline */
+               if (s_com == e_com) {
                    *e_com++ = ' ';
                    *e_com++ = ' ';
-                   *e_com++ = '*';
                    *e_com++ = ' ';
                    *e_com++ = ' ';
-                   while (*++buf_ptr == ' ' || *buf_ptr == '\t');
-               } else {
-                   if (++buf_ptr >= buf_end)
-                       fill_buffer();
-                   *e_com++ = 014;
                }
                }
-               break;
-
-           case '\n':
-               if (had_eof) {  /* check for unexpected eof */
-                   printf("Unterminated comment\n");
-                   *e_com = '\0';
-                   dump_line();
-                   return;
-               }
-               one_liner = 0;
-               if (ps.box_com || ps.last_nl) { /* if this is a boxed
-                                                * comment, we dont ignore
-                                                * the newline */
-                   if (s_com == e_com) {
-                       *e_com++ = ' ';
-                       *e_com++ = ' ';
-                   }
-                   *e_com = '\0';
-                   if (!ps.box_com && e_com - s_com > 3) {
-                       if (break_delim == 1 && s_com[0] == '/'
+               *e_com = '\0';
+               if (!ps.box_com && e_com - s_com > 3) {
+                   if (break_delim == 1 && s_com[0] == '/'
                            && s_com[1] == '*' && s_com[2] == ' ') {
                            && s_com[1] == '*' && s_com[2] == ' ') {
-                           char       *t = e_com;
-                           break_delim = 2;
-                           e_com = s_com + 2;
-                           *e_com = 0;
-                           if (blanklines_before_blockcomments) prefix_blankline_requested = 1;
-                           dump_line();
-                           e_com = t;
-                           s_com[0] = s_com[1] = s_com[2] = ' ';
-                       }
+                       char       *t = e_com;
+                       break_delim = 2;
+                       e_com = s_com + 2;
+                       *e_com = 0;
+                       if (blanklines_before_blockcomments)
+                           prefix_blankline_requested = 1;
                        dump_line();
                        dump_line();
-                       *e_com++ = ' ';
-                       *e_com++ = ' ';
+                       e_com = t;
+                       s_com[0] = s_com[1] = s_com[2] = ' ';
                    }
                    dump_line();
                    }
                    dump_line();
-                   now_col = ps.com_col;
-               } else {
+                   check_size(com);
+                   *e_com++ = ' ';
+                   *e_com++ = ' ';
+               }
+               dump_line();
+               now_col = ps.com_col;
+           }
+           else {
                ps.last_nl = 1;
                ps.last_nl = 1;
-               if (unix_comment != 1) {        /* we not are in
-                                                * unix_style comment */
+               if (unix_comment != 1) {        /* we not are in unix_style
+                                                * comment */
                    if (unix_comment == 0 && s_code == e_code) {
                        /*
                         * if it is a UNIX-style comment, ignore the
                         * requirement that previous line be blank for
                    if (unix_comment == 0 && s_code == e_code) {
                        /*
                         * if it is a UNIX-style comment, ignore the
                         * requirement that previous line be blank for
-                        * unindention 
+                        * unindention
                         */
                        ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
                        if (ps.com_col <= 1)
                            ps.com_col = 2;
                    }
                         */
                        ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
                        if (ps.com_col <= 1)
                            ps.com_col = 2;
                    }
-                   unix_comment = 2;   /* permanently remember that we
-                                        * are in this type of comment */
+                   unix_comment = 2;   /* permanently remember that we are in
+                                        * this type of comment */
                    dump_line();
                    ++line_no;
                    now_col = ps.com_col;
                    *e_com++ = ' ';
                    /*
                    dump_line();
                    ++line_no;
                    now_col = ps.com_col;
                    *e_com++ = ' ';
                    /*
-                    * fix so that the star at the start of the line will
-                    * line up 
+                    * fix so that the star at the start of the line will line
+                    * up
                     */
                    do          /* flush leading white space */
                        if (++buf_ptr >= buf_end)
                     */
                    do          /* flush leading white space */
                        if (++buf_ptr >= buf_end)
@@ -244,145 +254,152 @@ pr_comment()
                if (*(e_com - 1) == ' ' || *(e_com - 1) == '\t')
                    last_bl = e_com - 1;
                /*
                if (*(e_com - 1) == ' ' || *(e_com - 1) == '\t')
                    last_bl = e_com - 1;
                /*
-                * if there was a space at the end of the last line,
-                * remember where it was 
+                * if there was a space at the end of the last line, remember
+                * where it was
                 */
                else {          /* otherwise, insert one */
                    last_bl = e_com;
                 */
                else {          /* otherwise, insert one */
                    last_bl = e_com;
+                   check_size(com);
                    *e_com++ = ' ';
                    ++now_col;
                }
                    *e_com++ = ' ';
                    ++now_col;
                }
-               }
-               ++line_no;      /* keep track of input line number */
-               if (!ps.box_com) {
-                   int         nstar = 1;
-                   do {        /* flush any blanks and/or tabs at start
-                                * of next line */
+           }
+           ++line_no;          /* keep track of input line number */
+           if (!ps.box_com) {
+               int         nstar = 1;
+               do {            /* flush any blanks and/or tabs at start of
+                                * next line */
+                   if (++buf_ptr >= buf_end)
+                       fill_buffer();
+                   if (*buf_ptr == '*' && --nstar >= 0) {
                        if (++buf_ptr >= buf_end)
                            fill_buffer();
                        if (++buf_ptr >= buf_end)
                            fill_buffer();
-                       if (*buf_ptr == '*' && --nstar >= 0) {
-                           if (++buf_ptr >= buf_end)
-                               fill_buffer();
-                           if (*buf_ptr == '/')
-                               goto end_of_comment;
-                       }
-                   } while (*buf_ptr == ' ' || *buf_ptr == '\t');
-               } else if (++buf_ptr >= buf_end) fill_buffer();
-               break;          /* end of case for newline */
+                       if (*buf_ptr == '/')
+                           goto end_of_comment;
+                   }
+               } while (*buf_ptr == ' ' || *buf_ptr == '\t');
+           }
+           else if (++buf_ptr >= buf_end)
+               fill_buffer();
+           break;              /* end of case for newline */
 
 
-           case '*':           /* must check for possibility of being at
-                                * end of comment */
-               if (++buf_ptr >= buf_end)       /* get to next char after * */
-                   fill_buffer();
+       case '*':               /* must check for possibility of being at end
+                                * of comment */
+           if (++buf_ptr >= buf_end)   /* get to next char after * */
+               fill_buffer();
 
 
-               if (unix_comment == 0)  /* set flag to show we are not in
+           if (unix_comment == 0)      /* set flag to show we are not in
                                         * unix-style comment */
                                         * unix-style comment */
-                   unix_comment = 1;
+               unix_comment = 1;
 
 
-               if (*buf_ptr == '/') {  /* it is the end!!! */
-           end_of_comment:
-                   if (++buf_ptr >= buf_end)
-                       fill_buffer();
+           if (*buf_ptr == '/') {      /* it is the end!!! */
+       end_of_comment:
+               if (++buf_ptr >= buf_end)
+                   fill_buffer();
 
 
-                   if (*(e_com - 1) != ' ' && !ps.box_com) {   /* insure blank before
+               if (*(e_com - 1) != ' ' && !ps.box_com) {       /* insure blank before
                                                                 * end */
                                                                 * end */
-                       *e_com++ = ' ';
-                       ++now_col;
-                   }
-                   if (break_delim == 1 && !one_liner && s_com[0] == '/'
+                   *e_com++ = ' ';
+                   ++now_col;
+               }
+               if (break_delim == 1 && !one_liner && s_com[0] == '/'
                        && s_com[1] == '*' && s_com[2] == ' ') {
                        && s_com[1] == '*' && s_com[2] == ' ') {
-                       char       *t = e_com;
-                       break_delim = 2;
-                       e_com = s_com + 2;
-                       *e_com = 0;
-                           if (blanklines_before_blockcomments) prefix_blankline_requested = 1;
-                       dump_line();
-                       e_com = t;
-                       s_com[0] = s_com[1] = s_com[2] = ' ';
-                   }
-                   if (break_delim == 2 && e_com > s_com + 3
+                   char       *t = e_com;
+                   break_delim = 2;
+                   e_com = s_com + 2;
+                   *e_com = 0;
+                   if (blanklines_before_blockcomments)
+                       prefix_blankline_requested = 1;
+                   dump_line();
+                   e_com = t;
+                   s_com[0] = s_com[1] = s_com[2] = ' ';
+               }
+               if (break_delim == 2 && e_com > s_com + 3
                         /* now_col > adj_max_col - 2 && !ps.box_com */ ) {
                         /* now_col > adj_max_col - 2 && !ps.box_com */ ) {
-                       *e_com = '\0';
-                       dump_line();
-                       now_col = ps.com_col;
-                   }
-                   *e_com++ = '*';
-                   *e_com++ = '/';
                    *e_com = '\0';
                    *e_com = '\0';
-                   ps.just_saw_decl = l_just_saw_decl;
-                   return;
-               } else {        /* handle isolated '*' */
-                   *e_com++ = '*';
-                   ++now_col;
+                   dump_line();
+                   now_col = ps.com_col;
                }
                }
-               break;
-           default:            /* we have a random char */
-               if (unix_comment == 0 && *buf_ptr != ' ' && *buf_ptr != '\t')
-                   unix_comment = 1;   /* we are not in unix-style
-                                        * comment */
+               check_size(com);
+               *e_com++ = '*';
+               *e_com++ = '/';
+               *e_com = '\0';
+               ps.just_saw_decl = l_just_saw_decl;
+               return;
+           }
+           else {              /* handle isolated '*' */
+               *e_com++ = '*';
+               ++now_col;
+           }
+           break;
+       default:                /* we have a random char */
+           if (unix_comment == 0 && *buf_ptr != ' ' && *buf_ptr != '\t')
+               unix_comment = 1;       /* we are not in unix-style comment */
 
 
-               *e_com = *buf_ptr++;
-               if (buf_ptr >= buf_end)
-                   fill_buffer();
+           *e_com = *buf_ptr++;
+           if (buf_ptr >= buf_end)
+               fill_buffer();
 
 
-               if (*e_com == '\t')     /* keep track of column */
-                   now_col = ((now_col - 1) & tabmask) + tabsize + 1;
-               else if (*e_com == '\b')        /* this is a backspace */
-                   --now_col;
-               else
-                   ++now_col;
+           if (*e_com == '\t') /* keep track of column */
+               now_col = ((now_col - 1) & tabmask) + tabsize + 1;
+           else if (*e_com == '\b')    /* this is a backspace */
+               --now_col;
+           else
+               ++now_col;
 
 
-               if (*e_com == ' ' || *e_com == '\t')
-                   last_bl = e_com;
-               /* remember we saw a blank */
+           if (*e_com == ' ' || *e_com == '\t')
+               last_bl = e_com;
+           /* remember we saw a blank */
 
 
-               ++e_com;
-               if (now_col > adj_max_col && !ps.box_com && unix_comment == 1 && e_com[-1] > ' ') {
-                   /* the comment is too long, it must be broken up */
-                   if (break_delim == 1 && s_com[0] == '/'
+           ++e_com;
+           if (now_col > adj_max_col && !ps.box_com && unix_comment == 1 && e_com[-1] > ' ') {
+               /*
+                * the comment is too long, it must be broken up
+                */
+               if (break_delim == 1 && s_com[0] == '/'
                        && s_com[1] == '*' && s_com[2] == ' ') {
                        && s_com[1] == '*' && s_com[2] == ' ') {
-                       char       *t = e_com;
-                       break_delim = 2;
-                       e_com = s_com + 2;
-                       *e_com = 0;
-                           if (blanklines_before_blockcomments) prefix_blankline_requested = 1;
-                       dump_line();
-                       e_com = t;
-                       s_com[0] = s_com[1] = s_com[2] = ' ';
-                   }
-                   if (last_bl == 0) { /* we have seen no blanks */
-                       last_bl = e_com;        /* fake it */
-                       *e_com++ = ' ';
-                   }
-                   *e_com = '\0';      /* print what we have */
-                   *last_bl = '\0';
-                   while (last_bl > s_com && last_bl[-1] < 040)
-                       *--last_bl = 0;
-                   e_com = last_bl;
+                   char       *t = e_com;
+                   break_delim = 2;
+                   e_com = s_com + 2;
+                   *e_com = 0;
+                   if (blanklines_before_blockcomments)
+                       prefix_blankline_requested = 1;
                    dump_line();
                    dump_line();
-
-                   *e_com++ = ' ';     /* add blanks for continuation */
-                   *e_com++ = ' ';
+                   e_com = t;
+                   s_com[0] = s_com[1] = s_com[2] = ' ';
+               }
+               if (last_bl == 0) {     /* we have seen no blanks */
+                   last_bl = e_com;    /* fake it */
                    *e_com++ = ' ';
                    *e_com++ = ' ';
+               }
+               *e_com = '\0';  /* print what we have */
+               *last_bl = '\0';
+               while (last_bl > s_com && last_bl[-1] < 040)
+                   *--last_bl = 0;
+               e_com = last_bl;
+               dump_line();
 
 
-                   t_ptr = last_bl + 1;
-                   last_bl = 0;
-                   if (t_ptr >= e_com) {
-                       while (*t_ptr == ' ' || *t_ptr == '\t')
-                           t_ptr++;
-                       while (*t_ptr != '\0') {        /* move unprinted part
-                                                        * of comment down in
-                                                        * buffer */
-                           if (*t_ptr == ' ' || *t_ptr == '\t')
-                               last_bl = e_com;
-                           *e_com++ = *t_ptr++;
-                       }
+               *e_com++ = ' '; /* add blanks for continuation */
+               *e_com++ = ' ';
+               *e_com++ = ' ';
+
+               t_ptr = last_bl + 1;
+               last_bl = 0;
+               if (t_ptr >= e_com) {
+                   while (*t_ptr == ' ' || *t_ptr == '\t')
+                       t_ptr++;
+                   while (*t_ptr != '\0') {    /* move unprinted part of
+                                                * comment down in buffer */
+                       if (*t_ptr == ' ' || *t_ptr == '\t')
+                           last_bl = e_com;
+                       *e_com++ = *t_ptr++;
                    }
                    }
-                   *e_com = '\0';
-                   now_col = count_spaces(ps.com_col, s_com);  /* recompute current
-                                                                * position */
                }
                }
-               break;
+               *e_com = '\0';
+               now_col = count_spaces(ps.com_col, s_com);      /* recompute current
+                                                                * position */
+           }
+           break;
        }
     }
 }
        }
     }
 }