diff options
Diffstat (limited to 'codegen/vulkan/scripts/Retired/fixupRef.py')
-rwxr-xr-x | codegen/vulkan/scripts/Retired/fixupRef.py | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/codegen/vulkan/scripts/Retired/fixupRef.py b/codegen/vulkan/scripts/Retired/fixupRef.py new file mode 100755 index 00000000..4a9b792a --- /dev/null +++ b/codegen/vulkan/scripts/Retired/fixupRef.py @@ -0,0 +1,202 @@ +#!/usr/bin/python3 +# +# Copyright 2016-2021 The Khronos Group Inc. +# +# SPDX-License-Identifier: Apache-2.0 + +# fixupRef.py - replace old // refBegin .. // refEnd syntax with new +# open block syntax +# +# Usage: fixupRef.py [-outdir path] [-overwrite] files + +from reflib import * +from vkapi import * +import argparse, copy, io, os, pdb, re, string, sys + +# Return 'None' for None, the string otherwise +def noneStr(str): + if str == None: + return '(None)' + else: + return str + +# Escape single quotes in a string for asciidoc +def escapeQuote(str): + return str.replace("'", "\'") + +# Start a refpage open block +def openBlock(pi, fp): + if pi.refs != '': + print("[open,refpage='" + pi.name + + "',desc='" + pi.desc + + "',type='" + pi.type + + "',xrefs='" + pi.refs + "']", + file=fp) + else: + print("[open,refpage='" + pi.name + + "',desc='" + pi.desc + + "',type='" + pi.type + "']", + file=fp) + print('--', file=fp) + +# End a refpage open block +def closeBlock(pi, fp): + print('--', file=fp) + # Just for finding block ends while debugging + # print("// end [open,refpage='" + pi.name + "']", file=fp) + +# Replace old // refBegin .. // refEnd references in an asciidoc +# file with open blocks, per # ??? . +# specFile - filename to extract from +# outDir - output directory to write updated file to, if not overwritten +# overwrite - True if the file should be overwritten in place +# skipped - set of filenames containing commands which weren't +# rewritten with open blocks (e.g. enums). Updated in place. +def replaceRef(specFile, outDir, overwrite = False, skipped = set()): + file = loadFile(specFile) + if file == None: + return + + # Save the path to this file for later use in rewriting relative includes + specDir = os.path.dirname(os.path.abspath(specFile)) + + pageMap = findRefs(file) + logDiag(specFile + ': found', len(pageMap.keys()), 'potential pages') + + sys.stderr.flush() + + # Fix up references in pageMap + fixupRefs(pageMap, specFile, file) + + # Map the page info dictionary into a dictionary of actions + # keyed by line number they're performed on/after: + # 'action' : 'begin' or 'end'. What to do on a refBegin or refEnd line + # 'replace': True if this line needs to be replaced + # 'name' : Name of the ref page being defined + # 'desc' : One-line description of the ref page being defined + # 'type' : Type of the ref page being defined, 'structs', 'protos', etc. + # 'refs' : Space-separated string of crossreferenced pages + + actions = { } + + for name in pageMap.keys(): + pi = pageMap[name] + + # Cleanup parameters for output + pi.name = noneStr(pi.name) + pi.desc = escapeQuote(noneStr(pi.desc)) + + if pi.extractPage: + if (file[pi.begin][0:11] == '// refBegin'): + # Replace line + actions[pi.begin] = { + 'action' : 'begin', + 'replace' : True, + 'pageinfo' : pi + } + else: + # Insert line + actions[pi.begin] = { + 'action' : 'begin', + 'replace' : False, + 'pageinfo' : pi + } + + if (file[pi.end][0:9] == '// refEnd'): + # Replace line + actions[pi.end] = { + 'action' : 'end', + 'replace' : True, + 'pageinfo' : pi + } + else: + # Insert line + actions[pi.end] = { + 'action' : 'end', + 'replace' : False, + 'pageinfo' : pi + } + else: + logWarn('Skipping replacement for', pi.name, 'at', specFile, + 'line', pi.begin) + print('Skipping replacement for', pi.name, 'at', specFile, + 'line', pi.begin) + printPageInfo(pi, file) + skipped.add(specFile) + + if overwrite: + pageName = specFile + else: + pageName = outDir + '/' + os.path.basename(specFile) + + fp = open(pageName, 'w', encoding='utf-8') + + line = 0 + for text in file: + if line in actions.keys(): + action = actions[line]['action'] + replace = actions[line]['replace'] + pi = actions[line]['pageinfo'] + + logDiag('ACTION:', action, 'REPLACE:', replace, 'at line', line) + logDiag('PageInfo of action:') + printPageInfo(pi, file) + + if action == 'begin': + openBlock(pi, fp) + if not replace: + print(text, file=fp, end='') + elif action == 'end': + if not replace: + print(text, file=fp, end='') + closeBlock(pi, fp) + else: + print('ERROR: unrecognized action:', action, 'in', + specFile, 'at line', line) + print(text, file=fp, end='') + else: + print(text, file=fp, end='') + line = line + 1 + + fp.close() + + #for line in sorted(actions.keys()): + # action = actions[line] + # print('action at line', line, '\t', + # action[0], action[1], action[2]) + +if __name__ == '__main__': + global genDict + genDict = {} + + parser = argparse.ArgumentParser() + + parser.add_argument('-diag', action='store', dest='diagFile', + help='Set the diagnostic file') + parser.add_argument('-warn', action='store', dest='warnFile', + help='Set the warning file') + parser.add_argument('-log', action='store', dest='logFile', + help='Set the log file for both diagnostics and warnings') + parser.add_argument('-outdir', action='store', dest='outDir', + default='out', + help='Set the base directory in which pages are generated') + parser.add_argument('-overwrite', action='store_true', + help='Overwrite input filenames instead of writing different output filenames') + parser.add_argument('files', metavar='filename', nargs='*', + help='a filename to extract ref pages from') + parser.add_argument('--version', action='version', version='%(prog)s 1.0') + + results = parser.parse_args() + + setLogFile(True, True, results.logFile) + setLogFile(True, False, results.diagFile) + setLogFile(False, True, results.warnFile) + + skipped = set() + for file in results.files: + replaceRef(file, results.outDir, results.overwrite, skipped) + + if len(skipped) > 0: + print('Files containing skipped feature blocks:') + for file in sorted(skipped): + print('\t' + file) |