Sozobon C
The Sozobon C Compiler a freeware offering from Sozobon, Limited Tony Andrews Johann Ruegg Joe Treat User Reference 3/1/91 1. Introduction The Sozobon C Compiler is a complete implementation of the C language as defined by Kernighan & Ritchie and prevailing practice. The package includes a compiler, optimizer, assembler, and linker, as well as several other associated utilities. For runtime library support, version 1.2 of the public domain dLibs routines are used. Like the dLibs package, source code and executables for all components of the Sozobon compiler may be freely distributed. This document describes the various components of the system in detail. Chapter 8 contains a convenient command reference for the various utilities included in the system. Dale Schumacher's documentation for the dLibs package is provided separately. 1.1 System Overview 1.1.1 History The Sozobon compiler was originally written as a replacement front-end for the buggy Alcyon compiler. Johann had been working on the compiler for quite a while, and eventually got the rest of us interested in working on the other parts of the system. I (Tony) started working on an optimizer, mainly because I hadn't written one before and it sounded like fun. As - 1 - � Sozobon C Compiler User Reference the pieces started coming together, we discovered that there weren't any public domain assemblers that generated Alcyon-compatible objects. Joe offered to write one, filling the last major hole in the project. 1.1.2 Distribution The Sozobon C Compiler is distributed in both binary and source form. The programs and code are copyrighted, but may be freely distributed. The only restrictions are: 1. No charge may be made other than reasonable charges for reproduction. 2. Modified versions must be clearly marked as such. 3. The authors are not responsible for any harmful consequences of using this software, even if they result from defects in it. You are encouraged to make copies for friends, upload it to bulletin boards, or distribute it via networks. This is not a shareware product. We wrote this compiler because it was fun, not because we expected to make any money from it. 1.1.3 Obtaining the Source Code If you received only a binary release of the compiler (or if your binary release is incomplete or outdated), the complete source distribution can be obtained by sending $10 ($12 overseas) to: Tony Andrews 4704 Berkshire Court Boulder, CO USA 80301 Be sure to include your return address, and specify single or double-sided floppies. Checks should be payable to "Tony Andrews". Feel free to split the cost with as many people as you want. We're interested in getting the compiler distributed and used, not in spending our spare time writing floppies. The complete release comes on two single-sided floppies or one double-sided floppy containing: * all executables * source code for the compiler * source code for the utilities * documentation - 2 - � Sozobon C Compiler User Reference * dLibs, version 1.2 (including source) Most of this will be in lharc format to conserve space. Since the compiler can compile itself, you will have everything you need to hack on any part of the package. 1.1.4 Performance The compiler runs faster than Alcyon and generates code that is generally better than Alcyon's. The Alcyon compiler is smarter about register allocation and usage, but the Sozobon optimizer makes up most of the difference. Our assembler is better at generating short forms of the branch instructions, so that helps too. The code generation appears to be quite solid. None of the problems that we found during beta testing involved the code generation of the compiler, optimizer, or assembler. 1.2 Acknowledgements We'd like to thank our beta testers for their help in completing this project. Ian Lepore, in Denver, was the first to dive in and start using the compiler, and made many helpful suggestions. Dale Schumacher worked long hours to get a new release of dLibs ready and pointed out several problems. And Steve Yelvington was the first to develop a GEM application using the Sozobon compiler. 1.3 Support We're interested in receiving bug reports from people using the compiler. We use this software every day, so we have a strong interest in making sure it works right. Feel free to mail us bug reports at the address listed above. We can also be reached at the following electronic addresses: UUCP: onecom!raid5!tony Citadel: Tony Andrews @ FWBBS Bugs will be assigned priorities based roughly on the following scale: 1. Bug reports with a fix included. If you give us the fix, it will almost certainly show up in the next release. You've got the source; don't be afraid to use it. 2. Bug reports with a good description of the problem, the environment in which it occurred, and a SMALL program that reproduces the problem. - 3 - � Sozobon C Compiler User Reference 3. All others. Please try to at least isolate the problem to a small, repeatable example program. If you can find the bug and fix it, that's wonderful, but at least give us enough infomation to duplicate the bug ourselves. 2. Development Environment This section describes in more detail the operation of the compiler and the relationship between parts of the compiler and the corresponding pieces of the Alcyon compiler. The compiler works best when used with a shell like 'gulam'. There is currently little support for GEM, either in the runtime libraries, or in the commands themselves. None of the commands pause before exiting, yet. Since none of us use GEM, we don't have a very good perspective on how a GEM user would want things to work. If you've used the Alcyon compiler with GEM, you should have no trouble creating appropriate batch files for the Sozobon compiler. The compiler should be usable on machines with 512K and a single disk. This document doesn't describe the optimal layout for various ST configurations, but you can probably figure out what makes the most sense for your machine. This will probably involve a ram disk, and some arrangement of programs and libraries on one or more floppies. 2.1 Environment Variables Several environment variables may be used to alter the operation of the compiler. The variables are used to specify the location of executables, header files, libraries, and temporary files. Each variable may reference a list of directories to be searched, with elements of the list separated by commas or semicolons. The variables are: PATH executables INCLUDE header files LIB startup code and libraries TMP temporary files The "TMP" variable is currently only used by 'cc' to construct the object file list given to the loader. Reasonable defaults are assumed if these variables aren't set. The specific defaults are described later in the command references. - 4 - � Sozobon C Compiler User Reference 2.2 Machine Dependencies The supported data types and their sizes (in bytes) are: char 1 short 2 int 2 long 4 unsigned char 1 unsigned short 2 unsigned int 2 unsigned long 4 float 4 double 4 POINTER 4 Floating point is supported using the "Fast Floating Point" representation documented by Motorola and implemented by the Alcyon compiler. Both 'float' and 'double' types are supported, but are actually identical. We'd like to support the IEEE format eventually, but this will have to do for now. Any of the basic data types may be declared as register variables. Pointers occupy the A registers, all other types are placed in D registers. Five data registers and three address registers are available for use by register variables. 2.3 Compiler Limits Some limits imposed by the Sozobon compiler are: * Strings are limited to 256 characters in length * Local variables are limited to a total of 32K in size per function. * The size of a single structure or array may not exceed 32K. * Include files may not be nested more than 8 deep. * The assembler will have problems with extremely large source files that produce more than 32K of code from a single file. * Identifiers internal to a file may be of any length. * Only the first 7 characters of external identifiers are significant, and case is significant for all identifiers. (fixed in release 2.0 - hans) - 5 - � Sozobon C Compiler User Reference 2.4 Relationship to the Alcyon Compiler The components of the Sozobon compiler were developed by replacing pieces of the Alcyon compiler one by one. For this reason, a certain level of compatibility with the Alcyon system was inevitable. While the Alcyon system provided a convenient way to bootstrap a new compiler, our goal was not to be completely compatible with Alcyon. Compatibility is more in the interfaces between pieces of the compiler than in their command line options. The Sozobon compiler program replaces the pre-processor and the two compiler passes of the Alcyon system. This speeds up compilation quite a bit. The output of the compiler is suitable for input to other compatible assemblers such as Alcyon's assembler or the MadMac assembler. The optimizer is tuned in many ways to the output of the Sozobon compiler and could not (without some modifications) be used with the Alcyon compiler, or with hand-written assembly code. The Sozobon assembler was developed primarily to accept input from the Sozobon compiler (or optimizer) and doesn't support all the features of the Alcyon or MadMac assemblers. It does generate compatible object files, though, and generates smaller code since it uses 'short' branch instructions wherever possible. The Sozobon loader accepts Alcyon object files and libraries. The function of the 'relmod' program is incorporated into the loader, so a separate utility isn't needed. The other Sozobon utilities all operate on and generate Alcyon-compatible object files and libraries. 3. Component Overviews The following sections describe in detail the passes of the compiler. 3.1 Compiler The compiler is essentially compatible with the Alcyon compiler, but is stricter about type checking and will complain about things that Alcyon permits. The compiler implements the full C language as described by K&R, with the usual extensions: * bit fields * enumerations - 6 - � Sozobon C Compiler User Reference * structure assignment * structure parameters * structure return values * assembly escapes Most of the features listed above are self-explanatory. Assembly code can be embedded within C using the following syntax: asm("assembly code"); The string within quotes is passed directly to the output file. It is preceded by a tab, and followed by a newline, so these don't need to be given in the string. Extreme caution should be used when running the optimizer on C code that contains assembly escapes. The compiler has been tested with the "C Compiler Torture Test" from the Austin Code Works. This tests for full K&R compatibility. The compiler has been used to compile itself as well as many other programs totaling around 50,000 lines of code. The compiler uses the "normal" 68000 C calling conventions. Register A6 is used as a frame pointer, and function return values are placed in D0. Registers D3-D7 and A3-A5 are used to hold register variables. 3.2 Optimizer The Sozobon optimizer accepts assembly language input from the compiler and generates optimized assembly output. The optimizer is tuned to the output of the compiler and should not be used with hand-written assembly code. The optimizer performs several kinds of optimizations. Command line options can be used to control which kinds of operations are performed on the source file. The most important function of the optimizer is branch optimization. The compiler's code generation can be simplified somewhat if an optimizer is used to clean up redundant branches. Because branch optimization lays the foundation for everything else the optimizer does, this cannot be disabled on the command line. The other major part of the optimizer performs peephole optimization replacing specific instruction sequences with shorter or faster ones. From one to three instructions are re-written. The optimizer is able to ignore instructions that - 7 - � Sozobon C Compiler User Reference don't affect the validity of the optimization, so the instructions aren't necessarily adjacent. This process is aided by the use of dataflow analysis, which determines which registers are "live" at each point in a function. This part of the optimizer is more bug-prone, and can be disabled without affecting branch optimization. The current optimizer is only a start; the dataflow analysis lays the groundwork for many more peephole optimizations. The optimizer appears to be quite solid, and its use is highly recommended. The compiler depends pretty much on the optimizer to clean up useless branches, and this helps keep the compiler's code generation simple. 3.3 Assembler The assembler was designed to support the compiler and optimizer. It's small (about half the size of the Alcyon assembler) and quite a bit faster. If you want a "user-friendly" assembler, you're probably better off looking elsewhere, or hacking the features you want into our assembler yourself. Besides being smaller and faster, the Sozobon assembler does a better job of optimizing branch instruction sizes. 3.4 Linker The linker accepts Alcyon-compatible object files and libraries. It incorporates the function of the Alcyon 'relmod' program, so a separate utility is not needed. The linker can be instructed to make multiple passes over libraries if their contents are not ordered by dependency. 3.5 Utilities Besides the primary programs, there are several useful utilities provided. * The 'cc' program is used to run the passes of the compiler, avoiding the use of batch files. * The 'nm' program dumps the symbol table of object files, libraries, and executables. * The 'size' utility prints the size of text, data, and bss for objects, libraries, and executables. * The 'ar' program manages libraries of object modules. * The 'globs' program isn't very useful unless you have the Alcyon compiler. It removes local symbols from object - 8 - � Sozobon C Compiler User Reference modules and libraries. These aren't needed for linking and take up quite a bit of space. If you have Alcyon libraries that you use frequently, 'globs' can reduce their size by around 30%. (No longer include in 2.0 - hans) * An enhanced version of a public-domain 'make' utility is provided and documented in a separate file. 3.6 Library The dLibs routines, written by Dale Schumacher provide runtime support for the Sozobon compiler. We started our development using dLibs version 1.1, but worked closely with Dale as he prepared his 1.2 release to insure full compatibility with our programs. The new release is fully compatible with our compiler. 3.6.1 Startup Code The dLibs C startup code is used to link programs. 3.6.2 C Runtime Library The dLibs documentation is included in our release, since there are no changes for use with the Sozobon compiler. 3.6.3 Floating Point Library Our floating point code is included as a separate library. One traditional problem with C compilers and floating point is that as soon as you call printf(), you wind up linking in a bunch of floating point code whether you need it or not. To avoid this problem the dLibs package and our floating point library actually contain (slightly) different versions of printf and scanf. The versions in the normal library contain no support for floating point. The versions in the floating point library do support floating point. If the "-f" option is passed to "cc", the printf and scanf routines are taken from the floating point library. Otherwise, the versions in the normal library are used, and no floating point code gets linked at all, unless required by other parts of your program. We make no claims regarding the accuracy or speed of the floating point code. This code was thrown together to get something into this release, but still needs plenty of work. Only the basic operations are supported. Those of you with the Alcyon compiler can use the fast floating point library (libf) in place of our routines. Low level conversion routines between ASCII and floating point numbers are - 9 - � Sozobon C Compiler User Reference available in libf, or printf and scanf can be used by linking with the entire Alcyon runtime library. - 10 - � Sozobon C Compiler User Reference 4. Known Shortcomings and Bugs The floating point code needs more work. Unfortunately, this code isn't much fun to work on, and since none of us have much use for floating point, it probably won't receive much attention. If anyone has access to a public domain floating point library (IEEE preferred), we'd be happy to look into it for a future release. More optimization work is needed and many error cases could be handled better. 5. Next Release Plans Several items are high on the wish list for the next release. * A port of the compiler to Minix-ST is already underway. The Minix operating system comes with source code for everything except the C compiler, so the Sozobon compiler fills a void there and already contains some features (e.g. bit fields, floating point) absent in the Minix C compiler. * The assembly code produced by the compiler should refer to parameters and locals symbolically. This will make it easier to use embedded assembly within C. * Execution profiling is already well underway. This will be an option that adds instrumentation to the generated code to measure the number of calls made to each routine, and to approximate the amount of time spent in each part of the program. This can be extremely useful when trying to improve the performance of a working program. 6. Future Directions The compiler is quite usable and has already replaced Alcyon and Megamax as our standard development environment. Over time, we plan to move toward ANSI conformance. This is a very large task, impacting the runtime library as well as the compiler itself. Other possible projects: * Dale Shumacher has already done some work on a debugger, so with some more work, that would be a nice addition to a future release. * A port to the Amiga. * A version for the 8086. - 11 - � Sozobon C Compiler User Reference 7. Summary We've had fun creating this compiler. While we've been using this software for a long time ourselves, a lot of additional work went into making a release to the general public. That effort will have been well-spent if it encourages more people like us to continue developing software for the ST or if it helps more people learn C who might not have otherwise. May the source be with you... Tony Andrews Johann Ruegg Joe Treat - 12 - � Sozobon C Compiler User Reference 8. Command References 8.1 cc C Compiler driver program 8.1.1 Synopsis cc [ options ] file [ file ... ] 8.1.2 Description The cc command runs the passes of the compiler as needed to process files given on the command line. Various options exist to control the execution of cc or the compiler passes it runs. Cc recognizes file names with the following suffixes: .c C source file .s Assembly language input .o Relocatable object module .lib Library module (.a is also recognized) Normally, cc tries to form an executable image using the files given on the command line. C source files are compiled and assembled; assembly language files are passed to the assembler, and the resulting object modules are linked with any other object files or libraries given to form an executable program. The name of the executable is based on the first file name seen on the command line. If the first file name was "foobar.c", the executable would be named "foobar.ttp". The following options to the cc command may be used to alter the default operation just described: -c Supress the link phase. Leave generated object modules around. -O Run the assembly optimizer between the compiler and assembler. -S Compile C source files leaving the assembly language output in the corresponding ".s" file. -Ipath Include 'path' in the list of directories to be - 13 - � Sozobon C Compiler User Reference searched for header files (e.g. "-I\usr\include"). -Dname -Dname=value Define the pre-processor macro 'name'. If no value is given the macro is defined as 1. -Uname Un-define one of the built-in macros. For a list of the built-in macros, see the 'hcc' reference section. -o file Put the generated executable in the named file. -f Include the floating point library when linking. -m Generate a load map during the link phase. -t Put a symbol table in the generated program. -v Show the passes as they are being executed, and the version of 'cc'. -n Like -v, but don't really execute anything. -p This option enables runtime execution profiling. The compiler generates some additional code to count the number of calls to each function. Also, different startup code and runtime libraries are used. This option isn't fully supported yet. It's presence here will allow us to upgrade to support profiling without having to replace 'cc' and 'hcc'. 8.1.3 Files Cc assumes that header files, libraries, and executables can be found in the following locations: Primary location Alternate ------------------------------------------------- header files \sozobon\include \include libraries \sozobon\lib \lib executables \sozobon\bin \bin - 14 - � Sozobon C Compiler User Reference In addition to the above locations, cc also checks the root directory of the current drive as well as the current directory. If you're running a command line interpreter like 'gulam' or the Beckemeyer C Shell, environment variables can be used to override the default locations listed above. The variables "INCLUDE", "LIB", and "PATH" may contain lists of paths separated by commas or semicolons. The given paths will be searched, in order, instead of the primary and alternate paths shown above. - 15 - � Sozobon C Compiler User Reference 8.2 hcc Hans' C compiler 8.2.1 Synopsis hcc [ options ] file [ file ... ] 8.2.2 Description The hcc command accepts C source files and generates assembly language output to the corresponding ".s" files. The pre-processor and all phases of the compiler are included within this program. The following options are accepted by hcc: -Ipath Include 'path' in the list of directories to be searched for header files (e.g. "-I\usr\include"). -Dname -Dname=value Define the pre-processor macro 'name'. If no value is given the macro is defined as 1. -Uname Un-define one of the built-in macros. -V Display version information. -P Instructs the compiler to generate modified function entry code that will count the number of calls to each function. This is not fully implemented, but is provided for compatibility with a future release of the compiler. Directories listed in the "INCLUDE" environment variable are added to the list of standard locations to check for header files. Several macros are normally pre-defined. These are: MC68000, mc68000, SOZOBON, ATARI_ST, and (as applicable) TOS or MINIX. - 16 - � Sozobon C Compiler User Reference 8.3 top Tony's optimizer. 8.3.1 Synopsis top [ -vpbfd ] infile [ outfile ] 8.3.2 Description Top is an assembly-code optimizer designed for use with hcc. It accepts as input, the code generated by hcc and generates an optimized form of the assembly as output. If 'outfile' is given, the optimized code is written to the named file. If no output file is listed, the optimized code replaces the original code in the input file. Using the name "-" for the output file causes the output to be sent directly to the screen. The optimizer is normally run by the cc command, but accepts the following options when run manually: -v Display statistics about optimizations made on the file, and the version information for 'top'. -p Disable peephole optimizations. -b Disable conditional branch reversals. -f Disable data-flow analysis (live-dead register analysis) and any optimizations depending on it. -d Print detailed debugging information to stderr. The optimizer performs branch optimization as a minimum. The options above can be used to disable everything else. The optimizer will sometimes reverse the sense of a conditional branch to produce shorter code; this is disabled by the -b options. Data-flow analysis determines which machine registers contain useful data at any point in the code. This is used by other parts of the optimizer, but is also a likely source of bugs. It can be disabled with -f. - 17 - � Sozobon C Compiler User Reference Peephole optimizations are performed by looking at from one to three instructions at a time to see if a better sequence can be used. Optimizations of this kind are disabled with -p. If a bug is found in the optimizer, the options -bfp can be used together to eliminate more advanced features while still gaining the benefit of the more reliable (and quite useful) branch optimizer. - 18 - � Sozobon C Compiler User Reference 8.4 jas Joe's assembler. 8.4.1 Synopsis jas [ -NVlu ] [ -s dir ] [ -Ln ] [ -o file ] file 8.4.2 Description The jas assembler is designed for compatibility with the Alcyon assembler. It doesn't provide many features the assembly language programmer might want, but is intended more for use by a compiler front-end. Jas generally produces smaller code than the Alcyon assembler because it is smarter about generating short branch instructions. Also, jas uses no temporary files and runs quite a bit faster than Alcyon. Some of the command line options are accepted for compatibility with the Alcyon assembler, but are actually ignored. The following command line options are supported: -N Don't generate 'short' branch instructions. -V Print a version message. -l -u -s dir Ignored. -Ln By default, no local symbols are placed in the symbol table of the output. This option instructs jas to put all symbols into the symbol table if n is 2 or greater. If the option '-L1' is given, symbols whose name doesn't start with 'L' are written to the symbol table. -o file Be default, the assembler replaces the '.s' file extension of the input file with '.o' to form the name of the output. This option can be used to write the output to any file. - 19 - � Sozobon C Compiler User Reference 8.5 ld Loader 8.5.1 Synopsis ld [ -mvnbp ] [ -f file ] [ -o output ] [ -u symbol ] ... file ... 8.5.2 Description The ld command links object modules and libraries to form an executable program. Both object modules and libraries may be passed to ld for linking. Several options may be specified to alter the operation of the loader: -m Generate a load map -t Put a symbol table in the output file. -p Make multiple passes over each library until no more references can be satisfied. If libraries are ordered appropriately, this option is not needed and linking will be faster. -b This option can be used when linking large programs to reduce the amount of memory used by the loader. The loader makes more disk accesses when this option is used. -f file This option is useful when many files are to be linked. The loader reads the file name specified for a list of object modules and libraries to be linked. Names in the file should be separated by white space or newlines. -o file By default, the name of the executable file created is based on the first file name given on the command line. An initial file name of "foobar.o" would result in a program named "foobar.ttp". This option allows a different name to be specified. -u symbol The given symbol is marked as undefined. This can be useful when linking from libraries. A symbol (e.g. - 20 - � Sozobon C Compiler User Reference _main) can be marked as undefined to force loading from the library. -v Tells the loader to be verbose about what it's doing, and print version information. - 21 - � Sozobon C Compiler User Reference 8.6 size Prints program sizes 8.6.1 Synopsis size [ -oxV ] file ... 8.6.2 Description The size command examines object modules or libraries and prints information about their size. By default, for each module (or member of a library), the size of the text, data, and bss sections are printed in decimal. The 'o' and 'x' options can be used to print the sizes in octal or hexadecimal respectively. If the 'V' option is given, the version number of 'size' is printed. - 22 - � Sozobon C Compiler User Reference 8.7 nm Prints symbol tables 8.7.1 Synopsis nm [ -g ] file ... 8.7.2 Description The nm command dumps the symbol table of all object files, libraries or executables given on the command line. If the 'g' option is given, only information about global symbols is printed. - 23 - � Sozobon C Compiler User Reference 8.8 ar Archive management program 8.8.1 Synopsis ar -{drqtpmx}[vcV] afile [ file ... ] 8.8.2 Description The ar command is used to maintain object module libraries. It can perform one of seven basic operations as selected by a command character. The operation of the selected command can be modified by other option characters that may follow it. The name of the archive to be manipulated follows the option characters. Some commands also require (or allow) the names of files in the archive to follow the archive name on the command line. The following commands are supported. d Delete the named files from the archive. r Replace the named files in the archive. New files are placed at the end of the archive. q Quickly append the named files to the end of the archive. t Print the contents of the archive. If file names are given, only show those files. p Print the named files to the standard output. m Move the named files to the end of the archive. x Extract the named files from the archive, or all files if none were listed on the command line. The following characters modify the operation of the commands described above. v Generally show more information about what ar is - 24 - � Sozobon C Compiler User Reference doing. In a table of contents, show information about the size, mode, etc. c Suppress the message normally printed when a new archive is created. V Prints version information. - 25 - � Sozobon C Compiler User Reference 8.9 globs Remove non-global symbols 8.9.1 Synopsis globs file ... 8.9.2 Description The named files (object modules or libraries) are compressed by removing non-essential symbols from their symbol table. Since the Sozobon assembler does this by default, this program it mostly useful to users with old Alcyon libraries. This is no longer included with release 2.0. - 26 - � Table of Contents 1. Introduction ................................. 1 1.1 System Overview ........................... 1 1.1.1 History ............................. 1 1.1.2 Distribution ........................ 2 1.1.3 Obtaining the Source Code .............. 2 1.1.4 Performance ......................... 3 1.2 Acknowledgements ......................... 3 1.3 Support .................................. 3 2. Development Environment ....................... 4 2.1 Environment Variables ..................... 4 2.2 Machine Dependencies ...................... 5 2.3 Compiler Limits ........................... 5 2.4 Relationship to the Alcyon Compiler .......... 6 3. Component Overviews ........................... 6 3.1 Compiler ................................. 6 3.2 Optimizer ................................ 7 3.3 Assembler ................................ 8 3.4 Linker ................................... 8 3.5 Utilities ................................ 8 3.6 Library .................................. 9 3.6.1 Startup Code ......................... 9 3.6.2 C Runtime Library ..................... 9 3.6.3 Floating Point Library ................ 9 4. Known Shortcomings and Bugs ..................... 11 5. Next Release Plans ............................. 11 6. Future Directions ............................. 11 7. Summary ...................................... 12 8. Command References ............................ 13 - I - � 8.1 cc ....................................... 13 8.1.1 Synopsis ............................ 13 8.1.2 Description ......................... 13 8.1.3 Files ............................... 14 8.2 hcc ...................................... 16 8.2.1 Synopsis ............................ 16 8.2.2 Description ......................... 16 8.3 top ...................................... 17 8.3.1 Synopsis ............................ 17 8.3.2 Description ......................... 17 8.4 jas ...................................... 19 8.4.1 Synopsis ............................ 19 8.4.2 Description ......................... 19 8.5 ld ....................................... 20 8.5.1 Synopsis ............................ 20 8.5.2 Description ......................... 20 8.6 size ..................................... 22 8.6.1 Synopsis ............................ 22 8.6.2 Description ......................... 22 8.7 nm ....................................... 23 8.7.1 Synopsis ............................ 23 8.7.2 Description ......................... 23 8.8 ar ....................................... 24 8.8.1 Synopsis ............................ 24 8.8.2 Description ......................... 24 8.9 globs .................................... 26 8.9.1 Synopsis ............................ 26 8.9.2 Description ......................... 26 - II -