Return to buildMsgStrings.awk CVS log | Up to [Pegasus] / pegasus / src / Clients / cimcli |
File: [Pegasus] / pegasus / src / Clients / cimcli / buildMsgStrings.awk
(download)
Revision: 1.1, Mon Sep 22 16:21:49 2014 UTC (9 years, 8 months ago) by karl Branch: MAIN CVS Tags: RELEASE_2_14_1, RELEASE_2_14_0-RC2, RELEASE_2_14_0-RC1, RELEASE_2_14_0, RELEASE_2_14-root, RELEASE_2_14-branch, HEAD BUG#: 9885 TITLE: Ship cimcli on release build. Internationalize remainder of msgs DESCRIPTION: This patch internationalizes most of the remaining messages in cimcli. It does not internationalize the messages from the verbose mode and there are some cases where specific words (ex. namespaces) that feed groups of assembled messages are not internationalized but the majority of cimcli is not internationalized. Note that this patch adds an awk based tool that gets the interationalization from the source code itself rather that trying to maintain the bundle and code completely separately For each NEWly internationalized message, the message internationalization is documented just below the message and the the awk program extracts this info, confirms that it is correct, and creates installs the result into the CLI message bundle replacing the previous version of the same messages. Also, this technique was NOT used on previously internationalized messages (the help messages). The process of extracting the internationalization and modifying the bundle is in two new targets in the Makefile for cimcli. |
## ## This is a developer awk script to scrape the internationalization strings ## from the source code and produce a file that can be substitutue ## into the Pegasus client message bundle. ## It is a convience for building message bundles for a particular directory ## in that it allows putting the message bundle text for the message in ## the source file and mechanically generating the message bundle. ## NOTE: The created message bundle MUST BE manually transfered to the correct ## place in the OpenPegasus message bundle. ## The form it expects in the source file for each internationalized message ## is: ## line prefix //# for each line that defines a component of a message. ## The line types are ## N - Note There may be multiple note lines ## T - Name of this message ## S - String defining the message. There may be multiple string lines ## ## Example: ## //#N substitution {0} is a string with the property ## //#N name in error ## //#T BOOLEAN_VALUE_ERR ## //#S Invalid keyword for boolean value = {0}. Must be \"true\" or \"false\" ## //#S upper or lower case\n ## Maps each entry to the form ## /** ## * @note PGC01619: substitution {0} is a string with the keyword ## * in error ## */ ## ## Clients.cimcli.CIMCLIClient.BOOLEAN_VALUE_ERR:string { ## "Invalid keyword for boolean value = {0}. Must be \"true\" or \"false\"" ## " upper or lower case\n"} ## Notes are included only if the //#N tag exists ## The //#T tag MUST exist and must be unique. It contains a single ## Non-blank string that is the name component of this message. ## This is mapped to the name component of the Full message name ## FileText.name where name is the only parameter on the line ## at least one //#S tag must exist. Do not put quotes around the text ## Multiple lines may be supplied. They will be output as a single line ## within the context of the message string {"<text>"} BEGIN { ## These are the cimcli message bundle numbers. We are not using them ## at this point because all output is to the local console in response ## to console input. MsgNumStr = "PGC016" MsgNum = 1 ## Common part of the name of the source file group FileText = "Clients.cimcli.CIMCLIClient." ## name of the output file that will contain the messages outputFile = "cimcliCLI_en.txt" ## local variables arrayIndex = 0 txtString = "" errorCount = 0 messageNumber = "" print "Output msg file " outputFile " will be generated." # recreate the output message file print " /*CIMCLIAUTOMEDMESSAGEBUNDLE_BEGIN" > outputFile print " * MessageBundleInput automatically generated " \ strftime("%Y-%m-%d") >> outputFile print " * by cimcli buildMsgStrings.awk." >> outputFile print " */\n" >> outputFile exitCode = 0 } # line parsing from all input files ## Parse the first line of the text info, the NOTE info. This line is ## optional $1 == "//#N" { ##print "N record " $0 " $1=" $1 messageNumber = "" if (state == 0) { $1 = "" noteArray[arrayIndex++] = $0 state = 1 next } else if (state == 1) { $1 = "" noteArray[arrayIndex++] = $0 next } else { PrintError("N record found out of sequence") } } ## Used to set message numbers on specific messages. Set the message number ## text into the messageNumber variable to be output on the @note: line ## For now we DO NOT output this with the messages themselves. $1 == "//#P" { if (state != 1) { PrintError("Invalid use of P record.") } else { PrecordNumber = $2 if ($2 in numbersArray) { ermsg = "The msg number " $2 " is already defined at " nameArray[$2] PrintError(ermsg) } else { numbersArray[$2] = FILENAME":"FNR } messageNumber = "PGC016"$2 next } } ## This processes the message name line. It contains a single string ## the name of this message in the msg file. Must be all caps. This ## may be the first line in a description. This record must exist so it ## increments the state variable. $1 == "//#T" { ##print "T record " $0 " $2" $2 if ($2 == "") { PrintError("Invalid name for this msg txt. Must be single capped wrd") next } if (state == 1 || state == 0) { if ($2 in nameArray) { ermsg = "The msg name " $2 " is already defined at " nameArray[$2] PrintError(ermsg) next } else { nameArray[$2] = FILENAME":"FNR } state = 2 MSGName = FileText $2 ":string {\"" next } else { PrintError("Unexpected T record. Must be first or follow N record") next } } ## Process the String text line. There may be multiple lines of text to ## allow the source file to maintain the 80 col length. They are ## assembled into a single string $1 == "//#S" { ##print "S record" $0 " state=" state " txtString=" txtString ##remove ## remove the //#S from the line $1 = "" ## remove leading blanks and the ..#S sequence ##print "before " $0 gsub(/^[ ]+/,"",$0) ##print "afterx " $0 if (state == 2) { state = 3 where = match($0, /\$[0-9]/) if (where != 0) { PrintError("Internal form of variable (ex. $0 found") } txtString = $0 where = match($0, /\$[0-9]/) ##print "match result " where if (where != 0) { PrintError("Internal form of variable (ex. $0 found") fixInput($0) } next } else if (state == 3) { if (match($0, /\$[0-9]/)) { PrintError("Internal form of variable (ex. $1 found)" $0) fixInput($0) } ##else ##{ ## print " Match on following record failed. " $0 ##} txtString = txtString " " $0 ##print "txtString appended" txtString ##remove next } else { PrintError("Unexpected N or T record. Expected S record.") next } } ## process lines that do not have the //# prefix. If state != 0 ## this is first record after a msg definition and we output the ## result. ## if state == 1, there was no string definition ((state == 1) || (state == 2)) { PrintError("T record must preceed S record.") state = 0 next } ## state = 3. Valid message definition complete. Output the result (state == 3) { ##print "State 3 found" ##remove state = 0; if (arrayIndex != 0) { print " /**" >> outputFile if (messageNumber != "") { print " * @note "messageNumber":" >> outputFile } else { print " * @note:" >> outputFile } for (i = 0; i < arrayIndex; i++) { print " * " noteArray[i] >> outputFile } print " */" >> outputFile print "" >> outputFile arrayIndex = 0 } # any note output, proceed to output the name and text line ## Note that we have to append the leading and trailing quotes ##printf("\"%s\"\n", txtString) if (txtString in strTextArray) { errmsg = "Duplicated text of messages " txtString " at " strTextArray[txtString] PrintError(errmsg) } else { strTextArray[txtString] = FILENAME":"FNR } printf(" %s%s\"}\n", MSGName, txtString) >> outputFile print "" >> outputFile ## blank line after each message count++ } END { print Message File Generation Complete if (errorCount != 0) { print "ERRORS Found. " errorCount " errors found." } print "Generated file" outputFile " with " count " entries." if (errorCount != 0) { print " /*" > outputFile print " * cimcli MessageBundle End with " errorCount " errors." >> outputFile print " */" >> outputFile } else { print " /*" > outputFile print " * cimcli MessageBundle End" >> outputFile print " * Please insert into msg/CLI/pegasusCLI_en.txt." print " CIMCLIAUTOMEDMESSAGEBUNDLE_END*/" >> outputFile } if (exitCode != 0) { exit exitCode print "Exiting with error code " exitCode } } ## fix the input string to replace $x with {x} for all x between 0 and 9 function fixInput(textLine) { ##print "Fixing " textLine temp = textLine if (match($0, /\$[0-9]/)) { for (x = 0; x <= 9; x++) { replacement = "{"x"}" regex = "\\$"x ##print "fixInput. regex " regex " replacement " replacement where = match(textLine, regex) ##print "where " where if (where != 0) { sub(regex, replacement, textLine) ##print "fixed for replacement " replacement " textLine" textLine } else { ##print "Could not fix " textLine " with replacement " replacement " using regex " regex break } } } ##print "new " temp ##print "orig " textLine } function PrintError(errmsgText) { print "ERROR: "FILENAME":"FNR " " errmsgText errorCount++ exitCode = 1 }
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |