| 1.1 | Example of an annotated listing  | 11 | 
| 1.2 | UML-based diagram notation  | 12 | 
| 2.1 | The Unix echo program  | 21 | 
| 2.2 | Expanding tab stops (declarations)  | 26 | 
| 2.3 | Expanding tab stops (main part)  | 27 | 
| 2.4 | The getopt manual page  | 29 | 
| 2.5 | Expanding tab stops (supplementary functions)  | 36 | 
| 2.6 | The goto statement used for a common error handler  | 43 | 
| 2.7 | The use of goto to reexecute code  | 44 | 
| 2.8 | Exiting a loop using the goto statement  | 45 | 
| 2.9 | A conditional expression formatted like an if statement (left) and like cascading if--else statements (right)  | 47 | 
| 2.10 | Location detection code replacing the conditional expression  | 48 | 
| 2.11 | Binary search implementation  | 56 | 
| 2.12 | Maintaining the binary search invariant  | 58 | 
| 3.1 | Pointer access for an array-based stack  | 65 | 
| 3.2 | Parameterization using function arguments  | 68 | 
| 3.3 | Accessing internal type representation using a union  | 84 | 
| 3.4 | Dynamic storage allocation  | 85 | 
| 3.5 | Memory allocation readjustment  | 86 | 
| 4.1 | A structure pointer as a table cursor  | 102 | 
| 4.2 | A pointer-based matrix  | 104 | 
| 4.3 | Explicit matrix element access  | 105 | 
| 4.4 | A stack abstract data type  | 106 | 
| 4.5 | A queue with an explicit element count  | 110 | 
| 4.6 | Table-driven program operation  | 112 | 
| 4.7 | Hash function and hash table access  | 115 | 
| 4.8 | Linked list definition and basic operations  | 118 | 
| 4.9 | A singly linked list  | 118 | 
| 4.10 | A doubly linked list  | 121 | 
| 4.11 | Adding an element in a doubly linked list  | 123 | 
| 4.12 | A circular linked list  | 123 | 
| 4.13 | A hash table of linked lists  | 124 | 
| 4.14 | A binary tree of name server Internet addresses  | 127 | 
| 4.15 | Parse tree generated by lint for kp->flags & F-NEEDARG && !(ip->arg = *++*argvp)  | 130 | 
| 4.16 | Graph nodes accessed through an array of linked lists  | 133 | 
| 4.17 | A three-node graph and its representation in tsort  | 134 | 
| 4.18 | A simple call graph  | 136 | 
| 4.19 | A call graph represented as a gprof data structure  | 136 | 
| 4.20 | Program dependencies represented by a Makefile  | 138 | 
| 4.21 | Program dependencies represented in a make data
structure  | 138 | 
| 5.1 | Bourne shell command grammar  | 144 | 
| 5.2 | Recursively printing the parsed command tree  | 146 | 
| 5.3 | Recursive descent parser for shell commands  | 148 | 
| 5.4 | Tail recursion used instead of a loop  | 149 | 
| 5.5 | Exception handling in Java  | 150 | 
| 5.6 | Exception propagation across method calls  | 152 | 
| 5.7 | Work crew multithreaded code  | 157 | 
| 5.8 | Boss/worker multithreaded code  | 158 | 
| 5.9 | A code block protected by mutual exclusion locks  | 158 | 
| 5.10 | Spawning off a separate process to send mail  | 160 | 
| 5.11 | Potential security hole created by passing unverified arguments to the shell  | 161 | 
| 5.12 | Pipeline to summarize a list of compressed manual page files  | 161 | 
| 5.13 | Thread synchronization in Java  | 164 | 
| 5.14 | A signal handler and its installation  | 165 | 
| 5.15 | Avoiding nonreentrant code in a signal handler  | 166 | 
| 5.16 | Race conditions introduced by a signal handler  | 167 | 
| 5.17 | Synchronous handling of signals  | 169 | 
| 5.18 | A nonlocal jump using longjmp  | 170 | 
| 5.19 | Setting mutual exclusion regions to protect data structures  | 171 | 
| 5.20 | Macros using locally defined variables  | 175 | 
| 6.1 | The source code tree structure of the apache Web server  | 182 | 
| 6.2 | The NetBSD kernel main source tree | 184 | 
| 6.3 | The Linux kernel source tree | 185 | 
| 6.4 | The source tree of the architecture-specific part of the NetBSD kernel  | 187 | 
| 6.5 | The FreeBSD system source tree  | 188 | 
| 6.6 | The steps of a typical build process  | 189 | 
| 6.7 | A typical set of project dependencies  | 190 | 
| 6.8 | Representative dependencies in the apache Web server  | 191 | 
| 6.9 | Makefile from the apache Web server  | 193 | 
| 6.10 | The ant build file written in XML  | 197 | 
| 6.11 | The configuration process of GNU autoconf  | 200 | 
| 6.12 | Revision tree and symbolic names for the file cat.c  | 204 | 
| 6.13 | Sample RCS/CVS log output  | 208 | 
| 6.14 | Tools used in building the IBM 3270 terminal emulator  | 213 | 
| 6.15 |  javadoc comments embedded in a Java file  | 215 | 
| 6.16 | Using the JUnit test framework  | 221 | 
| 7.1 | Wrong tab settings used in Java code  | 229 | 
| 8.1 | TCP connection diagram  | 247 | 
| 8.2 | The first page of the perlguts manual  | 250 | 
| 8.3 | ASCII drawings in source code comments  | 257 | 
| 8.4 | A mathematical proof in a source code comment  | 258 | 
| 8.5 | Documentation in mdoc format  | 261 | 
| 8.6 | Documentation in Texinfo format  | 262 | 
| 9.1 | A blackboard in the apache Web server  | 270 | 
| 9.2 | Remote procedure calls in the yp/NIS implementation  | 272 | 
| 9.3 | Data-flow diagram for creating manual page descriptions  | 274 | 
| 9.4 | The filter-based implementation of the makewhatis command  | 274 | 
| 9.5 | A class representation in UML  | 276 | 
| 9.6 | Simple generalization relationships  | 277 | 
| 9.7 | Realization and generalization relationships  | 278 | 
| 9.8 | A file write operation: from a user program to the device  | 280 | 
| 9.9 | Examples of program slicing  | 284 | 
| 9.10 | Implicit event registration and handling in Xt  | 287 | 
| 9.11 | Explicit handling of Microsoft Windows messages  | 288 | 
| 9.12 | The BSD Unix swap process scheduler  | 290 | 
| 9.13 | Code for a state machine  | 292 | 
| 9.14 | UML state transition diagram for a state machine  | 293 | 
| 9.15 | An nvi editor module  | 294 | 
| 9.16 | Namespace definition and use in C++  | 298 | 
| 9.17 | Package definition and use in Java  | 298 | 
| 9.18 | Declaration of a C++ class for the CRC algorithm  | 300 | 
| 9.19 | The Java class for the input stream of an HTTP post operation  | 301 | 
| 9.20 | Runtime polymorphism in C++  | 307 | 
| 9.21 | Operator overloading in C++  | 310 | 
| 9.22 | Declaration of a Perl directory access class  | 311 | 
| 9.23 | An object class with a shared method table implemented in C  | 314 | 
| 9.24 | The library-structured rayshade program  | 321 | 
| 9.25 | The process structure of the GNU compiler system  | 324 | 
| 9.26 | A simple JavaBean servlet component  | 326 | 
| 9.27 | Using a JavaBean in a Java server page  | 326 | 
| 9.28 | Use of a Singleton pattern in Java document renderer  | 333 | 
| 9.29 | A C++ Singleton template  | 333 | 
| 9.30 | Reading the DHCP daemon configuration file  | 334 | 
| 9.31 | Reading the DNS specifications  | 334 | 
| 9.32 | Compiling a time-zone file  | 334 | 
| 9.33 | Parsing an SQL SELECT statement  | 335 | 
| 9.34 | The sed command interpreter  | 335 | 
| 10.1 | Regular expression matches  | 342 | 
| 10.2 | Generating tags from Visual Basic source files  | 344 | 
| 10.3 | Bird's-eye view of source code using Microsoft Word  | 345 | 
| 10.4 | Changing an identifier name under RCS control  | 349 | 
| 10.5 | Comparing files: output of the diff -c command  | 356 | 
| 10.6 | Locating code blocks with incorrect indentation  | 358 | 
| 10.7 | A signature survey of Java code  | 359 | 
| 10.8 | Symbol listing generated by the Microsoft Macro Assembler  | 362 | 
| 10.9 | Object code symbols (Unix nm)  | 363 | 
| 10.10 | Object code symbols (Windows dumpbin)  | 363 | 
| 10.11 | Microsoft Visual Studio source browser on troff classes  | 366 | 
| 10.12 | Sample output from the LXR Web-based source browser  | 367 | 
| 10.13 | The source code of rmdir typeset by using vgrind  | 369 | 
| 10.14 | Output from the trace program under MS-DOS  | 370 | 
| 10.15 | The Microsoft Windows API Spy program  | 371 | 
| 10.16 | Output from the strace program under Linux  | 371 | 
| 10.17 | Basic block count output from gprof  | 373 | 
| 11.1 | The moon phase algorithm transcribed into Java  | 389 |