#! /usr/bin/python
#
# 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
#

#
# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
#

#
# Check that link-editor mapfiles contain a valid mapfile header block
#

MAPFILE = '''
WARNING:  STOP NOW.  DO NOT MODIFY THIS FILE.
Object versioning must comply with the rules detailed in

	usr/src/lib/README.mapfiles

You should not be making modifications here until you've read the most current
copy of that file. If you need help, contact a gatekeeper for guidance.
'''

import re, sys
from onbld.Checks import CmtBlk

MAPFILE = MAPFILE.splitlines()[1:]		# Don't include initial \n

def mapfilechk(fh, filename=None, verbose=False, output=sys.stderr):
	if filename:
		name = filename
	else:
		name = fh.name

	# Verify that the mapfile is using version 2 syntax. Read and discard
	# comment and empty lines until the first non-empty line is seen.
	# This line must be '$mapfile_version 2'.
	CmtRE = re.compile(r'#.*$')
	LeadingWSRE = re.compile(r'^\s+')
	VersionRE = re.compile(r'^\$mapfile_version\s+2\s*$')
	for line in fh:
		line = CmtRE.sub(r'', line)
		line = LeadingWSRE.sub(r'', line)
		if line == '' :
			continue

		# First non=empty line must be version declaration
		if not VersionRE.match(line):
			output.write("Warning: mapfile version 2 syntax"
				" expected in file %s\n" % name)
			return 1

		# We have verified version 2 syntax. Exit the loop
		break

	# If the mapfile contains a SYMBOL_VERSION directive, the file
	# must include a copy of the MAPFILE warning comment above. The
	# comment is specific to symbol versioning, so we don't harrass
	# the authors of mapfiles used exclusively for other purposes.
	SymVerRE = re.compile(r'^\s*symbol_version\s+', re.IGNORECASE)
	for line in fh:
		# If we find a SYMBOL_VERSION, then verify that the comment
		# is present. The comment usually precedes the mapfile_version
		# comment and any mapfile directives (including SYMBOL_VERSION),
		# so we need to rewind the file. This is more efficient than it
		# might seem: All of these items are near the top of the file,
		# so not not many lines are read, and file contents are
		# bufferred.
		if SymVerRE.match(line):
			fh.seek(0);
			return CmtBlk.cmtblkchk(fh, 'MAPFILE', MAPFILE,
				filename=filename, verbose=verbose,
				output=output)

	# Comment is not required.
	return 0