Figures xiii
Tables xix
Foreword xxi
Preface xxv
1 Introduction 1
1.1 Why and How to Read Code 2
1.1.1 Code as Literature 2
1.1.2 Code as Exemplar 5
1.1.3 Maintenance 6
1.1.4 Evolution 7
1.1.5 Reuse 9
1.1.6 Inspections 9
1.2 How to Read This Book 10
1.2.1 Typographical Conventions 10
1.2.2 Diagrams 12
1.2.3 Exercises 13
1.2.4 Supplementary Material 14
1.2.5 Tools 14
1.2.6 Outline 15
1.2.7 The Great Language Debate 15
Further Reading 17
2 Basic Programming Elements 19
2.1 A Complete Program 19
2.2 Functions and Global Variables 25
2.3 while Loops, Conditions, and Blocks 28
2.4 switch Statements 32
2.5 for Loops 34
2.6 break and continue Statements 37
2.7 Character and Boolean Expressions 39
2.8 goto Statements 43
2.9 Refactoring in the Small 45
2.10 do Loops and Integer Expressions 51
2.11 Control Structures Revisited 54
Further Reading 60
3 Advanced C Data Types 61
3.1 Pointers 61
3.1.1 Linked Data Structures 62
3.1.2 Dynamic Allocation of Data Structures 62
3.1.3 Call by Reference 63
3.1.4 Data Element Access 65
3.1.5 Arrays as Arguments and Results 65
3.1.6 Function Pointers 67
3.1.7 Pointers as Aliases 70
3.1.8 Pointers and Strings 72
3.1.9 Direct Memory Access 74
3.2 Structures 75
3.2.1 Grouping Together Data Elements 75
3.2.2 Returning Multiple Data Elements from a Function 76
3.2.3 Mapping the Organization of Data 76
3.2.4 Programming in an Object-Oriented Fashion 78
3.3 Unions 80
3.3.1 Using Storage Efficiently 80
3.3.2 Implementing Polymorphism 81
3.3.3 Accessing Free Memory 82
3.4 Dynamic Memory Allocation 84
3.4.1 Managing Free Memory 87
3.4.2 Structures with Dynamically Allocated Arrays 89
3.5 typedef Declarations 91
Further Reading 93
4 C Data Structures 95
4.1 Vectors 96
4.2 Matrices and Tables 101
4.3 Stacks 105
4.4 Queues 107
4.5 Maps 111
4.5.1 Hash Tables 113
4.6 Sets 116
4.7 Linked Lists 117
4.8 Trees 125
4.9 Graphs 131
4.9.1 Node Storage 131
4.9.2 Edge Representation 134
4.9.3 Edge Storage 137
4.9.4 Graph Properties 139
4.9.5 Hidden Structures 139
4.9.6 Other Representations 140
Further Reading 140
5 Advanced Control Flow 143
5.1 Recursion 143
5.2 Exceptions 150
5.3 Parallelism 154
5.3.1 Hardware and Software Parallelism 154
5.3.2 Control Models 156
5.3.3 Thread Implementations 162
5.4 Signals 165
5.5 Nonlocal Jumps 169
5.6 Macro Substitution 172
Further Reading 177
6 Tackling Large Projects 179
6.1 Design and Implementation Techniques 179
6.2 Project Organization 181
6.3 The Build Process and Makefiles 189
6.4 Configuration 197
6.5 Revision Control 202
6.6 Project-Specific Tools 210
6.7 Testing 215
Further Reading 224
7 Coding Standards and Conventions 225
7.1 File Names and Organization 225
7.2 Indentation 228
7.3 Formatting 230
7.4 Naming Conventions 234
7.5 Programming Practices 237
7.6 Process Standards 239
Further Reading 240
8 Documentation 241
8.1 Documentation Types 241
8.2 Reading Documentation 243
8.3 Documentation Problems 254
8.4 Additional Documentation Sources 256
8.5 Common Open-Source Documentation Formats 260
Further Reading 266
9 Architecture 267
9.1 System Structures 268
9.1.1 Centralized Repository and Distributed Approaches 268
9.1.2 Data-Flow Architectures 273
9.1.3 Object-Oriented Structures 275
9.1.4 Layered Architectures 279
9.1.5 Hierarchies 282
9.1.6 Slicing 283
9.2 Control Models 285
9.2.1 Event-Driven Systems 285
9.2.2 System Manager 289
9.2.3 Sate Transition 291
9.3 Element Packaging 292
9.3.1 Modules 293
9.3.2 Namespaces 296
9.3.3 Objects 300
9.3.4 Generic Implementations 313
9.3.5 Abstract Data Types 318
9.3.6 Libraries 319
9.3.7 Processes and Filters 323
9.3.8 Components 325
9.3.9 Data Repositories 325
9.4 Architecture Reuse 328
9.4.1 Frameworks 329
9.4.2 Code Wizards 330
9.4.3 Design Patterns 331
9.4.4 Domain-Specific Architectures 333
Further Reading 337
10 Code-Reading Tools 339
10.1 Regular Expressions 340
10.2 The Editor as a Code Browser 343
10.3 Code Searching with grep 346
10.4 Locating File Differences 355
10.5 Roll Your Own Tool 357
10.6 The Compiler as a Code-Reading Tool 360
10.7 Code Browsers and Beautifiers 365
10.8 Runtime Tools 370
10.9 Nonsoftware Tools 375
Tool Availability and Further Reading 376
11 A Complete Example 379
11.1 Overview 379
11.2 Attack Plan 380
11.3 Code Reuse 382
11.4 Testing and Debugging 388
11.5 Documentation 396
11.6 Observations 397
A Outline of the Code Provided 399
B Source Code Credits 403
C Referenced Source Files 405
D Source Code Licenses 413
D.1 ACE 413
D.2 Apache 415
D.3 ArgoUML 416
D.4 DemoGL 416
D.5 hsqldb 417
D.6 NetBSD 418
D.7 OpenCl 418
D.8 Perl 419
D.9 qtchat 422
D.10 socked 422
D.11 vcf 422
D.12 X Window System 423
E Maxims for Reading Code 425
Bibliography 445
Author Index 459