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