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