}
}
-void read_mlocate(const char *filename, DatabaseReceiver *receiver)
+void read_mlocate(FILE *fp, DatabaseReceiver *receiver)
{
- FILE *fp = fopen(filename, "rb");
- if (fp == nullptr) {
- perror(filename);
+ if (fseek(fp, 0, SEEK_SET) != 0) {
+ perror("fseek");
exit(1);
}
while (!feof(fp)) {
handle_directory(fp, receiver);
}
- fclose(fp);
}
string zstd_compress(const string &src, ZSTD_CDict *cdict, string *tempbuf)
{
steady_clock::time_point start __attribute__((unused)) = steady_clock::now();
+ FILE *infp = fopen(infile, "rb");
+ if (infp == nullptr) {
+ perror(infile);
+ exit(1);
+ }
+
umask(0027);
FILE *outfp = fopen(outfile, "wb");
+ if (outfp == nullptr) {
+ perror(outfile);
+ exit(1);
+ }
// Write the header.
Header hdr;
// dictionary size is ~100 kB, but 1 kB seems to actually compress better for us,
// and decompress just as fast.
DictionaryBuilder builder(/*blocks_to_keep=*/1000, block_size);
- read_mlocate(infile, &builder);
+ read_mlocate(infp, &builder);
string dictionary = builder.train(1024);
ZSTD_CDict *cdict = ZSTD_createCDict(dictionary.data(), dictionary.size(), /*level=*/6);
hdr.zstd_dictionary_length_bytes = dictionary.size();
Corpus corpus(outfp, block_size, cdict);
- read_mlocate(infile, &corpus);
+ read_mlocate(infp, &corpus);
+ fclose(infp);
+
if (false) { // To read a plain text file.
FILE *fp = fopen(infile, "r");
while (!feof(fp)) {