299 lines
9.7 KiB
HTML
299 lines
9.7 KiB
HTML
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; U; SunOS 5.6 sun4u) [Netscape]">
|
|
</head>
|
|
<body>
|
|
|
|
<h1>
|
|
msi: Macro Substitution and Include Tool</h1>
|
|
Marty Kraimer
|
|
<br>Argonne National Laboratory - Advanced Photon Source
|
|
<br>Original: April 26, 1999
|
|
<h2>
|
|
Introduction</h2>
|
|
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 the macLib, an epics base
|
|
library created by William Lupton, to perform the substitutions.
|
|
<p>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.
|
|
<br>
|
|
<h2>
|
|
Command Syntax:</h2>
|
|
|
|
<pre>msi -V -ofile -Idir -Msub -Ssubfile template</pre>
|
|
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.
|
|
<p>Where:
|
|
<p><tt>-V</tt>
|
|
<ul>If this parameter is specified then an undefined macro is considered
|
|
an error. An error message is generated and the line containing the macro
|
|
is not written to the output.</ul>
|
|
<tt>-o file</tt>
|
|
<ul>Output will be written to the specifed file rather than to the standard output.</ul>
|
|
|
|
<tt>-I dir</tt>
|
|
<ul>This parameter, which may be repeated, specifies a search path for
|
|
include commands. For example:</ul>
|
|
|
|
<dd>
|
|
<tt> msi -I "/home/phoebus/MRK/examples:." -I".." template</tt></dd>
|
|
|
|
<dd>
|
|
specifies the search path:</dd>
|
|
|
|
<dd>
|
|
<tt> /home/phoebus/MRK/examples:.:..</tt></dd>
|
|
|
|
<br>-M substitutions
|
|
<ul>This parameter, which may be repeated, specifies marco substitutions.
|
|
For example:</ul>
|
|
|
|
<dd>
|
|
<tt> msi -M "a=aval,b=bval" -M"c=cval" template</tt></dd>
|
|
|
|
<ul>specifies that in the template file each occurrence of:</ul>
|
|
|
|
<ul>
|
|
<dd>
|
|
$(a) or ${a} is replaced by aval</dd>
|
|
|
|
<dd>
|
|
$(b) or ${b} is replaced by bval</dd>
|
|
|
|
<dd>
|
|
$(c) or ${c} is replaced by cval</dd>
|
|
</ul>
|
|
-S subfile
|
|
<ul>The substitution file. See below for format.</ul>
|
|
template
|
|
<ul>The input file. If no file is specified then input is taken from stdin,
|
|
i.e. msi can be used as a filter. See below for a description of commands
|
|
that can be embedded in the template file.</ul>
|
|
NOTE: It is not possible to display usage by just typing <tt>msi</tt> since
|
|
executing the command with no arguments i s a valid command. To show usage
|
|
specify an illegal switch, e.g.
|
|
<ul>
|
|
<pre>msi -help</pre>
|
|
</ul>
|
|
|
|
<h2>
|
|
Template File Format</h2>
|
|
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:
|
|
<pre> include "file"</pre>
|
|
|
|
<pre> substitute "var=value,var=value,..."</pre>
|
|
For example let the command be:
|
|
<pre> msi template</pre>
|
|
and file includeFile contain:
|
|
<pre> first name is ${first}
|
|
family name is ${family}</pre>
|
|
and template is
|
|
<br>
|
|
<pre> substitute "first=Marty,family=Kraimer"
|
|
include "includeFile"
|
|
substitute "first=Irma,family=Kraimer"
|
|
include "includeFile"</pre>
|
|
then the following is written to the output.
|
|
<pre> first name is Marty
|
|
family name is Kraimer
|
|
first name is Irma
|
|
family name is Kraimer</pre>
|
|
|
|
<h2>
|
|
Substitution File Format</h2>
|
|
The optional substitution file has three formats: regular, pattern, and
|
|
dbTemplate format. Lets discuss each separately
|
|
<br>
|
|
<h3>
|
|
regular format</h3>
|
|
|
|
<blockquote>
|
|
<pre>{var1=value1,var2=value2,...}
|
|
{var1=value1,var2=value2,...}
|
|
...</pre>
|
|
</blockquote>
|
|
After reading each set of replacements within braces, the template
|
|
file is read and macro substitution performed.
|
|
<br>
|
|
<h3>
|
|
pattern format:</h3>
|
|
|
|
<blockquote>
|
|
<pre>pattern {var1,var2,...}
|
|
{value1,value2,...}
|
|
{value1,value2,...}
|
|
pattern {var1,var2,...}
|
|
{value1,value2,...}
|
|
{value1,value2,...}</pre>
|
|
</blockquote>
|
|
This is the same as the regular format:
|
|
<blockquote>
|
|
<pre>{var1=value1,var2=value2}
|
|
...</pre>
|
|
</blockquote>
|
|
|
|
<h3>
|
|
dbTemplate Format</h3>
|
|
|
|
<blockquote>
|
|
<pre>file template {
|
|
pattern format or regular format
|
|
}</pre>
|
|
|
|
<pre>file template {
|
|
pattern format or regular format
|
|
}</pre>
|
|
</blockquote>
|
|
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 ${MOTOR} which
|
|
will be expanded before the file is opened.
|
|
<h3>
|
|
Regular substitution example</h3>
|
|
Let the command be:
|
|
<pre> msi -S substitute template</pre>
|
|
<tt>template</tt> is
|
|
<pre> first name is ${first}
|
|
family name is ${family}</pre>
|
|
<tt>substitute</tt> is
|
|
<pre> {first=Marty,family=Kraimer}
|
|
{first=Irma,family=Kraimer}</pre>
|
|
The following is written to the output.
|
|
<pre> first name is Marty
|
|
family name is Kraimer
|
|
first name is Irma
|
|
family name is Kraimer</pre>
|
|
|
|
<h3>
|
|
Pattern substitution example</h3>
|
|
Let the command be:
|
|
<pre> msi -S pattern template</pre>
|
|
<tt>pattern</tt> is
|
|
<pre> pattern {first,last}
|
|
{Marty,Kraimer}
|
|
{Irma,Kraimer}</pre>
|
|
<tt>template</tt> is the same as in the previous example.
|
|
<p>The following is written to the output.
|
|
<pre> first name is Marty
|
|
family name is Kraimer
|
|
first name is Irma
|
|
family name is Kraimer</pre>
|
|
|
|
<h3>
|
|
dbTemplate example</h3>
|
|
Let the command be
|
|
<blockquote>
|
|
<pre>msi -S xxx.substitutions</pre>
|
|
</blockquote>
|
|
<tt>xxx.substitutions</tt> is
|
|
<blockquote>
|
|
<pre>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}
|
|
}</pre>
|
|
</blockquote>
|
|
<tt>template</tt> is the same as in the previous example..
|
|
<p>The following is written to the output
|
|
<blockquote>
|
|
<pre>first name is Marty
|
|
family name is Kraimer
|
|
first name is Irma
|
|
family name is Kraimer
|
|
first name is Bill
|
|
last name is Smith
|
|
first name is Mary
|
|
last name is Smith
|
|
first name is Marty
|
|
family name is Kraimer
|
|
first name is Irma
|
|
family name is Kraimer</pre>
|
|
</blockquote>
|
|
|
|
<h2>
|
|
Some Details</h2>
|
|
Building msi
|
|
<ul>msi is built as a normal extensions product. It should be built with
|
|
base version 3.13.0beta11 or later.</ul>
|
|
|
|
<dt>
|
|
Line length limits</dt>
|
|
|
|
<ul>All buffers containing input or output lines are set for a maximum
|
|
line length of 1024. Longer input or output lines will cause msi to fail.</ul>
|
|
macLib
|
|
<ul>Currently the only macLib documentation is in macLibNOTES and macLibREADME
|
|
which are in base/src/libCom.</ul>
|
|
template file syntax
|
|
<ul>except for lines containing include or substitute commands each line
|
|
is just passed to macLib. Lines containing these commands MUST be of the
|
|
form:</ul>
|
|
|
|
<pre> include "<file name>"</pre>
|
|
|
|
<pre> or</pre>
|
|
|
|
<pre> substitute "<substitutions>"</pre>
|
|
|
|
<ul>White space is allowed before and after the command and after the quoted
|
|
string. If embedded quotes are needed the \ character can be used as an
|
|
escape character. For example:</ul>
|
|
|
|
<pre> substitute "a=\"val\""</pre>
|
|
|
|
<ul>specifies the substitution</ul>
|
|
|
|
<pre> a=val</pre>
|
|
|
|
<ul>If a line does have the above syntax it is just passed to macLib for
|
|
processing without any notification. Thus the input line:</ul>
|
|
|
|
<pre> include "myfile" #include file</pre>
|
|
|
|
<ul>would just be passed to macLib, i.e. it would NOT be considered an
|
|
include command.</ul>
|
|
substitution file syntax
|
|
<ul>A comment line may appear anywhere and is just ignored. A comment line
|
|
is any line beginning with the character #, which MUST be the very first
|
|
character of the comment line.
|
|
<p>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.
|
|
<p>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.
|
|
<p>Thus
|
|
<pre> {a=aa b=bb c="\"cc\""}</pre>
|
|
and
|
|
<pre> {a=aa,b=bb,c="\"cc\""}</pre>
|
|
and
|
|
<pre> {
|
|
a="aa"
|
|
b="bb",
|
|
c="\"cc\""
|
|
}</pre>
|
|
are all equivalent.</ul>
|
|
|
|
</body>
|
|
</html>
|