|
|
/*++
NONNULL.C
Code for finding unused OPT_NONNULLs
Copyright (C) 1997 Microsoft Corporation
Created, 6/10/1997 by DavidCHR
--*/
#include "private.h"
BOOL FindUnusedOptions( optionStruct *options, ULONG flags, /* OPTIONAL */ PCHAR prefix, PSAVEQUEUE pQueue ) {
PCHAR newprefix; BOOL freeprefix; BOOL ret = TRUE; ULONG i;
for ( i = 0 ; !ARRAY_TERMINATED( options+i ); i++ ) {
if ( ( options[i].flags & OPT_MUTEX_MASK ) == OPT_SUBOPTION ) {
OPTIONS_DEBUG( "%s: OPT_SUBSTRUCT. ", options[i].cmd );
if (options[i].flags & OPT_RECURSE ) { /* suboptions must be reparsed. we recurse on this structure,
copying the prefix into a newly allocated buffer. */ OPTIONS_DEBUG( "descending into substructure.\n" ); /* allocate the new prefix */ if ( prefix ) { /* oldprefix:optionname = newprefix */ newprefix = (PCHAR) malloc( ( strlen( prefix ) + strlen( options[i].cmd ) + 2 /* : and \0 */ ) * sizeof( CHAR ) ); if ( !newprefix ) { fprintf( stderr, "Failed to allocate new prefix-- cannot " "parse suboption %s:%s.\n", prefix, options[i].cmd ); return FALSE; } sprintf( newprefix, "%s:%s", prefix, options[i].cmd ); freeprefix = TRUE; } else { /* optionname = prefix */ newprefix = options[i].cmd; freeprefix = FALSE; } ASSERT( newprefix != NULL ); if ( !FindUnusedOptions( POPTU_CAST( options[i] )->optStruct, flags, newprefix, pQueue ) ) { ret = FALSE; } if ( freeprefix ) { free( newprefix ); } } else {
OPTIONS_DEBUG( "!OPT_RECURSE, so not descending.\n" ); }
continue;
} if ( ( options[i].flags & OPT_NONNULL ) || ( options [i].flags & OPT_ENVIRONMENT ) ) {
OPTIONS_DEBUG( "%s: OPT_NONNULL or OPT_ENV. pointer is 0x%x, ", options[i].cmd, POPTU_CAST( options[i] )->raw_data ); if ( *(POPTU_CAST( options[i] )->raw_data) == NULL ) {
OPTIONS_DEBUG( " *= NULL.\n" );
if ( ( options[i].flags & OPT_ENVIRONMENT ) && StoreEnvironmentOption( options+i, flags, pQueue ) ) {
OPTIONS_DEBUG( "found environment variable for %s...", options[i].cmd );
} else if ( options[i].flags & OPT_NONNULL ) {
if ( prefix ) { fprintf( stderr, "option %s:%s must be specified and is missing.\n", prefix, options[i].cmd );
} else { fprintf( stderr, "option %s must be specified and is missing.\n", options[i].cmd );
}
ret = FALSE;
} } else { OPTIONS_DEBUG( "data is not null.\n" ); } } #if 0 // not really necessary debug info.
else if ( options[i].cmd ) {
OPTIONS_DEBUG( "%s is ok.\n", options[i].cmd );
} #endif
}
return ret;
}
|