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