view src/dumpblocks.c @ 386:f1f9920cc7b1

Add AM_GNU_GETTEXT macros AM_ICONV relies on config.rpath and autopoint/gettextize will only copy these in when the AM_GNU_GETTEXT macros are present. This is needed for the next commit that deletes config.rpath since it is cruft that should be copied in by autotools not embedded. Run autopoint to copy in config.rpath and leave it to automake to copy into the tarball.
author Paul Wise <pabs3@bonedaddy.net>
date Sat, 21 Dec 2019 21:25:44 +0800
parents 26c48ea9d896
children
line wrap: on
line source

#include "define.h"

#define OUT_BUF 20

int main(int argc, char* const* argv)
{
    pst_file pstfile;
    size_t i;
    char *outdir = NULL, *file = NULL, *outname = NULL;
    char *buf = NULL;
    int c;
    FILE *fp;

    while ((c = getopt(argc, argv, "o:")) != -1) {
        switch (c) {
            case 'o':
                outdir = optarg;
                break;
            default:
                printf("Unknown switch %c\n", c);
        }
    }
    if (optind < argc) {
        file = argv[optind];
    } else {
        printf("Usage: dumpblocks [options] pstfile\n");
        printf("\tcopies the datablocks from the pst file into separate files\n");
        printf("Options: \n");
        printf("\t-o target\tSpecify the output directory\n");
        exit(1);
    }
    DEBUG_INIT("dumpblocks.log", NULL);
    DEBUG_ENT("main");

    printf("Opening file %s\n", file);
    if (pst_open(&pstfile, file, NULL)) {
        printf("Failed to open file %s\n", file);
        exit(1);
    }

    printf("Reading Indexes\n");
    if (pst_load_index(&pstfile)) {
        printf("Failed to load indexes in file %s\n", argv[1]);
        exit(1);
    }

    if (outdir != NULL)
        if (chdir(outdir)) {
            printf("Failed to change into directory %s\n", outdir);
            exit(1);
        }

    outname = (char *) pst_malloc(OUT_BUF);
    printf("Saving blocks\n");
    for (i = 0; i < pstfile.i_count; i++) {
        pst_index_ll *ptr = &pstfile.i_table[i];
        size_t c = pst_ff_getIDblock_dec(&pstfile, ptr->i_id, &buf);
        if (c) {
            snprintf(outname, OUT_BUF, "%#"PRIx64, ptr->i_id);
            if ((fp = fopen(outname, "wb")) == NULL) {
                printf("Failed to open file %s\n", outname);
                continue;
            }
            pst_fwrite(buf, 1, c, fp);
            fclose(fp);
        } else {
            printf("Failed to read block i_id %#"PRIx64"\n", ptr->i_id);
        }
    }
    pst_close(&pstfile);
    DEBUG_RET();
    return 0;
}