diff --git a/msi.html b/msi.html index 86ec39018..639553968 100644 --- a/msi.html +++ b/msi.html @@ -6,215 +6,400 @@
++Version 1.4, June 2004
+
+Marty Kraimer (Advanced Photon Source, Argonne National Laboratory)
msi is a general purpose macro substitution/include tool. It accepts as +input an ascii template file. It looks for lines containing two reserved +command names: include and substitute. It also looks for and performs +substitutions on macros of the form $(var) and ${var}. It uses macLib, an EPICS +Base library created by William Lupton, to perform the substitutions.
msi also allows substitutions to be specified via a separate substitution
file. This substitution file allows the same format as the substitution files
-accepted by dbLoadTemplate or subtool.
-
msi -V -ofile -Idir -Msub -Ssubfile template-NOTE: All parameters are optional and a space is optional between -o, --I, -M, and -S and the associated value. Output is written to -stdout unless the -o option is given. -
Where:
+All parameters are optional. The -o, -I, -M, and -S switches may be +separated from their associated value string by spaces if desired. Output will +be written to stdout unless the -o option is given.
--V
-Switches have the following meanings:
- -++ + specifies that all named files should be searched for in the following + locations in the order given: + +msi -I "/home/phoebus/MRK/examples:." -I".." template+
++ + specifies that in the template file each occurrence of: + +msi -M "a=aval,b=bval" -Mc=cval template+
It is not possible to display usage by just typing msi since +executing the command with no arguments is a valid command. To show usage +specify an illegal switch, e.g.
+ ++ +msi -help+
This file contains the text to be read and written to the output after macro substitution is performed. If no file is given then input is read from stdin. -In addition the file can have lines containing include and substitute -commands. The format of these commands are: -
include "file"-
substitute "var=value,var=value,..."-For example let the command be: -
msi template-and file includeFile contain: -
first name is ${first}
- family name is ${family}
-and template is substitute "first=Marty,family=Kraimer" - include "includeFile" - substitute "first=Irma,family=Kraimer" - include "includeFile"-then the following is written to the output. -
first name is Marty - family name is Kraimer - first name is Irma - family name is Kraimer+Variable instances to be substituted by macro values are expressed in the +template using the syntax $(name) or +${name}. If msi has been built with EPICS Base version +3.14.7 or later, the template can also provide default values to be used when a +macro has not been given a value, using the syntax +$(name=default) or +${name=default}. + +
For example, using the command
+ +++ +msi -M name=Marty template+
where the file template contains
+ +++ +My name is $(name) +My age is $(age=none of your business)+
results in this output:
+ +++ +My name is Marty +My age is none of your business+
Macro variables and their default values can be expressed in terms of other +macros if necessary, to almost any level of complexity. Recursive definitions +will generate warning messages on stderr and result in undefined output.
+ +The template file is read and processed one line at a time, where the +maximum length of a line before and/or after macro expansion is 1023 characters +— longer input or output lines will cause msi to fail. Within the context +of a single line, macro expansion does not occur when the variable instance +appears inside a single-quoted string, or where the dollar sign $ is +preceded by a back-slash character \, but as with the standard Unix +shells, variables inside double quoted strings are expanded properly.
+ +However neither back-slash characters nor quotes or either variety are +removed when generating the output file, so depending on what is being output +the single quote behaviour may not be useful and may even be a hinderance. It +cannot be disabled in the current version of msi.
+ +In addition to the regular text and variable instances described above, the +template file may also contain commands which allow the insertion of other +template files and the ability to set macro values inside the template file +itself. These commands are:
+ +++ +include "file" +substitute "var=value,var=value,..."+
Lines containing commands must be in one of these forms:
+ +White space is allowed before and after the command verb, and after the +quoted string. If embedded quotes are needed, the backslash character +\ can be used as an escape character. For example
+ +++ +substitute "a=\"val\""+
specifies that (unless a is subsequently redefined) wherever a +$(a) macro appears in the template below this point, the text +"val" (including the double quote characters) will appear in the +output instead.
+ +If a line does match either syntax above it is just passed to macLib for +processing without any notification. Thus the input line:
+ +++ +include "myfile" #include file+
would just be passed to macLib, i.e. it would not be considered an +include command.
+ +As an example of these commands, let the Unix command be:
+ +++ +msi template+
and file includeFile contain:
+ +
+first name is ${first}
+family name is ${family}
+
+
+and template is
+ +++ +substitute "first=Marty,family=Kraimer" +include "includeFile" +substitute "first=Irma,family=Kraimer" +include "includeFile"+
then the following is written to the output.
+ +++ +first name is Marty +family name is Kraimer +first name is Irma +family name is Kraimer+
Note that on an IOC when using the dbLoadTemplate command, the +template file does not support the substitute command, although +include is supported.
The optional substitution file has three formats: regular, pattern, and +dbTemplate format. We will discuss each separately.
+ +--After reading each set of replacements within braces, the -template file is read and macro substitution performed.{var1=value1,var2=value2,...} -{var1=value1,var2=value2,...} -...+{var1=set1_val1, var2=set1_val2, ...} +{var2=set2_val2, var1=set2_val1, ...} +{var1=set3_val1, var2=set3_val2, ...} +{var2=set4_val2, var1=set4_val1, ...}
The template file is output with macro substitutions performed once for each +set of braces containing macro replacement values.
+ +--This is the same as the regular format: -pattern {var1,var2,...} -{value1,value2,...} -{value1,value2,...} -pattern {var1,var2,...} -{value1,value2,...} -{value1,value2,...}+pattern {var1, var2, ...} +{set1_val1, set1_val2, ...} +{set2_val1, set2_val2, ...} +pattern {var2, var1, ...} +{set3_val2, set3_val1, ...} +{set4_val2, set4_val2, ...}
- {var1=value1,var2=value2}
-...
-
+This produces the same result as the regular format example above.
This format is an extension of the format accepted by the EPICS IOC command +dbLoadTemplate, and allows templates to be expanded on the host rather +by using dbLoadTemplate at IOC boot time.
+--For the template format, the command line template argument is optional. If -it specified it is used, otherwise the file template is used. This format is -an extension of the format accepted by dbLoadTemplate. It allows templates to -be expanded on the host rather via dbLoadTemplate. The file name may -appear inside double quotation marks; these are only required if the name -contains any environment variable macros of the form ${ENV_VAR} which will be -expanded before the file is opened. Environment variable macro expansion -is available when msi is linked with EPICS base R3.14.3 or newer. + +file template { - pattern format or regular format -}-file template { - pattern format or regular format +file template { + pattern format or regular format +} +file "${WHERE}/template2" { + pattern format or regular format }
For the dbTemplate format, the template filename does not have to be given +on the command line, and is usually specified in the substitutions file +instead. If a template filename is given on the command line it will override +the filenames listed in the substitutions files.
+ +A comment line may appear anywhere in a substitution file, and will be +ignored. A comment line is any line beginning with the character #, +which must be the very first character on the line.
+ +For definitions within braces given in any of the file formats, a separator +must be given between items. A separator is either a comma, or one or more of +the standard white space characters (space, formfeed, newline, carriage return, +tab or vertical tab).
+ +Each item within braces can be an alphanumeric token, or a double-quoted +string. A back-slash character \ can be used to escape a quote +character needed inside a quoted string. These three sets of substitutions are +all equivalent:
+ +
+{a=aa b=bb c="\"cc\""}
+{b="bb",a=aa,c="\"cc\""}
+{
+ c="\"cc\""
+ b=bb
+ a="aa"
+}
+
+
+Within a substitutions file, the file name may appear inside double +quotation marks; these are only required if the name contains environment +variable macros of the form ${ENV_VAR} or $(ENV_VAR), which will be expanded +before the file is opened. Environment variable macro expansion is only +available when msi has been built using EPICS base R3.14.3 or newer.
msi -S substitute template-template is -
first name is ${first}
- family name is ${family}
-substitute is
- {first=Marty,family=Kraimer}
- {first=Irma,family=Kraimer}
-The following is written to the output.
-first name is Marty - family name is Kraimer - first name is Irma - family name is Kraimer+ +
Let the command be:
+ +++ +msi -S substitute template+
The file template contains
+ +
+first name is ${first}
+family name is ${family}
+
+
+and the file substitute is
+ +
+{first=Marty,family=Kraimer}
+{first=Irma,family=Kraimer}
+
+
+The following is the output produced:
+ ++first name is Marty +family name is Kraimer +first name is Irma +family name is Kraimer+
msi -S pattern template-pattern is -
pattern {first,last}
- {Marty,Kraimer}
- {Irma,Kraimer}
-template is the same as in the previous example.
-The following is written to the output.
-first name is Marty - family name is Kraimer - first name is Irma - family name is Kraimer+
Let the command be:
+ +++ +msi -S pattern template+
The file pattern contains
+ +
+pattern {first,last}
+{Marty,Kraimer}
+{Irma,Kraimer}
+
+
+and template is the same as the previous example:
+ +
+first name is ${first}
+family name is ${family}
+
+
+This is the output:
+ ++first name is Marty +family name is Kraimer +first name is Irma +family name is Kraimer+
-+ xxx.substitutions ismsi -S xxx.substitutions+msi -S xxx.substitutions
- file template {
- pattern {first,last}
- {Marty,Kraimer}
- {Irma,Kraimer}
- pattern {last,first}
- {Smith,Bill}
- {Smith,Mary}
+file template {
+pattern {first,last}
+{Marty,Kraimer}
+{Irma,Kraimer}
+pattern {last,first}
+{Smith,Bill}
+{Smith,Mary}
}
file template {
- {first=Marty,last=Kraimer}
- {first=Irma,last=Kraimer}
+{first=Marty,last=Kraimer}
+{first=Irma,last=Kraimer}
}
template is the same as in the previous example..
@@ -222,7 +407,7 @@ file template {
The following is written to the output
--first name is Marty +first name is Marty family name is Kraimer first name is Irma family name is Kraimer @@ -236,77 +421,13 @@ first name is Irma family name is Kraimer
include "<file name>"-
or-
substitute "<substitutions>"-
substitute "a=\"val\""-
a=val-
include "myfile" #include file-
For items within braces separators may be given between items. A - separator is either white space or a comma. White space is any of the - following: space, formfeed, newline, carriage return, tab, vertical tab.
+msi is built as a normal extensions product, and can be built with any +version of EPICS Base from 3.13.0beta11 onwards. Base version 3.14.3 or later +is required if the ability to expand environment variables in filenames is +needed. Base version 3.14.7 or later is required to allow the use of default +macro values in template files.
-Each item within braces can be an alphanumeric token or a quoted string. - The characters \" can be used for embedded quotes. The rules for non quoted - strings are actually more relaxed but any item that is not an alphanumeric - string should be given as a quoted string.
- -Thus
- {a=aa b=bb c="\"cc\""}
-and
- {a=aa,b=bb,c="\"cc\""}
-and
- {
- a="aa"
- b="bb",
- c="\"cc\""
- }
-are all equivalent.
-
-
-
-0 - Success.
-1 - Can't open/create file, or other I/O error.
-2 - -V option specified and one or more undefined macros were encountered.