| .\" Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
| .\" Use is subject to license terms. |
| .\" |
| .\" CDDL HEADER START |
| .\" |
| .\" The contents of this file are subject to the terms of the |
| .\" Common Development and Distribution License (the "License"). |
| .\" You may not use this file except in compliance with the License. |
| .\" |
| .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| .\" or http://www.opensolaris.org/os/licensing. |
| .\" See the License for the specific language governing permissions |
| .\" and limitations under the License. |
| .\" |
| .\" When distributing Covered Code, include this CDDL HEADER in each |
| .\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| .\" If applicable, add the following below this CDDL HEADER, with the |
| .\" fields enclosed by brackets "[]" replaced with your own identifying |
| .\" information: Portions Copyright [yyyy] [name of copyright owner] |
| .\" |
| .\" CDDL HEADER END |
| .\" |
| .TH cstyle 1 "28 March 2005" |
| .SH NAME |
| .I cstyle |
| \- check for some common stylistic errors in C source files |
| .SH SYNOPSIS |
| \fBcstyle [-chpvCP] [-o constructs] [file...]\fP |
| .LP |
| .SH DESCRIPTION |
| .IX "OS-Net build tools" "cstyle" "" "\fBcstyle\fP" |
| .LP |
| .I cstyle |
| inspects C source files (*.c and *.h) for common stylistic errors. It |
| attempts to check for the cstyle documented in |
| \fIhttp://www.cis.upenn.edu/~lee/06cse480/data/cstyle.ms.pdf\fP. |
| Note that there is much in that document that |
| .I cannot |
| be checked for; just because your code is \fBcstyle(1)\fP clean does not |
| mean that you've followed Sun's C style. \fICaveat emptor\fP. |
| .LP |
| .SH OPTIONS |
| .LP |
| The following options are supported: |
| .TP 4 |
| .B \-c |
| Check continuation line indentation inside of functions. Sun's C style |
| states that all statements must be indented to an appropriate tab stop, |
| and any continuation lines after them must be indented \fIexactly\fP four |
| spaces from the start line. This option enables a series of checks |
| designed to find continuation line problems within functions only. The |
| checks have some limitations; see CONTINUATION CHECKING, below. |
| .LP |
| .TP 4 |
| .B \-h |
| Performs heuristic checks that are sometimes wrong. Not generally used. |
| .LP |
| .TP 4 |
| .B \-p |
| Performs some of the more picky checks. Includes ANSI #else and #endif |
| rules, and tries to detect spaces after casts. Used as part of the |
| putback checks. |
| .LP |
| .TP 4 |
| .B \-v |
| Verbose output; includes the text of the line of error, and, for |
| \fB-c\fP, the first statement in the current continuation block. |
| .LP |
| .TP 4 |
| .B \-C |
| Ignore errors in header comments (i.e. block comments starting in the |
| first column). Not generally used. |
| .LP |
| .TP 4 |
| .B \-P |
| Check for use of non-POSIX types. Historically, types like "u_int" and |
| "u_long" were used, but they are now deprecated in favor of the POSIX |
| types uint_t, ulong_t, etc. This detects any use of the deprecated |
| types. Used as part of the putback checks. |
| .LP |
| .TP 4 |
| .B \-o \fIconstructs\fP |
| Allow a comma-separated list of additional constructs. Available |
| constructs include: |
| .LP |
| .TP 10 |
| .B doxygen |
| Allow doxygen-style block comments (\fB/**\fP and \fB/*!\fP) |
| .LP |
| .TP 10 |
| .B splint |
| Allow splint-style lint comments (\fB/*@...@*/\fP) |
| .LP |
| .SH NOTES |
| .LP |
| The cstyle rule for the OS/Net consolidation is that all new files must |
| be \fB-pP\fP clean. For existing files, the following invocations are |
| run against both the old and new files: |
| .LP |
| .TP 4 |
| \fBcstyle file\fB |
| .LP |
| .TP 4 |
| \fBcstyle -p file\fB |
| .LP |
| .TP 4 |
| \fBcstyle -pP file\fB |
| .LP |
| If the old file gave no errors for one of the invocations, the new file |
| must also give no errors. This way, files can only become more clean. |
| .LP |
| .SH CONTINUATION CHECKING |
| .LP |
| The continuation checker is a reasonably simple state machine that knows |
| something about how C is laid out, and can match parenthesis, etc. over |
| multiple lines. It does have some limitations: |
| .LP |
| .TP 4 |
| .B 1. |
| Preprocessor macros which cause unmatched parenthesis will confuse the |
| checker for that line. To fix this, you'll need to make sure that each |
| branch of the #if statement has balanced parenthesis. |
| .LP |
| .TP 4 |
| .B 2. |
| Some \fBcpp\fP macros do not require ;s after them. Any such macros |
| *must* be ALL_CAPS; any lower case letters will cause bad output. |
| .LP |
| The bad output will generally be corrected after the next \fB;\fP, |
| \fB{\fP, or \fB}\fP. |
| .LP |
| Some continuation error messages deserve some additional explanation |
| .LP |
| .TP 4 |
| .B |
| multiple statements continued over multiple lines |
| A multi-line statement which is not broken at statement |
| boundaries. For example: |
| .RS 4 |
| .HP 4 |
| if (this_is_a_long_variable == another_variable) a = |
| .br |
| b + c; |
| .LP |
| Will trigger this error. Instead, do: |
| .HP 8 |
| if (this_is_a_long_variable == another_variable) |
| .br |
| a = b + c; |
| .RE |
| .LP |
| .TP 4 |
| .B |
| empty if/for/while body not on its own line |
| For visibility, empty bodies for if, for, and while statements should be |
| on their own line. For example: |
| .RS 4 |
| .HP 4 |
| while (do_something(&x) == 0); |
| .LP |
| Will trigger this error. Instead, do: |
| .HP 8 |
| while (do_something(&x) == 0) |
| .br |
| ; |
| .RE |
| |