xref: /llvm-project/openmp/runtime/tools/message-converter.py (revision 05bcf83c5c25625df1caf86ef4070644907947b6)
188dae3d5SJonathan Peyton#!/usr/bin/env python3
288dae3d5SJonathan Peyton
388dae3d5SJonathan Peyton#
488dae3d5SJonathan Peyton# //===----------------------------------------------------------------------===//
588dae3d5SJonathan Peyton# //
688dae3d5SJonathan Peyton# // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
788dae3d5SJonathan Peyton# // See https://llvm.org/LICENSE.txt for license information.
888dae3d5SJonathan Peyton# // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
988dae3d5SJonathan Peyton# //
1088dae3d5SJonathan Peyton# //===----------------------------------------------------------------------===//
1188dae3d5SJonathan Peyton#
1288dae3d5SJonathan Peyton
1388dae3d5SJonathan Peytonimport argparse
1488dae3d5SJonathan Peytonimport datetime
1588dae3d5SJonathan Peytonimport os
1688dae3d5SJonathan Peytonimport platform
1788dae3d5SJonathan Peytonimport re
1888dae3d5SJonathan Peytonimport sys
1988dae3d5SJonathan Peytonfrom libomputils import ScriptError, error
2088dae3d5SJonathan Peyton
2188dae3d5SJonathan Peyton
22*05bcf83cSChristian Oliverosclass TargetPlatform:
23*05bcf83cSChristian Oliveros    """Convenience class for handling the target platform for configuration/compilation"""
24*05bcf83cSChristian Oliveros
25*05bcf83cSChristian Oliveros    system_override = None
26*05bcf83cSChristian Oliveros    """
27*05bcf83cSChristian Oliveros    Target system name override by the user.
28*05bcf83cSChristian Oliveros    It follows the conventions from https://docs.python.org/3/library/platform.html#platform.system
29*05bcf83cSChristian Oliveros    """
30*05bcf83cSChristian Oliveros
31*05bcf83cSChristian Oliveros    def set_system_override(override_system):
32*05bcf83cSChristian Oliveros        """
33*05bcf83cSChristian Oliveros        Set a system override for the target.
34*05bcf83cSChristian Oliveros        Please follow the style from https://docs.python.org/3/library/platform.html#platform.system
35*05bcf83cSChristian Oliveros        """
36*05bcf83cSChristian Oliveros        TargetPlatform.system_override = override_system
37*05bcf83cSChristian Oliveros
38*05bcf83cSChristian Oliveros    def system():
39*05bcf83cSChristian Oliveros        """
40*05bcf83cSChristian Oliveros        Target System name.
41*05bcf83cSChristian Oliveros        It follows the conventions from https://docs.python.org/3/library/platform.html#platform.system
42*05bcf83cSChristian Oliveros        """
43*05bcf83cSChristian Oliveros        if TargetPlatform.system_override is None:
44*05bcf83cSChristian Oliveros            return platform.system()
45*05bcf83cSChristian Oliveros        return TargetPlatform.system_override
46*05bcf83cSChristian Oliveros
47*05bcf83cSChristian Oliveros
4888dae3d5SJonathan Peytonclass ParseMessageDataError(ScriptError):
4988dae3d5SJonathan Peyton    """Convenience class for parsing message data file errors"""
5088dae3d5SJonathan Peyton
5188dae3d5SJonathan Peyton    def __init__(self, filename, line, msg):
5288dae3d5SJonathan Peyton        super(ParseMessageDataError, self).__init__(msg)
5388dae3d5SJonathan Peyton        self.filename = filename
5488dae3d5SJonathan Peyton        self.line = line
5588dae3d5SJonathan Peyton
5688dae3d5SJonathan Peyton
5788dae3d5SJonathan Peytondef parse_error(filename, line, msg):
5888dae3d5SJonathan Peyton    raise ParseMessageDataError(filename, line, msg)
5988dae3d5SJonathan Peyton
6088dae3d5SJonathan Peyton
6188dae3d5SJonathan Peytondef display_language_id(inputFile):
6288dae3d5SJonathan Peyton    """Quickly parse file for LangId and print it"""
6388dae3d5SJonathan Peyton    regex = re.compile(r'^LangId\s+"([0-9]+)"')
6488dae3d5SJonathan Peyton    with open(inputFile, encoding="utf-8") as f:
6588dae3d5SJonathan Peyton        for line in f:
6688dae3d5SJonathan Peyton            m = regex.search(line)
6788dae3d5SJonathan Peyton            if not m:
6888dae3d5SJonathan Peyton                continue
6988dae3d5SJonathan Peyton            print(m.group(1))
7088dae3d5SJonathan Peyton
7188dae3d5SJonathan Peyton
7288dae3d5SJonathan Peytonclass Message(object):
7388dae3d5SJonathan Peyton    special = {
7488dae3d5SJonathan Peyton        "n": "\n",
7588dae3d5SJonathan Peyton        "t": "\t",
7688dae3d5SJonathan Peyton    }
7788dae3d5SJonathan Peyton
7888dae3d5SJonathan Peyton    def __init__(self, lineNumber, name, text):
7988dae3d5SJonathan Peyton        self.lineNumber = lineNumber
8088dae3d5SJonathan Peyton        self.name = name
8188dae3d5SJonathan Peyton        self.text = text
8288dae3d5SJonathan Peyton
8388dae3d5SJonathan Peyton    def toSrc(self):
84*05bcf83cSChristian Oliveros        if TargetPlatform.system().casefold() == "Windows".casefold():
8588dae3d5SJonathan Peyton            return re.sub(r"%([0-9])\$(s|l?[du])", r"%\1!\2!", self.text)
8688dae3d5SJonathan Peyton        return str(self.text)
8788dae3d5SJonathan Peyton
8888dae3d5SJonathan Peyton    def toMC(self):
8988dae3d5SJonathan Peyton        retval = self.toSrc()
9088dae3d5SJonathan Peyton        for special, substitute in Message.special.items():
9188dae3d5SJonathan Peyton            retval = re.sub(r"\\{}".format(special), substitute, retval)
9288dae3d5SJonathan Peyton        return retval
9388dae3d5SJonathan Peyton
9488dae3d5SJonathan Peyton
9588dae3d5SJonathan Peytonclass MessageData(object):
9688dae3d5SJonathan Peyton    """
9788dae3d5SJonathan Peyton    Convenience class representing message data parsed from i18n/* files
9888dae3d5SJonathan Peyton
9988dae3d5SJonathan Peyton    Generate these objects using static create() factory method
10088dae3d5SJonathan Peyton    """
10188dae3d5SJonathan Peyton
10288dae3d5SJonathan Peyton    sectionInfo = {
10388dae3d5SJonathan Peyton        "meta": {"short": "prp", "long": "meta", "set": 1, "base": 1 << 16},
10488dae3d5SJonathan Peyton        "strings": {"short": "str", "long": "strings", "set": 2, "base": 2 << 16},
10588dae3d5SJonathan Peyton        "formats": {"short": "fmt", "long": "formats", "set": 3, "base": 3 << 16},
10688dae3d5SJonathan Peyton        "messages": {"short": "msg", "long": "messages", "set": 4, "base": 4 << 16},
10788dae3d5SJonathan Peyton        "hints": {"short": "hnt", "long": "hints", "set": 5, "base": 5 << 16},
10888dae3d5SJonathan Peyton    }
10988dae3d5SJonathan Peyton    orderedSections = ["meta", "strings", "formats", "messages", "hints"]
11088dae3d5SJonathan Peyton
11188dae3d5SJonathan Peyton    def __init__(self):
11288dae3d5SJonathan Peyton        self.filename = None
11388dae3d5SJonathan Peyton        self.sections = {}
11488dae3d5SJonathan Peyton
11588dae3d5SJonathan Peyton    def getMeta(self, name):
11688dae3d5SJonathan Peyton        metaList = self.sections["meta"]
11788dae3d5SJonathan Peyton        for meta in metaList:
11888dae3d5SJonathan Peyton            if meta.name == name:
11988dae3d5SJonathan Peyton                return meta.text
12088dae3d5SJonathan Peyton        error(
12188dae3d5SJonathan Peyton            'No "{}" detected in meta data' " for file {}".format(name, self.filename)
12288dae3d5SJonathan Peyton        )
12388dae3d5SJonathan Peyton
12488dae3d5SJonathan Peyton    @staticmethod
12588dae3d5SJonathan Peyton    def create(inputFile):
12688dae3d5SJonathan Peyton        """Creates MessageData object from inputFile"""
12788dae3d5SJonathan Peyton        data = MessageData()
12888dae3d5SJonathan Peyton        data.filename = os.path.abspath(inputFile)
12988dae3d5SJonathan Peyton        obsolete = 1
13088dae3d5SJonathan Peyton        sectionRegex = re.compile(r"-\*- ([a-zA-Z0-9_]+) -\*-")
13188dae3d5SJonathan Peyton        keyValueRegex = re.compile(r'([a-zA-Z_][a-zA-Z0-9_]*)\s+"(.*)"')
13288dae3d5SJonathan Peyton        moreValueRegex = re.compile(r'"(.*)"')
13388dae3d5SJonathan Peyton
13488dae3d5SJonathan Peyton        with open(inputFile, "r", encoding="utf-8") as f:
13588dae3d5SJonathan Peyton            currentSection = None
13688dae3d5SJonathan Peyton            currentKey = None
13788dae3d5SJonathan Peyton            for lineNumber, line in enumerate(f, 1):
13888dae3d5SJonathan Peyton                line = line.strip()
13988dae3d5SJonathan Peyton                # Skip empty lines
14088dae3d5SJonathan Peyton                if not line:
14188dae3d5SJonathan Peyton                    continue
14288dae3d5SJonathan Peyton                # Skip comment lines
14388dae3d5SJonathan Peyton                if line.startswith("#"):
14488dae3d5SJonathan Peyton                    continue
14588dae3d5SJonathan Peyton                # Matched a section header
14688dae3d5SJonathan Peyton                match = sectionRegex.search(line)
14788dae3d5SJonathan Peyton                if match:
14888dae3d5SJonathan Peyton                    currentSection = match.group(1).lower()
14988dae3d5SJonathan Peyton                    if currentSection in data.sections:
15088dae3d5SJonathan Peyton                        parse_error(
15188dae3d5SJonathan Peyton                            inputFile,
15288dae3d5SJonathan Peyton                            lineNumber,
15388dae3d5SJonathan Peyton                            "section: {} already defined".format(currentSection),
15488dae3d5SJonathan Peyton                        )
15588dae3d5SJonathan Peyton                    data.sections[currentSection] = []
15688dae3d5SJonathan Peyton                    continue
15788dae3d5SJonathan Peyton                # Matched a Key "Value" line (most lines)
15888dae3d5SJonathan Peyton                match = keyValueRegex.search(line)
15988dae3d5SJonathan Peyton                if match:
16088dae3d5SJonathan Peyton                    if not currentSection:
16188dae3d5SJonathan Peyton                        parse_error(inputFile, lineNumber, "no section defined yet.")
16288dae3d5SJonathan Peyton                    key = match.group(1)
16388dae3d5SJonathan Peyton                    if key == "OBSOLETE":
16488dae3d5SJonathan Peyton                        key = "OBSOLETE{}".format(obsolete)
16588dae3d5SJonathan Peyton                        obsolete += 1
16688dae3d5SJonathan Peyton                    value = match.group(2)
16788dae3d5SJonathan Peyton                    currentKey = key
16888dae3d5SJonathan Peyton                    data.sections[currentSection].append(
16988dae3d5SJonathan Peyton                        Message(lineNumber, key, value)
17088dae3d5SJonathan Peyton                    )
17188dae3d5SJonathan Peyton                    continue
17288dae3d5SJonathan Peyton                # Matched a Continuation of string line
17388dae3d5SJonathan Peyton                match = moreValueRegex.search(line)
17488dae3d5SJonathan Peyton                if match:
17588dae3d5SJonathan Peyton                    value = match.group(1)
17688dae3d5SJonathan Peyton                    if not currentSection:
17788dae3d5SJonathan Peyton                        parse_error(inputFile, lineNumber, "no section defined yet.")
17888dae3d5SJonathan Peyton                    if not currentKey:
17988dae3d5SJonathan Peyton                        parse_error(inputFile, lineNumber, "no key defined yet.")
18088dae3d5SJonathan Peyton                    data.sections[currentSection][-1].text += value
18188dae3d5SJonathan Peyton                    continue
18288dae3d5SJonathan Peyton                # Unknown line syntax
18388dae3d5SJonathan Peyton                parse_error(inputFile, lineNumber, "bad line:\n{}".format(line))
18488dae3d5SJonathan Peyton        return data
18588dae3d5SJonathan Peyton
18688dae3d5SJonathan Peyton
18788dae3d5SJonathan Peytondef insert_header(f, data, commentChar="//"):
18888dae3d5SJonathan Peyton    f.write(
18988dae3d5SJonathan Peyton        "{0} Do not edit this file! {0}\n"
19088dae3d5SJonathan Peyton        "{0} The file was generated from"
19188dae3d5SJonathan Peyton        " {1} by {2} on {3}. {0}\n\n".format(
19288dae3d5SJonathan Peyton            commentChar,
19388dae3d5SJonathan Peyton            os.path.basename(data.filename),
19488dae3d5SJonathan Peyton            os.path.basename(__file__),
19588dae3d5SJonathan Peyton            datetime.datetime.now().ctime(),
19688dae3d5SJonathan Peyton        )
19788dae3d5SJonathan Peyton    )
19888dae3d5SJonathan Peyton
19988dae3d5SJonathan Peyton
20088dae3d5SJonathan Peytondef generate_enum_file(enumFile, prefix, data):
20188dae3d5SJonathan Peyton    """Create the include file with message enums"""
20288dae3d5SJonathan Peyton    global g_sections
20388dae3d5SJonathan Peyton    with open(enumFile, "w") as f:
20488dae3d5SJonathan Peyton        insert_header(f, data)
20588dae3d5SJonathan Peyton        f.write(
20688dae3d5SJonathan Peyton            "enum {0}_id {1}\n"
20788dae3d5SJonathan Peyton            "\n"
20888dae3d5SJonathan Peyton            "    // A special id for absence of message.\n"
20988dae3d5SJonathan Peyton            "    {0}_null = 0,\n"
21088dae3d5SJonathan Peyton            "\n".format(prefix, "{")
21188dae3d5SJonathan Peyton        )
21288dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
21388dae3d5SJonathan Peyton            messages = data.sections[section]
21488dae3d5SJonathan Peyton            info = MessageData.sectionInfo[section]
21588dae3d5SJonathan Peyton            shortName = info["short"]
21688dae3d5SJonathan Peyton            longName = info["long"]
21788dae3d5SJonathan Peyton            base = info["base"]
21888dae3d5SJonathan Peyton            setIdx = info["set"]
21988dae3d5SJonathan Peyton            f.write(
22088dae3d5SJonathan Peyton                "    // Set #{}, {}.\n"
22188dae3d5SJonathan Peyton                "    {}_{}_first = {},\n".format(
22288dae3d5SJonathan Peyton                    setIdx, longName, prefix, shortName, base
22388dae3d5SJonathan Peyton                )
22488dae3d5SJonathan Peyton            )
22588dae3d5SJonathan Peyton            for message in messages:
22688dae3d5SJonathan Peyton                f.write("    {}_{}_{},\n".format(prefix, shortName, message.name))
22788dae3d5SJonathan Peyton            f.write("    {}_{}_last,\n\n".format(prefix, shortName))
22888dae3d5SJonathan Peyton        f.write(
22988dae3d5SJonathan Peyton            "    {0}_xxx_lastest\n\n"
23088dae3d5SJonathan Peyton            "{1}; // enum {0}_id\n\n"
23188dae3d5SJonathan Peyton            "typedef enum {0}_id  {0}_id_t;\n\n\n"
23288dae3d5SJonathan Peyton            "// end of file //\n".format(prefix, "}")
23388dae3d5SJonathan Peyton        )
23488dae3d5SJonathan Peyton
23588dae3d5SJonathan Peyton
23688dae3d5SJonathan Peytondef generate_signature_file(signatureFile, data):
23788dae3d5SJonathan Peyton    """Create the signature file"""
23888dae3d5SJonathan Peyton    sigRegex = re.compile(r"(%[0-9]\$(s|l?[du]))")
23988dae3d5SJonathan Peyton    with open(signatureFile, "w") as f:
24088dae3d5SJonathan Peyton        f.write("// message catalog signature file //\n\n")
24188dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
24288dae3d5SJonathan Peyton            messages = data.sections[section]
24388dae3d5SJonathan Peyton            longName = MessageData.sectionInfo[section]["long"]
24488dae3d5SJonathan Peyton            f.write("-*- {}-*-\n\n".format(longName.upper()))
24588dae3d5SJonathan Peyton            for message in messages:
24688dae3d5SJonathan Peyton                sigs = sorted(list(set([a for a, b in sigRegex.findall(message.text)])))
24788dae3d5SJonathan Peyton                i = 0
24888dae3d5SJonathan Peyton                # Insert empty placeholders if necessary
24988dae3d5SJonathan Peyton                while i != len(sigs):
25088dae3d5SJonathan Peyton                    num = i + 1
25188dae3d5SJonathan Peyton                    if not sigs[i].startswith("%{}".format(num)):
25288dae3d5SJonathan Peyton                        sigs.insert(i, "%{}$-".format(num))
25388dae3d5SJonathan Peyton                    else:
25488dae3d5SJonathan Peyton                        i += 1
25588dae3d5SJonathan Peyton                f.write("{:<40} {}\n".format(message.name, " ".join(sigs)))
25688dae3d5SJonathan Peyton            f.write("\n")
25788dae3d5SJonathan Peyton        f.write("// end of file //\n")
25888dae3d5SJonathan Peyton
25988dae3d5SJonathan Peyton
26088dae3d5SJonathan Peytondef generate_default_messages_file(defaultFile, prefix, data):
26188dae3d5SJonathan Peyton    """Create the include file with message strings organized"""
26288dae3d5SJonathan Peyton    with open(defaultFile, "w", encoding="utf-8") as f:
26388dae3d5SJonathan Peyton        insert_header(f, data)
26488dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
26588dae3d5SJonathan Peyton            f.write(
26688dae3d5SJonathan Peyton                "static char const *\n"
26788dae3d5SJonathan Peyton                "__{}_default_{}[] =\n"
26888dae3d5SJonathan Peyton                "    {}\n"
26988dae3d5SJonathan Peyton                "        NULL,\n".format(prefix, section, "{")
27088dae3d5SJonathan Peyton            )
27188dae3d5SJonathan Peyton            messages = data.sections[section]
27288dae3d5SJonathan Peyton            for message in messages:
27388dae3d5SJonathan Peyton                f.write('        "{}",\n'.format(message.toSrc()))
27488dae3d5SJonathan Peyton            f.write("        NULL\n" "    {};\n\n".format("}"))
27588dae3d5SJonathan Peyton        f.write(
27688dae3d5SJonathan Peyton            "struct kmp_i18n_section {0}\n"
27788dae3d5SJonathan Peyton            "    int           size;\n"
27888dae3d5SJonathan Peyton            "    char const ** str;\n"
27988dae3d5SJonathan Peyton            "{1}; // struct kmp_i18n_section\n"
28088dae3d5SJonathan Peyton            "typedef struct kmp_i18n_section  kmp_i18n_section_t;\n\n"
28188dae3d5SJonathan Peyton            "static kmp_i18n_section_t\n"
28288dae3d5SJonathan Peyton            "__{2}_sections[] =\n"
28388dae3d5SJonathan Peyton            "    {0}\n"
28488dae3d5SJonathan Peyton            "        {0} 0, NULL {1},\n".format("{", "}", prefix)
28588dae3d5SJonathan Peyton        )
28688dae3d5SJonathan Peyton
28788dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
28888dae3d5SJonathan Peyton            messages = data.sections[section]
28988dae3d5SJonathan Peyton            f.write(
29088dae3d5SJonathan Peyton                "        {} {}, __{}_default_{} {},\n".format(
29188dae3d5SJonathan Peyton                    "{", len(messages), prefix, section, "}"
29288dae3d5SJonathan Peyton                )
29388dae3d5SJonathan Peyton            )
29488dae3d5SJonathan Peyton        numSections = len(MessageData.orderedSections)
29588dae3d5SJonathan Peyton        f.write(
29688dae3d5SJonathan Peyton            "        {0} 0, NULL {1}\n"
29788dae3d5SJonathan Peyton            "    {1};\n\n"
29888dae3d5SJonathan Peyton            "struct kmp_i18n_table {0}\n"
29988dae3d5SJonathan Peyton            "    int                   size;\n"
30088dae3d5SJonathan Peyton            "    kmp_i18n_section_t *  sect;\n"
30188dae3d5SJonathan Peyton            "{1}; // struct kmp_i18n_table\n"
30288dae3d5SJonathan Peyton            "typedef struct kmp_i18n_table  kmp_i18n_table_t;\n\n"
30388dae3d5SJonathan Peyton            "static kmp_i18n_table_t __kmp_i18n_default_table =\n"
30488dae3d5SJonathan Peyton            "    {0}\n"
30588dae3d5SJonathan Peyton            "        {3},\n"
30688dae3d5SJonathan Peyton            "        __{2}_sections\n"
30788dae3d5SJonathan Peyton            "    {1};\n\n"
30888dae3d5SJonathan Peyton            "// end of file //\n".format("{", "}", prefix, numSections)
30988dae3d5SJonathan Peyton        )
31088dae3d5SJonathan Peyton
31188dae3d5SJonathan Peyton
31288dae3d5SJonathan Peytondef generate_message_file_unix(messageFile, data):
31388dae3d5SJonathan Peyton    """
31488dae3d5SJonathan Peyton    Create the message file for Unix OSes
31588dae3d5SJonathan Peyton
31688dae3d5SJonathan Peyton    Encoding is in UTF-8
31788dae3d5SJonathan Peyton    """
31888dae3d5SJonathan Peyton    with open(messageFile, "w", encoding="utf-8") as f:
31988dae3d5SJonathan Peyton        insert_header(f, data, commentChar="$")
32088dae3d5SJonathan Peyton        f.write('$quote "\n\n')
32188dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
32288dae3d5SJonathan Peyton            setIdx = MessageData.sectionInfo[section]["set"]
32388dae3d5SJonathan Peyton            f.write(
32488dae3d5SJonathan Peyton                "$ ------------------------------------------------------------------------------\n"
32588dae3d5SJonathan Peyton                "$ {}\n"
32688dae3d5SJonathan Peyton                "$ ------------------------------------------------------------------------------\n\n"
32788dae3d5SJonathan Peyton                "$set {}\n\n".format(section, setIdx)
32888dae3d5SJonathan Peyton            )
32988dae3d5SJonathan Peyton            messages = data.sections[section]
33088dae3d5SJonathan Peyton            for num, message in enumerate(messages, 1):
33188dae3d5SJonathan Peyton                f.write('{} "{}"\n'.format(num, message.toSrc()))
33288dae3d5SJonathan Peyton            f.write("\n")
33388dae3d5SJonathan Peyton        f.write("\n$ end of file $")
33488dae3d5SJonathan Peyton
33588dae3d5SJonathan Peyton
33688dae3d5SJonathan Peytondef generate_message_file_windows(messageFile, data):
33788dae3d5SJonathan Peyton    """
33888dae3d5SJonathan Peyton    Create the message file for Windows OS
33988dae3d5SJonathan Peyton
34088dae3d5SJonathan Peyton    Encoding is in UTF-16LE
34188dae3d5SJonathan Peyton    """
34288dae3d5SJonathan Peyton    language = data.getMeta("Language")
34388dae3d5SJonathan Peyton    langId = data.getMeta("LangId")
34488dae3d5SJonathan Peyton    with open(messageFile, "w", encoding="utf-16-le") as f:
34588dae3d5SJonathan Peyton        insert_header(f, data, commentChar=";")
34688dae3d5SJonathan Peyton        f.write("\nLanguageNames = ({0}={1}:msg_{1})\n\n".format(language, langId))
34788dae3d5SJonathan Peyton        f.write("FacilityNames=(\n")
34888dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
34988dae3d5SJonathan Peyton            setIdx = MessageData.sectionInfo[section]["set"]
35088dae3d5SJonathan Peyton            shortName = MessageData.sectionInfo[section]["short"]
35188dae3d5SJonathan Peyton            f.write(" {}={}\n".format(shortName, setIdx))
35288dae3d5SJonathan Peyton        f.write(")\n\n")
35388dae3d5SJonathan Peyton
35488dae3d5SJonathan Peyton        for section in MessageData.orderedSections:
35588dae3d5SJonathan Peyton            shortName = MessageData.sectionInfo[section]["short"]
35688dae3d5SJonathan Peyton            n = 0
35788dae3d5SJonathan Peyton            messages = data.sections[section]
35888dae3d5SJonathan Peyton            for message in messages:
35988dae3d5SJonathan Peyton                n += 1
36088dae3d5SJonathan Peyton                f.write(
36188dae3d5SJonathan Peyton                    "MessageId={}\n"
36288dae3d5SJonathan Peyton                    "Facility={}\n"
36388dae3d5SJonathan Peyton                    "Language={}\n"
36488dae3d5SJonathan Peyton                    "{}\n.\n\n".format(n, shortName, language, message.toMC())
36588dae3d5SJonathan Peyton                )
36688dae3d5SJonathan Peyton        f.write("\n; end of file ;")
36788dae3d5SJonathan Peyton
36888dae3d5SJonathan Peyton
36988dae3d5SJonathan Peytondef main():
37088dae3d5SJonathan Peyton    parser = argparse.ArgumentParser(description="Generate message data files")
37188dae3d5SJonathan Peyton    parser.add_argument(
37288dae3d5SJonathan Peyton        "--lang-id",
37388dae3d5SJonathan Peyton        action="store_true",
37488dae3d5SJonathan Peyton        help="Print language identifier of the message catalog source file",
37588dae3d5SJonathan Peyton    )
37688dae3d5SJonathan Peyton    parser.add_argument(
37788dae3d5SJonathan Peyton        "--prefix",
37888dae3d5SJonathan Peyton        default="kmp_i18n",
37988dae3d5SJonathan Peyton        help="Prefix to be used for all C identifiers (type and variable names)"
38088dae3d5SJonathan Peyton        " in enum and default message files.",
38188dae3d5SJonathan Peyton    )
38288dae3d5SJonathan Peyton    parser.add_argument("--enum", metavar="FILE", help="Generate enum file named FILE")
38388dae3d5SJonathan Peyton    parser.add_argument(
38488dae3d5SJonathan Peyton        "--default", metavar="FILE", help="Generate default messages file named FILE"
38588dae3d5SJonathan Peyton    )
38688dae3d5SJonathan Peyton    parser.add_argument(
38788dae3d5SJonathan Peyton        "--signature", metavar="FILE", help="Generate signature file named FILE"
38888dae3d5SJonathan Peyton    )
38988dae3d5SJonathan Peyton    parser.add_argument(
39088dae3d5SJonathan Peyton        "--message", metavar="FILE", help="Generate message file named FILE"
39188dae3d5SJonathan Peyton    )
392*05bcf83cSChristian Oliveros    parser.add_argument(
393*05bcf83cSChristian Oliveros        "--target-system-override",
394*05bcf83cSChristian Oliveros        metavar="TARGET_SYSTEM_NAME",
395*05bcf83cSChristian Oliveros        help="Target System override.\n"
396*05bcf83cSChristian Oliveros        "By default the target system is the host system\n"
397*05bcf83cSChristian Oliveros        "See possible values at https://docs.python.org/3/library/platform.html#platform.system",
398*05bcf83cSChristian Oliveros    )
39988dae3d5SJonathan Peyton    parser.add_argument("inputfile")
40088dae3d5SJonathan Peyton    commandArgs = parser.parse_args()
40188dae3d5SJonathan Peyton
40288dae3d5SJonathan Peyton    if commandArgs.lang_id:
40388dae3d5SJonathan Peyton        display_language_id(commandArgs.inputfile)
40488dae3d5SJonathan Peyton        return
40588dae3d5SJonathan Peyton    data = MessageData.create(commandArgs.inputfile)
40688dae3d5SJonathan Peyton    prefix = commandArgs.prefix
407*05bcf83cSChristian Oliveros    if commandArgs.target_system_override:
408*05bcf83cSChristian Oliveros        TargetPlatform.set_system_override(commandArgs.target_system_override)
40988dae3d5SJonathan Peyton    if commandArgs.enum:
41088dae3d5SJonathan Peyton        generate_enum_file(commandArgs.enum, prefix, data)
41188dae3d5SJonathan Peyton    if commandArgs.default:
41288dae3d5SJonathan Peyton        generate_default_messages_file(commandArgs.default, prefix, data)
41388dae3d5SJonathan Peyton    if commandArgs.signature:
41488dae3d5SJonathan Peyton        generate_signature_file(commandArgs.signature, data)
41588dae3d5SJonathan Peyton    if commandArgs.message:
416*05bcf83cSChristian Oliveros        if TargetPlatform.system().casefold() == "Windows".casefold():
41788dae3d5SJonathan Peyton            generate_message_file_windows(commandArgs.message, data)
41888dae3d5SJonathan Peyton        else:
41988dae3d5SJonathan Peyton            generate_message_file_unix(commandArgs.message, data)
42088dae3d5SJonathan Peyton
42188dae3d5SJonathan Peyton
42288dae3d5SJonathan Peytonif __name__ == "__main__":
42388dae3d5SJonathan Peyton    try:
42488dae3d5SJonathan Peyton        main()
42588dae3d5SJonathan Peyton    except ScriptError as e:
42688dae3d5SJonathan Peyton        print("error: {}".format(e))
42788dae3d5SJonathan Peyton        sys.exit(1)
42888dae3d5SJonathan Peyton
42988dae3d5SJonathan Peyton# end of file
430