This appendix contains files from Volume 1 that
are required to build the files in Volume 2.
//: :require.h // Test for error conditions in programs // Local "using namespace std" for old compilers #ifndef REQUIRE_H #define REQUIRE_H #include <cstdio> #include <cstdlib> #include <fstream> inline void require(bool requirement, const char* msg = "Requirement failed") { using namespace std; if (!requirement) { fputs(msg, stderr); fputs("\n", stderr); exit(1); } } inline void requireArgs(int argc, int args, const char* msg = "Must use %d arguments") { using namespace std; if (argc != args + 1) { fprintf(stderr, msg, args); fputs("\n", stderr); exit(1); } } inline void requireMinArgs(int argc, int minArgs, const char* msg = "Must use at least %d arguments") { using namespace std; if(argc < minArgs + 1) { fprintf(stderr, msg, minArgs); fputs("\n", stderr); exit(1); } } inline void assure(std::ifstream& in, const char* filename = "") { using namespace std; if(!in) { fprintf(stderr, "Could not open file %s\n", filename); exit(1); } } inline void assure(std::ofstream& in, const char* filename = "") { using namespace std; if(!in) { fprintf(stderr, "Could not open file %s\n", filename); exit(1); } } #endif // REQUIRE_H ///:~
From Volume 1, Chapter 9:
//: C0A:Stack4.h // With inlines #ifndef STACK4_H #define STACK4_H #include "../require.h" class Stack { struct Link { void* data; Link* next; Link(void* dat, Link* nxt): data(dat), next(nxt) {} }* head; public: Stack(){ head = 0; } ~Stack(){ require(head == 0, "Stack not empty"); } void push(void* dat) { head = new Link(dat, head); } void* peek() { return head->data; } void* pop(){ if(head == 0) return 0; void* result = head->data; Link* oldHead = head; head = head->next; delete oldHead; return result; } }; #endif // STACK4_H ///:~
//: C0A:Dummy.cpp // To give the makefile at least one target // for this directory int main() {} ///:~