![]() | ![]() | Application Development |
This appendix describes utilities that are useful in the development process.
Converts binary files into C data structures
bin2c [-fluv]asciiFileinputFile...
-f- Overwrite an existing output file.
-l- Convert filenames sent to output to lower case.
-u- Make array of
UCHARinstead of char.-v- Generate list of files processed.
asciiFile- Name of the output file.
inputFile- Name of the input file.
bin2cconverts Prolifics binaries—screens, menus, and JPL modules—into C character arrays. Whenbin2ccreates the ASCII C file, it generate an array for each of the binary input files. An array in the file has one of these two forms:char inputFile[] = { contents of file };
UCHAR inputFile[] = { contents of file };where
inputFileis the name of the source binary file with its path and extension stripped off. If you use the -l option,inputFileis in lower case.Files created with
bin2carrays can be compiled, linked with your application, and added to the memory-resident form list withsm_formlist. For more information on memory-resident lists, refer to this function and to page . The following files can be made memory-resident:
Converts binary screen to hexadecimal ASCII file
bin2hex -c[flv]asciiFilescreen...bin2hex -x[flv]asciiFile
-c- Create an ASCII file from one or more screens.
-f- Overwrite an existing file.
-l- Convert filenames in output to lower case.
-v- Generate list of files processed.
-x- Extract all screens contained in an ASCII source; selective extraction is not supported.
asciiFile- Specifies the name of the ASCII output file or ASCII input file if using the -x option.
screen- Name of a screen to convert to hexadecimal.
bin2hexconverts binary files to and from hexadecimal to let you port Prolifics screens across different systems. By default, the screen editor creates binary screen files.With the -c option, all named binary input files (screen) are converted to hexadecimal ASCII and added to
asciiFile. Path names are stripped off; extensions are left intact. With the -x option,bin2hexextracts each screen in the specifiedasciiFileand puts each file, in binary format, in the current directory.Selective extraction of screens from
asciiFileis not supported. Only one argument is supported with the -x option; additional arguments are ignored.
Updates screens and reports with inherited property values from repository
binherit [ -rrepository] [ -v level ] [ -u ] -llibrary[libMember...]
-llibrary- Name of the library from which to read for updating all members or individual library members (
libMember).-rrepository- Name of the repository from which to inherit. If not specified,
binheritchecks the value ofSMDICNAME. If the variable is not set, the utility seeks a repository named data.dic in the current directory and alongSMPATH. If unable to find the repository, an error is issued.-u- Update the screens/reports as well as listing the differences.
-vlevel- Specify level of detail to report: 0: No reporting.1: List screens as they are processed (the default setting). 2: List screens and widgets as they are processed. 3: List screens, widgets, and properties as they are processed.
binheritopens the named library and searches all or specified library members for widgets having the Inherit From property set to a repository entry in the open repository, for example,titles!title_id. For those widgets, it compares the inherited property values with the values in the repository. The properties that have inheritance disabled are ignored.If the screen's Inherit From property is set, it compares the values in the inherited screen properties with the corresponding values in the repository.
If the -u option is specified, it updates the file with the repository value; however, this option will be ignored for members of libraries that can only be opened read-only.
The following list describes possible errors, their causes, and the corrective action to take:
Converts configuration map files to binary
cmap2bin [-pv] [-eext]mapFile...
- -e
ext- Use the specified ext extension in the output file name instead of the default bin extension.
-p- Place the output file in the same directory as the input file.
-v- Generate a list of files processed.
mapFile- Name of ASCII configuration map file; more than one input file can be specified.
cmap2binconverts one or more ASCII configuration map files to a binary format for use by Prolifics.
cmap2binautomatically appends the binary filename with the bin extension unless you specify a different extension with the -e option. It places the binary output file in the directory where you run the utility.
The following list describes possible errors, their cause, and the corrective action to take:
Converts screens, service components and reports between binary and ASCII format
f2asc -a[cf]asciiFile[ -iheaderFile]binaryFile...f2asc -b[f]asciiFile
-a- Create ASCII listing of one or more screens, service components and/or reports.
-b- Extract all binary files (screens, service components, reports) from an ASCII listing. This option does not accept an output filename.
-c- Do not generate comment lines (-a option only).
-f- Overwrite an existing file.
- -i
headerFile- Include specified
headerFileat beginning of ASCII output.asciiFile- With -
aoption, name of the file to receive ASCII version ofbinaryFile. With -boption, name ASCII file to convert back to binary format.binaryFile- Filename of screen, service component or report to convert to ASCII.
f2asclets you create an ASCII listing of the contents of a screen, service component or report (-a); and convert them back to binary format using the -b option. By default, the editor creates binary files.With -a, you must specify the name of at least one screen/component/report (or use wildcard characters). With -b, names are ignored. The -b option automatically extracts all files from the specified
asciiFile.f2ascis typically used for documenting applications. It is also useful for editing tasks that are best performed by text editors—for example, global search and replace operations.
The text file generated by
f2ascdescribes the contents of the screen, service component or report—the widgets that compose it and their respective properties. It is broken into sections by object type, starting with the screen/component/report itself, and identifies the object by name, if it has one. Subsequent statements in the section describe each object through attribute keywords.
A:layoutAreaName- A layout area in a report.
B:widgetName- A non-field widget: box, line, grid frame, or graph.
C:logicalKey- Identifies a logical key that is associated with a control string. The subsequent
ACTIONstatement contains the control string itself.F:fieldName- The name of a field (including text, check box, push button, link, dynamic label, and dynamic output widgets).
G:groupName- Selection group.
I:- Service component's interface definition.
L:staticLabelName- Static label.
R:reportName- Name of the report. All report files begin with this entry.
S:screenName- Name of the screen. All screen files begin with this entry.
T:tableViewName- Table view widget.
Y:syncGroup- Synchronized scrolling group.
Comment lines begin with a pound (#) character. For example:
Two types of expressions are used to specify the properties:
- A boolean expression is a string that sets a property to be on or off; its absence implicitly sets the same property to the opposite value. For example,
CIRCULARspecifies that an array's circular property is set toPV_YES; its absence means that circular is set toPV_NO. The following statements contain two boolean expressions: the first sets a widget'sautotabproperty toPV_NO; the second sets itsinput_protectionproperty toPV_YES:
NO-AUTOTAB
PROTECTED FROM DATA-ENTRY- An assignment expression explicitly assigns a value to a property. For example, the following statements assign values for several widget Geometry properties:
LENGTH=15 ARRAY-SIZE=5 VERT-DISTANCE=1
MAX-LENGTH=255 SHIFT-INCR=8
There are two types of keywords describing object properties, flags and values:
- A flag keyword is by itself and requires no other information—for example the
NUMERICkeyword represents the numeric field type property and needs no value. A flag keyword can appear on the same line as other keywords.
Creates and maintains libraries and repositories
formlib -c [-fluv]library[filename...]formlib -r [-fluv]libraryfilename[filename...]formlib -{d|x|t} [-fluv]library[memberName...]formlib -{e|i|m|o|s|w} [-v]libraryformlib -gcfgStr[-v]library
-c- Create a new library/repository that optionally contains the files named (filename). If no files are specified, an empty library is created.
-d- Delete the named members from the library/repository.
-e- Configure the library/repository for external file locking scheme.
-f- Overwrite a library member or repository entry.
-qcfgStr- Define a configuration management string; begins with the name of your configuration management system—either "sccs" or "pvcs" (in lower case). For information about source control management options, refer to page .
-i- Configure the library/repository for internal (operating system) file locking scheme.
-l- Convert filenames to lowercase before processing.
-m- Compact the library by removing unused space. The original library is kept as
libname.old. The compacted library will have read-write permissions and be configured to use internal file locking. (Only Panther and Prolifics libraries can be compacted.)-o- Configure the library/repository to be read-only. This operation is not reversible unless the library is compacted.
-r- Replace/add the named files to the library/repository.
-s- Synchronize the specified library with the source code management directory.
-t- Generate a list of the library/repository contents.
-u- Convert filenames to uppercase before processing.
-v- Display information in verbose mode. Generates a list of files processed. When used in conjunction with the -t flag, produces a detailed listing of the library contents.
-w- Upgrade pre-Prolifics library/repository.
-x- Extract (copy) the named files from specified library/repository. If none are named, all are extracted. Do not include wildcard specifiers in the filename.
filename- Name of file to be included in library or repository.
library- Name of library/repository.
memberName- Name of library member or repository entry.
formliblets you create and maintain libraries/repositories in which you store application components, such as screens, menus, and JPL files. You can store ASCII files in a Prolifics library; however, only binary files are accessible at runtime or through the screen editor.
formlibcan also be used to maintain and get information about libraries and repositories; for example, you can put a library/repository under source management control, or get a list of its contents.File specifications can include any wildcard or pattern-matching symbols that are valid for your operating system. For example, this command puts all files with the .
jamextension into the libraryscreens.lib:formlib -c screens.lib *.jamLibrary member specifications must be explicit; no wildcards can be used.
The -l and -u options are useful for operating systems like UNIX that are case-sensitive. For example, the following UNIX command creates the library
new.liband adds all *.jamfiles in the current directory to it; all files receive lowercase names—for example,MAIN.SCRis identified asmain.scr.formlib -cl new.lib *.jam
Access to libraries requires both read and write locking. Locking of libraries is unrelated to source control management, as the latter affects access to individual library members (and their archived versions) during development, whereas the former controls access on an as-needed basis to the library file as a unit during development and at runtime.
Libraries require write locks to provide exclusive access during the brief moments when a library is being written to. Read locks allow others to read from the library, but prevent the library from being written to while it is being read. Read-only libraries that have been marked so (via the -o flag) do not need any locking at all since they cannot be written to under any circumstances.
You can configure a library to use either one of two file-locking schemes. By default, the internal (native operating system) file locking system is used. Use the -e flag to instead implement an external locking scheme. External locking can be used if internal locking is not available in your environment. It creates an empty exclusive-access file called
libname.jlkto implement write locking, and keeps a count of the current readers in a shared read lock file calledlibname.rlk. The .jlkand .rlkfiles are created in the same directory as the library. They are checked or modified when access to the library is attempted. The write lock file is deleted when access is completed; the read lock file is not. Also, the library is marked so that it knows to use external locking. Use the -i flag to clear the external locking mark in the library, so that it will henceforth use internal locking.Though external locking is portable, it has two drawbacks that make internal locking the preferable choice, where available. First, it tends to be slower than internal locking. Secondly, if processes die abruptly—due to signals, operator intervention, and so on—write lock files can be left hanging around, or read locks can have counts that never go to zero. This impedes further access until a recovery procedure (stop all processes, delete the lock files) is performed. With internal locking the operating system automatically performs all clean up when processes abruptly die.
By default, libraries are created to use internal file locking. However, if a library is created on a platform where internal locking is not available, locking defaults to external. On such platforms, attempts to set internal locking are ignored. External locking might be necessary in cross-platform network environments where the network locking facilities are inadequate. Refer to your operating system's installation notes for further information about which file locking scheme is used on your platform and/or network environment.
Use of the -o flag makes a library read-only. This is not a reversible operation unless the library has been compacted (-m).
When the read-only operation is not reversible, in order to write to a read-only library, you have to create a new library, extract the members from the read-only library, and move them into the new library. Read-only libraries generally provide quicker access.
Library copies of screens can become unsynchronized with source management directories. This can happen if screens are extracted and edited directly with the source code management tool as opposed to using the screen editor interface to check screens in and out.
Run
formlibwith the -s option to ensure that your libraries are synchronized with the source management directory. The specified library is moved to a new library with the same name, but with a .jbl(backup library) extension, and a new library is created, having the name of the original library. Any screens that were not under source code management are copied from the backup library to the new library. Screens that were under source management, but were checked out whenformlibwas executed are also copied from the backup library to the new library.All screens that are under source code management and checked-in when
formlibwas executed are copied from the source code management directory to the new library. In this way, you can be assured that your libraries contain the latest revisions before distributing your libraries.
Converts JIF between binary and ASCII format for JetNet and BEA Tuxedo applications
jif2asc -a [-fp]ascJIF binJIFjif2asc -b [-fp]ascJIF binJIF
-a- Create ASCII JIF named
ascJIFfrom specified binary binJIF.-b- Create binary JIF named
binJIFfrom specified ascJIF.-f- Overwrite an existing file.
-p- Write the output file to the directory containing the input file.
ascJIF- Name of ASCII JIF to be converted or created.
binJIF- Name of binary JIF to be converted.
JetNet and BEA Tuxedo applications require a binary JIF for execution. In the JIF editor, the JIF is saved as binary. The
jif2asccommand-line utility lets you convert a JIF between ASCII and binary formats.Both input and output files must be named, there is no default naming convention. The output file is created in the current directory, unless the -p option is used to indicate that the output file is to be written in the same directory as the input file.
An attempt to overwrite an existing file without using the -f option produces an error message and no file is written.
Converts JPL modules between binary and text formats
jpl2bin -a [ -fpv] [ -eext]binary...jpl2bin -b [ -rfpv] [ -eext]textFile...jpl2bin -sbinary...
-a- Convert compiled JPL to source (default extension is *.
jpl).-b- Compile JPL from source to binary format (default extension is *.
bin).-eext- Replace the default bin extension with the specified extension (ext) on the binary output filename. There should be no space between the -e switch and the extension name. To omit an extension, supply a value of - (dash) for ext; for example, -e-.
-f- Permit the output file to overwrite an existing file.
-p- Output the binary file to the same directory as input file.
-r- Exclude source from compiled binary. Useful for removing source from a production distribution. However, without the source, the module cannot be edited within the screen editor.
-s- Strip source from the compiled binary (overwrites input).
-v- List the name of each file as it is processed.
binary- Name of the compiled JPL file.
textFile- Name of the source text file.
jpl2binlets you compile JPL modules before storing them in a library or before making them memory-resident. Under UNIX, runjpl2binfrom the command line; under Windows, choose thejpl2binicon.Note: Prolifics always performs colon preprocessing at runtime; therefore, a module is fully compiled only when it executes.
jpl2binsaves the module to a file of the same name with a *.binextension, unless you specify a different extension.
Converts menu files between binary and ASCII formats
m2asc -a [ -fv ] [ -iincludeFile]asciiFilemenuFile[menuFile...]m2asc -b [ -fv ]asciiFile[asciiFile...]
-a- Convert specified binary menu files to ASCII.
-b- Convert the specified ASCII files to binary.
-f- Overwrite an existing file.
-iincludeFile- Include specified
includeFileat the beginning of ASCII output.-v- Generate a list of files as they are processed.
asciiFile- Name of ASCII file as output with -a or as input file input with -b.
menuFile- Name of binary menu file (as extracted with
formlibutility).
The
m2ascutility lets you convert binary menu files to ASCII and vice versa. You must extract the menu file from its library with theformlibutility before usingm2asc.ASCII menu definitions define a menu as a hierarchy, where the top-level menu and its items are defined first along with global menu properties, followed by submenus and their items. Each component of a menu definition is identified by a keyword (refer to Table A-1 and, optionally, a unique name.
Each menu and menu item definition has properties; these properties are specified immediately below the component's identifier. For example, the following statements define a submenu item myoption: its label is Options with a keyboard mnemonic of O; it invokes the menu
myoptionsub; and it is initially available for selection (ACTIVE=YES):SUBMENU:myoptionLABEL=&OptionsSUBMENU=myoptionsubACTIVE=YESRefer to Table 15-1 for a list of menu-specific properties.
The following menu script is the ASCII output of a truncated version of the menu bar used by Prolifics's screen editor. The example includes two of the main menu options and their associated submenus: File and Help.
FILE:semain
MENU:sm_se_main_menu
TEAR=NO
EXTERNAL=NO
ACTIVE=YES
INDICATOR=NO
SHOW-ACCEL=YES
SEP-STYLE=SINGLESUBMENU:sm_se_file
LABEL=&File
SUBMENU=sm_se_file_menu
IS-HELP=NO
EXT-HELP-TAG=basicFilemenu
STAT-TEXT=File OperationsSUBMENU:sm_se_help
LABEL=&Help
SUBMENU=sm_se_help_menu
IS-HELP=YES
STAT-TEXT=Get Help!MENU:sm_se_file_menu
TEAR=NO
EXTERNAL=NO
ACTIVE=YES
INDICATOR=NO
SHOW-ACCEL=YES
SEP-STYLE=SINGLESUBMENU:sm_se_new
LABEL=&New
SUBMENU=sm_se_new_menu
IS-HELP=NO
EXT-HELP-TAG=FileNew
STAT-TEXT=Create new screenSUBMENU:sm_se_open
LABEL=&Open
SUBMENU=sm_se_open_menu
IS-HELP=NO
EXT-HELP-TAG=FileOpen
STAT-TEXT=Open existing screenACTION:sm_se_save
LABEL=&Save
CONTROL=^jm_keys PF5
ACTIVE=YES
IS-HELP=NO
EXT-HELP-TAG=FileSave
ACCEL=PF5
ACCEL-ACTIVE=NO
SHOW-ACCEL=YES
DISPLAY-ON=BOTH
STAT-TEXT=Saves the current screen
ORDER=18
ACTIVE-PIXMAP=save-act
INACTIVE-PIXMAP=save-dis
TOOL-TIP=SaveACTION:sm_se_set_test
LABEL=&Test Mode
CONTROL=^jm_keys PF2
IS-HELP=NO
EXT-HELP-TAG=FileTestMode
ACCEL=PF2
ACCEL-ACTIVE=NO
SHOW-ACCEL=YES
DISPLAY-ON=BOTH
STAT-TEXT=Switch to Test Mode
ORDER=19
ACTIVE-PIXMAP=test-act
TOOL-TIP=Test ModeSEP:sm_se_file_sep2
SEP-STYLE=SINGLEACTION:sm_se_exit
LABEL=E&xit
CONTROL=^jm_keys CLAPP
ACCEL=CLAPP
IS-HELP=NO
EXT-HELP-TAG=FileExit
ACCEL-ACTIVE=NO
SHOW-ACCEL=YES
STAT-TEXT=Exit the editorMENU:sm_se_new_menu
TEAR=NO
EXTERNAL=NO
ACTIVE=YES
INDICATOR=NO
SHOW-ACCEL=YES
SEP-STYLE=SINGLEACTION:sm_se_new_screen
LABEL=&Screen
CONTROL=^filemenu new screen
IS-HELP=NO
EXT-HELP-TAG=FileNew
SHOW-ACCEL=YES
DISPLAY-ON=BOTH
STAT-TEXT=Creates new untitled screen
ORDER=11
ACTIVE-PIXMAP=new-act
INACTIVE-PIXMAP=new-dis
TOOL-TIP=New ScreenACTION:sm_se_new_jpl
LABEL=&JPL
CONTROL=^filemenu new jpl
IS-HELP=NO
EXT-HELP-TAG=FileNew
SHOW-ACCEL=YES
STAT-TEXT=Creates new jplACTION:sm_se_new_dd_entry
LABEL=Repository &Entry...
CONTROL=^filemenu new ddentry
IS-HELP=NO
EXT-HELP-TAG=FileNew
SHOW-ACCEL=YES
STAT-TEXT=Create new repository entryACTION:sm_se_new_lib
LABEL=&Library...
CONTROL=^filemenu new lib
IS-HELP=NO
EXT-HELP-TAG=FileNew
SHOW-ACCEL=YES
STAT-TEXT=Create a new libraryMENU:sm_se_open_menu
TEAR=NO
EXTERNAL=NO
ACTIVE=YES
INDICATOR=NO
SHOW-ACCEL=YES
SEP-STYLE=SINGLEACTION:sm_se_op_lib
LABEL=&Library...
CONTROL=^filemenu open lib
IS-HELP=NO
EXT-HELP-TAG=FileOpen
SHOW-ACCEL=YES
STAT-TEXT=Open libraryACTION:sm_se_op_db
LABEL=D&atabase...
CONTROL=^dm_handle_connect 1
ACTIVE=NO
IS-HELP=NO
EXT-HELP-TAG=FileOpen
SHOW-ACCEL=YES
STAT-TEXT=Open databaseMENU:sm_se_help_menu
TEAR=NO
EXTERNAL=NO
ACTIVE=YES
INDICATOR=NO
SHOW-ACCEL=YES
SEP-STYLE=SINGLEACTION:sm_se_hl_topic
LABEL=Current &Topic ...
CONTROL=^jm_keys HELP
IS-HELP=NO
STAT-TEXT=Shows help on what you're doing
ORDER=191
DISPLAY-ON=BOTH
ACTIVE-PIXMAP=help-act
INACTIVE-PIXMAP=help-dis
TOOL-TIP=HelpSEP:sm_se_hl_sep1
SEP-STYLE=SINGLE
ORDER=190
DISPLAY-ON=BOTHACTION:sm_se_hl_about
LABEL=&About Prolifics ...
CONTROL=^sm_message_box( \
"Prolifics Version 1.0%NCopyright 1994-1996%NJYACC Inc.", \
"About Prolifics",0,"")
STAT-TEXT=Tells about this version of Prolifics
Converts ASCII message files to binary format
msg2bin [-pv] [-eext]msgFile...msg2bin [-pv] [-ofile]msgFile...
- -e
ext- Replace default bin extension on the output file with the given extension (ext). If the -o option is used, -e is ignored.
- -o
file- Output is placed in a single specified file. Use this option to concatenate your user messages to Prolifics-messages in a single binary file. This option will overwrite an existing binary message file of the same name.
-p- Place each binary output file in the same directory as the corresponding input file.
-v- List the name of each input message file as it is processed.
msgFile- Name of ASCII file containing named messages. More than one input file can be specified.
msg2binconverts ASCII message files to a binary format for use by Prolifics library functions. The output ofmsg2binis a binary file; the utility uses theTAGsto distinguish between system and user messages. It numbers user-defined messages consecutively starting with the class number times 0x1000 (refer to page for more on defining user classes). If no classes are defined, user-defined messages are automatically numbered consecutively starting from zero; the definitions of system messages are taken from smerror.h. Be sure to maintain the order of messages and the assignment of their identifiers. Use these identifiers in the application pro grams to invoke the desired messages at runtime. Then recompile and link any non-JPL source that includes any files that contain newly defined messages.Errors
The following list describes possible errors, their cause, and the corrective action to take:
Creates a header file of user messages
msg2hdr [-dfjpv] [-nnum] [-spfix] [-xpfix] [-ofile] [-eext]msgFile...
-d- Decimal base in the output header file. Default is base 16 (hexadecimal).
- -e
ext- Replace default extension (h or jpl) on the output file with the specified extension (ext).
-f- Output file may overwrite an existing file.
-j- Create a JPL global variable file from the msgfile.
-nnum- Start numbering messages with the specified num for the first #define or global. If no number is entered, 0 (zero) is used.
-ofile- Direct output to the named file.
-p- Place output file in the same directory as the corresponding input file.
- -s
pfix- Select only message names beginning with the specified prefix (
pfix).-v- Generate list of the files processed.
-xpfix- Prepend the specified prefix (pfix) to the tag portion of the message.
msgFile- Name of ASCII file containing your application's messages.
msg2hdrconverts an ASCII message file that contains your application's messages to a C header file. The output ofmsg2hdris a .h file with #define statements for each user message tag. The messages are numbered sequentially starting with 0x0 to 0xF. The message portion is copied to the header file as a comment.For example, a user message file with multiple sections might look like this:
"U0" = 0
U0_BADVAL = Bad value
U0_WRONGDATE = Date must be within 30 days of current date
"U1" = 1
WRONGRATE = This is not the applicable rateThis yields the following output:
#define U0_BADVAL 0x0 /* Bad value */
#define UO_WRONGDATE 0x1 /* Date must be within 30 \
> days of current date */
#define WRONGRATE 0x1000 /* This is not the \
> applicable rate */If you use the -joption,msg2hdryields this output:global U0_BADVAL(1) = 0 /* Bad value */
global U0_WRONGDATE(1) = 1 /* Date must be within 30 \
> days of current date */
global WRONGRATE(4) = 4096 /* This is not the \
> applicable rate */
The following list describes possible errors, their causes, and the corrective action to take:
Converts styles file between binary and ASCII formats
s2asc -a [-f]asciiFilestyles.stys2asc -b [-f]asciiFile
-a- Create ASCII listing of
styles.sty. The styles file must be namedstyles.sty.-b- Create a binary style file from an ASCII listing. The name of the binary file corresponds to the name specified in the s: name option in the ASCII file. To have this binary file accessed by your application, change the name of the file to styles.sty.
-f- Overwrite an existing
styles.styfile.asciiFile- With the -a option, name of the file in which to place the ASCII styles settings. With the -b option, name of the file containing ASCII text for conversion to binary format.
The
s2ascutility must be executed from the command line. With the utility, you can convert yourstyles.styfile between binary and ASCII format. After converting an ASCII file to binary withs2asc, useformlibto put it in the appropriate library. You might do this in order to place the file under source control management or to document or review the contents of the file.The text files generated by
s2asccontain a list of the property settings for each style, followed by a list of the styles assigned to each class.
![]()
![]()
![]()
![]()