/** \deprecated use XLALUserVarReadCmdline() instead */ void LALUserVarReadCmdline (LALStatus *status, int argc, char *argv[]) { INITSTATUS(status); if ( XLALUserVarReadCmdline(argc, argv) != XLAL_SUCCESS ) { XLALPrintError ("Call to XLALUserVarReadCmdline() failed with code %d\n", xlalErrno ); ABORT ( status, USERINPUTH_EXLAL, USERINPUTH_MSGEXLAL ); } RETURN (status); } // LALUserVarReadCmdline()
/** * Put all the pieces together, and basically does everything: * get config-filename from cmd-line (if found), * then interpret config-file and then the command-line */ int XLALUserVarReadAllInput ( int argc, char *argv[] ) { XLAL_CHECK ( argc > 0, XLAL_EINVAL ); XLAL_CHECK ( argv != NULL, XLAL_EINVAL ); XLAL_CHECK ( argv[0] != NULL, XLAL_EINVAL ); XLAL_CHECK ( UVAR_vars.next != NULL, XLAL_EINVAL, "No UVAR memory allocated. Did you register any user-variables?" ); program_name = argv[0]; // keep a modul-local pointer to the executable name // ---------- pre-process command-line: have we got a config-file ? CHAR* cfgfile_name = NULL; for ( INT4 i = 1; i < argc; i++ ) { char *argi = argv[i]; XLAL_CHECK ( argi != NULL, XLAL_EINVAL, "argc = %d, but argv[%d] == NULL!\n", argc, i ); if ( argi[0] == '@' ) { XLAL_CHECK ( cfgfile_name == NULL, XLAL_EINVAL, "Can only handle *one* config-file passed on commandline!\n" ); argi ++; XLAL_CHECK ( (cfgfile_name = XLALStringDuplicate ( argi )) != NULL, XLAL_EFUNC ); } // if argument starts with '@' -> config-file } // for i < argc // ---------- if config-file specified, read from that first if ( cfgfile_name != NULL ) { XLAL_CHECK ( XLALUserVarReadCfgfile ( cfgfile_name ) == XLAL_SUCCESS, XLAL_EFUNC ); XLALFree (cfgfile_name); } // ---------- now parse cmdline: overloads previous config-file settings XLAL_CHECK ( XLALUserVarReadCmdline ( argc, argv ) == XLAL_SUCCESS, XLAL_EFUNC ); // ---------- handle special options that need some action ---------- BOOLEAN skipCheckRequired = FALSE; LALUserVariable *ptr = &UVAR_vars; while ( (ptr=ptr->next) != NULL ) { if ( (ptr->category == UVAR_CATEGORY_HELP) && ( *((BOOLEAN*)ptr->varp) ) ) { CHAR *helpstring; XLAL_CHECK ( ( helpstring = XLALUserVarHelpString(argv[0])) != NULL, XLAL_EFUNC ); printf ("\n%s\n", helpstring); XLALFree (helpstring); return XLAL_SUCCESS; } // if help requested // check 'special' category, which suppresses the CheckRequired test if ( (ptr->category == UVAR_CATEGORY_SPECIAL) && ptr->was_set ) { skipCheckRequired = TRUE; } // handle DEPRECATED options by outputting a warning: if ( ptr->category == UVAR_CATEGORY_DEPRECATED && ptr->was_set ) { XLALPrintError ("Option '%s' is DEPRECATED: %s\n", ptr->name, ptr->help ); // we output warning on error-level to make this very noticeable! } // handle DEPREC_ERROR options by throwing an error: if ( ptr->category == UVAR_CATEGORY_DEFUNCT && ptr->was_set ) { XLAL_ERROR ( XLAL_EINVAL, "Option '%s' is DEFUNCT: %s\n", ptr->name, ptr->help ); } } // while ptr = ptr->next // check that all required input-variables have been specified if ( !skipCheckRequired ) { XLAL_CHECK ( XLALUserVarCheckRequired() == XLAL_SUCCESS, XLAL_EFUNC ); } return XLAL_SUCCESS; } // XLALUserVarReadAllInput()
/** * Put all the pieces together, and basically does everything: * print help (if requested), get config-filename from cmd-line (if found), * then interpret config-file and then the command-line * * If \p *should_exit is TRUE when this function returns, the * program should exit immediately with a non-zero status. */ int XLALUserVarReadAllInput ( BOOLEAN *should_exit, int argc, char *argv[] ) { XLAL_CHECK ( should_exit != NULL, XLAL_EFAULT ); XLAL_CHECK ( argc > 0, XLAL_EINVAL ); XLAL_CHECK ( argv != NULL, XLAL_EINVAL ); XLAL_CHECK ( argv[0] != NULL, XLAL_EINVAL ); XLAL_CHECK ( UVAR_vars.next != NULL, XLAL_EINVAL, "No UVAR memory allocated. Did you register any user-variables?" ); *should_exit = 0; // keep a module-local pointer to the executable path/name program_path = argv[0]; program_name = strrchr( program_path, '/' ); if ( program_name == NULL ) { program_name = program_path; } else { ++program_name; } // ---------- manually parse command-line for help/usage arguments for ( INT4 i = 1; i < argc; i++ ) { XLAL_CHECK( argv[i] != NULL, XLAL_EINVAL, "argc = %d, but argv[%d] == NULL!\n", argc, i ); if ( strcmp( argv[i], "-h" ) == 0 ) { XLALUserVarPrintUsage( stdout ); *should_exit = 1; return XLAL_SUCCESS; } else if ( strcmp( argv[i], "--help" ) == 0 || strcmp( argv[i], "-help" ) == 0 ) { XLALUserVarPrintHelp( stdout ); *should_exit = 1; return XLAL_SUCCESS; } } // ---------- pre-process command-line: have we got a config-file ? CHAR* cfgfile_name = NULL; for ( INT4 i = 1; i < argc; i++ ) { char *argi = argv[i]; XLAL_CHECK ( argi != NULL, XLAL_EINVAL, "argc = %d, but argv[%d] == NULL!\n", argc, i ); if ( argi[0] == '@' ) { XLAL_CHECK ( cfgfile_name == NULL, XLAL_EINVAL, "Can only handle *one* config-file passed on commandline!\n" ); argi ++; XLAL_CHECK ( (cfgfile_name = XLALStringDuplicate ( argi )) != NULL, XLAL_EFUNC ); } // if argument starts with '@' -> config-file } // for i < argc // ---------- if config-file specified, read from that first if ( cfgfile_name != NULL ) { XLAL_CHECK ( XLALUserVarReadCfgfile ( should_exit, cfgfile_name ) == XLAL_SUCCESS, XLAL_EFUNC ); if ( *should_exit ) { return XLAL_SUCCESS; } XLALFree (cfgfile_name); } // ---------- now parse cmdline: overloads previous config-file settings XLAL_CHECK ( XLALUserVarReadCmdline ( should_exit, argc, argv ) == XLAL_SUCCESS, XLAL_EFUNC ); if ( *should_exit ) { return XLAL_SUCCESS; } // ---------- handle special options that need some action ---------- BOOLEAN skipCheckRequired = FALSE; for ( LALUserVariable *ptr = &UVAR_vars; (ptr=ptr->next) != NULL; ) { // check 'special' category, which suppresses the CheckRequired test if ( (ptr->category == UVAR_CATEGORY_SPECIAL) && ptr->was_set ) { skipCheckRequired = TRUE; } // handle DEPRECATED options by outputting a warning (on error-level to make this very noticeable!) if ( ptr->category == UVAR_CATEGORY_DEPRECATED && ptr->was_set ) { XLALPrintError ("\n%s: option " UVAR_FMT " is DEPRECATED: %s\n\n", program_name, ptr->name, ptr->help ); } // handle DEFUNCT options by throwing an error: XLALUserVarCheck( should_exit, ptr->category != UVAR_CATEGORY_DEFUNCT || !ptr->was_set, "option " UVAR_FMT " is DEFUNCT: %s", ptr->name, ptr->help ); if ( *should_exit ) { return XLAL_SUCCESS; } } // while ptr = ptr->next // check that all required input-variables have been specified if ( !skipCheckRequired ) { // go through list of uvars for ( LALUserVariable *ptr = &UVAR_vars; (ptr=ptr->next) != NULL; ) { XLALUserVarCheck( should_exit, ptr->category != UVAR_CATEGORY_REQUIRED || ptr->was_set, "required option " UVAR_FMT " has not been specified!", ptr->name ); if ( *should_exit ) { return XLAL_SUCCESS; } } } return XLAL_SUCCESS; } // XLALUserVarReadAllInput()