1 /*
2 ** Extract a range of bytes from a file.
3 **
4 ** Usage:
5 **
6 **    extract FILENAME OFFSET AMOUNT
7 **
8 ** The bytes are written to standard output.
9 */
10 #include <stdio.h>
11 #include <stdlib.h>
12 
main(int argc,char ** argv)13 int main(int argc, char **argv){
14   FILE *f;
15   char *zBuf;
16   int ofst;
17   int n;
18   size_t got;
19 
20   if( argc!=4 ){
21     fprintf(stderr, "Usage: %s FILENAME OFFSET AMOUNT\n", *argv);
22     return 1;
23   }
24   f = fopen(argv[1], "rb");
25   if( f==0 ){
26     fprintf(stderr, "cannot open \"%s\"\n", argv[1]);
27     return 1;
28   }
29   ofst = atoi(argv[2]);
30   n = atoi(argv[3]);
31   zBuf = malloc( n );
32   if( zBuf==0 ){
33     fprintf(stderr, "out of memory\n");
34     return 1;
35   }
36   fseek(f, ofst, SEEK_SET);
37   got = fread(zBuf, 1, n, f);
38   fclose(f);
39   if( got<n ){
40     fprintf(stderr, "got only %d of %d bytes\n", got, n);
41     return 1;
42   }else{
43     fwrite(zBuf, 1, n, stdout);
44   }
45   return 0;
46 }
47