| 1 | Cawf - nroff-like text formatter
 | 
|---|
| 2 | 
 | 
|---|
| 3 | Cawf is a C version of awf, Henry Spencer's Amazingly Workable (text)
 | 
|---|
| 4 | Formatter.  (Awf is written in awk and appears in comp.sources.unix,
 | 
|---|
| 5 | Volume 23, Issue 27.)  Cawf and awf provide a usable subset of raw nroff
 | 
|---|
| 6 | capabilities and the styles of the man(7), me(7) and ms(7) macro sets.
 | 
|---|
| 7 | One of cawf's virtues is that it will run on PC clones under MS-DOS.  It
 | 
|---|
| 8 | is also, like awf, totally independent of any licensed Unix source code.
 | 
|---|
| 9 | 
 | 
|---|
| 10 | This distribution contains complete source, make files for Unix and
 | 
|---|
| 11 | MS-DOS, documentation (raw and formatted) and MS-DOS executables for cawf
 | 
|---|
| 12 | and a companion output filters, bsfilt.
 | 
|---|
| 13 | 
 | 
|---|
| 14 | This is the fourth distribution of cawf.  Changes include:
 | 
|---|
| 15 | 
 | 
|---|
| 16 |         *  Some rudimentary output device support has been added, via a device
 | 
|---|
| 17 |            configuration file.
 | 
|---|
| 18 | 
 | 
|---|
| 19 |         *  The code has been converted to use unsigned characters.
 | 
|---|
| 20 | 
 | 
|---|
| 21 |         *  An attempt has been made to make the code ANSI C compliant.
 | 
|---|
| 22 | 
 | 
|---|
| 23 |         *  The following bugs have been fixed:
 | 
|---|
| 24 | 
 | 
|---|
| 25 |                 A bug in the locating of the device file has been corrected,
 | 
|---|
| 26 |                 so that the code performs as documented.
 | 
|---|
| 27 | 
 | 
|---|
| 28 |                 Null macro arguments are ignored.
 | 
|---|
| 29 | 
 | 
|---|
| 30 |                 Some unused arguments to local functions have been more
 | 
|---|
| 31 |                 carefully type cast to avoid portability problems.
 | 
|---|
| 32 | 
 | 
|---|
| 33 |         *  The .fl and .rn requests are now supported.
 | 
|---|
| 34 | 
 | 
|---|
| 35 |         *  Limited support has been added for the non-break request control
 | 
