From: Keith Bostic Date: Fri, 16 Sep 1988 03:19:17 +0000 (-0800) Subject: new version from James Gosling X-Git-Tag: BSD-4_3_Net_1-Snapshot-Development~927 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/30f489145880932a3d40307c0213e120cb79a98a?hp=94a602c5fedcbed8aed6b580ac65694eb971e7a1 new version from James Gosling 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 --- diff --git a/usr/src/usr.bin/indent/Makefile b/usr/src/usr.bin/indent/Makefile index ed78f3b449..e0943f25d2 100644 --- a/usr/src/usr.bin/indent/Makefile +++ b/usr/src/usr.bin/indent/Makefile @@ -14,59 +14,34 @@ # 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 +MAN= indent.0 all: indent -indent: ${OBJS} ${LIBC} +indent: ${OBJS} ${LIBC} ${CC} -o $@ ${CFLAGS} ${OBJS} -clean: FRC +clean: rm -f ${OBJS} core indent -depend: FRC +cleandir: clean + rm -f ${MAN} tags .depend + +depend: ${SRCS} mkdep ${CFLAGS} ${SRCS} -install: FRC +install: ${MAN} 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} -tags: FRC +tags: ${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 diff --git a/usr/src/usr.bin/indent/args.c b/usr/src/usr.bin/indent/args.c index 5c6aa253fd..2aca4b804d 100644 --- a/usr/src/usr.bin/indent/args.c +++ b/usr/src/usr.bin/indent/args.c @@ -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. * @@ -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 - * 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 -static char sccsid[] = "@(#)args.c 5.4 (Berkeley) %G%"; +static char sccsid[] = "@(#)args.c 5.5 (Berkeley) %G%"; #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 #include -char *getenv(), *index(); +char *getenv(), *index(); /* 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 */ @@ -48,82 +50,94 @@ char *getenv(), *index(); #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 { - 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; - char fname[BUFSIZ]; + char fname[BUFSIZ]; static char pro[] = ".indent.pro"; sprintf(fname, "%s/%s", getenv("HOME"), pro); @@ -140,30 +154,21 @@ set_profile() 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; - 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; /* - * 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++) - if (p->p_type != PRO_SPECIAL) + if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT) *p->p_obj = p->p_default; } @@ -213,58 +218,66 @@ set_option(arg) 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; - 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; - 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: - 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); + } + *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); } } diff --git a/usr/src/usr.bin/indent/indent.1 b/usr/src/usr.bin/indent/indent.1 index 00757f5689..72c5447a54 100644 --- a/usr/src/usr.bin/indent/indent.1 +++ b/usr/src/usr.bin/indent/indent.1 @@ -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 @@ -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\-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\ ] @@ -25,17 +40,14 @@ indent \- indent and format C program source [\ \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\-npro\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\ ] @@ -43,14 +55,6 @@ indent \- indent and format C program source [\ \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 @@ -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 -.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 \-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 @@ -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 -.BR \-nbc . +.BR \-bc . .TP 15 .BR \-br , \-bl Specifying @@ -155,14 +159,13 @@ Rather than like this: /* 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 -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 -.BR \-ce . +.B \-ce . .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. -\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 -.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 -right of code. Specifying +right of code. The default .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. @@ -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 -.BR \-di16 . -.TP 15 +.B \-di16 . +.if 0 \{.TP 15 .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 -processing. If enabled, +processing. If it's enabled, .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 -statement. The default is -.BR \-ei . +statement.\} .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 -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 -.BR \-ip . +.B \-ip . .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 -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 @@ -245,57 +249,45 @@ paren. For example, here is how a piece of continued code looks with .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 -.ta \w' p1 = first_procedure('u p1 = first_procedure(second_procedure(p2, p3), - third_procedure(p4, p5)); + third_procedure(p4, p5)); .ft R .fi .ne 5 -Inserting two more newlines we get: +Inserting a couple more newlines we get: .nf .ft L -.ta \w' p1 = first_procedure('u +\w'second_procedure('u 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 -.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 -.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 -.BR \-psl . +.B -psl .TP 15 -.BR \-sc , \-nsc +.BI \-sc , \-nsc 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: -.BR \-nsob . +.B \-nsob .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 -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 -.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 -turns on `verbose' mode; +turns on `verbose' mode, .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 -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 -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 @@ -382,10 +372,10 @@ automatically extended in extreme cases. .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 -compensate for the syntactic peculiarities introduced. +compensate for the syntactic peculiarites introduced. .LP .B C syntax .LP @@ -403,11 +393,10 @@ is handled properly. .br \&./.indent.pro profile file .br -~/.indent.pro profile file .SH BUGS .I Indent has even more switches than \fIls\fR. -.sp + .ne 5 A common mistake that often causes grief is typing: .nf diff --git a/usr/src/usr.bin/indent/indent.c b/usr/src/usr.bin/indent/indent.c index 311bd98bff..13004e75e2 100644 --- a/usr/src/usr.bin/indent/indent.c +++ b/usr/src/usr.bin/indent/indent.c @@ -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. * @@ -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 - * 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. @@ -19,62 +20,43 @@ #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 -static char sccsid[] = "@(#)indent.c 5.8 (Berkeley) %G%"; +static char sccsid[] = "@(#)indent.c 5.9 (Berkeley) %G%"; #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 +#include + +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; { - 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 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 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 */ - 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 ? @@ -92,12 +74,19 @@ main(argc, argv) 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; + 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'; + 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; @@ -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; + set_defaults(); 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) { /* - * 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 */ @@ -156,7 +161,8 @@ main(argc, argv) 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 */ @@ -172,12 +178,12 @@ main(argc, argv) } fprintf(stderr, "indent: unknown parameter: %s\n", argv[i]); exit(1); - } else + } + else set_option(argv[i]); - } /* 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) @@ -187,24 +193,35 @@ main(argc, argv) 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) - 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 */ - 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; - fill_buffer(); /* get first batch of stuff into input - * buffer */ + fill_buffer(); /* get first batch of stuff into input buffer */ parse(semicolon); { @@ -232,153 +249,148 @@ main(argc, argv) 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 - * 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]; /* - * 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(), - * 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) { - 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 */ + } + 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 */ - *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] == '}') - 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 */ - *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 */ - 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 */ - 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 - || 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."); @@ -390,22 +402,17 @@ check_type: (1.0 * ps.com_lines) / code_lines); } fflush(output); - exit(ps.tos > 1 || found_err); + exit(1); } 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; @@ -413,665 +420,705 @@ check_type: 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++ = ' '; - 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++ = ' '; *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 */ - 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; - 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.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]; - 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<') - 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 * ?: 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 ?: construct */ + --squest; if (ps.want_blank) *e_code++ = ' '; - *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 ?: - * 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.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; + 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; - 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; - 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; - 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 (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; - 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 */ - *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; - 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)) - 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 */ - 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 */ - *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 - } - 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 */ - *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 */ }; /* - * 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; - char buff[BUFSIZ]; + char buff[8 * 1024]; 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++; - else - p = in_name; 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); } - 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", - bakfile); + bakfile); exit(1); } if (n < 0) { @@ -1095,13 +1142,13 @@ bakcopy() /* 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"); - if (output == NULL) { + if (output == 0) { fprintf(stderr, "indent: can't create %s\n", in_name); unlink(bakfile); exit(1); diff --git a/usr/src/usr.bin/indent/indent_codes.h b/usr/src/usr.bin/indent/indent_codes.h index 42423d496a..5d2c1a6fca 100644 --- a/usr/src/usr.bin/indent/indent_codes.h +++ b/usr/src/usr.bin/indent/indent_codes.h @@ -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. * @@ -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 - * 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. * - * @(#)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 -*/ - #define newline 1 #define lparen 2 #define rparen 3 diff --git a/usr/src/usr.bin/indent/indent_globs.h b/usr/src/usr.bin/indent/indent_globs.h index 36d73b5f20..90c39c6fb2 100644 --- a/usr/src/usr.bin/indent/indent_globs.h +++ b/usr/src/usr.bin/indent/indent_globs.h @@ -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. * @@ -8,225 +9,260 @@ * 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. * - * @(#)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 #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 -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; - 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" - * 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 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 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 - * 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_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_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 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 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 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 - * 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 sizeof_keyword; + int sizeof_keyword; 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 just_saw_decl; + int just_saw_decl; } ps; -int ifdef_level; +int ifdef_level; struct parser_state state_stack[5]; struct parser_state match_state[5]; diff --git a/usr/src/usr.bin/indent/io.c b/usr/src/usr.bin/indent/io.c index e015715ea5..136a88ac7a 100644 --- a/usr/src/usr.bin/indent/io.c +++ b/usr/src/usr.bin/indent/io.c @@ -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. * @@ -8,106 +9,60 @@ * 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 -static char sccsid[] = "@(#)io.c 5.7 (Berkeley) %G%"; +static char sccsid[] = "@(#)io.c 5.8 (Berkeley) %G%"; #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 - * - */ -/*- - * - * 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 - * - */ -#include "indent_globs.h" +#include "indent_globs.h"; +#include - -int ff = 014; /* used to write a form feed */ 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; + static not_first_line; if (ps.procname[0]) { - if (troff) + if (troff) { + if (comment_open) { + comment_open = 0; + fprintf(output, ".*/\n"); + } 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) { - if (suppress_blanklines>0) suppress_blanklines--; + if (suppress_blanklines > 0) + suppress_blanklines--; 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; - if (prefix_blankline_requested) + if (prefix_blankline_requested && not_first_line) 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 - * 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 */ @@ -161,7 +116,7 @@ dump_line() } 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); @@ -169,10 +124,11 @@ dump_line() } if (s_com != e_com) if (troff) { + int all_here = 0; 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; @@ -180,25 +136,44 @@ dump_line() 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; - 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 (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); @@ -210,23 +185,27 @@ dump_line() register char *com_st = s_com; target += ps.comment_delta; + while (*com_st == '\t') + com_st++, target += 8; /* ? */ 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; - 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; } + while (e_com > com_st && isspace(e_com[-1])) + e_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); @@ -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 - * 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 - * 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 */ @@ -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]; + not_first_line = 1; return; }; -compute_code_target() { +compute_code_target() +{ 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 - && 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; @@ -296,27 +277,26 @@ compute_code_target() { 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 - : 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 + * */ int fill_buffer() @@ -326,14 +306,13 @@ fill_buffer() 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) - 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; @@ -358,7 +337,7 @@ fill_buffer() 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++; @@ -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 - * 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 + * */ -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 */ { @@ -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 - * character position on output. - * + * character position on output. + * * 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 + * */ int count_spaces(current, buffer) - /* * 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; @@ -487,32 +463,29 @@ count_spaces(current, buffer) 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 '': /* this is a backspace */ - --cur; - break; + case '': /* this is a backspace */ + --cur; + break; - default: - ++cur; - break; + default: + ++cur; + break; } /* end of switch */ } /* end of for loop */ return (cur); }; -int found_err; 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); @@ -524,3 +497,94 @@ diag(level, msg, a, b) 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; +} diff --git a/usr/src/usr.bin/indent/lexi.c b/usr/src/usr.bin/indent/lexi.c index d743952211..dacca37fb1 100644 --- a/usr/src/usr.bin/indent/lexi.c +++ b/usr/src/usr.bin/indent/lexi.c @@ -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. * @@ -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 - * 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 -static char sccsid[] = "@(#)lexi.c 5.8 (Berkeley) %G%"; +static char sccsid[] = "@(#)lexi.c 5.9 (Berkeley) %G%"; #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;" - * - */ - -/* - * 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 @@ -120,15 +74,15 @@ struct templ specials[100] = }; 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, 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, @@ -144,12 +98,12 @@ char chartype[128] = -int +int 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' */ @@ -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 - * 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.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(); } - /* 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; - 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) @@ -193,9 +178,8 @@ lexi() } 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; @@ -206,16 +190,15 @@ lexi() * 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 - * 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) @@ -228,57 +211,61 @@ lexi() 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 */ - return (ident); + return (ident); } /* 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; + not_proc:; } - /* * 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; @@ -290,227 +277,230 @@ lexi() 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) { - 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 [/] */ - 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 [/] */ + 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 (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++ = '\''; - 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 */ - 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++; - 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 */ @@ -525,10 +515,11 @@ lexi() 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) @@ -538,7 +529,7 @@ char *key; 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; diff --git a/usr/src/usr.bin/indent/parse.c b/usr/src/usr.bin/indent/parse.c index c86317bdc8..e17c15be2e 100644 --- a/usr/src/usr.bin/indent/parse.c +++ b/usr/src/usr.bin/indent/parse.c @@ -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. * @@ -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 - * 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 -static char sccsid[] = "@(#)parse.c 5.6 (Berkeley) %G%"; +static char sccsid[] = "@(#)parse.c 5.7 (Berkeley) %G%"; #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 - */ -/*- - * 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 - * - */ - -#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 + 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 */ } - 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; - 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 or */ - 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 or */ + 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 */ - 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 - * a 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 */ + #ifdef debug for (i = 1; i <= ps.tos; ++i) printf("(%d %d)", ps.p_stack[i], ps.il[i]); printf("\n"); #endif + return; } - /* - * 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 do - * "dostmt" if "ifstmt" switch - * decl "ifelse" for - * while "dostmt" while - * + * "dostmt" if "ifstmt" switch decl + * "ifelse" for while + * "dostmt" while + * * 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  - * - * HISTORY: initial coding November 1976 D A Willcox of CAC - * + * + * HISTORY: initial coding November 1976 D A Willcox of CAC + * */ /*----------------------------------------------*\ - * | REDUCTION PHASE +| REDUCTION PHASE | \*----------------------------------------------*/ -reduce() { +reduce() +{ 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]) { - 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: /* */ - ps.p_stack[--ps.tos] = dohead; - ps.i_l_follow = ps.il[ps.tos]; - break; - - case ifstmt: - /* */ - 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: - /* */ - case_ind = ps.cstk[ps.tos - 1]; - - case decl: /* finish of a declaration */ - case elsehead: - /* < else> */ - case forstmt: - /* */ - case whilestmt: - /* */ - ps.p_stack[--ps.tos] = stmt; - ps.i_l_follow = ps.il[ps.tos]; - break; - - default: /* */ - return; - - } /* end of section for 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; - 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: /* */ + ps.p_stack[--ps.tos] = dohead; + ps.i_l_follow = ps.il[ps.tos]; + break; + + case ifstmt: + /* */ + 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: + /* */ + case_ind = ps.cstk[ps.tos - 1]; + + case decl: /* finish of a declaration */ + case elsehead: + /* < else> */ + case forstmt: + /* */ + case whilestmt: + /* */ + ps.p_stack[--ps.tos] = stmt; + ps.i_l_follow = ps.il[ps.tos]; + break; + + default: /* */ + return; + + } /* end of section for 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; + default: /* anything else on top */ + return; + } } } diff --git a/usr/src/usr.bin/indent/pr_comment.c b/usr/src/usr.bin/indent/pr_comment.c index 81dd6d6225..163cb37025 100644 --- a/usr/src/usr.bin/indent/pr_comment.c +++ b/usr/src/usr.bin/indent/pr_comment.c @@ -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. * @@ -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 - * 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 -static char sccsid[] = "@(#)pr_comment.c 5.6 (Berkeley) %G%"; +static char sccsid[] = "@(#)pr_comment.c 5.7 (Berkeley) %G%"; #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 - * 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 - * 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 * */ /* - * 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() @@ -65,37 +67,36 @@ pr_comment() * 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 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 */ - 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 */ - 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 */ - 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; - } 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 @@ -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 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; - } else { + } + else { 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); - ps.comment_delta = 0; buf_ptr[-2] = '/'; - } else { + } + else { ps.n_comment_delta = 0; - ps.comment_delta = 0; while (*buf_ptr == ' ' || *buf_ptr == '\t') buf_ptr++; } @@ -148,9 +149,15 @@ pr_comment() *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 */ @@ -158,82 +165,85 @@ pr_comment() * copied */ if (*buf_ptr > 040 && *buf_ptr != '*') ps.last_nl = 0; + check_size(com); 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++ = ' '; - 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] == ' ') { - 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(); - *e_com++ = ' '; - *e_com++ = ' '; + e_com = t; + s_com[0] = s_com[1] = s_com[2] = ' '; } 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; - 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 - * unindention + * unindention */ 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++ = ' '; /* - * 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) @@ -244,145 +254,152 @@ pr_comment() 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; + check_size(com); *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 == '*' && --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_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 */ - *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] == ' ') { - 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 */ ) { - *e_com = '\0'; - dump_line(); - now_col = ps.com_col; - } - *e_com++ = '*'; - *e_com++ = '/'; *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] == ' ') { - 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(); - - *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 = '\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; } } }