#!/usr/bin/env python # # Copyright (C) 2020-2021 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, # and distributed under the terms of the FreeType project license, # LICENSE.TXT. By continuing to use, modify, or distribute this file you # indicate that you have read the license and understand and accept it # fully. """Parse modules.cfg and dump its output either as ftmodule.h or a list of base extensions. """ from __future__ import print_function import argparse import os import re import sys # Expected input: # # ... # FONT_MODULES += # HINTING_MODULES += # RASTER_MODULES += # AUX_MODULES += # BASE_EXTENSIONS += # ... def parse_modules_cfg(input_file): lists = { "FONT_MODULES": [], "HINTING_MODULES": [], "RASTER_MODULES": [], "AUX_MODULES": [], "BASE_EXTENSIONS": [], } for line in input_file.splitlines(): line = line.rstrip() # Ignore empty lines and those that start with a comment. if not line or line[0] == "#": continue items = line.split() assert len(items) == 3 and items[1] == "+=", ( "Unexpected input line [%s]" % line ) assert items[0] in lists, ( "Unexpected configuration variable name " + items[0] ) lists[items[0]].append(items[2]) return lists def generate_ftmodule(lists): result = "/* This is a generated file. */\n" for driver in lists["FONT_MODULES"]: if driver == "sfnt": # Special case for the sfnt 'driver'. result += "FT_USE_MODULE( FT_Module_Class, sfnt_module_class )\n" continue name = { "truetype": "tt", "type1": "t1", "cid": "t1cid", "type42": "t42", "winfonts": "winfnt", }.get(driver, driver) result += ( "FT_USE_MODULE( FT_Driver_ClassRec, %s_driver_class )\n" % name ) for module in lists["HINTING_MODULES"]: result += ( "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module ) for module in lists["RASTER_MODULES"]: name = { "raster": "ft_raster1", "smooth": "ft_smooth", }.get(module) result += ( "FT_USE_MODULE( FT_Renderer_Class, %s_renderer_class )\n" % name ) for module in lists["AUX_MODULES"]: if module in ("psaux", "psnames", "otvalid", "gxvalid"): result += ( "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module ) result += "/* EOF */\n" return result def generate_main_modules(lists): return "\n".join( lists["FONT_MODULES"] + lists["HINTING_MODULES"] + lists["RASTER_MODULES"] ) def generate_aux_modules(lists): return "\n".join(lists["AUX_MODULES"]) def generate_base_extensions(lists): return "\n".join(lists["BASE_EXTENSIONS"]) def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "--format", required=True, choices=( "ftmodule.h", "main-modules", "aux-modules", "base-extensions-list", ), help="Select output format.", ) parser.add_argument( "input", metavar="CONFIGURE_RAW", help="The input configure.raw file to parse.", ) parser.add_argument("--output", help="Output file (default is stdout).") args = parser.parse_args() with open(args.input) as f: input_data = f.read() lists = parse_modules_cfg(input_data) if args.format == "ftmodule.h": result = generate_ftmodule(lists) elif args.format == "main-modules": result = generate_main_modules(lists) elif args.format == "aux-modules": result = generate_aux_modules(lists) elif args.format == "base-extensions-list": result = generate_base_extensions(lists) else: assert False, "Invalid output format!" if args.output: with open(args.output, "w") as f: f.write(result) else: print(result) return 0 if __name__ == "__main__": sys.exit(main())