Same as writeFile, but for reading.
| 126 | |
| 127 | // Same as writeFile, but for reading. |
| 128 | static void readFile(int argc, const char** argv) { |
| 129 | ssize_t bufSize = -1; // if -1, all in one go |
| 130 | ssize_t begin = -1; // if -1, start of file |
| 131 | ssize_t end = -1; // if -1, end of file |
| 132 | bool useMmap = false; |
| 133 | bool mmapRandom = false; |
| 134 | bool backwards = false; |
| 135 | const char* filename = NULL; |
| 136 | |
| 137 | for (int i = 0; i < argc; i++) { |
| 138 | if (std::string(argv[i]) == "-buf-size") { |
| 139 | if (i+1 >= argc) { badUsage("No argument after -buf-size"); } i++; |
| 140 | bufSize = strtoull(argv[i], NULL, 0); |
| 141 | if (bufSize == ULLONG_MAX) { |
| 142 | badUsage("Bad -buf-size: %d (%s)", errno, strerror(errno)); |
| 143 | } |
| 144 | } else if (std::string(argv[i]) == "-begin") { |
| 145 | if (i+1 >= argc) { badUsage("No argument after -begin"); } i++; |
| 146 | begin = strtoull(argv[i], NULL, 0); |
| 147 | if (begin == ULLONG_MAX) { |
| 148 | badUsage("Bad -begin: %d (%s)", errno, strerror(errno)); |
| 149 | } |
| 150 | } else if (std::string(argv[i]) == "-end") { |
| 151 | if (i+1 >= argc) { badUsage("No argument after -end"); } i++; |
| 152 | end = strtoull(argv[i], NULL, 0); |
| 153 | if (end == ULLONG_MAX) { |
| 154 | badUsage("Bad -end: %d (%s)", errno, strerror(errno)); |
| 155 | } |
| 156 | } else if (std::string(argv[i]) == "-mmap") { |
| 157 | useMmap = true; |
| 158 | } else if (std::string(argv[i]) == "-random") { |
| 159 | mmapRandom = true; |
| 160 | } else if (std::string(argv[i]) == "-backwards") { |
| 161 | backwards = true; |
| 162 | } else { |
| 163 | if (filename != NULL) { badUsage("Filename already specified: %s", filename); } |
| 164 | filename = argv[i]; |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | if (backwards && !useMmap) { |
| 169 | die("-backwards only works with -mmap for now"); |
| 170 | } |
| 171 | |
| 172 | size_t fileSize; |
| 173 | { |
| 174 | struct stat st; |
| 175 | if(stat(filename, &st) != 0) { |
| 176 | die("couldn't stat %s: %d (%s)", filename, errno, strerror(errno)); |
| 177 | } |
| 178 | fileSize = st.st_size; |
| 179 | } |
| 180 | |
| 181 | if (bufSize < 0) { bufSize = fileSize; } |
| 182 | if (begin < 0) { begin = 0; } |
| 183 | if (end < 0) { end = fileSize; } |
| 184 | if (end > fileSize) { |
| 185 | die("-end (%ld) exceeds file size (%lu)", end, fileSize); |