home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
smart21b.zip
/
SM_PROG2.INF
(
.txt
)
< prev
next >
Wrap
OS/2 Help File
|
1995-09-15
|
106KB
|
3,542 lines
ΓòÉΓòÉΓòÉ 1. The SMART Programming Guide ΓòÉΓòÉΓòÉ
The SMART Programming Guide
UDMD and MiCL
Version 2.1B
September 1995
(C) 1991, 1994, 1995 One Up Corporation
All Rights Reserved
Notice
Table of Contents
ΓòÉΓòÉΓòÉ 2. Notice ΓòÉΓòÉΓòÉ
** NOTICE **
This document may not, in whole or in part, be copied, reproduced, photocopied,
translated, or reproduced to any electronic medium or machine readable form
without prior written consent from One Up Corporation.
This publication could contain technical inaccuracies or typographical errors.
As changes are periodically made to the information herein; these changes may
be incorporated in new additions of the publication. One Up Corporation may
make improvements and/or changes in the product and/or the program described in
this publication at any time.
One Up Corporation is not responsible for any direct or indirect damage or loss
of business resulting from inaccuracies or omissions in this publication. The
specifications contained in this document are subject to change without notice.
SMART - Source Migration Analysis Reporting Toolset is a trademark of One Up
Corporation. OS/2, Presentation Manager are trademarks of the International
Business Machines Corporation. IBM is a registered trademark of the
International Business Machines Corporation. Other trademarks are property of
their respective companies.
CONTENTS
ΓòÉΓòÉΓòÉ 3. Table of Contents ΓòÉΓòÉΓòÉ
Section 1 - UDMD Programming
Introduction
Format Tags
.Notice
.Table
.Version
.Date
.Keyword
.SComment
.LComment
.Sample
.Prototyp
.Template
.Refer
.Command
.Notes
Programming Notes
Section 2 - MiCL Programming
Introduction
General Language Description
Variables and Constants
Strings and Quotations
SMART Built-in Functions
SmDisplayDlg( )
SmGetListName( )
SmGetListPath( )
SmGetSmartPath( )
SmIgnoreKeyword( )
SmListDlg( )
SmLoadVars( )
SmMigrateKeyword( )
SmNoComment( )
SmNoMigrate( )
SmOutputLine( )
SmOutputNote( )
SmPromptDlg( )
SmRemove( )
SmSaveVars( )
SmSendToEditor( )
MiCL Instructions
Event Command Procedures
Programming Notes and Tips
MiCL Basics
Preset Variables
Two MiCL Examples
Pre and Post Command Sets
Use of Templates
Use of Dialog Functions
Migration Control
Migration Notes and Comments
Global, Static and Local Variables
String and Variable Evaluation
Launching the Editor
Testing MiCL Command Sets
Reference
Reserved Words
Keyword Identifier Codes
Navigation Links
CONTINUE - Section 1
ΓòÉΓòÉΓòÉ 4. Section 1 - UDMD Programming ΓòÉΓòÉΓòÉ
User Defined Migration Database programming
Introduction
Format Tags
Programming Notes
Navigation Links
CONTINUE - Introduction
BACK - Table of Contents
ΓòÉΓòÉΓòÉ 4.1. UDMD - Introduction ΓòÉΓòÉΓòÉ
UDMD - Introduction
Introduction - Programming a User Defined Migration Data Base
Input for the creation of User Databases (UDMD) is an ASCII text file
containing format tags and data. One database at a time can be used in
conjunction with a SMART Migration Database for analysis and Migration of
program source code. The User Migration Dictionary (text File) is transformed
into SMART Migration database format and tables using the utility function
under "Tables", "Create User UDMD" under the main menu of SMART.
A sample of this input text file follows:
.Notice =Copyright (c) 1993 One Up Corporation, All Rights Reserved
.Table =OS/2 1.3 to OS/2 2.1
.Version =1.0
.Date =11-03-93
.Keyword =010 020 130 DosFindFirst2
.SComment=Parameters changed to ULONG and return structure changed
.LComment=Parameters changed to ULONG values. Note that the variable
=to receive the number of matching entries (addressed by the
=6th parameter) has been changed to a ULONG value.
=DosFindFirst now includes additional attribute flags. The
=previous reserved parameter (last parameter) has been
=eliminated. The returned structure for FIL_STANDARD is now
=FILEFINDBUF3 and for FIL_QUERYEASIZE it is FILEFINDBUF4.
.Notes =If all shorts are changed to longs, the last arg is Ok
.Sample =OS/2 1.3:
= HDIR hDir = HDIR_CREATE;
= USHORT usCount = 1;
= FILEFINDBUF2 FindBuf;
= if (!DosFindFirst2 ("C:\\*.*", &hDir, FILE_NORMAL,
= &FindBuf, sizeof(FindBuf), &usCount,
=: Note that the last arg is a USHORT
= FIL_QUERYEASIZE, 0))
= ...
=OS/2 2.1:
= HDIR hDir = HDIR_CREATE;
= ULONG ulCount = 1;
= FILEFINDBUF4 FindBuf;
= if (!DosFindFirst ("C:\\*.*", &hDir, FILE_NORMAL,
= &FindBuf, sizeof(FindBuf), &ulCount,
= FIL_QUERYEASIZE))
= ...
.Prototyp=APIRET APIENTRY DosFindFirst(PSZ pszFileSpec, PHDIR phdir,
= ULONG flAttribute, PVOID pfindbuf, ULONG cbBuf,
= PULONG pcFileNames, ULONG ulInfoLevel);
.Template=DosFindFirst ($P1,$P2,$P3,$P4,$P5,$P6,$P7)
.Command =/* Evaluate and output template */
=SmMigrateKeyword($T1)
.Refer =DosFindFirst
.Refer =FILEFINDBUF3
.Refer =FILEFINDBUF4
.Refer =$FILEFINDBUF
.Refer =$FILEFINDBUF2
You may note that the table code contains a format tag starting with a period
in column one. An equal sign appears in column 10 with the data for each
element beginning in column 11. If a colon is found in column 11 (first data
column) SMART will ignore the record. This can be used for internal comments.
The line will appear in SMART View displays.
Each input file must contain the table header data at the beginning of the
file. Line skips (carriage returns) can be used anywhere in the file to
improve readability and should most probably be utilized between keyword
definitions to separate keyword data.
Navigation Links
CONTINUE - Format Tags
BACK - Section 1 - UDMD Programming
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2. UDMD - Format Tags ΓòÉΓòÉΓòÉ
UDMD - Format tags
Format tags are used to identify the coding lines in a Migration table
dictionary.
The following tags are available for use in a UDMD.
.Notice
.Table
.Version
.Date
.Keyword
.SComment
.LComment
.Sample
.Prototyp
.Template
.Refer
.Command
.Notes
Navigation Links
CONTINUE - Notice Tag
BACK - UDMD - Introduction
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.1. Notice Tag ΓòÉΓòÉΓòÉ
.Notice Tag
.Notice - (Optional) (Max. 79 characters)
Notice is simply a comment line and is not processed by SMART.
Example:
.Notice =Copyright (c) 1993 One Up Corporation, All Rights Reserved
Navigation Links
CONTINUE - Table Tag
BACK - Format Tags
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.2. Table Tag ΓòÉΓòÉΓòÉ
.Table Tag
.Table - (Required - once at beginning of file) (Max 48 characters)
Table specifies the name of the migration table. This is used for display
only in the SMART Tables display panel.
Example:
.Table =OS/2 1.3 to OS/2 2.1
Navigation Links
CONTINUE - Version Tag
BACK - Notice Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.3. Version Tag ΓòÉΓòÉΓòÉ
.Version Tag
.Version - (Required - once at beginning of file) (Max 8 characters)
Version allows you to specify a version number for the table. This is used
for display only in the SMART Tables display panel.
Example:
.Version =1.0
Navigation Links
CONTINUE - Date Tag
BACK - Table Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.4. Date Tag ΓòÉΓòÉΓòÉ
.Date Tag
.Date - (Required - once at beginning of file) (Max 8 characters)
Date allows you to specify a creation or modification date for the table.
This is used for reference only and appears in the SMART Tables display panel.
Example:
.Date =12-31-99
Navigation Links
CONTINUE - Keyword Tag
BACK - Version Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.5. Keyword Tag ΓòÉΓòÉΓòÉ
.Keyword Tag
.Keyword - (Required at the beginning of a keyword definition data set)
The Keyword is a composite data statement consisting of four parameters:
Type Code - 3 characters, column 11-13
Category Code - 3 characters, column 15-17
Functional Area Code - 3 characters, column 19-21
Keyword Name - Column 23 (Max 48 Characters)
The Type Code, Category Code and Functional Area Code must match the valid
codes specified in the companion primary SMART Migration Database.
All table records up to the next Keyword data tag will be assigned to the
keyword defined in this statement.
Example:
.Keyword =010 020 130 DosFindFirst2
Navigation Links
CONTINUE - SComment Tag
BACK - Date Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.6. SComment Tag ΓòÉΓòÉΓòÉ
.SComment Tag
.SComment - (Required for each keyword - one line only) (Max 120 characters)
The Short Comment is a one line comment regarding the migration of the
keyword.
Example:
.SComment=Parameters changed to ULONG and return structure changed
Navigation Links
CONTINUE - LComment Tag
BACK - Keyword Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.7. LComment Tag ΓòÉΓòÉΓòÉ
.LComment Tag
.LComment - (Required for each keyword ) (Max 120 characters each line)
The Long Comment is a single or multi-line comment regarding the migration of
the keyword. Note that continued lines do not repeat the tag, but simply
require an equal ("=") sign in column 10. The lines should be formatted
exactly as you would like to see them appear in the migrated code.
Example:
.LComment=Parameters changed to ULONG values. Note that the variable
=to receive the number of matching entries (addressed by the
=6th parameter) has been changed to a ULONG value.
=DosFindFirst now includes additional attribute flags. The
=previous reserved parameter (last parameter) has been
=eliminated. The returned structure for FIL_STANDARD is now
=FILEFINDBUF3 and for FIL_QUERYEASIZE it is FILEFINDBUF4.
Navigation Links
CONTINUE - Sample Tag
BACK - SComment Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.8. Sample Tag ΓòÉΓòÉΓòÉ
.Sample Tag
.Sample - (Optional for each keyword ) (Max 120 characters each line)
The Sample is a single or multi-line set of example code regarding the
migration of the keyword. Note that continued lines do not repeat the tag, but
simply require an equal ("=") sign in column 10. The lines should be formatted
exactly as you would like to see them appear in the migrated code. Typically
you will want to show an example of the code as it would appear in the source
platform code, followed by an example of its use in the target platform.
Example:
.Sample =OS/2 1.3:
= HDIR hDir = HDIR_CREATE;
= USHORT usCount = 1;
= FILEFINDBUF2 FindBuf;
= if (!DosFindFirst2 ("C:\\*.*", &hDir, FILE_NORMAL,
= &FindBuf, sizeof(FindBuf), &usCount,
= FIL_QUERYEASIZE, 0))
= ...
=OS/2 2.1:
= HDIR hDir = HDIR_CREATE;
= ULONG ulCount = 1;
= FILEFINDBUF4 FindBuf;
= if (!DosFindFirst ("C:\\*.*", &hDir, FILE_NORMAL,
= &FindBuf, sizeof(FindBuf), &ulCount,
= FIL_QUERYEASIZE))
= ...
Navigation Links
CONTINUE - Prototype Tag
BACK - LComment Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.9. Prototype Tag ΓòÉΓòÉΓòÉ
.Prototype Tag
.Prototyp - (Optional for each keyword ) (Max 120 characters each line)
The Prototype is a single or multi-line set of code specifying the formal
function prototype for the migrated keyword. Note that continued lines do not
repeat the tag, but simply require an equal ("=") sign in column 10. The lines
should be formatted exactly as you would like to see them appear in the
migrated code.
Example:
.Prototyp=APIRET APIENTRY DosFindFirst(PSZ pszFileSpec, PHDIR phdir,
= ULONG flAttribute, PVOID pfindbuf, ULONG cbBuf,
= PULONG pcFileNames, ULONG ulInfoLevel);
Navigation Links
CONTINUE - Template Tag
BACK - Sample Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.10. Template Tag ΓòÉΓòÉΓòÉ
.Template Tag
.Template - (Required for Category 010) (Max 120 characters each line)
The Template is the code generating specification for the SMART Migration.
In the case of Category 010 Keywords, the Template is the literal replacement
string for the migrated keyword. For Category 000, no template is required.
In the other categories, templates may be used to assist the SMART user in
formatting their own migration.
When SMART Migration Command Language (MiCL) is used to create a migration
command set the template may be the basis for generating the migration code.
Note that continued lines do not repeat the tag, but simply require an equal
("=") sign in column 10.
Example:
.Template=DosFindFirst ($P1,$P2,$P3,$P4,$P5,$P6,$P7)
Navigation Links
CONTINUE - Reference Tag
BACK - Prototype Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.11. Reference Tag ΓòÉΓòÉΓòÉ
.Reference Tag
.Refer - (Optional) (Max 120 characters each line)
Reference keywords provide hypertext links to items related to the current
keyword. The reference items are only used in the SMART Viewer to provide
quick access to additional information on related keywords. Only one reference
item can be displayed on each .Refer tag line.
Any reference with a dollar character ("$") immediately preceding the
reference keyword (column 11) indicates that the reference is to an item found
elsewhere in the migration table as a keyword. Without the dollar character,
SMART View will launch the IBM system View utility to display system help on
the keyword topic.
Example:
.Refer =DosAllocMem
.Refer =DosAllocSharedMem
.Refer =$GlobalAlloc
.Refer =$GlobalLock
Navigation Links
CONTINUE - Command Tag
BACK - Template Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.12. Command Tag ΓòÉΓòÉΓòÉ
.Command Tag
.Command - (Optional) (Max 120 characters each line)
The Command is a set of SMART Migration Commands described elsewhere in this
document. See Section 2 - MiCL Programming Any Category of Keywords can have
command statements, but they are typically used for Category 020 and 030
Keywords in the manipulation of templates for migration code generation.
In the absence of Command statements the default migration will prevail.
This is: Comments only for Category 000; Literal replacement of the keyword by
the template for Category 010; and insertion of comments, templates and other
data elements in the other categories as specified by the Category Format
Options selected by the user.
The Command statements control the migration generated for the Keyword,
however and Short or Long Comments, Prototypes, and Sample code will
automatically be inserted in the migrated code unless omitted by a
"SmNoComment" command in this data set. Note that continued lines do not repeat
the tag, but simply require an equal ("=") sign in column 10.
Example:
.Command =/* Evaluate and output template */
=SmMigrateKeyword($T1)
Navigation Links
CONTINUE - Notes Tag
BACK - Reference Tag
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.13. Notes Tag ΓòÉΓòÉΓòÉ
.Notes Tag
.Notes - (Optional) (Max 120 characters each line)
Notes are used to insert a set of coding lines in the Migration table for
explanation or clarification to the UDMD developer and is not used SMART
processing.
Notes will not be displayed in SMART Viewer.
You may also us a colon (":") in any coding line except for the table heading
data ( .Table, .Version, .Date, and .Notice) to indicate a comment to the
developer. SMART will not process the comment, however the comment will
display in SMART Viewer.
Continued lines do not repeat the tag, but simply require an equal ("=") sign
in column 10.
Example:
.Notes =This migration assumes that all shorts have been changed to longs.
=If not, care must be taken to properly type cast the argument variables.
Navigation Links
CONTINUE - UDMD Programming Notes
BACK - Command Tags
FORMAT TAGS
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 4.2.14. UDMD Programming Notes ΓòÉΓòÉΓòÉ
.UDMD Programming Notes
The use of the User Defined Migration Database is effective in overriding the
SMART Migration Database for specific keywords to customize the migration and
analysis to meet the specific requirements of your code.
For example, you may wish to port all USHORT, SHORT and int variable types to
ULONG and LONG. You may also replace the use of NULL with simply 0. If you are
using Common Functions, you may also wish to change all occurrences of those
function calls that are replaced by the Common Functions that you have created.
All of these custom changes can be performed by a few simple lines of code in
a User Defined Migration Database.
Since the System provided SMART Migration Databases were constructed to
handle the general cases, you may increase the effective automatic migration of
your source code and greatly reduce your migration effort by the creative use
of your own UDMD.
Navigation Links
CONTINUE - Section 2 - MiCL Programming
BACK - Notes Tag
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5. Section 2 - MiCL Programming ΓòÉΓòÉΓòÉ
Migration Command Language Programming
Introduction
General Language Description
Variables and Constants
Strings and Quotations
SMART Built-in Functions
MiCL Instructions
Event Command Procedures
Programming Notes and Tips
Navigation Links
CONTINUE - MiCL Introduction
BACK - UDMD Programming Notes
SECTION 1 - UDMD Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.1. MiCL Introduction ΓòÉΓòÉΓòÉ
MiCL Programming Introduction
SMART Version 1.0 was limited to migration changes that are straight forward
and require only literal string changes. All of the remaining changes that are
required to be made are flagged in the source code with migration comments and
left to the developer to complete. This provides a great deal of help in the
migration effort but is limited in this rather closed solution.
The SMART Migration Command Processor Language defined in this document, when
implemented within SMART, will create a flexible, open and VERY powerful
migration environment.
Essentially the SMART migration process can be programmed with this language.
The migration of each keyword can be programmed with context sensitive logical
statements; generating migration source code specific to the requirements of
each individual keyword encounter.
Furthermore, SMART takes on expert characteristics. With appropriate
programming of the keyword commands, recurring data can be stored and reused
upon subsequent encounters of the same migration instance. The command set has
the capability of prompting the user for required parameters and storing the
parameter for continuing use in the migration of individual keywords. The data
obtained during a migration run can be saved in simple ASCII text format and
modified for reuse in following runs.
In addition to command sets processed for assigned keywords, command sets can
be programmed to execute at specific migration events, such as: pre and post
migration run, pre and post file, at the encounter of a function definition,
and so on.
The interactive features of this command language allow the migration
developer to customize the migration process, pausing at times during the
process, displaying specific lines of source code and allowing the user to
respond to questions from the migration command processor.
The SMART user can create their own migration database, or override the SMART
migration database for any desired keyword. The user can add and modify
migration commands, customizing the migration process to take advantage of
their specific migration requirements.
This migration language is intentionally designed to conform closely to the
Rexx Macro Language syntax. However, the implementation contains only a very
small subset of the Rexx capabilities and has NO interface to the Rexx Command
Processor.
You may also take care to note the differences between the Rexx programming
language syntax and that of SMART MiCL.
This document describes the capabilities and syntax of the SMART Migration
Command Language.
The following topics are covered:
General Language Description
Variables and Constants
Strings and quotations
SMART Built-In Functions
Instructions
Other Language & Command Processor Characteristics
- Pre and Post Command Procedures
Programming Notes, Tips & Sample Code
Navigation Links
CONTINUE - General Language Description
BACK - Section 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.2. General Language Description ΓòÉΓòÉΓòÉ
General Language Description
The SMART Migration Command Language is Rexx-like in syntax.
All data is stored as character strings, eliminating the requirement for
data declarations.
Each command set is processed after a SMART Migration event - typically
after the detection of a keyword in the source code stream. As such,
predefined variables contain many of the parameters, arguments, and conditions
encountered in the detection of the migration keyword.
The instructions are limited to the following set:
1. Assignment
MyVariable = "HWND"
2. Execution of a SMART built-in functions
rtn = SmPrompt ( "Enter variable for HAB:", "hab", BUTTON, ENTRY, OK |
CANCEL )
3. Comparison instructions
IF $LCNT > "2" THEN EXIT
Included in this instruction set are IF, THEN, ELSE, DO-END, along with
comparison operator =, <, >, and NOT.
Any number of comments can be embedded in the SMART command set
and must be contained within the delimiters /* and */.
MiCL Language statements cannot be continued on multiple lines
except for built-in function arguments (bounded by parentheses) and
the code between the "IF-THEN" comparison instruction. Built-in
Function arguments cannot, however, span multiple lines if the
function is the object of an IF-THEN comparison.
Navigation Links
CONTINUE - Variables and Constants
BACK - MiCL Introduction
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.3. Variables and Constants ΓòÉΓòÉΓòÉ
Variables and Constants
Predefined Variables
The SMART Migration Language Command Processor predefines a number of
variables available to the user for each keyword command set. All predefined
variables start with a dollar sign ($).
The following list describes these variables:
$KEY Contains the keyword string.
$KCAT Contains the three character key for the keyword Category,
i.e. 020.
$KTYPE Contains the three character key for the keyword Type.
$KAREA Contains the three character key for the keyword
Functional Area.
$KIND Contains the condition of the keyword's autonomy - TRUE
(1) is a stand-alone keyword statement, 0 or FALSE is an
embedded keyword.
$KRTN If the current keyword is preceeded by an equal sign, the
variable preceding the equal sign is stored with this
identifier.
$P1 - $P99 Contains the argument string of an API keyword.
$PCNT Contains a value for the number of arguments for an API
Keyword.
$TCNT Contains a value for the number of Templates provided for
this keyword.
$T1 - $T99 Contains the template strings for a specific keyword.
$LFILE Contains the fully qualified filename of the current
keyword encounter.
$LLINE Contains the line number of the current keyword encounter.
$LCOL Contains the current column starting position of the
current keyword encounter.
.$LCNT Contains the number of source code lines in the current
parsed code block.
$Gxxxxxxxx Contains global data assigned by the user and available by
any keyword in any occurrence. The "xxxxxxxx" is a user
defined 8 character identifier.
$Sxxxxxxxx Contains keyword, static, local data assigned by the user
and available for every occurrence of the same keyword
occurrence in the current processing run. The "xxxxxxxx"
is a user defined 8 character identifier.
User defined variables
When you choose a name for a variable, the first character must be one of:
A B C...Z ! ? _ or $ (if the variable is Static or Global)
Lowercase letters are also allowed as a first letter and are converted to
uppercase. The rest of the characters can be any of the preceding characters
( except for $) and also 0 through 9.
All text not in quotations is converted to uppercase prior to processing.
All variables are initialized as null character strings. (This deviates
from the REXX standard).
Single character variables can not be used.
Do not define variables beginning with $K, $L, $P, $T - as these variables
are designated for system use only.
User defined, keyword local variables beginning with "?" can be evaluated in
template evaluation. Variables beginning with $G and $S are designated for
use as Process Global and Keyword Static variables.
Constants
Numeric constants cannot be used in this version of MiCL. Where needed use
the literal equivalent of the number string.
As an example:
IF $LCNT > "1" THEN EXIT
Related Topics
Preset Variables
Global, Static and Local Variables
String and Variable Evaluation
Navigation Links
CONTINUE - Strings and Quotations
BACK - Language Description
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.4. Strings and Quotations ΓòÉΓòÉΓòÉ
Strings and Quotations
A string is any group of characters inside single or double quotation marks.
Either type of quotation marks can be used, but the beginning and the ending
mark must match. The command processor stops processing the quotation when a
quotation mark and the characters that follow remain as they were typed, with
uppercase and lowercase letters.
The command processor resumes interpreting when it sees a matching quotation
mark. For example:
'CreateWindow'
"CreateWindow"
are both strings in quotation.
To use an apostrophe (single quotation mark) or double quotation marks within
a string, use the other quotation mark around the whole string. For example:
'The keyword is "CreateWindow"'
or
"The keyword is 'CreateWindow'"
You also can use a pair of quotation marks (the same as those used to mark
the string). However, the double quotation marks may not be the first marks of
a quotation. If an open quotation mark is immediately followed by another
quotation mark of the same type it will be interpreted as a null string in
quotation. An example of properly used nest quotation follows:
"Error Condition. ""Can't find template."""
This is interpreted by the command processor as:
Error Condition. "Can't find template."
A nested quotation can be expressed as follows:
"'This string is in quotation.'"
The preceding example is evaluated as follows:
'This string is in quotation.'
A literal string can be formatted by using a series of literal constants
and/or variables in an assignment instruction:
ASTRING = "The first parameter is: " $P1
In this example, if the first parameter was "hWindow" the value of MYSTRING
will be:
The first parameter is: hWindow
Each segment of the assignment is concatenated to the next. Be careful to
insert spaces in quotation where spacing may be required.
Note that the variable $P1 was placed outside the quotation marks. If the
variable had been placed within the quotation marks the variable would have
been assumed to be part of the literal string and not evaluated for the
expression. Variables are not evaluated when they are placed in quotation.
The template is a special string. It should not be specified with bounding
quotation marks when entered into the migration dictionary with the ".Templete"
tag. When evaluated by the SmMigrateKeyword, SmSendToEditor, or SmOutputLine
function, the only variables that are replaced by the value of the variables
are SMART predefined variables, global and keyword static variables or user
defined local variables beginning with "?" (question mark).
Variables placed within quotation marks are not evaluated. During this
evaluation, all spacing is maintained in the evaluated expression (blanks are
retained). This differs from expression evaluation with the assignment
operator (=).
In expression evaluation for assignment, all variables not in quotation, are
replaced by their stored values and all items evaluated are concatenated in the
output string. Spaces not in quotation or part of an evaluated variable are
ignored.
Related Topics
Use of Templates
String and Variable Evaluation
Navigation Links
CONTINUE - Built-In Functions
BACK - Variables and Constants
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5. SMART Built-in Functions ΓòÉΓòÉΓòÉ
SMART Built-in Functions
There are a number of SMART functions that are callable from within the SMART
Migration Command Language. The functions are "C" Language-like in syntax with
the function name followed by the function argument, enclosed in parenthesis
and separated by commas.
The success value of the function call will be the returned and can be
assigned to a user defined variable when the function is called. These
functions include the following:
SmDisplayDlg( )
SmGetListName( )
SmGetListPath( )
SmGetSmartPath( )
SmIgnoreKeyword( )
SmListDlg( )
SmLoadVars( )
SmMigrateKeyword( )
SmNoComment( )
SmNoMigrate( )
SmOutputLine( )
SmOutputNote( )
SmPromptDlg( )
SmRemove( )
SmSaveVars( )
SmSendToEditor( )
Navigation Links
CONTINUE - SmDisplayDlg( )
BACK - Strings and Quotations
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.1. SmDisplayDlg( ) ΓòÉΓòÉΓòÉ
.SmDisplayDlg( )
SmDisplayDlg ( Display_String, Option_Return, Control_Options )
SmDisplayDlg creates a popup dialog to display a message string. Processing
will be halted and the dialog will remain displayed until the user presses one
of the control option buttons.
Up to four programmable push-buttons can be defined in this call.
Accelerators can be assigned to the push-buttons by using the tilde (~)
character preceding the push-button display character of the desired
accelerator key. The value of the returned option selected by the user will
not contain this tilde character.
Description for the arguments of this function follows:
Display_String The user supplied literal string to display (up
to 80 characters). This argument can also be a
variable whose value contains the string to
display.
Option_Return A variable to contain the literal value of the
button selected by the user to terminate the
display (see Control_Options).
Control_Options Up to four strings representing the
identification of the push-buttons to appear on
the display. The buttons will appear in the
order as they appear in this argument. Each
button ID must be separated by the "|"
character. Upper and lower case, along with the
aforementioned tilde can be used. By default
the first button responds to the "Enter" key,
and the second button responds to the "ESCape"
key.
result A success value for the function. 1= Ok.
0=Error.
Example:
RTN = SmDisplayDlg("Verify Processing this Keyword",
OPTION, ~Ok | ~Cancel | ~Abort )
IF OPTION = "ABORT" THEN TERMINATE
Notes:
The position of the Display Dialog on the user desktop is saved at the
termination of the dialog. The user can move the dialog panel to a convenient
position. Subsequent dialog displays from this function call will appear in
the same position.
This dialog can be used to suspend processing while displaying the source
code at the current keyword encounter from the use of the SmSendToEditor
command function.
Related Topics
Use of Dialog Functions
Launching the Editor
Navigation Links
CONTINUE - SmGetListName
BACK - Built-In Functions
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.2. SmGetListName( ) ΓòÉΓòÉΓòÉ
.SmGetListName( )
SmGetListName ( Return_Variable )
SmGetListName returns the fully qualified filename of the current
List-of-Files used in the migration process.
Description for the arguments of this function follows:
Return_Variable A variable to contain the filename of the
List-of-Files.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmGetListName( LISTNAME )
IF LISTNAME = "C:\MYAPP\LIST.LST"
THEN
SmLoadVars( "C:\MYAPP\VARS1.DAT" )
ELSE
SmLoadVars( "C:\MYAPP\VARS2.DAT" )
Navigation Links
CONTINUE - SmGetListPath
BACK - SmDisplayDlg
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.3. SmGetListPath( ) ΓòÉΓòÉΓòÉ
.SmGetListPath( )
SmGetListPath ( Return_Variable )
SmGetListPath returns the directory path of the current List-of-Files used in
the migration process.
Description for the arguments of this function follows:
Return_Variable A variable to contain the path of the
List-of-Files.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmGetListPath( LISTPATH )
VARNAME = LISTPATH "\VARS.DAT"
SmLoadVars( VARNAME )
Navigation Links
CONTINUE - SmGetSmartPath
BACK - SmGetListName
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.4. SmGetSmartPath( ) ΓòÉΓòÉΓòÉ
.SmGetSmartPath( )
SmGetSmartPath ( Return_Variable )
SmGetSmartPath returns the directory path of the SMART application
executable.
Description for the arguments of this function follows:
Return_Variable A variable to contain the path of the SMART
executable.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmGetSmartPath( SMARTPATH )
VARNAME = SMARTPATH "\DATA\VARS.DAT"
SmLoadVars( VARNAME )
Navigation Links
CONTINUE - SmIgnoreKeyword
BACK - SmGetListPath
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.5. SmIgnoreKeyword( ) ΓòÉΓòÉΓòÉ
.SmIgnoreKeyword( )
SmIgnoreKeyword ( )
SmIgnoreKeyword excludes processing of the current keyword. This is
equivalent to entering the keyword in an exclude list for processing. However,
since this command appears in the MiCL Language, it can be dynamically and
interactively applied.
No comments for this keyword will appear in the migrated output file.
See also: SmNoMigrate and DEFAULT.
Description for the arguments of this function follows:
result A success value for the function. 1= Ok.
0=Error.
Example:
IF $SIgnore = "" THEN
DO
STRING = "Verify Ignore Keyword on all: " $KEY
SmDisplay( STRING, $SIgnore, ~Yes | ~NO | ~Abort)
END
IF $SIgnore = "Abort" THEN TERMINATE
IF $SIgnore = "Yes" THEN
SmIgnoreKeyword( )
...
Notes:
Note in the example a static variable was defined to contain the user
response to the question of ignoring the current keyword. Upon subsequent
encounters this variable will contain "Yes" or "No" and the display is not
required.
If this static variable is saved at the end of the process and reloaded at
the beginning of other process runs, then this variable will always respond to
the initial user query.
By using SmSendToEditor followed by SmDisplayDlg you can allow the user to
view each encounter of the keyword and enter the appropriate response for
ignoring the keyword or not ignoring the keyword for migration.
Related Topics
Migration Control
SmNoMigrate
Navigation Links
CONTINUE - SmListDlg
BACK - SmGetSmartPath
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.6. SmListDlg( ) ΓòÉΓòÉΓòÉ
.SmListDlg( )
SmListDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Filename)
SmListDlg creates a popup dialog to provide a list of options to select or
maintain. This is ideal for interactive processing where a user can select
from a list of templates or processing options. The user will also have the
opportunity to add new items to the list.
The list of items is stored and retrieved as a text file with the designated
filename in the argument of this function call.
The response buttons on this dialog are fixed, but both the button name and
the selected string will be returned to the variables as specified by the
arguments of this call.
Processing will be halted and the dialog will remain displayed until the user
presses one of the control option buttons.
Description for the arguments of this function follows:
Display_String The literal string to display (up to 80
characters) above the list box. This argument
can also be a variable that contains the string
to display.
Edit_String The default edit string that will be displayed
and highlighted above the list box.
Option_Return A variable to contain the literal value of the
button selected by the user to terminate the
display. "Process", "Cancel", "Store" or
"Terminate" is valid.
String_Return_Variable A Variable to contain the list box selection if
the user terminates with "Process".
Filename The filename to contain the text items to
display in the listbox. If the user terminates
the dialog with "Process" or "Store", the items
contained in the current list box, including any
changes will be stored in the designated
filename.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmSendToEditor( "$LFile($LLine:$LCol)R" )
SmListDlg("Select the choice for HANDLE replacement",
$Shandle, OPTION, $Shandle, "HANDLE.DAT" )
IF OPTION = "Terminate" THEN TERMINATE
IF OPTION = "Cancel" THEN EXIT
IF OPTION = "Store" THEN EXIT
SmMigrateKeyword( $Shandle )
Notes:
The position of the List Dialog on the user desktop is saved at the
termination of the dialog. The user can move the dialog panel to a convenient
position. Subsequent displays of this dialog will appear in the same
position.
This dialog can be used to suspend processing while displaying the source
code at the current keyword encounter from the use of the SmSendToEditor
command function.
If the filename containing the list to display does not exist, the user will
be advised and can proceed by creating a new file with their own entries, or
canceling this step.
The advantage of this dialog is that the user can easily select an existing
item in the list, or modify the list. The list will be saved (upon
appropriate termination of the dialog) and the stored items will appear in
subsequent encounters of the keyword.
Note the use of the static variable $Shandle in the example above. By using
this variable as both the Edit_String and the String_Return_Variable
arguments, the selected string returned by the user will appear as the default
option in the next encounter.
Also note the use of SmSendToEditor.
In this example the source code at the point of encounter was displayed to
allow the user to see the keyword in context before making a listbox
selection.
The filename specified in this function call does not require a fully
qualified path if the file is located in the same directory as the
List-of-Files file for the migration process. The path for the List-of-Files
or the main SMART directory path can be obtained by appropriate built-in
function calls.
Related Topics
Use of Dialog Functions
Launching the Editor
Navigation Links
CONTINUE - SmLoadVars
BACK - SmIngoreKeyword
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.7. SmLoadVars( ) ΓòÉΓòÉΓòÉ
.SmLoadVars( )
SmLoadVars ( Filename )
SmLoadVariables reads the ASCII text file specified by filename to assign
values to global and keyword static variables. The file can be created using a
text editor or can be the stored result of the SmSaveVars function call.
Description for the arguments of this function follows:
Filename The filename of the output file. If the
filename is not fully qualified, the default
directory is the directory containing the
currently selected List-Of-files.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmLoadVars ( "VARS1.DAT" )
Notes:
Each line of the file containing the stored variables and their values must
contain an assignment statement of the form:
$Gvariable = value (for Process Global variables)
or
Keyword.$Svariable=value (for Keyword Static variables)
For example:
$Ghab=hab
WinCreateMessage.$Shandle=hwnd
Note in the case of keyword static variables, the variable is keyword
identified by preceding the variable name with the keyword followed by a
period (.). The keyword in this case is case sensitive an should appear
exactly as it is coded in the migration database.
This call is best utilized by including this function in a preprocess
command set ($$PRE_PROCESS) with the companion call, SmSaveVars, performed as
a part of the $$POST_PROCESS command set. This effectively restores and saves
all global and keyword static variable values.
Related Topics
Pre and Post Command Sets
Navigation Links
CONTINUE - SmMigrateKeyword
BACK - SmListDlg
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.8. SmMigrateKeyword( ) ΓòÉΓòÉΓòÉ
.SmMigrateKeyword( )
SmMigrateKeyword ( Template )
The SmMigrateKeyword command replaces the current keyword with the argument
of this command. If the keyword is an API keyword, then this output will
replace both the keyword and all arguments of the API call including the
opening and closing parentheses. Typically this argument will be a template for
the keyword. However it can be a literal string formatted in this command set.
The argument can consist of a single variable or literal string.
This command MUST appear in each command set unless the keyword is to remain,
blank, or the SmRemove command is used to remove source code related to the
keyword. Failure to do so will result in a NULL output in the migrated source
code.
Description for the arguments of this function follows:
Template A variable containing a keyword template, or a
variable containing a string to be processed as
a template, or a literal to be used as a
template.
result A success value for the function. 1= Ok.
0=Error.
Example:
NEWTEMPLATE = "WinQueryWindow( $P1, QW_PARENT)"
SmMigrateKeyword( NEWTEMPLATE )
Notes:
Note that the argument of the SmMigrateKeyword is evaluated as a template.
Only $variables and ?variables are replaced with their values and all spacing
will remain intact.
Only ONE call to SmMigrateKeyword should be made while processing a keyword
encounter. If multiple calls are made, only the last call will create the
migration code.
DO NOT include a semicolon at the end of an API template to be used in this
function. The keyword may be an embedded argument of a higher API call and
not require a semicolon. Note that in the case of an API keyword, both the
keyword string and ALL arguments including the bounding parentheses are
replaced by the argument of this function call.
If multiple lines are to be output in the migration you must use this
function call, or SmRemove, along with the SmOutputLine function.
Related Topics
Preset Variables
Use of Templates
Migration Control
Migration Notes and Comments
String and Variable Evaluation
Navigation Links
CONTINUE - SmNoComment
BACK - SmLoadVars
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.9. SmNoComment( ) ΓòÉΓòÉΓòÉ
.SmNoComment( )
SmNoComment ( param1 | [ param2 | ... ] )
SmNoComment turns off the designated migration comments for this encounter of
the current keyword only.
Description for the arguments of this function follows:
param The following parameters are valid for this
call: LCOMMENT, SCOMMENT, SAMPLE, PROTOTYPE,
TEMPLATE ALL (All comments). When specifying
multiple parameters use the "|" character to
separate each parameter.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmNoComment( LCOMMENT | SAMPLE | PROTOTYPE | TEMPLATE )
Notes:
Please note the interaction and capabilities of the SmIgnoreKeyword,
SmNoMigrate, and SmNoComment commands.
SmIgnoreKeyword acts if the keyword did not exist in the migration table -
no processing is performed on this keyword.
SmNoMigrate causes no change in the migrated output code, but retains any
comments that you may wish to insert in the output code. These comments can
be modified by using the SmNoComment command turning off any or all migration
comments, and by using the SmOutputNote to insert custom comments in the
output code.
Related Topics
Migration Notes and Comments
Navigation Links
CONTINUE - SmNoMigrate
BACK - SmMigrateKeyword
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.10. SmNoMigrate( ) ΓòÉΓòÉΓòÉ
.SmNoMigrate( )
SmNoMigrate ( )
SmNoMigrate suspends any migration processing for the current keyword
instance. The output will look just like the input. However, all comments
scheduled to be inserted in the output source code will be processed. (In the
SmIgnoreKeyword call, the keyword processing is completely ignored).
In combination with SmNoComment(ALL) the migration for this keyword will be
ignored. You may use SmNoMigrate with SmNoComment and SmOutputNote to insert a
processing note at the point of this keyword encounter.
Description for the arguments of this function follows:
arguments None.
result A success value for the function. 1= Ok.
0=Error.
Example 1:
SmNoMigrate( )
SmNoComment( ALL )
NOTE = "Keyword: " $KEY must be reworked for complete migration."
SmOutputNote( NOTE )
Example 2:
OPTION = ""
SmNoComment(ALL)
IF $Scontrol NOT = "No Verify" THEN
SmSendToEditor( "$LFile($LLine:$LCol)R" )
IF $Sreplaced = "" THEN
DO
PROMPT = "Enter replacement string for: " $KEY
SmPromptDlg(PROMPT, "", OPTION, $Sreplaced, ~Ok | ~Abort )
END
IF OPTION = "Abort" THEN TERMINATE
IF $Sverify = "No Verify" THEN
DO
DISPLAY = "Verify replacement of: " $KEY " by " $Sreplaced
SmDisplayDlg(DISPLAY, $Scontrol,
~Yes | ~NO | No ~Verify | ~Abort)
END
IF $Scontrol = "Abort" THEN TERMINATE
IF $Scontrol = "No" THEN
DO
SmNoMigrate( )
EXIT
END
ELSE
SmMigrateKeyword( $Sreplaced )
Notes:
Example 2 is a search and replace with initial replacement prompt and a
verify for each encounter. If "No Verify" is selected, the process will
automatically perform the replacement without any notification.
Related Topics
Migration Control
Navigation Links
CONTINUE - SmOutputLine
BACK - SmNoComment
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.11. SmOutputLine( ) ΓòÉΓòÉΓòÉ
.SmOutputLine ( )
SmOutputLine ( Template )
The SmOutputLine command is similar to SmMigrateKeyword , except that this
command is used to generate additional output lines (following the migration).
This command is useful to generate multiple lines of migration code in Category
030 migration encounters, or where program code or comments are to be required
to be placed in the output.
This function is different from SmOutputNote . The generated code will not
be in comments and will appear in the output stream immediately following the
code block containing the encountered keyword. The argument for this function
can be a variable or a literal string.
The value of the argument will be evaluated (if not a literal string) by
replacing all variables beginning with "$" (dollar sign) or "?" (question
mark). Any variable referenced but not defined will be replaced by a null
character.
Description for the arguments of this function follows:
Template A variable containing a keyword template, or a
variable containing a string to be processed as
a template, or a literal to be used as a
template.
result A success value for the function. 1= Ok.
0=Error.
Example 1:
SmNoMigrate( )
SmNoComment( ALL )
NOTE = "Keyword: " $KEY must be reworked for complete migration."
SmOutputNote( NOTE )
Example 2:
IF $KIND = "TRUE" THEN
DO
SmMigrateKeyword( $T1 )
SmOutputLine( $T2 )
END
ELSE
...
Notes:
If the migrating keyword is embedded in the arguments of a higher level
function call a comment will be generated in the output code and the
additional output line will be supressed.
If the keyword is within an 'if', 'while', or 'for' statement as a single
API function call, braces will be added, if required, to insure that all of
the generated lines are properly placed within the scope of the statement.
Note that the Keyword Independent Flag "$KIND" contains a literal value of
"TRUE" or "FALSE".
When creating the template or literal string for each of the generated
additional lines of code, remember that a keyword is not being replaced by the
code line, but instead the line is placed in full in the output stream. As
such, a semicolon at the end of the line may be necessary to terminate a
statement.
Related Topics
Use of Templates
Migration Control
Migration Notes and Comments
String and Variable Evaluation
Navigation Links
CONTINUE - SmOutputNote
BACK - SmNoMigrate
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.12. SmOutputNote( ) ΓòÉΓòÉΓòÉ
.SmOutputNote ( )
SmOutputNote ( Line )
SmOutputNote places a string in the output migration comments. This comment
is tagged as "SM$:I". This argument should be limited to a maximum of 80
characters for each note line created.
Description for the arguments of this function follows:
Line Variable containing an note line or a literal
string.
result A success value for the function. 1= Ok.
0=Error.
Example:
NOTE = "Keyword is embedded and cannot be properly migrated: " $KEY
SmOutputNote ( NOTE )
...
Notes:
Any notes generated in the output code will be appropriately placed in
comments along with the other migration comments.
Suppression of migration comments with the SmNoComment command will not
affect the generation of notes created with this built-in function call.
It is helpful to identify the keyword that is the object of the note to
insure that the user clearly understands which keyword the generated comment
is associated.
Related Topics
Migration Notes and Comments
Navigation Links
CONTINUE - SmPromptDlg
BACK - SmOutputLine
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.13. SmPromptDlg( ) ΓòÉΓòÉΓòÉ
.SmPromptDlg ( )
SmPromptDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Control_Options)
SmPromptDlg creates a popup dialog and waits for a user response. This
dialog is useful for obtaining variable names from the user at run time.
Up to four programmable push-buttons can be defined in this call.
Accelerators can be assigned to the push-buttons by using the tilde (~)
character preceding the push-button display character of the desired
accelerator key. The value of the returned option selected by the user will
not contain this tilde character.
Description for the arguments of this function follows:
Display_String The user supplied literal string to display (up
to 80 characters). This argument can also be a
variable that contains the string to display.
Edit_String The default edit string that will be displayed
and highlighted in he entry panel ready for
change.
Option_Return A variable to contain the literal value of the
button selected by the user to terminate the
display (see Control_Options).
String_Return_Variable A variable to contain the value of the entry
field upon termination of the dialog. This will
contain the user entry to the prompt of this
dialog.
Control_Options Up to four strings representing the
identification of the push-buttons to appear on
the display. The buttons will appear in the
order as they appear in this argument. Each
button ID must be separated by the "|"
character. Upper and lower case, along with the
aforementioned tilde can be used. By default
the first button responds to the "Enter" key,
and the second button responds to the "ESCape"
key.
result A success value for the function. 1= Ok.
0=Error.
Example:
IF $Shab = "" THEN $Shab = "hab"
RTN = SmPromptDlg("Please enter the variable name used for HAB",
$Shab, OPTION, $Shab, ~Ok | ~Cancel | ~Abort )
IF OPTION = "ABORT" THEN TERMINATE
Notes:
The position of the Prompt Dialog on the user desktop is saved at the
termination of the dialog. The user can move the dialog panel to a convenient
position. Subsequent displays of this dialog type will appear in the same
position.
The use of a single keyword static variable for both the Edit_String and the
String_Return_Variable give the user his previous entry as the initial
default.
Related Topics
Use of Dialog Functions
Launching the Editor
Navigation Links
CONTINUE - SmRemove
BACK - SmOutputNote
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.14. SmRemove( ) ΓòÉΓòÉΓòÉ
.SmRemove ( )
SmRemove ( Option )
SmRemove will remove either the keyword, the source code line in which the
keyword is found or the complete statement block at has been parsed as part of
the keyword statement.
The value of the options argument specifies 'KEYWORD', 'LINE', or 'BLOCK'.
Due to the complexity of the coding syntax that may occur in the source code,
it is advised that the user have the opportunity to view the context of the
keyword to determine if the removal is appropriate.
Description for the arguments of this function follows:
Option 'KEYWORD', 'LINE', or 'BLOCK'.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmSendToEditor( "$LFile($LLine:$LCol)R" )
DISPLAY = "Choose Removal Option for: " $KEY
SmDisplayDlg( DISPLAY, OPTION,
~Line | ~Cancel | ~Keyword | ~Block)
IF OPTION = "Cancel" THEN
DO
SmNoMigrate()
EXIT
END
ELSE
SmRemove( OPTION )
Notes:
You can use SmRemove along with SmOutputLine to replace source code with
newly generated output code.
Using SmRemove with the "KEYWORD" option replaces the keyword. (and any
arguments, if the keyword is a API function) with a null string.
Note however that the code surrounding the keyword remains intact (including
a terminating semicolon if it appears). A stand alone API function call
should by removed with the "LINE" option to insure that the termination
semicolon is properly erased in the output.
Related Topics
Migration Control
Navigation Links
CONTINUE - SmSaveVars
BACK - SmPromptDlg
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.15. SmSaveVars( ) ΓòÉΓòÉΓòÉ
.SmSaveVars ( )
SmSaveVars ( Filename, Options )
SmSaveVars creates an ASCII text file containing assignment statements with
the variables and values of these variables that the time that this function is
executed. The format of the file corresponds to the format described above for
SmLoadVars.
The Options argument specifies whether GLOBAL, STATIC or both sets of
variables are to be written to the file.
This command is usually performed at the end of the process in the
"$$POST_PROCESS" command procedure.
Description for the arguments of this function follows:
Filename The filename of the output file. If the
filename is not fully qualified, the default
directory is the directory containing the
currently selected List-Of-Files.
Options Specify the type of variables and can be one or
a combination of the following ( separated by
the OR symbol, "|" ): GLOBAL' - process global
variables and/or 'STATIC' - keyword static
variables
result A success value for the function. 1= Ok.
0=Error.
Example:
SmSaveVars( "VARS1.DAT", GLOBAL | STATIC )
Related Topics
Pre and Post Command Sets
Global, Static and Local Variables
Navigation Links
CONTINUE - SmSendToEditor
BACK - SmRemove
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.5.16. SmSendToEditor( ) ΓòÉΓòÉΓòÉ
.SmSendToEditor ( )
SmSendToEditor ( Template )
SmSendToEditor passes the Parameter to the editor defined in the SMART setup
options. The editor, or whatever proxy program is specified in the setup
option, will be spawned by this command. The argument in this command will be
passed as an argument string to the application spawned.
If you want to pause processing at this point until the user has a chance to
view the displayed argument, you should follow this command with the
SmDisplayDlg, SmPromptDlg, or SmListDlg command.
Typically, the argument for an editor will be the filename, linenumber,
column of the current keyword.
Failure to temporarily halt the processing while the editor is receiving the
parameter from this command may create a race condition with multiple commands
in rapid fire succession attempting to display multiple files. The timing of
this condition may create a system wide failure, if not just a mess of confused
editor instances and file displays.
The use of a project ID is highly recommended in the creation of a The SMART
Editor instance for SMART, and in the parameter of the SMART Editor
specification.
Description for the arguments of this function follows:
Template A variable containing a keyword template, or a
variable containing a string to be processed as
a template, or a literal to be used as the
argument in starting the SMART specified editor
(see "Options", "SetupOptions" in the main menu
of SMART.) Note that if other parameters are
specified in the Setup Panel, they will be sent
in addition to the argument of this command.
result A success value for the function. 1= Ok.
0=Error.
Example:
SmSendToEditor( "$LFile($LLine:$LCol)R" )
DISPLAY = "Migrate This Keyword : " $KEY
SmDisplayDlg( DISPLAY, OPTION,
~Yes | ~No | ~Abort)
IF OPTION = "Abort" THEN TERMINATE
IF OPTION = "NO" THEN
SmNoMigrate()
ELSE
SmMigrateKeyword( $T1)
Notes:
The construction of the parameter to send to the editor maybe somewhat
dependent upon the capabilities of the editor. In the above example the
created parameter will appear in the following format indicating a fully
qualified file name followed by line and column number of the keyword, and a
designator for opening the file as read-only:
C:\MYAPP\FILE.C(123:12)R
Related Topics
Use of Templates
Use of Dialog Functions
Launching the Editor
Navigation Links
CONTINUE - MiCL Instructions
BACK - SmSaveVars
BUILT-IN FUNCTIONS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.6. MiCL Instructions ΓòÉΓòÉΓòÉ
MiCL Instructions
The following processing instructions are defined in the SMART Migration
Command Language.
IF - THEN
ELSE
DO-END
EXIT
DEFAULT
TERMINATE
= (Assignment)
In addition to the instructions, the following comparison operators are
defined to be used in the decision instruction, IF-THEN.
< (Less than)
> (Greater than).
= (Equal)
NOT ( used in conjunction with one of the other operators)
IF - THEN - ELSE- DO - END
The "IF" instruction is used with a "THEN" instruction to make a decision.
The command processor runs the instruction if the expression is true; for
example:
if answer = "YES" then
EXIT
In this example, the EXIT instruction is processed only if "answer" has the
value of "YES".
Character strings are compared character by character with a result of true
or false depending upon the ASCII value of the first non-matching character.
You can group instructions using DO and END . To tell the interpreter to run
a list of instructions after the THEN instruction, use DO-END as in the
following example:
if answer = "YES" then
DO
...
...
...
END
else
...
The DO and its END instruction tell the interpreter to process any
instructions between them depending upon the comparison condition.
ELSE identifies the instruction to be run if the expression is false. To
tell the interpreter to select from one of two possible instructions, use:
IF expression THEN
instruction1
ELSE
instruction2
You could include the IF-THEN-ELSE format in a procedure like this:
IF answer = 'NO' THEN
EXIT
ELSE
SmMigrateKeyword( $T1 )
The comparison operators (<,>,=) along with the NOT operators can be used in
combination with the decision instruction (IF).
Nested IF statements are only allowed if the scope of each nested if
instruction is defined by the DO-END instruction set. As an example:
IF OptionA = "TRUE" THEN
DO
IF OptionC = "TRUE" THEN
DO
SmDisplayDlg("OptionC is TRUE",
OPTION, Ok | Cancel | Abort)
EXIT
END
ELSE
SmDisplayDlg("OptionC is FALSE", OPTION,
Ok | Cancel | Abort)
END
ELSE
DO
SmDisplayDlg("OptionA is FALSE", OPTION,
Ok | Cancel | Abort)
IF OptionB = "TRUE" THEN
SmDisplayDlg("OptionB is TRUE", OPTION,
Ok | Cancel | Abort)
ELSE
SmDisplayDlg("OptionB is FALSE", OPTION,
Ok | Cancel | Abort)
END
The "IF" instruction must appear as the first word on a command coding line.
Processing for the comparison statement stops with the "THEN" instruction. The
"DO" and "END" instructions must appear on separate coding lines without any
other instruction.
The comparison expression in an IF-THEN instruction can only be a simple
statement of the form:
item1 operator item2
Where:
item1 must be a variable
operator can be "<", ">", or "=" and may be preceeded by "NOT"
item2 must be a variable, or a literal string.
Example:
if OPTION = 'Abort' then TERMINATE
if RESULT not = "Ok" then EXIT
EXIT
The EXIT instruction terminates processing of the current command set. The
EXIT statement is not required at the end of the command set, since an exit
condition is processed by default at the end of each command set.
DEFAULT
The DEFAULT instruction exits the current MiCL command set and reverts to
the Primary Migration Database instructions for processing the keyword.
TERMINATE
The TERMINATE instruction unconditionally stops the migration process,
immediately.
.Assignment ( = )
The assignment operator equates the variable to the left of the operator to
be equal to the value of the expression to the right. This expression can be
another variable, a literal string, the result of a SMART built-in function
call, or a string formatted from a combination of literal strings and
variable values.
The variables in this instruction can be SMART predefined variables, or user
defined variables. The user defined variables do not need declaration. Their
use in an instruction automatically declares the variable.
The following examples show the use of the assignment instruction.
$Ghab = 'hab'
Sets the global variable $Ghab to contain the string "hab".
$T0 = $T1
Copies the template, $T1, to the current processing template $T0.
$P1 = 'hwndMenu'
Set the current template parameter $P1 to contain the string "hwndMenu"
str = 'The keyword ' $KEY ' cannot be migrated.'
SmOutputNote ( str )
These two instructions create a migration note and places it in the
migration comments for the current keyword. Note the concatenation of the
literal strings with the contents of the predefined variable $KEY, containing
the current keyword string.
Related Topics
Two MiCL Examples
Navigation Links
CONTINUE - Event Command Procedures
BACK - SmSendToEditor
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.7. Event Command Procedures ΓòÉΓòÉΓòÉ
Event Command Procedures
Each keyword in the SMART and User Migration Data Base can contain a command
set of instructions for custom processing of the migration code required by the
keyword. In addition to these standard command sets, there is a special
facility to provide you with pre and post migration event commands sets.
As an example, you may wish to prompt the user for the variable containing
the application HAB at the start of the migration process. You can do this by
creating a set of commands to be processed before (pre) the migration process
as follows:
result = SmPrompt( $Ghab, "Enter HAB variable name.", Ok | Abort )
if result = "Abort"
then TERMINATE
In order for SMART to process this command set, the commands are entered into
the Migration data base under the pseudo-keyword "$$PRE_PROCESS". All
pseudo-keywords are designated as migration event command sets and are not used
in SMART for any other reason.
The following pseudo-keyword designators are provided for your use.
$$PRE_PROCESS At the beginning of the migration process,
before any files are processed.
$$POST_PROCESS At the end of the migration process. All
globals and keyword static variables are
accessible at this time.
$$PRE_FILE Just before the first line of a new file is
read. The current filename is accessible in the
global variable $GFILE.
$$POST_FILE After the end of file is processed and the file
is closed.
In the processing of Event Command sets many of the MiCL built-in functions
are not applicable and will not process. Also, the preloaded variables
($K..., $L..., $Pn, $Tn) and any Static variables ($S...) are not accessible.
Only the following built-in MiCL functions are available to event command
sets.
SmDisplayDlg ( Display_String, Option_Return, Control_Options )
SmGetListName ( Return_Variable )
SmGetListPath ( Return_Variable )
SmGetSmartPath ( Return_Variable )
SmListDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Filename )
SmLoadVars ( Filename )
SmPromptDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Control_Options )
SmSaveVars ( Filename, [STATIC | GLOBAL] )
SmSendToEditor ( Template )
The Pre and Post Process command sets can best be utilized to load or save
the process variables with the functions:
SmLoadVars ( Filename )
SmSaveVars ( Filename, [STATIC | GLOBAL] )
These event command sets can also be utilized to provide run-time
interaction with the user to obtain variable names or run options that can
easily be stored in process global variables for use by any keyword command
set during the process run.
Interactive dialogs can be created and used with the following built-in
functions:
SmDisplayDlg ( Display_String, Option_Return, Control_Options )
SmListDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Filename )
SmPromptDlg ( Display_String, Edit_String, Option_Return,
String_Return_Variable, Control_Options )
Related Topics
Preset Variables
Pre and Post Command Sets
Global, Static and Local Variables
Navigation Links
CONTINUE - Programming Notes and Tips
BACK - MiCL Instructions
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8. Programming Notes and Tips ΓòÉΓòÉΓòÉ
Programming Notes and Tips
MiCL Basics
Preset Variables
Two MiCL Examples
Pre and Post Command Sets
Use of Templates
Use of Dialog Functions
Migration Control
Migration Notes and Comments
Global, Static and Local Variables
String and Variable Evaluation
Launching the Editor
Testing MiCL Command Sets
Navigation Links
CONTINUE - MiCL Basics
BACK - Event Command Procedures
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.1. MiCL Basics ΓòÉΓòÉΓòÉ
MiCL Basics
In general, the SMART Migration Command Language defines a flexible set of
commands to be used in the custom migration of identified keywords which may be
encountered in a source language. The exception to this is the Pre and Post
processing command sets triggered at specific events during the migration
process.
Once a keyword to be migrated is identified in the source code SMART accesses
the currently selected Migration database for records related to the keyword
containing: short comments, long comments, templates, prototypes, sample code,
commands and references.
A command set consists of a number of SMART Migration Command Language
instructions, and built-in function calls to affect the specific migration of
an encountered keyword.
If no commands are programmed for a specific keyword, then the migration is
processed using the default actions. Category 000 keywords are left unaffected.
Category 010 keywords require a simple literal string replacement. These
keywords will be processed automatically without commands and will have the
detected keyword replaced by the template string provided in the migration
database without evaluation.
Category 020 and above are good candidates for SMART command processing. If
there are no commands available in the migration database, SMART will simply
output the migration code as defined in the options settings for each category.
Typically this will simply be a set of migration comments inserted in the
output source code,
A keyword command set can be as simple as an output of the template into the
migration code stream, along with the arguments of the keyword function
inserted into the migrated output.
/* Dos Delete - OS/2 1.3 to OS/2 2.1 */
/* Second argument is deleted */
/* Template : DosDelete( $P1 ) */
SmMigrateKeyword(T1)
In this example the template for this keyword as coded in the migration table
is automatically evaluated in the SmMigrateKeyword function replacing the
argument of the output keyword API function call with the first argument of the
input keyword function. The results of this simple migration follow.
Input source code:
DosDelete( szTheFile, 0L );
Output migrated source code:
DosDelete( szTheFile );
Navigation Links
CONTINUE - Preset Variables
BACK - NOTES and TIPS
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.2. Preset Variables ΓòÉΓòÉΓòÉ
Preset Variables
The processing of the keyword commands starts with a number of predefined
variables initialized and available to the commands.
Process global variables ($Gxxxxxxxx) can be set in any command set and are
available to all keyword commands throughout the current migration process.
Keyword static variables ($Sxxxxxxxx) are variables that are local to each
keyword, but which retain their value throughout the migration process. You
can prompt, or otherwise save a value the first time a keyword is processed to
use this value throughout the remaining process.
At the end of a process run you may save all of the Global and Static
variable values into a hard file to be reloaded at the beginning of another
migration run.
The keyword information variables, $K... contain information about the
keyword and are available to the command set. The source code file and line
information is available in the preset variables $L... .
If the keyword is a function call, the arguments of this call are stored in
$P1...$Pn, with the number of arguments stored in the variable $PCNT.
Any templates that are in the migration database for the current keyword are
available in the predefined variables $T1...$Tn, with the number of available
templates stored in $TCNT.
The following is an example of a keyword template:
WinMessageBox(HWND_DESKTOP, $GhFrame, $P3, $P2, 0, ?Options)
Note that the Global variable $GhFrame has been previously initialized. The
two arguments $P3 and $P2 come from the input keyword function call arguments
(automatically). The last argument, ?Options is a local variable that been set
in prior statements before the output instruction for this template.
The predefined variable $KIND tells you if an API keyword functional call is
embedded in an expression in the source code. This value is important to
determine whether a function call can be removed (if standing alone), or can be
set to some static return value (if the return value is used as an argument),
or simply cannot be migrated and must have a note attached saying so.
Navigation Links
CONTINUE - Two MiCL Examples
BACK - MiCL Basics
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.3. Two MiCL Examples ΓòÉΓòÉΓòÉ
Two MiCL Examples
In the following example, a single keyword function call will generate
several lines of migrated output.
The keyword is "SetParent" in a Win 3.1 which appears in the source code as
follows:
SetParent(hwnd, hwndParent)
The SMART migration table templates for this keyword are:
.Template =$P2 = WinQueryWindow ($P1, QW_PARENT);
=WinSetParent ($P1, $P2, TRUE);
=if (($P2 != HWND_DESKTOP) &&
= ($P2 != HWND_OBJECT))
= WinSetOwner ($P1, $P2)
= else
= WinSetOwner ($P1, (HWND)0);
The command set for the migration of this keyword follows:
/* Replace source code for SetParent - Category 030 */
IF $KIND = "TRUE" THEN
DO
SmSendToEditor( "$LFILE($LLINE:$LCOL)R" )
DISPLAY = "Verify removal and replacement for keyword: " $KEY
SmDisplay( DISPLAY, OPTION, ~Yes | ~No | ~Abort )
IF OPTION = "Abort" THEN TERMINATE
IF OPTION = "Yes" THEN
DO
SmRemove(LINE)
SmOutputLine( $T1 )
SmOutputLine( $T2 )
SmOutputLine( $T3 )
SmOutputLine( $T4 )
SmOutputLine( $T5 )
SmOutputLine( $T6 )
SmOutputLine( $T7 )
SmNoMigrate( )
SmNoComment( ALL )
NOTE = "Source line removed and code replaced for:" $KEY
SmOutputNote( NOTE )
END
END
ELSE
DO
string = "*** Unable to migrate : " $KEY
SmOutputNote( string )
SmOutputNote("*** Multi-line migration is embedded.")
SmNoMigrate( )
END
In this example the command processing checks to see if the keyword is
standing alone. If the answer is true, then the source code at the point of the
keyword is sent to the editor for the user to view.
Next a display dialog confirms replacement of the code. If the user responds
"Ok" then the seven output templates are used to generate the migrated output
code, with the template variables replaced by the values of the input
arguments.
The standard output comments were supressed and a note was inserted in this
migration to indicate the code replacement.
The migrated code created from this command set is shown below:
// SetParent(hwnd, hwndParent ); SM$:O
hwndParent = WinQueryWindow (hwnd, QW_PARENT); // SM$:M1
WinSetParent (hwnd, hwndParent, TRUE); // SM$:M1
if ((hwndParent != HWND_DESKTOP) && // SM$:M1
(hwndParent != HWND_OBJECT)) // SM$:M1
WinSetOwner (hwnd, hwndParent) // SM$:M1
else // SM$:M1
WinSetOwner (hwnd, (HWND)0); // SM$:M1
// Source line removed and code replaced for: SetParent SM$:I
In the next example you wish to migrate a user function and modify the
calling sequence every place that it appears by inserting a new argument at the
front of the argument list. The user is to be prompted the first time that the
keyword is encountered, but the response will be saved for all other
occurrences.
The keyword is "MyMessageBox" in the form of:
MyMessageBox( szString, lOptions );
The template for this migration is:
MyMessageBox( $Shwnd1, $P1, $P2 )
The command set follows:
IF $Shwnd1 = "" THEN
DO
result = SmPrompt( "Enter variable for MyMessageBox argument 1.",
"hwnd", option, $Shwnd1, OK | Abort)
IF option = 'Abort' THEN TERMINATE
END
SmMigrateKeyword( T1 )
In the example above the static variable $Shwnd1 was checked for a value and
if none was present the user was prompted for the variable name. Furthermore,
if the user terminated out of the entry panel then the process was stopped,
otherwise the migration was completed with the keyword template using the value
of the static variable $Shwnd1.
Navigation Links
CONTINUE - Pre and Post Command Sets
BACK - Preset Variables
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.4. Pre and Post Command Sets ΓòÉΓòÉΓòÉ
Pre and Post Command Sets
The preprocess command set can be used to prompt for process run options,
global variables that may be used through the migration process, and used to
load previous data from an earlier run. For obvious reasons, many of the
keyword related built-in functions are not available for use in the event
command sets.
However, with the use of the MiCL interactive dialog functions you will be
able to set process global variables at run time by prompting the user.
The following commands provide a good example for the preprocess event
command set. These commands are coded into a pseudo-keyword structure in the
migration table.
.Keyword =999 000 999 $$PRE_PROCESS
.SComment=Preprocess Command set
.Command = SmGetListPath( LISTPATH )
= $GVARS = LISTPATH "\VARS1.DAT"
= SmPromptDlg( "Enter filename for loading process variables:",
= $GVARS, OPTION, $GVARS, ~Ok | ~Abort )
= if OPTION = "Abort" then terminate
= SmLoadVars( $GVARS )
= if $GHAB = "" then
= $GHAB = "hab"
= SmPromptDlg( "Enter application HAB variable name:",
= $GHAB, OPTION, $GHAB, ~Ok | ~Abort )
= if OPTION = "Abort" then terminate
In the example above, the first order of business is to get the current
List-of-Files directory path and create a default filename for the process
variables file.
Once the user has accepted this filename or entered another name in the edit
field, then the function is executed to load the variables from the specified
file.
Next a check is made for the loaded global variable $GHAB to see if it has a
valid entry. Note that MiCL initializes a new variable with a null string.
Variables are created when referenced. Therefore, when the variable $GHAB was
checked in the IF-THEN instruction, the variable was created with a null entry
if the variable did not previously exist.
In this example, if the global variable was null then we set the value to our
default value "hab".
Finally, a prompt dialog is created to allow the user to enter the string for
the application HAB variable or accept the one displayed.
The Post-Process command set allows you the opportunity to execute any
functions that you may need at the end of the migration process after all of
the migration files have been processed and closed. Typically this may consist
of simply saving the static and global variables from the current migration
run. Following is a sample of a typical post-processing command set.
.Keyword =999 000 999 $$POST_PROCESS
.SComment=Post-process Command set
.Command = if $GVARS = "" then
= do
= SmGetListPath( LISTPATH )
= $GVARS = LISTPATH "\VARS1.DAT"
= end
= SmPromptDlg( "Enter filename for storing process variables:",
= $GVARS, OPTION, $GVARS, ~Ok | ~Abort )
= if OPTION = "Abort" then terminate
= SmSaveVars( STATIC | GLOBAL )
Note in this example we took advantage of the fact that in the preprocess
command set we stored the filename of the variables in a global variable,
"$GVARS". Now at the end of the process we can access this stored filename and
use it as the default entry item in a prompt to the user.
Recalling that the first button in the SmDisplayDlg, SmPromptDlg, and the
SmListDlg respond to the keyboard "Enter" key, while the second button responds
to the "Esc" key.
Since we have placed the natural default filename in the entry field of the
prompt, the user can complete the process with this filename by simply pressing
the "Enter" key.
Related Topics
Global, Static and Local Variables
Navigation Links
CONTINUE - Use of Templates
BACK - Two MiCL Examples
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.5. Use of Templates ΓòÉΓòÉΓòÉ
Use of Templates
Use of a template, along with the MiCL built-in command SmMigrateKeyword is a
simple and effective way to migrate an API keyword when the arguments of the
call have be changed.
With a template for an API migration you have the ability to reorder the
arguments, delete any arguments, insert new arguments. The new arguments may
be a literal string, the contents of a user prompted variable, or the user
selected return from a list of possible arguments from the SmListDlg dialog.
The argument can even be the assignment return variable from the source code
that may exit in the form of:
sReturn = Fcn( Arg1, Arg2, Arg3);
The mechanism for this migration maneuver begins with the predefined
variables that are available at the beginning of the command set. Each
argument of the API keyword function call in the source code is set to the
variables $P1-$Pn. The assignment return variable $KRTN contains the variable
name of the function return assignment if any exists. All templates found for
the current keyword are available in the predefined variables $T1-$Tn.
A template is a coding string that is loaded into the migration table
dictionary with a tag of ".Template". The template should be coded exactly as
it will appear to replace the keyword in the source code, or appear as a
generated source code line using the SmMigrateKeyword built-in function. Any
spacing, literals, special syntax characters and any other item that is to
appear in the output should be placed in the template.
The power and flexibility of the template comes from the use of any variables
that you may place in the template. During the evaluation of the template in
the built-in functions SmMigrateKeyword or SmOutputLine, any variables that
start with "$" or "? ". This will include any process Global or keyword Static
variables along with predefined variables, and any keyword local variable that
begins with "$" or "?".
Example:
Windows source statement:
bChild = IsChild (hWndParent, hWndChild);
Migration Table code:
.Template =WinIsChild ($P2, $P1)
.Command=SmMigrateKeyword( $T1)
Migrate output code:
bChild = WinIsChild (hWndChild, hWndParent);
Note in the simple example above that the parameters of the Win keyword API
"IsChild" are reversed in their appearance in the OS/2 migrated code. This was
accomplished by simply stating the format of the output in the keyword template
coded into the migration table, and then declaring the built-in function
SmMigrateKeyword() in the command set.
The following hypothetical example makes use of the $KRTN variable and a
multiple output migration coding lines.
Win statement:
sCount = ButtonCount( hWnd, 0L);
Migration Table code:
.Template=HWND hwndDlg = WinGetDialogFocus( $P1 );
=WinGetButtonCount( HWND_DESKTOP, hwndDlg, &$KRTN );
.Command =IF $KIND = "TRUE" THEN
= DO
= SmSendToEditor( "$LFILE($LLINE:$LCOL)R" )
= DISPLAY = "Verify code replacement for keyword: " $KEY
= SmDisplay( DISPLAY, OPTION, ~Yes | ~No | ~Abort )
= IF OPTION = "Abort" THEN TERMINATE
= IF OPTION = "Yes" THEN
= DO
= SmRemove(LINE)
= SmOutputLine( $T1 )
= SmOutputLine( $T2 )
= END
= END
=ELSE
= DO
= string = "*** Unable to migrate : " $KEY
= SmOutputNote( string )
= SmOutputNote("*** Multi-line migration is embedded.")
= SmNoMigrate( )
= END
Migrated Output Code:
HWND hwndDlg = WinGetDialogFocus( hWnd );
WinGetButtonCount( HWND_DESKTOP, hwndDlg, &sCount);
There are a couble of important items to note in this example.
As in previous examples when a line of code is to be removed, the code is
displayed and the user is requested to verify the removal. This will prevent
code removal under unusual coding syntax situations which may garble the
output.
Predefined variables are used in both templates, including the return
variable $KRTN. The second argument in the input source "0L" was not needed,
and was discarded by not specifying the predefined argument variable $P2 in
either of the templates. You may also not that a constant "HWND_DESKTOP" was
inserted in the second template.
Related Topics
Preset Variables
Global, Static and Local Variables
Navigation Links
CONTINUE - Use of Dialog Functions
BACK - Pre and Post Commands
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.6. Use of Dialog Functions ΓòÉΓòÉΓòÉ
Use of Dialog Functions
Use of the built-in dialog functions SmDisplayDlg , SmPromptDlg, SmListDlg
can enable you to create a great deal of interactive and expert-like
functionality in the migration process.
These three dialog functions provide a great deal of flexibility while
allowing the user to select options and provide run-time information where user
interaction, verification and choice is required.
All three dialogs halt the migration process and wait for user response. In
conjunction with the SmSendToEditor , you will have the opportunity to display
the source code at the point of the keyword encounter and allow the user to
browse the source code to make the selection requested of the dialog.
The three dialog functions all display information, wait for user response,
and return the response back to the command set program. In each dialog,
however, the capabilities are quite different.
SmDisplayDlg
SmDisplayDlg is a type of message box. The arguments of the function call
specify the message to be displayed, a select return variable and a rather
unique way to specify up to four buttons to be displayed.
The buttons specification depart quite differently from the WinMessageBox
call in OS/2 Presentation Manager Programming. In MiCL you simply specify the
ID on each of up to four buttons. The ID will appear on the button exactly as
specified. You may include a tilde (~) character preceding any character of
the button ID to designate an accelerator key for the button.
The first button in the specification responds to the "Enter" key and the
second button responds to the "Esc" key.
When the user presses on of the buttons created for this dialog, the dialog
will terminate and the ID string of the button pressed will be returned as the
value of the select return variable. At this point you may compare the value
of the select return variable with any one of the string IDs to determine
appropriate action based on the selection. Note that the button string ID
returned does not include any tilde which may have been specified as an
accelerator.
One other nice feature for each of the three dialogs is their placement
recall. If the user moves the placement of any one of the dialogs on the
desktop, subsequent creation of the same type of dialog will appear in the
location last positioned. In this manner you have the opportunity to position
the dialogs and the editor to best suit your needs during the migration
process.
Let's look at an example of the display dialog.
.Command =SmSendToEditor( "$LFILE($LLINE:$LCOL)R" )
=DISPLAY = "Verify code replacement for keyword: " $KEY
=SmDisplay( DISPLAY, OPTION, ~Yes | ~No | ~Abort )
=IF OPTION = "Abort" THEN TERMINATE
=IF OPTION = "Yes" THEN
= ...
Note how the three buttons in the above dialog were specified. The button
IDs need not be placed in quotes. The IDs will appear case sensitive exactly
as they are specified.
The variable "OPTION" was used to receive the returned response.
SmPromptDlg
While SmDisplayDlg can be used as a type of message box, SmPromptDlg is an
entry panel dialog. A prompt message string is specified in the arguments of
the call to create this dialog.
In addition to the prompt string, the other arguments specify the initial
entry string, the entry return variable, the button return string and the
buttons specification.
The initial entry string provides a highlighted default entry for the user.
The entry return variable will contain the user's entry string at the
termination of the dialog panel.
The button return variable and the buttons specification operate identically
as in the SmDisplayDlg described above.
The following example of the SmPromptDlg function points to a good use of the
keyword static variable to recall the previous user entry to be used as the
current initial entry string as the dialog is initialized.
IF $Shab = "" THEN $Shab = "hab"
RTN = SmPromptDlg("Please enter the variable name used for HAB",
$Shab, OPTION, $Shab, ~Ok | ~Cancel | ~Abort )
IF OPTION = "ABORT" THEN TERMINATE
In this example the keyword static variable $Shab is used to contain the
variable name used for the application anchor block. If this static variable
is null and has never been set, it is initialized to "hab".
Next note that both the initial edit string argument and the entry return
arguments both use this same static variable. Using this technique in
SmPromptDlg will provide the user with their prior entry as an initial default
in the current prompt.
You should note two poor techniques in the coding of the command set in the
above example. There is no display of the source code immediately preceding the
prompt dialog. The user will not know where this prompt is referenced in the
source code.
The second coding error is not providing the keyword in the display of the
prompt. By using The SMART Editor as the SMART editor, and sending the
file/line/column_number to the editor will automatically highlight the
referenced keyword. However, it is a good programming technique to also
identify the name of the keyword in the display or prompt message. Go back and
review the previous example for the SmDisplayDlg function.
SmListDlg
The interactive dialog panel created with SmListDlg presents a number of
unique capabilities.
Essentially this is a user maintainable, item selectable list box. The list
box is loaded from items contained in the file specified in the argument of the
call to this function. With the controls on this dialog panel, the user may
select one of the list box items, or type a new entry to be returned to the
command program and saved in the file for subsequent use.
The buttons on this panel, unlike the other two dialog functions, are fixed
and not programmable.
The list of items to be loaded can be prepared from a simple text editor with
one item per line of the file.
The user can add items, or delete any item in the list. Double clicking on
any list box item will automatically make the selection and terminate the
dialog. The item selected will be returned to the command program as the value
of the selection return variable.
The following example demonstrates the use of the SmListDlg.
SmSendToEditor( "$LFile($LLine:$LCol)R" )
SmListDlg("Select the choice for HANDLE replacement",
$Shandle, OPTION, $Shandle, "HANDLE.DAT" )
IF OPTION = "Terminate" THEN TERMINATE
IF OPTION = "Cancel" THEN
DO
SmNoMigrate
EXIT
END
SmMigrateKeyword( $T1 )
In this example the file "HANDLE.DAT" contains the following entries:
HWND
PVOID
LHANDLE
CHAR *
This list box, dialog selection panel is best utilized where a combination
of an entry field is combined with a list of multiple selectable items is
needed. It provides a user an effective opportunity to view the source code
at the point of keyword encounter and select one of several templates or other
migration options displayed in this panel.
Related Topics
Launching the Editor
Navigation Links
CONTINUE - Migration Control
BACK - Use of Templates
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.7. Migration Control ΓòÉΓòÉΓòÉ
Migration Control
General migration control is achieved with the built-in MiCL functions
SmIgnoreKeyword( ), SmNoMigrate( ), along with SmMigrateKeyword( ) and
SmRemove( ).
SmIgnoreKeyword( ) will cause the processing to skip over the encountered
keyword, just as if it did not appear in the migration table. The original
source code stays intact and no comments or notes are inserted in the output
stream. Essentially this acts like the keyword appeared in an Exclude Keyword
file, except that this function is programmatic and can be executed depending
upon run time conditions.
As an example, it may be necessary to process a keyword by first displaying
the source code at the keyword encountered and then asking the user to process
the keyword or skip this encounter. If the user responds with "Skip", then the
MiCL command can execute the SmIgnoreKeyword( ) function to skip the processing
of the keyword. The output remains intact and will appear as if the keyword
was not encountered. The following code demonstrates this example:
.Command =SmSendToEditor( "$LFILE($LLINE:$LCOL)R" )
=DISPLAY = "Verify migration for keyword: " $KEY
=SmDisplay( DISPLAY, OPTION, ~Yes | ~Skip | ~Abort )
=IF OPTION = "Abort" THEN TERMINATE
=IF OPTION = "Yes" THEN
= SmMigrateKeyword( $T1 )
=ELSE
= SmIgnoreKeyword( )
SmNoMigrate( ) will cause the process to go through all of the migration
steps, except that the keyword will appear in the output exactly as it did in
the source code input, with no change.
In this case the original code will appear untouched, but all migration
comments and any note generated will appear in the output code. (Note: in
comparison, SmIgnoreKeyword will suppress all comments and notes).
This function can be used where the migration was exited during the MiCL
command set processing and the migration could not be performed and was left to
the user.
If you simply "EXIT" the command set without executing SmMigrateKeyword, or
SmNoMigrate, then the keyword (with all arguments in the case of an API
keyword) will be left out of the output code. This may confuse the user to see
part of the source code left blank. You may prefer to execute SmNoMigrate and
place a note to the user in the output code. An example of SmNoMigrate
follows:
The source code appears as follows:
if (DeleteMenu (hMenu, 2, MF_BYPOSITION) )
MenuProcess(hMenu);
The migration table code:
.Template =SHORT sID = (SHORT)WinSendMsg ( $P1, MM_ITEMIDFROMPOSITION,
= MPFROMSHORT (2), MPVOID)
= WinSendMsg ( $P1, MM_DELETEITEM, MPFROM2SHORT(sID,FALSE),
= PVOID);
.Command =if $KIND = "TRUE" then
= do
= SmMigrateKeyword( $T1 )
= SmOutputLine( $T2 )
= end
=else
= do
= SmNoMigrate()
= DISPLAY = "** No Migration. Embedded Keyword: " $KEY
= SmOutputNote( DISPLAY )
= end
The resulting output code will appear as follows:
if (DeleteMenu (hMenu, 2, MF_BYPOSITION) )
MenuProcess(hMenu);
// ** No Migration. Embedded Keyword: DeleteMenu SM$:I
// SM$:C
// DeleteMenu - Cat:030 Type:010 Area:280 SM$:K
// Replace with WinSendMsg and MM_DELETEITEM SM$:S
Navigation Links
CONTINUE - Migration Notes and Comments
BACK - Use of Dialogs
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.8. Migration Notes and Comments ΓòÉΓòÉΓòÉ
Migration Notes and Comments
There are two MiCL built-in functions that control the output of migration
comments and notes. These are SmNoComment( ) and SmOutputNote( ).
Migration comments come from the migration table coded under the tags:
SComment, LComment, Template, Prototype, and Sample. The user has control over
the suppression of any of these comments in the migration options settings. In
addition to the user control, the MiCL function call can programmatically
suppress any of these comments by specifying the comment tag to be suppressed
in the argument of this call.
SmOutputNote( ) places a note created in a MiCL Command set in the output
stream under the migrated code. Typically these notes are used to advise the
user of some alternative action performed during the execution of the command
set based upon the user response to a selected option. These notes are placed
in comments and are tagged with "SM$:I".
With the combinational of these two built-in functions you can control the
commented text inserted in the output code following the detection of a
keyword.
You can replace all standard migration comments with a new set; you can
suppress all comments and notes; you can add migration notes to the standard
comments. These options are all available with MiCL using SmNoComment and
SmOutputNote.
Navigation Links
CONTINUE - Global, Static and Local Variables
BACK - Migration Control
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.9. Global, Static and Local Variables ΓòÉΓòÉΓòÉ
Global, Static and Local Variables
Variables used in MiCL fall into three major categories: Process Global,
Keyword Static and Local. The life and scope of each category is quite
different.
Process Global variables are designated with the leading characters "$G".
Once a global variable is set, it is available to all keyword command sets
throughout the process. The value of a global variable can be changed at any
time during the process run, by any keyword or event command set. Furthermore,
the global variables can be saved at any time during the process run through
the execution of the built-in function "SmSaveVars". The saved variables can
be restored with their saved values using the function "SmLoadVars".
Keyword Static variables behave like global variables except that the scope
of the Static variable is contained to the Keyword command set where it has
been created. The same static variable name can be used in multiple command
sets, however the scope of each of these duplicate variable names is restricted
to its own keyword.
The Keyword Static variable is ideal for maintaining keyword migration data
and options throughout the process run. As in the case of the global
variables, the static variables can be saved to a hard file and restored when
necessary.
Keyword Static variables are designated by the leading characters "$S".
The local variable's life only extends to the end of a command set. The
value of the variable is only available to the keyword command set where the
variable is created and set. Typically it is used for temporary or
intermediate storage of keyword data, options and strings related to the
individual encounter of a keyword during the migration process.
The predefined variables related to keyword context information are all local
variables, created automatically during the migration process upon detection of
a keyword encounter.
A local variable name can begin with any character A-Z, !, ? or _ . Local
variables used in template processing with the SmMigrateKeyword and
SmOutputLine must begin with a "?" character.
All variable names processed in MiCL are case insensitive. The names of
control option buttons in the dialog functions are NOT variables but instead,
are case sensitive literals.
Related Topics
Preset Variables
Use of Templates
String and Variable Evaluation
Navigation Links
CONTINUE - String and Variable Evaluation
BACK - Migration Notes and Comments
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.10. String and Variable Evaluation ΓòÉΓòÉΓòÉ
String and Variable Evaluation
The evaluation of variables and strings fall into three categories:
Templates, Arguments, and assignment expressions.
A Template is a string containing embedded variables. When this string is
evaluated, the variables are replaced by the string value of the variable while
the rest of the evaluated string including all spacing and special characters
remain unchanged.
Templates can be created within the command set and can be coded in the
migration table using the ".Template" tag.
Template evaluation is performed on the argument of the following MiCL
built-in functions:
SmMigrateKeyword ( Template )
SmOutputLine ( Template )
SmSendToEditor ( Template )
Please note that the ONLY variables that are replaced by their string values
are those beginning with "$" and "?". Any other character string will be
assumed to be part of the template and will be passed unchanged to the output
of the evaluation.
Any Template enclosed in quotation marks will have the outer marks removed
during the evaluation. If the result is required to be contained in quotation
then you must place the template string in double quotation.
The following are valid template strings:
$LFile($LLine)
WinSetParent( $P1, ?Param2, TRUE);
"'OS2.H'"
An example of a template created within the command set may appear as:
$T1 = RETURN " = WinSetParent( $P1, $P2, TRUE):"
Arguments to MiCL built-in functions other than those evaluated as templates
(shown above) are evaluated as either the string value of a variable or a
literal string in quotation.
The control option button IDs in the dialog functions SmListDlg,
SmDisplayDlg, and SmPromptDlg are not evaluated but are used as entered.
Any argument variable that has not previously been created will be passed to
the output without evaluation.
Evaluation of expressions in the assignment instruction combine literal
strings and/or variable values. The evaluation of the expression proceeds from
left to right after the equal sign (designating an assignment instruction).
Spacing is maintained only within the literal strings, enclosed in quotation.
All expression elements are concatenated.
The following is an example of expression evaluation.
$KEY contains "CreateWindow"
The command is shown below:
DISPLAY = "Unable to migrate: " $KEY ". Keyword is embedded."
SmDisplayDlg( DISPLAY, OPTION, Ok | Abort )
The resulting evaluation in the assignment instruction of DISPLAY is:
Unable to migrate the keyword: CreateWindow. Keyword is embedded.
Related Topics
Preset Variables
Use of Templates
Navigation Links
CONTINUE - Launching the Editor
BACK - Global, Static, and Local Variables
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.11. Launching the Editor ΓòÉΓòÉΓòÉ
Launching the Editor
The editor specified in the SMART setup options can be launched from the MiCL
built-in function SmSendToEditor( ). The argument of this call is used as one
of the arguments of a DosStartSession for the specified editor. Additional
arguments can be specified in the setup options for the editor and will be used
each time this function is executed.
Typically the argument for this function is created as a template to contain
the filename, line number, column number and an indicator to open the file as
read only. An example of this template argument is shown below:
$LFILE($LLINE:$LCOL)R
Note that in this example the variables $LFile, $LLine, $LCol are all
predefined variables that are automatically set before the execution of any
line of code in a command set.
This template is specifically designed for The SMART Editor - The SMART
Editor. The SMART Editor will accept this parameter and open the specified
file at the designated line number. Furthermore the word at the specified
column number will be highlighted. A new instance of The SMART Editor will not
be created by this call, if SLSTART is designated as the system editor.
Instead The SMART Editor will immediately open the file at the point of the
keyword encounter as specified by the template shown above.
As an additional feature, the use of the optional parameter "/F" in the setup
options for SLSTART will force The SMART Editor to popup the specified file
without having to select "Open Waiting Files" (F10).
It is highly recommended that you create a project instance of The SMART
Editor in the use of SMART. Simply create a program object for The SMART
Editor and place the project ID in the parameter of this instance with the
/P:xxxx option. "xxxx" should be the project ID for this special instance of
The SMART Editor. "SMART" could be a good choice for this ID.
In a like fashion, identify this instance of The SMART Editor by placing a
/P:xxxx parameter in the parameters field of the SMART editor specification in
the Setup Options dialog.
If you are not using The SMART Editor as your designated SMART editor, the
results using SmSendToEditor will depend upon the capabilities of the specified
editor.
It is important that you halt the migration process after executing this
instruction. This will allow your editor to display the source code in an
orderly fashion. Executing any one of the dialog functions ( SmListDlg,
SmDisplayDlg, and SmPromptDlg ) will temporarily halt the process until the
user responds to the dialog. Failure to halt the migration process after
executing SmSendToEditor may cause a general OS/2 system failure.
Related Topics
Use of Dialog Functions
Navigation Links
CONTINUE - Testing MiCL
BACK - String and Variable Evaluation
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 5.8.12. Testing MiCL Command Sets ΓòÉΓòÉΓòÉ
Testing MiCL Command Sets
You are advised to perform thorough testing of any MiCL programs that you
create. MiCL processing does not perform extensive detection and reporting of
programming bugs. Unexpected results may occur from programming errors.
This version of SMART includes a trace facility for MiCL.
To activate MiCL Trace select "Trace MiCL" under the "Migration" main menu
item. A display will appear. You can size and move the trace display.
Next enter the keyword to trace and press 'Trace Keyword' or press "Trace
ALL" to trace all keywords executing MiCL Commands.
Once the trace begins, press <Enter> to step through each command line.
At the conclusion of tracing through a keyword command set, you may cancel
the trace, advance to the next keyword encounter, change the name of the
keyword to trace, or terminate the migration process. (Press <Enter> or select
the appropriate item under the "Trace" menu on the MiCL Trace Window.)
Closing the Trace Facility will cancel the trace and the migration process
will proceed naturally through the process.
The best way to test your MiCL programs to create a UDMD containing the MiCL
commands as they will appear in the migration table. Then, prepare a sample
source code file containing various different examples demonstrating the use of
the programmed keyword.
You can quickly create a UDMD from the MiCL commands, and process the test
source code with the SMART Migration. Be sure to select the newly created UDMD
table as the override migration table.
Once you are satisfied with the test results from this small test file, you
may wish to process a selected set of files from your actual source code.
After you have processed this migration test, carefully review the resulting
output to insure that the migration was performed as programmed.
Navigation Links
CONTINUE - Reference
BACK - String and Variable Evaluation
NOTES and TIPS
SECTION 2 - MiCL Programming
CONTENTS
ΓòÉΓòÉΓòÉ 6. Reference ΓòÉΓòÉΓòÉ
Reference
Reserved Words
Keyword Identifier Codes
Navigation Links
CONTINUE - Reserved Words
BACK - Testing MiCL
CONTENTS
ΓòÉΓòÉΓòÉ 6.1. Reserved Words ΓòÉΓòÉΓòÉ
Reserved Words
The following words are reserved by the SMART Migration Command Language
Processor and should not be used as a variable name in your commands. The
definition and purpose of these reserved words are found elsewhere in this
document.
Remember, all command language text not enclosed in quotes is treated as
uppercase. Also, user variables cannot start with a dollar sign ($) this is
reserved for SMART predefined variables (however $G and $S variables can be
custom user identified with up to eight characters).
ALL
AND
BLOCK
DEFAULT
DO
ELSE
END
EXIT
GLOBAL
IF
KEYWORD
LCOMMENT
LINE
NOT
PROTOTYPE
OR
SAMPLE
SCOMMENT
SmDisplayDlg
SmGetListName
SmGetListPath
SmGetSmartPath
SmIgnoreKeyword
SmLoadVars
SmMigrateKeyword
SmNoComment
SmNoMigrate
SmOutputLine
SmOutputNote
SmPromptDlg
SmRemove
SmSaveVars
SmSendToEditor
STATIC
TEMPLATE
TERMINATE
THEN
Navigation Links
CONTINUE - Keyword Identifier Codes
BACK - Reference
REFERENCE
CONTENTS
ΓòÉΓòÉΓòÉ 6.2. Keyword Identifier Codes ΓòÉΓòÉΓòÉ
Keyword Identifier Codes
Keyword Category
000 Informational only
010 Literal replacement
020 Replacement with parameter changes
030 Change with more / less API calls
040 Logic changes required
050 Functionality does not exist
999 Dictionary entry not defined
Keyword Type
010 Function
020 Message
030 Symbol
040 typedef
999 Unknown
Functional Area - Windows
010 Module-Management
020 Segment
030 Memory-Management
040 Operating-System Interrupt
050 Task
060 Resource-Management
070 String-Manipulation
080 Atom-Management
090 Initialization-File
100 Communication
110 Sound
120 Utility Macros and Functions
130 File I/O
140 Debugging
150 Optimization-Tool
160 Application-Execution
200 Message
210 Window-Creation
215 Multiple-Document Interface
220 Display and Movement
230 Input
240 Hardware
250 Painting
260 Dialogs
270 Scrolling
280 Menu
290 Information
300 System
310 Clipboard
320 Error
330 Caret
340 Cursor
345 Icon
350 Hook
360 Property
370 Rectangle
400 Device-Context
410 Drawing-Tool
420 Color-Palette
430 Drawing-Attribute
440 Mapping
450 Coordinate
460 Region
470 Clipping
480 Line-Output
490 Ellipse and Polygon
500 Bitmap
510 Device-Independent Bitmap
520 Text
530 Font
540 Metafile
550 Device-Control
560 Printer
570 Environment
580 Network
800 WinMem32
810 Windows Macros
820 File Manager Extensions
830 Version Control Extensions
840 ToolHelp Extensions
850 Stress Extensions
860 Shell Extensions
865 Screen Saver Extensions
870 Print Spooling Extensions
875 Pen Windows Extensions
880 OLE
890 MultiMedia Extensions
891 MMP Extensions
892 DispDib Extensions
895 File Compression Extensions
900 Device Driver extensions
905 Dialog Extensions
910 DDEML
911 DDE
915 Dialog Editor Extensions
920 Control Panel Extensions
925 Common Dialogs
926 Color Dialog
930 Common Dialog Errors
940 Typedefines
990 Miscellaneous
999 Functional Area not defined
Functional Area - OS/2
010 Module-Management
020 Segment
030 Memory-Management
040 Semaphores
050 Tasks and Threads
060 Resource-Management
070 String-Manipulation
080 Atom-Management
090 Profile-Management
100 Pipes and Queues
110 Sound
120 Utility Macros and Functions
130 File I/O
140 Device Drivers
150 Printing
160 Application-Execution
170 Signals and Monitors
180 Keyboard Interface (Kbd)
190 VIO Interface (Vio)
200 Mouse Inteface (Mou)
210 Window Creation
220 Display and Movement
230 Input
250 Painting
260 Dialog
270 Scrolling
280 Menu
290 Information
310 Clipboard
320 Message
330 Cursor
340 Pointer
350 Hook
370 Rectangle
420 Color-Palette
450 Coordinate
460 Region
480 Line-Output
500 Bitmap
520 Text
530 Font
590 Graphics-Engine
600 Drag-Drop
910 DDE
920 Switch-List
930 Spool-Manager
940 Direct-Device File System
950 Print-Spooling
990 Miscellaneous
999 Functional Area
BACK - Reserved Words
REFERENCE
CONTENTS