View Source Document

extract8.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PAGESIZE    2048
#define PAGECOUNT    720

void extract_blocks(FILE *, char *, int, int);

char page[PAGESIZE];

/*
 * extract8 - extract binary images from given pages
 * on a BefOS boot disk.
 * Usage: extract8 befos.flp legend.bin 9 1
 */
int
main(int argc, char **argv)
{
    int i = 1;
    FILE *infile;

    if ((infile = fopen(argv[1], "r")) == NULL)
        errx(1, "cannot read `%s'", argv[1]);

    for (i = 2; i < (argc - 2); i += 3)
        extract_blocks(infile, argv[i],
            atoi(argv[i + 1]), atoi(argv[i + 2]));

    fclose(infile);
}

void
extract_blocks(FILE *infile, char *filename, int pagepos, int numpages)
{
    FILE *outfile;
    int pos = pagepos * PAGESIZE;
    int length = numpages * PAGESIZE;
    int pageno = 1;

    printf("writing %s from page %d...\n", filename, pagepos);
    if ((outfile = fopen(filename, "w")) == NULL)
        errx(1, "cannot create `%s'", filename);

    while(pageno <= numpages) {
        printf("\textracting page %d...\n", pageno++);
        bzero(page, PAGESIZE);
        fseek(infile, pos, SEEK_SET);
        fread(page, PAGESIZE, 1, infile);
        fwrite(page, PAGESIZE, 1, outfile);
        pos += PAGESIZE;
    }
    fclose(outfile);
}