diff options
-rwxr-xr-x | src/extract/libgamma-method-extract | 213 |
1 files changed, 100 insertions, 113 deletions
diff --git a/src/extract/libgamma-method-extract b/src/extract/libgamma-method-extract index 6477c8a..9e76681 100755 --- a/src/extract/libgamma-method-extract +++ b/src/extract/libgamma-method-extract @@ -24,120 +24,107 @@ with open(os.path.dirname(sys.argv[0]) + '/../lib/libgamma-method.h', 'rb') as f data = file.read() data = data.decode('utf-8', 'error') + +def list_define(prefix, *blacklist): + global data + test1 = lambda line : line.startswith('#define ' + prefix) + test2 = lambda line : line.split(' ')[1] not in [prefix + b for b in list(blacklist)] + test3 = lambda line : not line.endswith('_H') + defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] + print('\n'.join([d.split(' ')[1] for d in defs])) + +def list_enum(prefix, *blacklist): + global data + test1 = lambda line : line.strip().startswith(prefix) + test2 = lambda line : line.split(' ')[1] not in [prefix + b for b in list(blacklist)] + defs = [line for line in data.split('\n') if test1(line) and test2(line)] + print('\n'.join([d.strip().split(' ')[0].rstrip(',') for d in defs])) + +def list_struct(name): + global data + data = data[data.find('\ntypedef struct ' + name):] + data = data[:data.find('\n}')] + test1 = lambda line : line.startswith(' ') and line.endswith(';') + test2 = lambda line : ' * ' not in line + defs = [line for line in data.split('\n') if test1(line) and test2(line)] + print('\n'.join([d.strip().split(' : ')[0].split(' ')[-1].rstrip(';') for d in defs])) + + +def type_struct(name): + global data + data = data[data.find('\ntypedef struct ' + name):] + data = data[:data.find('\n}')] + test1 = lambda line : line.startswith(' ') + test2 = lambda line : ' * ' not in line + test3 = lambda line : line.strip().split(' : ')[0].split(' ')[-1].rstrip(';') == sys.argv[3] + defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] + line = defs[0].strip().rstrip(';') + if ' : ' in line: + line = line.split(' : ') + line[0] = ' '.join(line[0].split(' ')[:-1]) + print(':'.join(line)) + else: + print(' '.join(line.split(' ')[:-1])) + + +def doc_define(): + global data + i = data.find('\n#define ' + sys.argv[2]) + data = data[:i] + i = data.rfind('\n */') + data = data[:i] + i = data.rfind('/**\n') + data = data[i + len('/**\n'):] + data = [line[3:] for line in data.split('\n')] + print('\n'.join(data)) + +def doc_enum(): + global data + while '\n ' in data: + data = data.replace('\n ', '\n') + i = data.find('\n' + sys.argv[2]) + data = data[:i] + i = data.rfind('\n*/') + data = data[:i] + i = data.rfind('/**\n') + data = data[i + len('/**\n'):] + data = [line[2:] for line in data.split('\n')] + print('\n'.join(data)) + +def doc_struct(name): + global data + data = data[data.find('\ntypedef struct ' + name):] + data = data[:data.find('\n}')] + test1 = lambda line : line.startswith(' ') + test2 = lambda line : ' * ' not in line + test3 = lambda line : line.strip().split(' : ')[0].split(' ')[-1].rstrip(';') == sys.argv[2] + defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] + line = defs[0] + i = data.find('\n' + line) + data = data[:i] + while '\n ' in data: + data = data.replace('\n ', '\n') + i = data.rfind('\n*/') + data = data[:i] + i = data.rfind('/**\n') + data = data[i + len('/**\n'):] + data = [line[2:] for line in data.split('\n')] + print('\n'.join(data)) + + if sys.argv[1] == '--list': - if sys.argv[2] == '--method': - test1 = lambda line : line.startswith('#define LIBGAMMA_METHOD_') - test2 = lambda line : line.split(' ')[1] not in ('LIBGAMMA_METHOD_MAX', 'LIBGAMMA_METHOD_COUNT') - test3 = lambda line : not line.endswith('_H') - defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] - print('\n'.join([d.split(' ')[1] for d in defs])) - elif sys.argv[2] == '--info': - test1 = lambda line : line.startswith('#define LIBGAMMA_CRTC_INFO_') - test2 = lambda line : not line.split(' ')[1] == 'LIBGAMMA_CRTC_INFO_COUNT' - defs = [line for line in data.split('\n') if test1(line) and test2(line)] - print('\n'.join([d.split(' ')[1] for d in defs])) - elif sys.argv[2] == '--connector': - test1 = lambda line : line.strip().startswith('LIBGAMMA_CONNECTOR_TYPE_') - test2 = lambda line : not line.split(' ')[1] == 'LIBGAMMA_CONNECTOR_TYPE_COUNT' - defs = [line for line in data.split('\n') if test1(line) and test2(line)] - print('\n'.join([d.strip().split(' ')[0].rstrip(',') for d in defs])) - elif sys.argv[2] == '--subpixel': - test1 = lambda line : line.strip().startswith('LIBGAMMA_SUBPIXEL_ORDER_') - test2 = lambda line : not line.split(' ')[1] == 'LIBGAMMA_SUBPIXEL_ORDER_COUNT' - defs = [line for line in data.split('\n') if test1(line) and test2(line)] - print('\n'.join([d.strip().split(' ')[0].rstrip(',') for d in defs])) - elif sys.argv[2] == '--info-t': - data = data[data.find('\ntypedef struct libgamma_crtc_information'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') and line.endswith(';') - test2 = lambda line : ' * ' not in line - defs = [line for line in data.split('\n') if test1(line) and test2(line)] - print('\n'.join([d.strip().split(' ')[-1].rstrip(';') for d in defs])) - elif sys.argv[2] == '--cap-t': - data = data[data.find('\ntypedef struct libgamma_method_capabilities'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') and line.endswith(';') - test2 = lambda line : ' * ' not in line - defs = [line for line in data.split('\n') if test1(line) and test2(line)] - print('\n'.join([d.strip().split(' : ')[0].split(' ')[-1].rstrip(';') for d in defs])) + if sys.argv[2] == '--method': list_define('LIBGAMMA_METHOD_', 'MAX', 'COUNT') + elif sys.argv[2] == '--info': list_define('LIBGAMMA_CRTC_INFO_', 'COUNT') + elif sys.argv[2] == '--connector': list_enum('LIBGAMMA_CONNECTOR_TYPE_', 'COUNT') + elif sys.argv[2] == '--subpixel': list_enum('LIBGAMMA_SUBPIXEL_ORDER_', 'COUNT') + elif sys.argv[2] == '--info-t': list_struct('libgamma_crtc_information') + elif sys.argv[2] == '--cap-t': list_struct('libgamma_method_capabilities') elif sys.argv[1] == '--type': - if sys.argv[2] == '--info-t': - data = data[data.find('\ntypedef struct libgamma_crtc_information'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') - test2 = lambda line : ' * ' not in line - test3 = lambda line : line.strip().split(' ')[-1] == sys.argv[3] + ';' - defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] - print('\n'.join([' '.join(d.strip().split(' ')[:-1]) for d in defs])) - elif sys.argv[2] == '--cap-t': - data = data[data.find('\ntypedef struct libgamma_method_capabilities'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') - test2 = lambda line : ' * ' not in line - test3 = lambda line : line.strip().split(' : ')[0].split(' ')[-1].rstrip(';') == sys.argv[3] - defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] - line = defs[0].strip().rstrip(';') - if ' : ' in line: - line = line.split(' : ') - line[0] = ' '.join(line[0].split(' ')[:-1]) - print(':'.join(line)) - else: - print(' '.join(line.split(' ')[:-1])) + if sys.argv[2] == '--info-t': type_struct('libgamma_crtc_information') + elif sys.argv[2] == '--cap-t': type_struct('libgamma_method_capabilities') else: - if sys.argv[1] in ('--method', '--info'): - i = data.find('\n#define ' + sys.argv[2]) - data = data[:i] - i = data.rfind('\n */') - data = data[:i] - i = data.rfind('/**\n') - data = data[i + len('/**\n'):] - data = [line[3:] for line in data.split('\n')] - print('\n'.join(data)) - elif sys.argv[1] in ('--connector', '--subpixel'): - while '\n ' in data: - data = data.replace('\n ', '\n') - i = data.find('\n' + sys.argv[2]) - data = data[:i] - i = data.rfind('\n*/') - data = data[:i] - i = data.rfind('/**\n') - data = data[i + len('/**\n'):] - data = [line[2:] for line in data.split('\n')] - print('\n'.join(data)) - elif sys.argv[1] == '--info-t': - data = data[data.find('\ntypedef struct libgamma_crtc_information'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') - test2 = lambda line : ' * ' not in line - test3 = lambda line : line.strip().split(' ')[-1] == sys.argv[2] + ';' - defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] - line = defs[0] - i = data.find('\n' + line) - data = data[:i] - while '\n ' in data: - data = data.replace('\n ', '\n') - i = data.rfind('\n*/') - data = data[:i] - i = data.rfind('/**\n') - data = data[i + len('/**\n'):] - data = [line[2:] for line in data.split('\n')] - print('\n'.join(data)) - elif sys.argv[1] == '--cap-t': - data = data[data.find('\ntypedef struct libgamma_method_capabilities'):] - data = data[:data.find('\n}')] - test1 = lambda line : line.startswith(' ') - test2 = lambda line : ' * ' not in line - test3 = lambda line : line.strip().split(' : ')[0].split(' ')[-1].rstrip(';') == sys.argv[2] - defs = [line for line in data.split('\n') if test1(line) and test2(line) and test3(line)] - line = defs[0] - i = data.find('\n' + line) - data = data[:i] - while '\n ' in data: - data = data.replace('\n ', '\n') - i = data.rfind('\n*/') - data = data[:i] - i = data.rfind('/**\n') - data = data[i + len('/**\n'):] - data = [line[2:] for line in data.split('\n')] - print('\n'.join(data)) + if sys.argv[1] in ('--method', '--info'): doc_define() + elif sys.argv[1] in ('--connector', '--subpixel'): doc_enum() + elif sys.argv[1] == '--info-t': doc_struct('libgamma_crtc_information') + elif sys.argv[1] == '--cap-t': doc_struct('libgamma_method_capabilities') |