blob: 3f92f368ae0a65d59236129397e7dbb4010b69cc [file] [log] [blame]
/*
* Name: openFiles
* Input: number of command-line arguments, argc
* array of command-line argument strings, argv
* Output: input FILE pointer
* output FILE pointer
* metrics FILE pointer
* Return: OPEN_FILES_SUCCESS, or
* OPEN_FILES_USAGE_REQUEST
* OPEN_FILES_USAGE_ERROR
* OPEN_FILES_INPUT_FILE_ERROR,
* OPEN_FILES_OUTPUT_FILE_ERROR,
* OPEN_FILES_METRICS_FILE_ERROR,
* Description: Routine opens the three files used by the application:
* input, output, and metrics. The FILE pointers are returned
* open and at the beginning of the files. Default values for
* the input, output, and metric files are stdin, stdout, and
* stderr respectively. The command-line arguments are passed
* to the routine for default overrides. The usage for the
* baseline application is:
*
* a.out -i name : specify input file name
* -o name : specify output file name
* -m name : specify metrics file name
* -h : display usage and return
*
* The routine also initializes the output buffer by passing
* the value of the output file pointer to initOutputBuffer().
* Calls: errorMessage()
* initOutputBuffer()
* System: fopen()
* fprintf()
* Author: M.L.Rivas
*
* Revision History:
* Date Name Revision
* ------- --------------- ------------------------------
* 24May99 Matthew Rivas Created
* 06Jul99 Matthew Rivas Modified command-line argument parsing and added
* usage parameter -h
* 12Jul99 Matthew Rivas Change file assertions to correct form
*
* Copyright 1999, Atlantic Aerospace Electronics Corp.
*/
#include <assert.h> /* for assert() */
#include <stdio.h> /* for FILE definitions and fopen() */
#include "dataManagement.h" /* for primitive type definitions */
#include "errorMessage.h" /* for errorMessage() definition */
#include "openFiles.h" /* for openFiles return codes */
/*
* Function Prototypes
*/
extern void initOutputBuffer( FILE *file );
Int openFiles( Int argc, /* command-line arguments to provide */
Char **argv, /* input values for file names */
FILE **inputFile, /* input file ptr - output */
FILE **outputFile, /* output file ptr - output */
FILE **metricsFile ) /* metrics file ptr - output */
{ /* begin openFiles() */
Char *inputFileName; /* character strings used to store name */
Char *outputFileName; /* values parsed from input command-line */
Char *metricsFileName; /* arguments */
static Char name[] = "openFiles";
assert( argc > 0 );
assert( argv && argv[ 0 ] );
assert( *inputFile == NULL );
assert( *outputFile == NULL );
assert( *metricsFile == NULL );
/*
* Process input command-line arguments for the name of the input, output,
* and metric files. The names are set to NULL and if unchanged will
* default to the stdin, stdout, and stderr, respectively. If a file is
* specified by the command-line options, the name is referenced by the
* appropriate local variable and used during the opening of the file in
* the next section.
*/
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
if ( argc > 1 ) {
Int i; /* counter for current argument being parsed */
i = 1; /* start with second argument - first is program name */
while ( i < argc ) { /* parse command-line arguments until all parsed */
if ( strlen( argv[ i ] ) == 2 && argv[ i ][ 0 ] == '-' ) {
if ( argv[ i ][ 1 ] == 'i' ) {
if ( i + 1 < argc ) {
i++;
inputFileName = argv[ i ];
} /* end of if i+1 <= argc */
else {
errorMessage( "missing argument for -i", REPLACE );
errorMessage( name, PREPEND );
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_ERROR );
} /* end of if i+1 > argc */
i++;
} /* end of if argv[ i ][ 1 ] = 'i' */
else if ( argv[ i ][ 1 ] == 'o' ) {
if ( i + 1 < argc ) {
i++;
outputFileName = argv[ i ];
} /* end of if i+1 <= argc */
else {
errorMessage( "missing argument for -o", REPLACE );
errorMessage( name, PREPEND );
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_ERROR );
} /* end of if i+1 > argc */
i++;
} /* end of if argv[ i ][ 1 ] = 'o' */
else if ( argv[ i ][ 1 ] == 'm' ) {
if ( i + 1 < argc ) {
i++;
metricsFileName = argv[ i ];
} /* end of if i+1 <= argc */
else {
errorMessage( "missing argument for -m", REPLACE );
errorMessage( name, PREPEND );
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_ERROR );
} /* end of if i+1 > argc */
i++;
} /* end of if argv[ i ][ 1 ] = 'm' */
else if ( argv[ i ][ 1 ] == 'h' ) {
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_REQUEST );
} /* end of if argv[ i ][ 1 ] = 'h' */
else {
errorMessage( "unknown option", REPLACE );
errorMessage( name, PREPEND );
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_ERROR );
} /* end of else - unknown option */
} /* end of if strlen( argv ) > 1 && argv[i][0] = '-' */
else {
errorMessage( "incorrect format - unknown option", REPLACE );
errorMessage( name, PREPEND );
inputFileName = NULL;
outputFileName = NULL;
metricsFileName = NULL;
fprintf( stderr, "Usage: %s [-h], or\n", argv[ 0 ] );
fprintf( stderr, " %s", argv[ 0 ] );
fprintf( stderr, " [-i <input file = stdin>]" );
fprintf( stderr, " [-o <output file = stdout>]" );
fprintf( stderr, " [-m <metrics file = stderr>]\n" );
return ( OPEN_FILES_USAGE_ERROR );
} /* end of else - incorrect format */
} /* end of option present with '-' in front */
} /* end of if argc > 1 - command-line arguments present */
/*
* Check each file name for either default value or no value, open each
* file and check value of FILE pointer. If a failure occurs, place
* message in error buffer and return appropriate code.
*/
if ( inputFileName == NULL ) { /* input file */
*inputFile = stdin;
} /* end of if ( inputFileName == NULL ) */
else {
*inputFile = fopen( inputFileName, "r" );
if ( *inputFile == NULL ) {
errorMessage( "error opening input file", REPLACE );
errorMessage( name, PREPEND );
return ( OPEN_FILES_INPUT_FILE_ERROR );
} /* end of if ( *inputFile == NULL ) */
} /* end of branches for input file */
if ( outputFileName == NULL ) { /* output file */
*outputFile = stdout;
} /* end of if ( outputFileName == NULL ) */
else {
*outputFile = fopen( outputFileName, "w" );
if ( *outputFile == NULL ) {
errorMessage( "error opening output file", REPLACE );
errorMessage( name, PREPEND );
return ( OPEN_FILES_OUTPUT_FILE_ERROR );
} /* end of if ( *outputFile == NULL ) */
} /* end of branches for output file */
initOutputBuffer( *outputFile );
if ( metricsFileName == NULL ) { /* metrics file */
*metricsFile = stderr;
} /* end of if ( metricsFileName == NULL ) */
else {
*metricsFile = fopen( metricsFileName, "w" );
if ( *metricsFile == NULL ) {
errorMessage( "error opening metrics file", REPLACE );
errorMessage( name, PREPEND );
return ( OPEN_FILES_METRICS_FILE_ERROR );
} /* end of if ( *metricsFile == NULL ) */
} /* end of branches for metrics file */
return ( OPEN_FILES_SUCCESS );
} /* end of openFiles() */