Compress-Stream-Zstd

 view release on metacpan or  search on metacpan

ext/zstd/contrib/diagnose_corruption/check_flipped_bits.c  view on Meta::CPAN

typedef struct {
  char *input;
  size_t input_size;

  char *perturbed; /* same size as input */

  char *output;
  size_t output_size;

  const char *dict_file_name;
  const char *dict_file_dir_name;
  int32_t dict_id;
  char *dict;
  size_t dict_size;
  ZSTD_DDict* ddict;

  ZSTD_DCtx* dctx;

  int success_count;
  int error_counts[ZSTD_error_maxCode];
} stuff_t;

static void free_stuff(stuff_t* stuff) {
  free(stuff->input);
  free(stuff->output);
  ZSTD_freeDDict(stuff->ddict);
  free(stuff->dict);
  ZSTD_freeDCtx(stuff->dctx);
}

static void usage(void) {
  fprintf(stderr, "check_flipped_bits input_filename [-d dict] [-D dict_dir]\n");
  fprintf(stderr, "\n");
  fprintf(stderr, "Arguments:\n");
  fprintf(stderr, "    -d file: path to a dictionary file to use.\n");
  fprintf(stderr, "    -D dir : path to a directory, with files containing dictionaries, of the\n"
                  "             form DICTID.zstd-dict, e.g., 12345.zstd-dict.\n");
  exit(1);
}

static void print_summary(stuff_t* stuff) {
  int error_code;
  fprintf(stderr, "%9d successful decompressions\n", stuff->success_count);
  for (error_code = 0; error_code < ZSTD_error_maxCode; error_code++) {
    int count = stuff->error_counts[error_code];
    if (count) {
      fprintf(
          stderr, "%9d failed decompressions with message: %s\n",
          count, ZSTD_getErrorString(error_code));
    }
  }
}

static char* readFile(const char* filename, size_t* size) {
  struct stat statbuf;
  int ret;
  FILE* f;
  char *buf;
  size_t bytes_read;

  ret = stat(filename, &statbuf);
  if (ret != 0) {
    fprintf(stderr, "stat failed: %m\n");
    return NULL;
  }
  if ((statbuf.st_mode & S_IFREG) != S_IFREG) {
    fprintf(stderr, "Input must be regular file\n");
    return NULL;
  }

  *size = statbuf.st_size;

  f = fopen(filename, "r");
  if (f == NULL) {
    fprintf(stderr, "fopen failed: %m\n");
    return NULL;
  }

  buf = malloc(*size);
  if (buf == NULL) {
    fprintf(stderr, "malloc failed\n");
    fclose(f);
    return NULL;
  }

  bytes_read = fread(buf, 1, *size, f);
  if (bytes_read != *size) {
    fprintf(stderr, "failed to read whole file\n");
    fclose(f);
    free(buf);
    return NULL;
  }

  ret = fclose(f);
  if (ret != 0) {
    fprintf(stderr, "fclose failed: %m\n");
    free(buf);
    return NULL;
  }

  return buf;
}

static ZSTD_DDict* readDict(const char* filename, char **buf, size_t* size, int32_t* dict_id) {
  ZSTD_DDict* ddict;
  *buf = readFile(filename, size);
  if (*buf == NULL) {
    fprintf(stderr, "Opening dictionary file '%s' failed\n", filename);
    return NULL;
  }

  ddict = ZSTD_createDDict_advanced(*buf, *size, ZSTD_dlm_byRef, ZSTD_dct_auto, ZSTD_defaultCMem);
  if (ddict == NULL) {
    fprintf(stderr, "Failed to create ddict.\n");
    return NULL;
  }
  if (dict_id != NULL) {
    *dict_id = ZSTD_getDictID_fromDDict(ddict);
  }
  return ddict;
}



( run in 2.175 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )