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