|---|
| 36 |            character, the acute accent (').
 | 
|---|
| 37 | 
 | 
|---|
| 38 |         *  Argument count conditionals -- operating on \n(.$ -- may now use
 | 
|---|
| 39 |            the >= and <= operators in addition to [<=>].
 | 
|---|
| 40 | 
 | 
|---|
| 41 |         *  Macros may be terminated with "..", ".", "''" or "'".
 | 
|---|
| 42 | 
 | 
|---|
| 43 |         *  String interpolation is performed if it is specified at the start
 | 
|---|
| 44 |            of the .ds request argument.
 | 
|---|
| 45 | 
 | 
|---|
| 46 |         *  The .tr request has been enhanced to handle named characters and
 | 
|---|
| 47 |            string interpolation.
 | 
|---|
| 48 | 
 | 
|---|
| 49 |         *  The SS macro is now included in man.mac.
 | 
|---|
| 50 | 
 | 
|---|
| 51 |         *  The cawf version number is now displayed in the help output.
 | 
|---|
| 52 | 
 | 
|---|
| 53 |         *  A limited -me macro set is included in me.mac.
 | 
|---|
| 54 | 
 | 
|---|
| 55 | Changes to cawf to run under Minix:
 | 
|---|
| 56 | 
 | 
|---|
| 57 |         *  The DOS binaries and make files have been removed.
 | 
|---|
| 58 |  
 | 
|---|
| 59 |         *  Tabs stops changed from per 5 to per 8.
 | 
|---|
| 60 | 
 | 
|---|
| 61 |         *  Bold and underline as it should be in device.cf.
 | 
|---|
| 62 | 
 | 
|---|
| 63 |         *  Added .SB and .TA to man.mac.
 | 
|---|
| 64 | 
 | 
|---|
| 65 |         *  Numerous prototypes added.
 | 
|---|
| 66 | 
 | 
|---|
| 67 | 
 | 
|---|
| 68 | CONTENTS
 | 
|---|
| 69 | --------
 | 
|---|
| 70 | 
 | 
|---|
| 71 | This Minix distribution of cawf includes:
 | 
|---|
| 72 | 
 | 
|---|
| 73 |         README              this file
 | 
|---|
| 74 |         *.c and *.h         source files to build cawf and bsfilt (bsfilt
 | 
|---|
| 75 |                             removes Backspaces from cawf output)
 | 
|---|
| 76 |         bsfilt.1            nroff source for the bsfilt manual page
 | 
|---|
| 77 |         cawf.1              nroff source for the cawf manual page
 | 
|---|
| 78 |         common              initialization file for CAWFLIB library
 | 
|---|
| 79 |         device.cf           output device configuration file for CAWFLIB
 | 
|---|
| 80 |                             library
 | 
|---|
| 81 |         dumb.dev            device description file for CAWFLIB library
 | 
|---|
| 82 |         Makefile            Unix-style make file
 | 
|---|
| 83 |         man.mac             man(7) macros for CAWFLIB library
 | 
|---|
| 84 |         me.mac              me(7) macros for CAWFLIB library
 | 
|---|
| 85 |         ms.mac              ms(7) macros for CAWFLIB library
 | 
|---|
| 86 |         diffs               Minix patches
 | 
|---|
| 87 | #ifdef PUTTING_IT_ON_THE_NET
 | 
|---|
| 88 |         cawf
 | 
|---|
| 89 |         bsfilt              binaries compiled under Minix-PC 1.5 using the ACK
 | 
|---|
| 90 |                             ANSI C compiler using software floating point
 | 
|---|
| 91 | #endif
 | 
|---|
| 92 | 
 | 
|---|
| 93 | 
 | 
|---|
| 94 | LIBRARY
 | 
|---|
| 95 | -------
 | 
|---|
| 96 | 
 | 
|---|
| 97 | To use cawf, you must select a location for the CAWFLIB library files.  The
 | 
|---|
| 98 | distributed cawf binary expects to find them in /usr/local/lib/cawf but you
 | 
|---|
| 99 | can alter that with the CAWFLIB environment variable, or you can change the
 | 
|---|
| 100 | CAWFLIB #define in cawf.h and rebuild cawf from the sources.
 | 
|---|
| 101 | 
 | 
|---|
| 102 | CAWFLIB contains a minimum of six files:
 | 
|---|
| 103 | 
 | 
|---|
| 104 |         common          common raw nroff commands to get cawf started
 | 
|---|
| 105 |         dumb.dev        a set of character definitions for a plain, "dumb"
 | 
|---|
| 106 |                         ASCII device - e. g., the console display, a CRT or
 | 
|---|
| 107 |                         a basic line printer
 | 
|---|
| 108 |         device.cf       the output device configuration file
 | 
|---|
| 109 |         man.mac         the man(7) macros
 | 
|---|
| 110 |         me.mac          the me(7) macros
 | 
|---|
| 111 |         ms.mac          the ms(7) macros
 | 
|---|
| 112 | 
 | 
|---|
| 113 | You may want to add your own macro files to the library.  Just name them
 | 
|---|
| 114 | "m[your-name].mac", following the usual nroff naming convention for macro
 | 
|---|
| 115 | files.
 | 
|---|
| 116 | 
 | 
|---|
| 117 | If you have fancy output devices with special character specifications, you
 | 
|---|
| 118 | may want to generate new *.dev files for them.  Follow the format of dumb.dev
 | 
|---|
| 119 | in making new character specifications.  To define characters for a new
 | 
|---|
| 120 | device, select a name prefix for it and create a file in CAWFLIB with the
 | 
|---|
| 121 | name "<prefix>.dev".  To use the new file, set the TERM environment variable
 | 
|---|
| 122 | to <prefix> - e. g., when I test cawf on Unix, I need a vt100.dev, because
 | 
|---|
| 123 | my TERM environment variable value is usually vt100.  All I do is make
 | 
|---|
| 124 | vt100.dev a symbolic link to dumb.dev.  Even that isn't even necessary,
 | 
|---|
| 125 | because cawf will use dumb.dev if it can't find TERM.dev.
 | 
|---|
| 126 | 
 | 
|---|
| 127 | In addition to the character specifications possible through the *.dev files,
 | 
|---|
| 128 | cawf provides one-time font selection and bold or italic face support for
 | 
|---|
| 129 | output devices via its -d and -f options.  Cawf can be directed to issue
 | 
|---|
| 130 | specific device codes for bold and italic characters, and one font can be
 | 
|---|
| 131 | specified for the entire document.  Cawf has some built-in output device
 | 
|---|
| 132 | support, and addition support is contained in the device configuration file,
 | 
|---|
| 133 | device.cf.  Additional devices may be defined in device.cf.
 | 
|---|
| 134 | 
 | 
|---|
| 135 | It is not necessary to generate a new *.dev file for each output device
 | 
|---|
| 136 | definition.  Only when you need special character definitions do you need to
 | 
|---|
| 137 | create a *.dev file.  The dumb.dev file is adequate for most devices you 
 | 
|---|
| 138 | define in device.cf.
 | 
|---|
| 139 | 
 | 
|---|
| 140 | 
 | 
|---|
| 141 | SOURCES
 | 
|---|
| 142 | -------
 | 
|---|
| 143 | 
 | 
|---|
| 144 | The Unix make file has some definitions that help tune it to the local
 | 
|---|
| 145 | Unix environment:
 | 
|---|
| 146 | 
 | 
|---|
| 147 |         CAWFLIB         is a string that can be used in lieu of changes
 | 
|---|
| 148 |                         to cawf.h's CWFLIB #define.
 | 
|---|
| 149 | 
 | 
|---|
| 150 |         MALLOCH         is a string that should be defined when a UNIX
 | 
|---|
| 151 |                         environment has a <malloc.h>, unless it also has a
 | 
|---|
| 152 |                         <stdlib.h> with protoypes for malloc() and its
 | 
|---|
| 153 |                         relatives.  In the latter case, you should define
 | 
|---|
| 154 |                         STDLIB, but you don't need to define MALLOCH.
 | 
|---|
| 155 | 
 | 
|---|
| 156 |         STDLIB          indicates that standard library function prototype
 | 
|---|
| 157 |                         definitions may be found in <stdlib.h>.
 | 
|---|
| 158 | 
 | 
|---|
| 159 |                         STDLIB must be defined for MS-DOS Quick C.
 | 
|---|
| 160 | 
 | 
|---|
| 161 |                         If STDLIB is not defined, the cawf sources try to
 | 
|---|
| 162 |                         define their own library function return values.
 | 
|---|
| 163 | 
 | 
|---|
| 164 |         __STR__         The definition of this string must be deleted when
 | 
|---|
| 165 |                         using the xlc 1.2 compiler on the RISC/System 6000
 | 
|---|
| 166 |                         under AIX 3.2.  Put
 | 
|---|
| 167 | 
 | 
|---|
| 168 |                                 -U__STR__
 | 
|---|
| 169 | 
 | 
|---|
| 170 |                         in the Makefile DEFS string.  This must be done
 | 
|---|
| 171 |                         because the xlc 1.2 compiler does not correctly inline
 | 
|---|
| 172 |                         string functions when compiling pass3.c.
 | 
|---|
| 173 | 
 | 
|---|
| 174 |         UNIX            switches the build environment to Unix.  You may also
 | 
|---|
| 175 |                         have to decide about MALLOCH, STDLIB, __STR__ and USG
 | 
|---|
| 176 |                         when you define UNIX.
 | 
|---|
| 177 | 
 | 
|---|
| 178 |                         Do not define UNIX for MS-DOS Quick-C; do define
 | 
|---|
| 179 |                         STDLIB.
 | 
|---|
| 180 | 
 | 
|---|
| 181 |         USG             adjusts for System V.  (UNIX must also be defined.)
 | 
|---|
| 182 | 
 | 
|---|
| 183 |                         You may also need to define USG to select the proper
 | 
|---|
| 184 |                         header file for string function prototypes.  If UNIX
 | 
|---|
| 185 |                         and USG are defined, "proto.h" selects <string.h>;
 | 
|---|
| 186 |                         if only UNIX, <strings.h>.  Cawf needs the more
 | 
|---|
| 187 |                         complete set of definitions, including strchr() and
 | 
|---|
| 188 |                         strrchr().  If <string.h> #includes <strings.h>, as
 | 
|---|
| 189 |                         is sometimes the case, define only UNIX.
 | 
|---|
| 190 | 
 | 
|---|
| 191 | I have built and tested cawf in the UNIX context under AIX 3.2 (see the
 | 
|---|
| 192 | note above on __STR__), BSD4.3-Tahoe, Sequent DYNIX, ETAV (SYSV 3.0),
 | 
|---|
| 193 | NeXTStep 3.0, SunOS 4.1.1 and Ultrix 2.2.  If you build under another Unix
 | 
|---|
| 194 | variant, you may have to adjust the source code, header files and Makefile
 | 
|---|
| 195 | to fit.  Check the Makefile first for hints.
 | 
|---|
| 196 | 
 | 
|---|
| 197 | 
 | 
|---|
| 198 | ANSI C COMPLIANCE
 | 
|---|
| 199 | -----------------
 | 
|---|
| 200 | 
 | 
|---|
| 201 | Some effort has been devoted to making the cawf sources ANSI C compliant.
 | 
|---|
| 202 | The header file proto.h contains function prototypes that enable ANSI C
 | 
|---|
| 203 | argument checking.  The state of definition of the __STDC__ symbol is used
 | 
|---|
| 204 | to select options that depend on strict adherence to the ANSI C standard --
 | 
|---|
| 205 | e.g., the need for the isascii() test before islower() or isupper().  If
 | 
|---|
| 206 | your ANSI compiler doesn't define this variable when it's acting in strict
 | 
|---|
| 207 | ANSI C mode, you may have to define it in the Makefile.
 | 
|---|
| 208 | 
 | 
|---|
| 209 | 
 | 
|---|
| 210 | MS-DOS CONSIDERATIONS
 | 
|---|
| 211 | ---------------------
 | 
|---|
| 212 | 
 | 
|---|
| 213 | The MS-DOS version of cawf was created to run under the KornShell of the
 | 
|---|
| 214 | Mortis Kern Systems Toolkit.  One ramification of using MKS' ksh is that it
 | 
|---|
| 215 | supports the separate standard error and standard output streams.  Hence,
 | 
|---|
| 216 | cawf blithely distributes its error messages to the standard error file, and
 | 
|---|
| 217 | assumes the user's shell is capable of separating them from standard output.
 | 
|---|
| 218 | 
 | 
|---|
| 219 | If you don't use the MKS KornShell, but do want to separate the output
 | 
|---|
| 220 | streams, you'll have to modify the cawf source code.  As a rudimentary aid,
 | 
|---|
| 221 | cawf uses a separate stream pointer, Efs, for writing error output, but sets
 | 
|---|
| 222 | it to stderr.  You can change that process to open a separate error file and
 | 
|---|
| 223 | set Efs to point to it.
 | 
|---|
| 224 | 
 | 
|---|
| 225 | 
 | 
|---|
| 226 | COPYRIGHTS AND CREDITS
 | 
|---|
| 227 | ----------------------
 | 
|---|
| 228 | 
 | 
|---|
| 229 | The sources are copyrighted, but freely distributable under usual terms -
 | 
|---|
| 230 | retention of credit, etc.
 | 
|---|
| 231 | 
 | 
|---|
| 232 | Please acknowledge:
 | 
|---|
| 233 | 
 | 
|---|
| 234 |         AT&T for their public-domain release of getopt(3) at the 1985
 | 
|---|
| 235 |         UNIFORUM conference;
 | 
|---|
| 236 | 
 | 
|---|
| 237 |         Chet Creider, Bob Hardy and Ted Campbell for their contributions
 | 
|---|
| 238 |         to font filtering;
 | 
|---|
| 239 | 
 | 
|---|
| 240 |         Henry Spencer for awf and his regular expression package;
 | 
|---|
| 241 | 
 | 
|---|
| 242 |         Andy Tanenbaum for his help in ANSI C compliance, including his
 | 
|---|
| 243 |         ansi.h header file from Minix.
 | 
|---|
| 244 | 
 | 
|---|
| 245 | Henry says about awf, "I can't believe I really wrote this."  Those are
 | 
|---|
| 246 | my sentiments exactly about cawf, but I also understand that necessity
 | 
|---|
| 247 | sometimes forces us to do what we would prefer to avoid.
 | 
|---|
| 248 | 
 | 
|---|
| 249 | 
 | 
|---|
| 250 | BUGS AND ENHANCEMENTS
 | 
|---|
| 251 | ---------------------
 | 
|---|
| 252 | 
 | 
|---|
| 253 | I'll be glad to hear about bugs and needs for enhancements, but make no
 | 
|---|
| 254 | promises about delivering fixes or upgrades in response.
 | 
|---|
| 255 | 
 | 
|---|
| 256 | Vic Abell <abe@cc.purdue.edu>
 | 
|---|
| 257 | 24 November 1992
 | 
|---|
| 258 | 
 | 
|---|
| 259 | 
 | 
|---|
| 260 | MINIX SPECIFIC TINKERING
 | 
|---|
| 261 | ------------------------
 | 
|---|
| 262 | 
 | 
|---|
| 263 | Kees J. Bot <kjb@cs.vu.nl>
 | 
|---|
| 264 | 26 November 1992
 | 
|---|