| 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 (PDF 251K)
|
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 Different Internal Representations | 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 | State 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 |
| Further Reading | 21 |
|
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 | socket | 422 |
D.11 | vcf | 422 |
D.12 | X Window System | 423 |
|
E | Maxims for Reading Code | 425 |
| Bibliography | 445 |
| Index | 459 (PDF 138K) |
| Author Index | 491 |