47 lines
		
	
	
		
			856 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			856 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| ** Extract a range of bytes from a file.
 | |
| **
 | |
| ** Usage:
 | |
| **
 | |
| **    extract FILENAME OFFSET AMOUNT
 | |
| **
 | |
| ** The bytes are written to standard output.
 | |
| */
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| int main(int argc, char **argv){
 | |
|   FILE *f;
 | |
|   char *zBuf;
 | |
|   int ofst;
 | |
|   int n;
 | |
|   size_t got;
 | |
| 
 | |
|   if( argc!=4 ){
 | |
|     fprintf(stderr, "Usage: %s FILENAME OFFSET AMOUNT\n", *argv);
 | |
|     return 1;
 | |
|   }
 | |
|   f = fopen(argv[1], "rb");
 | |
|   if( f==0 ){
 | |
|     fprintf(stderr, "cannot open \"%s\"\n", argv[1]);
 | |
|     return 1;
 | |
|   }
 | |
|   ofst = atoi(argv[2]);
 | |
|   n = atoi(argv[3]);
 | |
|   zBuf = malloc( n );
 | |
|   if( zBuf==0 ){
 | |
|     fprintf(stderr, "out of memory\n");
 | |
|     return 1;
 | |
|   }
 | |
|   fseek(f, ofst, SEEK_SET);
 | |
|   got = fread(zBuf, 1, n, f);
 | |
|   fclose(f);
 | |
|   if( got<n ){
 | |
|     fprintf(stderr, "got only %d of %d bytes\n", got, n);
 | |
|     return 1;
 | |
|   }else{
 | |
|     fwrite(zBuf, 1, n, stdout);
 | |
|   }
 | |
|   return 0;
 | |
| }
 | 
