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