/* Program: EXTRACT.C Author : Kim Moser Date : 02/15/89 System : IBM PC / Borland Turbo-C 2.0 Descrip: Extracts a run of bytes from a specified file to stdout Usage : EXTRACT [-] [-] */ #include #include #include #include #include /* isalpha */ int MSG=1, WARN=1; /* Whether to print messages and warnings */ void usage(void) { if (!MSG) return; fprintf( stderr, "EXTRACT v1.0 (2/15/89) Copyright (c) Kim Moser All Rights Reserved\n" ); fprintf( stderr, "Usage: EXTRACT [-] \n\n" ); fprintf( stderr, " Starting at byte of stdin, extracts bytes to stdout.\n" ); fprintf( stderr, " If offset < 0 then offset is taken to be from EOF.\n\n" ); fprintf( stderr, " SWITCH MEANING\n" ); fprintf( stderr, " M suppress messages\n" ); fprintf( stderr, " W suppress warnings\n" ); exit(1); } void main(argc, argv) int argc; char **argv; { unsigned long int offset, length, i; int ch; int fromend=0; /* Whether offset should be calculated from EOF */ long flen; int j=1, k; if (argc==1) usage(); if ( (argv[j][0]=='-') && isalpha(argv[j][1]) ) { for (k=1; argv[j][k]; k++) switch(argv[j][k]) { case 'M': /* Suppress msgs */ MSG=0; break; case 'W': /* Suppress warnings */ WARN=0; break; default: usage(); break; } j++; /* Point to param which should contain offset */ } fromend = (argv[j][0]=='-' ? 1 : 0); if (!sscanf(&argv[j][fromend], "%lu", &offset)) usage(); if (argv[j+1]==NULL) usage(); if (!sscanf(argv[j+1], "%lu", &length)) usage(); if (setmode(fileno(stdin), O_BINARY)==-1) { if (WARN) fprintf( stderr, "Error setting mode of stdin to O_BINARY.\n" ); exit(1); } if (setmode(fileno(stdout), O_BINARY)==-1) { if (WARN) fprintf( stderr, "Error setting mode of stdout to O_BINARY.\n" ); exit(1); } if (fromend) { if ((flen=filelength(fileno(stdin)))==-1) { if (WARN) fprintf( stderr, "Error finding length of stdin.\n" ); exit(1); } /* Check if they wanted to begin before beginning: */ if (flen < offset+1) { if (WARN) fprintf( stderr, "Offset from EOF (-%lu) is larger than file length (%lu).\n", offset, flen ); exit(1); } if (MSG) fprintf( stderr, "Offset from end: -%lu (%lu from beginning).\n", offset, flen-offset-1 ); if ( fseek(stdin, (long) (flen-offset-1), SEEK_SET) ) { if (WARN) fprintf( stderr, "Unable to set stdin file pointer to -%lu (%lu from beginning).\n", offset, flen-offset-1 ); exit(1); } } else { if ( fseek(stdin, offset, SEEK_SET) ) { if (WARN) fprintf( stderr, "Unable to set stdin file pointer to %lu.\n", offset ); exit(1); } } for (i=0; i