xref: /titanic_54/usr/src/tools/onbld/Checks/CmtBlk.py (revision bfed486ad8de8b8ebc6345a8e10accae08bf2f45)
1*bfed486aSAli Bahrami#! /usr/bin/python
2*bfed486aSAli Bahrami
3*bfed486aSAli Bahrami#
4*bfed486aSAli Bahrami# CDDL HEADER START
5*bfed486aSAli Bahrami#
6*bfed486aSAli Bahrami# The contents of this file are subject to the terms of the
7*bfed486aSAli Bahrami# Common Development and Distribution License (the "License").
8*bfed486aSAli Bahrami# You may not use this file except in compliance with the License.
9*bfed486aSAli Bahrami#
10*bfed486aSAli Bahrami# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11*bfed486aSAli Bahrami# or http://www.opensolaris.org/os/licensing.
12*bfed486aSAli Bahrami# See the License for the specific language governing permissions
13*bfed486aSAli Bahrami# and limitations under the License.
14*bfed486aSAli Bahrami#
15*bfed486aSAli Bahrami# When distributing Covered Code, include this CDDL HEADER in each
16*bfed486aSAli Bahrami# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17*bfed486aSAli Bahrami# If applicable, add the following below this CDDL HEADER, with the
18*bfed486aSAli Bahrami# fields enclosed by brackets "[]" replaced with your own identifying
19*bfed486aSAli Bahrami# information: Portions Copyright [yyyy] [name of copyright owner]
20*bfed486aSAli Bahrami#
21*bfed486aSAli Bahrami# CDDL HEADER END
22*bfed486aSAli Bahrami#
23*bfed486aSAli Bahrami
24*bfed486aSAli Bahrami#
25*bfed486aSAli Bahrami# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
26*bfed486aSAli Bahrami# Use is subject to license terms.
27*bfed486aSAli Bahrami#
28*bfed486aSAli Bahrami
29*bfed486aSAli Bahrami#
30*bfed486aSAli Bahrami# Check that source files contain a valid comment block
31*bfed486aSAli Bahrami#
32*bfed486aSAli Bahrami
33*bfed486aSAli Bahramiimport re, sys
34*bfed486aSAli Bahrami
35*bfed486aSAli BahramiCmntChrs = r'#*!/\\";. '
36*bfed486aSAli Bahrami
37*bfed486aSAli Bahramiclass CmtBlkError(Exception):
38*bfed486aSAli Bahrami	def __init__(self, lineno, seen, shouldbe):
39*bfed486aSAli Bahrami		Exception.__init__(self)
40*bfed486aSAli Bahrami		self.lineno = lineno
41*bfed486aSAli Bahrami		self.seen = seen
42*bfed486aSAli Bahrami		self.shouldbe = shouldbe
43*bfed486aSAli Bahrami
44*bfed486aSAli Bahramidef checkblock(block, blk_text):
45*bfed486aSAli Bahrami	line = block['start']
46*bfed486aSAli Bahrami	lictxt = block['block']
47*bfed486aSAli Bahrami
48*bfed486aSAli Bahrami	for actual, valid in map(lambda x, y: (x and x.lstrip(CmntChrs), y),
49*bfed486aSAli Bahrami			       lictxt, blk_text):
50*bfed486aSAli Bahrami		if actual != valid:
51*bfed486aSAli Bahrami			raise CmtBlkError(line, actual, valid)
52*bfed486aSAli Bahrami		line += 1
53*bfed486aSAli Bahrami
54*bfed486aSAli Bahramidef cmtblkchk(fh, blk_name, blk_text, filename=None,
55*bfed486aSAli Bahrami	      lenient=False, verbose=False, output=sys.stderr):
56*bfed486aSAli Bahrami
57*bfed486aSAli Bahrami	ret = 0
58*bfed486aSAli Bahrami	blocks = []
59*bfed486aSAli Bahrami	lic = []
60*bfed486aSAli Bahrami	in_cmt = False
61*bfed486aSAli Bahrami	start = 0
62*bfed486aSAli Bahrami	lineno = 0
63*bfed486aSAli Bahrami
64*bfed486aSAli Bahrami	StartText = '%s HEADER START' % blk_name
65*bfed486aSAli Bahrami	EndText = '%s HEADER END' % blk_name
66*bfed486aSAli Bahrami	full_text = [StartText, ''] + blk_text + ['', EndText]
67*bfed486aSAli Bahrami
68*bfed486aSAli Bahrami	StartRE = re.compile(r'^[%s ]*%s' % (CmntChrs, StartText))
69*bfed486aSAli Bahrami	EndRE = re.compile(r'^[%s ]*%s' % (CmntChrs, EndText))
70*bfed486aSAli Bahrami
71*bfed486aSAli Bahrami	if not filename:
72*bfed486aSAli Bahrami		filename = fh.name
73*bfed486aSAli Bahrami
74*bfed486aSAli Bahrami	for line in fh:
75*bfed486aSAli Bahrami		line = line.rstrip('\r\n')
76*bfed486aSAli Bahrami		lineno += 1
77*bfed486aSAli Bahrami
78*bfed486aSAli Bahrami		if StartRE.search(line):
79*bfed486aSAli Bahrami			in_cmt = True
80*bfed486aSAli Bahrami			lic.append(line)
81*bfed486aSAli Bahrami			start = lineno
82*bfed486aSAli Bahrami		elif in_cmt and EndRE.search(line):
83*bfed486aSAli Bahrami			in_cmt = False
84*bfed486aSAli Bahrami			lic.append(line)
85*bfed486aSAli Bahrami			blocks.append({'start':start, 'block':lic})
86*bfed486aSAli Bahrami			start = 0
87*bfed486aSAli Bahrami			lic = []
88*bfed486aSAli Bahrami		elif in_cmt:
89*bfed486aSAli Bahrami			lic.append(line)
90*bfed486aSAli Bahrami
91*bfed486aSAli Bahrami	if in_cmt:
92*bfed486aSAli Bahrami		output.write('Error: Incomplete %s block in file %s\n'
93*bfed486aSAli Bahrami			     '    at line %s\n''' % (blk_name, filename, start))
94*bfed486aSAli Bahrami
95*bfed486aSAli Bahrami	# Check for no comment block, warn if we're not being lenient
96*bfed486aSAli Bahrami	if not len(blocks) and not lenient:
97*bfed486aSAli Bahrami		if not ret:
98*bfed486aSAli Bahrami			ret = 2
99*bfed486aSAli Bahrami		output.write("Warning: No %s block in file %s\n" %
100*bfed486aSAli Bahrami			     (blk_name, filename))
101*bfed486aSAli Bahrami
102*bfed486aSAli Bahrami	# Check for multiple comment blocks
103*bfed486aSAli Bahrami	if len(blocks) > 1:
104*bfed486aSAli Bahrami		ret = 1
105*bfed486aSAli Bahrami		output.write('Error: Multiple %s blocks in file %s\n'
106*bfed486aSAli Bahrami			     '    at lines %s\n''' %
107*bfed486aSAli Bahrami			     (blk_name, filename,
108*bfed486aSAli Bahrami			      ', '.join([str(x['start']) for x in blocks])))
109*bfed486aSAli Bahrami
110*bfed486aSAli Bahrami	# Validate each comment block
111*bfed486aSAli Bahrami	for b in blocks:
112*bfed486aSAli Bahrami		try:
113*bfed486aSAli Bahrami			checkblock(b, full_text)
114*bfed486aSAli Bahrami		except CmtBlkError, e:
115*bfed486aSAli Bahrami			ret = 1
116*bfed486aSAli Bahrami			output.write(
117*bfed486aSAli Bahrami				"Error: Invalid line in %s block in file %s\n"
118*bfed486aSAli Bahrami				"    at line %d, should be\n"
119*bfed486aSAli Bahrami				"    '%s'\n"
120*bfed486aSAli Bahrami				"    is\n"
121*bfed486aSAli Bahrami				"    '%s'\n" % (blk_name, filename,
122*bfed486aSAli Bahrami						e.lineno, e.shouldbe, e.seen))
123*bfed486aSAli Bahrami			break
124*bfed486aSAli Bahrami
125*bfed486aSAli Bahrami	if verbose and not ret:
126*bfed486aSAli Bahrami		output.write("Message: Valid %s block in file %s\n" %
127*bfed486aSAli Bahrami			     (blk_name, filename))
128*bfed486aSAli Bahrami
129*bfed486aSAli Bahrami	return ret
130