9512fe850e98fdd448c638ca63fdd92a8a510255ahl#!/usr/perl5/bin/perl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# CDDL HEADER START
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# The contents of this file are subject to the terms of the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# Common Development and Distribution License (the "License").
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# You may not use this file except in compliance with the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# or http://www.opensolaris.org/os/licensing.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# See the License for the specific language governing permissions
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# and limitations under the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# When distributing Covered Code, include this CDDL HEADER in each
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# If applicable, add the following below this CDDL HEADER, with the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# fields enclosed by brackets "[]" replaced with your own identifying
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# information: Portions Copyright [yyyy] [name of copyright owner]
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# CDDL HEADER END
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
df0345f7d6cc87cde9e532e8362f1aca053d98ccJohn Sonnenschein# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# Use is subject to license terms.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens#
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens# Copyright (c) 2014, 2016 by Delphix. All rights reserved.
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens#
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens
df0345f7d6cc87cde9e532e8362f1aca053d98ccJohn Sonnenscheinrequire 5.8.4;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$PNAME = $0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$PNAME =~ s:.*/::;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$USAGE = "Usage: $PNAME [file ...]\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$errs = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub err
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($msg) = @_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "$file: $lineno: $msg\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $errs++;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub dstyle
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl open(FILE, "$file");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $lineno = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $inclause = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $skipnext = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl while (<FILE>) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $lineno++;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl chop;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($skipnext) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $skipnext = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # Amazingly, some ident strings are longer than 80 characters!
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^#pragma ident/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # The algorithm to calculate line length from cstyle.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $line = $_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($line =~ tr/\t/\t/ * 7 + length($line) > 80) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # yes, there is a chance.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # replace tabs with spaces and check again.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $eline = $line;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl 1 while $eline =~
9512fe850e98fdd448c638ca63fdd92a8a510255ahl s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (length($eline) > 80) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "line > 80 characters";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/\/\*DSTYLED\*\//) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $skipnext = 1;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^#pragma/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^#include/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # Before we do any more analysis, we want to prune out any
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # quoted strings. This is a bit tricky because we need
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # to be careful of backslashed quotes within quoted strings.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # I'm sure there is a very crafty way to do this with a
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # single regular expression, but that will have to wait for
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # somone with better regex juju that I; we do this by first
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # eliminating the backslashed quotes, and then eliminating
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # whatever quoted strings are left. Note that we eliminate
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # the string by replacing it with "quotedstr"; this is to
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # allow lines to end with a quoted string. (If we simply
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # eliminated the quoted string, dstyle might complain about
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # the line ending in a space or tab.)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl s/\\\"//g;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl s/\"[^\"]*\"/quotedstr/g;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/[ \t]$/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "space or tab at end of line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^[\t]+[ ]+[\t]+/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "spaces between tabs";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^[\t]* \*/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^ /) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "indented by spaces not tabs";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^{}$/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!/^enum/ && !/^\t*struct/ && !/^\t*union/ && !/^typedef/ &&
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens !/^translator/ && !/^provider/ && !/\tif / &&
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens !/ else /) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/[\w\s]+{/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "left brace not on its own line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/{[\w\s]+/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "left brace not on its own line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
c3bd3abd8856e8e75d820f65c58031cd6cbac818Matthew Ahrens if (!/;$/ && !/\t*}$/ && !/ else /) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/[\w\s]+}/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "right brace not on its own line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/}[\w\s]+/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "right brace not on its own line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^}/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $inclause = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!$inclause && /^[\w ]+\//) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "predicate not at beginning of line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!$inclause && /^\/[ \t]+\w/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "space between '/' and expression in predicate";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!$inclause && /\w[ \t]+\/$/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "space between expression and '/' in predicate";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!$inclause && /\s,/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "space before comma in probe description";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!$inclause && /\w,[\w\s]/ && !/;$/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!/extern/ && !/\(/ && !/inline/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "multiple probe descriptions on same line";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($inclause && /sizeof\(/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "missing space after sizeof";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($inclause && /^[\w ]/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "line doesn't begin with a tab";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($inclause && /,[\w]/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "comma without trailing space";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/\w&&/ || /&&\w/ || /\w\|\|/ || /\|\|\w/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "logical operator not set off with spaces";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # We want to catch "i<0" variants, but we don't want to
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # erroneously flag translators.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!/\w<\w+>\(/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/\w>/ || / >\w/ || /\w</ || /<\w/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "comparison operator not set " .
9512fe850e98fdd448c638ca63fdd92a8a510255ahl "off with spaces";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/\w==/ || /==\w/ || /\w<=/ || />=\w/ || /\w!=/ || /!=\w/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "comparison operator not set off with spaces";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/\w=/ || /=\w/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl err "assignment operator not set off with spaces";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (/^{/) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $inclause = 1;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlforeach $arg (@ARGV) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f $arg) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl push(@files, $arg);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl die "$PNAME: $arg is not a valid file\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahldie $USAGE if (scalar(@files) == 0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlforeach $file (@files) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl dstyle($file);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlexit($errs != 0);