1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport os
24e5c31af7Sopenharmony_ciimport sys
25e5c31af7Sopenharmony_cifrom itertools import chain
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ciINL_HEADER_TMPL = """\
28e5c31af7Sopenharmony_ci/* WARNING: This is auto-generated file. Do not modify, since changes will
29e5c31af7Sopenharmony_ci * be lost! Modify the generating script instead.
30e5c31af7Sopenharmony_ci *
31e5c31af7Sopenharmony_ci * Generated from {registryName} revision {revision}.
32e5c31af7Sopenharmony_ci */\
33e5c31af7Sopenharmony_ci"""
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cidef genInlHeader (registryName, revision):
36e5c31af7Sopenharmony_ci	return INL_HEADER_TMPL.format(
37e5c31af7Sopenharmony_ci		registryName	= registryName,
38e5c31af7Sopenharmony_ci		revision		= str(revision))
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_cidef genInlHeaderForSource (registrySource):
41e5c31af7Sopenharmony_ci	return genInlHeaderForSource(registrySource.getFilename(), registrySource.getRevision())
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_cidef nextMod (val, mod):
44e5c31af7Sopenharmony_ci	if val % mod == 0:
45e5c31af7Sopenharmony_ci		return val + mod
46e5c31af7Sopenharmony_ci	else:
47e5c31af7Sopenharmony_ci		return int(val/mod)*mod + mod
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_cidef indentLines (lines):
50e5c31af7Sopenharmony_ci	tabSize = 4
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_ci	# Split into columns
53e5c31af7Sopenharmony_ci	lineColumns = [line.split("\t") for line in lines if line is not None]
54e5c31af7Sopenharmony_ci	if len(lineColumns) == 0:
55e5c31af7Sopenharmony_ci		return
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ci	numColumns = max(len(line) for line in lineColumns)
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci	# Figure out max length per column
60e5c31af7Sopenharmony_ci	columnLengths = [nextMod(max(len(line[ndx]) for line in lineColumns if len(line) > ndx), tabSize) for ndx in range(numColumns)]
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ci	for line in lineColumns:
63e5c31af7Sopenharmony_ci		indented = []
64e5c31af7Sopenharmony_ci		for columnNdx, col in enumerate(line[:-1]):
65e5c31af7Sopenharmony_ci			colLen	= len(col)
66e5c31af7Sopenharmony_ci			while colLen < columnLengths[columnNdx]:
67e5c31af7Sopenharmony_ci				col		+= "\t"
68e5c31af7Sopenharmony_ci				colLen	 = nextMod(colLen, tabSize)
69e5c31af7Sopenharmony_ci			indented.append(col)
70e5c31af7Sopenharmony_ci
71e5c31af7Sopenharmony_ci		# Append last col
72e5c31af7Sopenharmony_ci		indented.append(line[-1])
73e5c31af7Sopenharmony_ci		yield "".join(indented)
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_cidef readFile (filename):
76e5c31af7Sopenharmony_ci	f = open(filename, 'rb')
77e5c31af7Sopenharmony_ci	data = f.read()
78e5c31af7Sopenharmony_ci	f.close()
79e5c31af7Sopenharmony_ci	return data
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_cidef writeFileIfChanged (filename, data):
82e5c31af7Sopenharmony_ci	if not os.path.exists(filename) or readFile(filename) != data:
83e5c31af7Sopenharmony_ci		if (sys.version_info < (3, 0)):
84e5c31af7Sopenharmony_ci			f = open(filename, 'wt')
85e5c31af7Sopenharmony_ci		else:
86e5c31af7Sopenharmony_ci			f = open(filename, 'wt', newline='\n')
87e5c31af7Sopenharmony_ci		f.write(data)
88e5c31af7Sopenharmony_ci		f.close()
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_cidef writeLines (filename, lines):
91e5c31af7Sopenharmony_ci	text = ""
92e5c31af7Sopenharmony_ci	for line in lines:
93e5c31af7Sopenharmony_ci		text += line
94e5c31af7Sopenharmony_ci		text += "\n"
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_ci	writeFileIfChanged(filename, text)
97e5c31af7Sopenharmony_ci	print(filename)
98e5c31af7Sopenharmony_ci
99e5c31af7Sopenharmony_cidef writeInlFile (filename, header, source):
100e5c31af7Sopenharmony_ci	writeLines(filename, chain([header], source))
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_cidef normalizeConstant (constant):
103e5c31af7Sopenharmony_ci	value = int(constant, base=0)
104e5c31af7Sopenharmony_ci	if value >= 1 << 63:
105e5c31af7Sopenharmony_ci		suffix = 'ull'
106e5c31af7Sopenharmony_ci	elif value >= 1 << 32:
107e5c31af7Sopenharmony_ci		suffix = 'll'
108e5c31af7Sopenharmony_ci	elif value >= 1 << 31:
109e5c31af7Sopenharmony_ci		suffix = 'u'
110e5c31af7Sopenharmony_ci	else:
111e5c31af7Sopenharmony_ci		suffix = ''
112e5c31af7Sopenharmony_ci	return constant + suffix
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_cidef commandParams (command):
115e5c31af7Sopenharmony_ci	if len(command.params) > 0:
116e5c31af7Sopenharmony_ci		return ", ".join(param.declaration for param in command.params)
117e5c31af7Sopenharmony_ci	else:
118e5c31af7Sopenharmony_ci		return "void"
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_cidef commandArgs (command):
121e5c31af7Sopenharmony_ci	return ", ".join(param.name for param in command.params)
122