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# 25*8276d791SJonathan Adams# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 26bfed486aSAli Bahrami# 27bfed486aSAli Bahrami 28bfed486aSAli Bahrami# 29bfed486aSAli Bahrami# Check that source files contain a valid comment block 30bfed486aSAli Bahrami# 31bfed486aSAli Bahrami 32bfed486aSAli Bahramiimport re, sys 33bfed486aSAli Bahrami 34bfed486aSAli BahramiCmntChrs = r'#*!/\\";. ' 35bfed486aSAli Bahrami 36bfed486aSAli Bahramiclass CmtBlkError(Exception): 37bfed486aSAli Bahrami def __init__(self, lineno, seen, shouldbe): 38bfed486aSAli Bahrami Exception.__init__(self) 39bfed486aSAli Bahrami self.lineno = lineno 40bfed486aSAli Bahrami self.seen = seen 41bfed486aSAli Bahrami self.shouldbe = shouldbe 42bfed486aSAli Bahrami 43bfed486aSAli Bahramidef checkblock(block, blk_text): 44bfed486aSAli Bahrami line = block['start'] 45bfed486aSAli Bahrami lictxt = block['block'] 46bfed486aSAli Bahrami 47bfed486aSAli Bahrami for actual, valid in map(lambda x, y: (x and x.lstrip(CmntChrs), y), 48bfed486aSAli Bahrami lictxt, blk_text): 49bfed486aSAli Bahrami if actual != valid: 50bfed486aSAli Bahrami raise CmtBlkError(line, actual, valid) 51bfed486aSAli Bahrami line += 1 52bfed486aSAli Bahrami 53bfed486aSAli Bahramidef cmtblkchk(fh, blk_name, blk_text, filename=None, 54bfed486aSAli Bahrami lenient=False, verbose=False, output=sys.stderr): 55bfed486aSAli Bahrami 56bfed486aSAli Bahrami ret = 0 57bfed486aSAli Bahrami blocks = [] 58bfed486aSAli Bahrami lic = [] 59bfed486aSAli Bahrami in_cmt = False 60bfed486aSAli Bahrami start = 0 61bfed486aSAli Bahrami lineno = 0 62bfed486aSAli Bahrami 63bfed486aSAli Bahrami StartText = '%s HEADER START' % blk_name 64bfed486aSAli Bahrami EndText = '%s HEADER END' % blk_name 65bfed486aSAli Bahrami full_text = [StartText, ''] + blk_text + ['', EndText] 66bfed486aSAli Bahrami 67bfed486aSAli Bahrami StartRE = re.compile(r'^[%s ]*%s' % (CmntChrs, StartText)) 68bfed486aSAli Bahrami EndRE = re.compile(r'^[%s ]*%s' % (CmntChrs, EndText)) 69bfed486aSAli Bahrami 70bfed486aSAli Bahrami if not filename: 71bfed486aSAli Bahrami filename = fh.name 72bfed486aSAli Bahrami 73bfed486aSAli Bahrami for line in fh: 74bfed486aSAli Bahrami line = line.rstrip('\r\n') 75bfed486aSAli Bahrami lineno += 1 76bfed486aSAli Bahrami 77bfed486aSAli Bahrami if StartRE.search(line): 78bfed486aSAli Bahrami in_cmt = True 79bfed486aSAli Bahrami lic.append(line) 80bfed486aSAli Bahrami start = lineno 81bfed486aSAli Bahrami elif in_cmt and EndRE.search(line): 82bfed486aSAli Bahrami in_cmt = False 83bfed486aSAli Bahrami lic.append(line) 84bfed486aSAli Bahrami blocks.append({'start':start, 'block':lic}) 85bfed486aSAli Bahrami start = 0 86bfed486aSAli Bahrami lic = [] 87bfed486aSAli Bahrami elif in_cmt: 88bfed486aSAli Bahrami lic.append(line) 89bfed486aSAli Bahrami 90bfed486aSAli Bahrami if in_cmt: 91*8276d791SJonathan Adams output.write('%s: %s: Error: Incomplete %s block\n''' % 92*8276d791SJonathan Adams (filename, start, blk_name)) 93bfed486aSAli Bahrami 94bfed486aSAli Bahrami # Check for no comment block, warn if we're not being lenient 95bfed486aSAli Bahrami if not len(blocks) and not lenient: 96bfed486aSAli Bahrami if not ret: 97bfed486aSAli Bahrami ret = 2 98*8276d791SJonathan Adams output.write("%s: Warning: No %s block\n" % 99*8276d791SJonathan Adams (filename, blk_name)) 100bfed486aSAli Bahrami 101bfed486aSAli Bahrami # Check for multiple comment blocks 102bfed486aSAli Bahrami if len(blocks) > 1: 103bfed486aSAli Bahrami ret = 1 104*8276d791SJonathan Adams output.write('%s: Error: Multiple %s blocks\n' 105bfed486aSAli Bahrami ' at lines %s\n''' % 106*8276d791SJonathan Adams (filename, blk_name, 107bfed486aSAli Bahrami ', '.join([str(x['start']) for x in blocks]))) 108bfed486aSAli Bahrami 109bfed486aSAli Bahrami # Validate each comment block 110bfed486aSAli Bahrami for b in blocks: 111bfed486aSAli Bahrami try: 112bfed486aSAli Bahrami checkblock(b, full_text) 113bfed486aSAli Bahrami except CmtBlkError, e: 114bfed486aSAli Bahrami ret = 1 115bfed486aSAli Bahrami output.write( 116*8276d791SJonathan Adams "%s: %d: Error: Invalid line in %s block:\n" 117*8276d791SJonathan Adams " should be\n" 118bfed486aSAli Bahrami " '%s'\n" 119bfed486aSAli Bahrami " is\n" 120*8276d791SJonathan Adams " '%s'\n" % (filename, e.lineno, blk_name, 121*8276d791SJonathan Adams e.shouldbe, e.seen)) 122bfed486aSAli Bahrami break 123bfed486aSAli Bahrami 124bfed486aSAli Bahrami if verbose and not ret: 125*8276d791SJonathan Adams output.write("%s: Valid %s block\n" % 126*8276d791SJonathan Adams (filename, blk_name)) 127bfed486aSAli Bahrami 128bfed486aSAli Bahrami return ret 129