INFORMATION PRESENTATION FACILITY PREPROCESSOR (C) IBM CORPORATION 1992 VERSION 1.0 June 30, 1992 Doug Haigh IBM Corporation Contents 1.0 OVERVIEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1 What IPFCPREP does for you. . . . . . . . . . . . . . . . . . . . . 3 1.2 Running IPFCPREP . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.0 REFERENCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1 Imbedding Files from Other Subdirectories . . . . . . . . . . . . . 5 2.1.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Defining Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3 Using C Language define files . . . . . . . . . . . . . . . . . . . 6 2.3.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4 Using Bookmaster 1.0 Vanilla conditional compiles . . . . . . . . . 7 2.4.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.5 Using Simple Macros . . . . . . . . . . . . . . . . . . . . . . . . 8 2.5.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.6 Using Simple Macros that can be used in BookMaster . . . . . . . . . 9 2.6.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7 Using Positional Parameters on Macros . . . . . . . . . . . . . . 11 2.7.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.0 Overview 1.1 What IPFCPREP does for you. o Allows you to have IPFC script files in different subdirectories. The IPFCPREP program will look at the INCLUDE environment variable as it processes the imbed (.im) tags so that it can search more than the current subdirectory for script files. o Allows you to define symbols. The IPFCPREP program allows the use of BookMaster .nameit tags with the symbol= and text= paramters. o Allows you to use C language header files to define symbols. The IPFCPREP program will read in C language header files and use the #define statements as BookMaster .nameit tags. o Allows you to have conditional compile sections The IPFCPREP program supports BookMaster Vanilla conditional compiles. o Allows you to have simple substitution macros. The IPFCPREP will support the .dm tag to define simple macros that are used for text replacement only. Either keyword or positional parameters may be used. o Resolves bitmap file names to fully qualified path name. Currently IPF requires the bitmap files be in the current directory. If multiple versions of a file are produced in different subdirectories, the bitmaps must be copied into every subdirectory. IPFCPREP will resolve the bitmap file's position using the INCLUDE environment variable and replace the bitmap file's name with a fully qualified path name in the artwork tag. It will also resolve the artwork linkfile's name. *************************************************************************** 1.2 Running IPFCPREP To run the IPFC preprocessor, type on the command line IPFCPREP input_file_name output_file_name [options] NAME DEFINITION input_file_name Input script file output_file_name Output script file options Preprocessing options /V, -V, /v, OR -v Flag to indicate you want lines printed out as they are read in /W, -W, /w, OR -w Flag to indicate you want additional warning messages. /N, -N, /n, OR -n Flag to indicate a symbol definition /S, -S, /s, OR -s Flag to indicate not to include system include files, i.e. files that are enclosed by '<' & '>'. /D, -D, /d, OR -d Flag to indicate a symbol definition of the form -D symbolname[=symbol_text] where symbolname Name of symbol to be defined symbol_text Text of defined symbol. This is optional. If no symbol_text is defined, the symbol is put in the symbol table with no text (ex: for use on conditional compiles). If text is defined, it can either be a single word or multiple words inclosed in single quotes. 1.2.1 Examples The following will preprocess the test.scr file into the test.ipf file. ipfcprep test.scr test.ipf The following will preprocess the test.scr file into the test.ipf file and define one symbol called HOST. ipfcprep test.scr test.ipf -D HOST The following will preprocess the test.scr file into the test.ipf file and define one symbol called HOST with the text Mainframe. ipfcprep test.scr test.ipf -D HOST=MainFrame The following will preprocess the test.scr file into the test.ipf file and define one symbol called HOST with the text IBM Mainframe. ipfcprep test.scr test.ipf -D HOST='IBM MainFrame' The following will preprocess the test.scr file into the test.ipf file, define one symbol called HOST with the text IBM Mainframe, and define a symbol called PC ipfcprep test.scr test.ipf -D HOST='IBM MainFrame' -D PC The following will preprocess the test.scr file into the test.ipf file, define one symbol called HOST with the text IBM Mainframe, define a symbol called PC and turn on those annoying warning messages. ipfcprep test.scr test.ipf -D HOST='IBM MainFrame' /D PC /W 2.0 Reference *************************************************************************** 2.1 Imbedding Files from Other Subdirectories To have the IPFC preprocessor pull in imbedded files from other subdirecto- ries, set up the INCLUDE environment variable with the path(s) to search. IPFCPREP will also resolve the bitmap name or linkfile name in an artwork tag using the INCLUDE environment variable. This can be turned off using the /N switch on the command line. 2.1.1 Example After the include environment variable is set as shown by the following command, the IPFCPREP will search the C:\HELPDIR1 & C:\HELPDIR2 subdirecto- ries after checking the current subdirectory for an imbed file. SET INCLUDE=C:\HELPDIR1;C:\HELPDIR2; For artwork tags, resolving will make a artwork tag that looks like :artwork name='IPFCPREP.BMP' linkfile='IPFCPREP.LNK'. into a tag that looks like :artwork name='C:\HELPDIR1\IPFCPREP.BMP' linkfile='C:\HELPDIR1\IPFCPREP.LNK'. *************************************************************************** 2.2 Defining Symbols To define symbols, use the same method as in BookMaster with .nameit tags. IPFCPREP does not allow the GMLTYPE or SIZE parameters however. If you want those, you must create a simple macro described later. To use the symbol in the file, put an ampersand (&) before the symbol and a period (.) after it. The period after the symbol is required. Symbols may be within symbols (nested symbols). The innermost symbol will be resolved first and then the resulting text will be used to search for the remaining symbol. Currently, the maximum symbol size after everything is resolved is about 250 character bytes. 2.2.1 Examples The following line will create a symbol called goofy and a symbol called MM with the text for the first being 'Goofy' and the second being 'Mickey Mouse'. .nameit symbol=goofy text='Goofy' .nameit symbol=MM text='Mickey Mouse' Now if those are used in the following sentences I went to Disney World and saw &goofy. and &MM.. The text will come out like I went to Disney World and saw Goofy and Mickey Mouse. The following demonstrates the use of nested symbols. .nameit symbol=mightm text='Mighty Mouse' .nameit symbol=mickm text='Mickey Mouse' Now if those are used in the following sentence I went to Disney World and saw &&mouse_name.m.. The text will come out like I went to Disney World and saw Mickey Mouse. when &mouse_name. is set to 'mick', or it will come out like I went to Disney World and saw Mighty Mouse. when &mouse_name. is set to 'might'. *************************************************************************** 2.3 Using C Language define files To use symbols in a C language header files, you must use the .imd tag to imbed the header file. Then all defines of the form #define symbol_name integer_value or #define symbol_name "string" or #define symbol_name2 symbol_name1 or #define symbol_name expression will be put into the symbol table. The integer version is mainly used in defining the resource id on a :h1. tag so that you can have one file define your panel resource IDs. The string version is used to define text symbols similar to .namemit tags. Wherever symbol_name is used the string (without the double quotes) will be substituted. This is useful in using the same string that is in a .MRI file in the text for a help panel to eliminate differences. The symbol set to another symbol is a method to assign the same value to two different symbol names. If the value after a symbol name matches any previ- ously defined symbol name (whether it be C #defines or .nameit tags) the value of the previously defined symbol will be used. The symbol set to an expression is commonly used in C header files to base all symbols off of one with an offset such as the following: #define START 1000 #define PANEL_1 (START + 1) #define PANEL_2 (START + 2) IPFCPREP will allow the +, -, *, and / operators. It will evaluate expressions from left to right without regard to operator precedence. If you want precedence, you can use parentheses. This will also search all subdirectories defined by the INCLUDE environment variable after searching the current directory for the specified file. An include file can include other include files defined by the #include com- piler directive. You can disable the including of system include files by using the /S command line option. This will not include any #include file that is enclosed in '< >'. Currently, the maximum symbol size after everything is resolved is about 120 character bytes. IPFCPREP now supports some compiler directives, namely, #ifdef and #ifndef. IPFCPREP will determine if the symbol referenced by these lines exists or not and process or not process the lines that follow. #else used with #ifdefs or #ifndefs is also allowed. IPFCPREP does not handle the #if or #elif lines currently due to IPFCPREP's lack of logical expression evaluation. #else used with #if or #elif is ignored also. 2.3.1 Example To include the 'test.h' C language define file in the document use the fol- lowing line in the script file .imd test.h Now if the C header file had the statement #define HELP_PANEL_1 100 And the script file contained the line :h1 res=&HELP_PANEL_1.. The preprocessor will resolve it to :h1 res=100. *************************************************************************** 2.4 Using Bookmaster 1.0 Vanilla conditional compiles The best reference for this is the BookMaster document, but I will put a short exerpt here. The conditional compiles use two main tags, the .CONFIG & .WHEN tags. .CONFIG tags start and end conditional compile sections and the .WHEN tags instruct the preprocessor to insert or delete lines based on a conditions. The .CONFIG tag looks like .CONFIG config_name ON | OFF The config_name is used to match the ON and OFF statements. Nested config statements are allowed. The .WHEN tag looks like .WHEN 'condition-expression' INSERT | DELETE The condition-expression is a symbol or group of symbols that are defined or not defined to determine if the expression is TRUE. This may take the form of 'symbol1 symbol2 ... symboln' which will AND the symbols together or 'symbol1 or symbol2 or ... or symboln' which will OR the symbols together. Symbols may also be negated such as 'not symbol1 or symbol2' When the condition is TRUE, the lines following the .WHEN line are either inserted or deleted depending on the INSERT or DELETE following the condi- tional expression. If the conditional-expression is FALSE, the opposite oper- ation is performed, i.e. lines will be deleted if INSERT is specified and lines will be inserted if DELETE is specified. 2.4.1 Example For example, the conditional compile .config section1 on .when 'PC' insert This is processed on a PC. .when 'HOST' insert This is processed on the big iron. .config section1 off will produce 'This is processed on a PC.' when IPFCPREP is invoked like ipfcprep in.scr out.ipf -D PC and will produce 'This is processed on the big iron.' when IPFCPREP is invoked like ipfcprep in.scr out.ipf -D HOST *************************************************************************** 2.5 Using Simple Macros Macros in the IPFCPREP is a simple way to substitute lines of text for a single tag. This does not do any math or fancy macro stuff, just simple text substitution. Macros start with a '.dm macro-name on' tag and end with a '.dm off' tag. All text between the those two lines is part of the macro. The macro is invoked by specifying a colon (:), the macro name, any parame- ters, and finally a period (.). The period at the end of the macro is required. 2.5.1 Example For example, the macro .dm testmac on This macro prints out &text. when invoked .dm off will produce This macro prints out garbage when invoked. when it is called like :testmac text=garbage. It will also produce This macro prints out tons of garbage when invoked. when it is called like :testmac text='tons of garbage'. Another example, the macro .dm user_resp on :hp1.&resp.:ehp1. .dm off will produce The user response is :hp1.Quit:ehp1.. when it is called like The user response is :user_resp resp=Quit.. *************************************************************************** 2.6 Using Simple Macros that can be used in BookMaster To make these macros work under BookMaster, you must structure the macro slightly different. You must o Add a '.gs attval parm_keyname_1 parm_keyname2 ...' line after the '.dm macro_name' line so that the values are assigned in BookMaster. o Add a '.aa tag_name start_macro_name end_macro_name' after the '.dm off' line so that you can reference the macros start_macro_name and end_macro_name by :tag_name. & :etag_name. o Make sure all substitution variables on the tag line are used in upper- case. 2.6.1 Example For example, the macro .dm testmac on .gs attval text This macro prints out &TEXT. when invoked .dm off .aa test testmac will produce This macro prints out garbage when invoked. when it is called like :test text=garbage. It will also produce This macro prints out tons of garbage when invoked. when it is called like :test text='tons of garbage'. Another example, the macro .dm strtlist on :ul. .dm off .dm endlist on :eul. .dm off .aa list strtlist endlist .dm listitem on :li. .dm off .aa item listitem will produce :ul. :li.Text :eul. when it is called like :list. :item.Text :elist. *************************************************************************** 2.7 Using Positional Parameters on Macros Positional parameters *, and *1 throught *n may be used in macros instead of keyword parameters. 2.7.1 Example For example, the macro .dm posmac on All parms are :*.. This is the first parm = &*1.. This is the second parm = &*2.. This is the third parm = &*3.. This is the fourth parm = &*4.. . off will produce All parms are Mickey Mouse loves Minnie. This is the first parm = Mickey. This is the second parm = Mouse. This is the third parm = loves. This is the fourth parm = Minnie. when it is called like :posmac Mickey Mouse loves Minnie. It will also produce All parms are Mickey Mouse loves nobody. This is the first parm = Mickey. This is the second parm = Mouse. This is the third parm = loves. This is the fourth parm = nobody. when it is called like :posmac Mickey Mouse loves nobody.