/** * Read config-variables from cfgfile and parse into input-structure. * An error is reported if the config-file reading fails, but the * individual variable-reads are treated as optional */ int XLALUserVarReadCfgfile ( const CHAR *cfgfile ) /**< [in] name of config-file */ { XLAL_CHECK ( cfgfile != NULL, XLAL_EINVAL ); XLAL_CHECK ( UVAR_vars.next != NULL, XLAL_EINVAL, "No memory allocated in UVAR_vars.next, did you register any user-variables?\n" ); LALParsedDataFile *cfg = NULL; XLAL_CHECK ( XLALParseDataFile ( &cfg, cfgfile ) == XLAL_SUCCESS, XLAL_EFUNC ); // step through all user-variable: read those with names from config-file LALUserVariable *ptr = &UVAR_vars; while ( (ptr=ptr->next) != NULL) { if (ptr->name == NULL) { // ignore name-less user-variable continue; } XLAL_CHECK ( (ptr->type > UVAR_TYPE_START) && (ptr->type < UVAR_TYPE_END), XLAL_EFAILED, "Invalid UVAR_TYPE '%d' outside of [%d,%d]\n", ptr->type, UVAR_TYPE_START+1, UVAR_TYPE_END-1 ); BOOLEAN wasRead; CHAR *valString = NULL; // first read the value as a string XLAL_CHECK ( XLALReadConfigSTRINGVariable ( &valString, cfg, NULL, ptr->name, &wasRead ) == XLAL_SUCCESS, XLAL_EFUNC ); if ( wasRead ) // if successful, parse this as the desired type { // destroy previous value, is applicable, then parse new one if ( UserVarTypeMap [ ptr->type ].destructor != NULL ) { UserVarTypeMap [ ptr->type ].destructor( *(char**)ptr->varp ); *(char**)ptr->varp = NULL; } // if a destructor was registered XLAL_CHECK ( UserVarTypeMap [ ptr->type ].parser( ptr->varp, valString ) == XLAL_SUCCESS, XLAL_EFUNC ); XLALFree (valString); check_and_mark_as_set ( ptr ); } // if wasRead } // while ptr->next // ok, that should be it: check if there were more definitions we did not read UINT4Vector *unread = XLALConfigFileGetUnreadEntries ( cfg ); XLAL_CHECK ( xlalErrno == 0, XLAL_EFUNC, "XLALConfigFileGetUnreadEntries() failed\n"); if ( unread != NULL ) { XLALPrintWarning ("The following entries in config-file '%s' have not been parsed:\n", cfgfile ); for ( UINT4 i = 0; i < unread->length; i ++ ) { XLALPrintWarning ("%s\n", cfg->lines->tokens[ unread->data[i] ] ); } XLALDestroyUINT4Vector ( unread ); } XLALDestroyParsedDataFile ( cfg ); return XLAL_SUCCESS; } // XLALUserVarReadCfgfile()
/** * Read config-variables from cfgfile and parse into input-structure. * An error is reported if the config-file reading fails, but the * individual variable-reads are treated as optional * * If \p *should_exit is TRUE when this function returns, the * caller should exit immediately. */ int XLALUserVarReadCfgfile ( BOOLEAN *should_exit, const CHAR *cfgfile ) { XLAL_CHECK ( should_exit != NULL, XLAL_EFAULT ); XLAL_CHECK ( cfgfile != NULL, XLAL_EINVAL ); XLAL_CHECK ( UVAR_vars.next != NULL, XLAL_EINVAL, "No memory allocated in UVAR_vars.next, did you register any user-variables?\n" ); *should_exit = 0; LALParsedDataFile *cfg = NULL; XLAL_CHECK ( XLALParseDataFile ( &cfg, cfgfile ) == XLAL_SUCCESS, XLAL_EFUNC ); // step through all user-variable: read those with names from config-file LALUserVariable *ptr = &UVAR_vars; while ( (ptr=ptr->next) != NULL) { XLAL_CHECK ( (ptr->type > UVAR_TYPE_START) && (ptr->type < UVAR_TYPE_END), XLAL_EFAILED, "Invalid UVAR_TYPE '%d' outside of [%d,%d]\n", ptr->type, UVAR_TYPE_START+1, UVAR_TYPE_END-1 ); BOOLEAN wasRead; CHAR *valString = NULL; // first read the value as a string XLAL_CHECK ( XLALReadConfigSTRINGVariable ( &valString, cfg, NULL, ptr->name, &wasRead ) == XLAL_SUCCESS, XLAL_EFUNC ); if ( wasRead ) // if successful, parse this as the desired type { // destroy previous value, is applicable, then parse new one if ( UserVarTypeMap [ ptr->type ].destructor != NULL ) { UserVarTypeMap [ ptr->type ].destructor( *(char**)ptr->varp ); *(char**)ptr->varp = NULL; } // if a destructor was registered if ( UserVarTypeMap [ ptr->type ].parser( ptr->varp, valString ) != XLAL_SUCCESS ) { XLALPrintError( "\n%s: could not parse value given to option " UVAR_FMT "\n\n", program_name, ptr->name ); *should_exit = 1; return XLAL_SUCCESS; } XLALFree (valString); switch ( ptr->was_set ) { case 0: // this variable has not been set; mark as set in configuration file ptr->was_set = 1; break; default: // this variable has been set before; error XLALUserVarCheck( should_exit, 0, "configuration option `%s' was set more than once!", ptr->name ); return XLAL_SUCCESS; } } // if wasRead } // while ptr->next // ok, that should be it: check if there were more definitions we did not read UINT4Vector *unread = XLALConfigFileGetUnreadEntries ( cfg ); XLAL_CHECK ( xlalErrno == 0, XLAL_EFUNC, "XLALConfigFileGetUnreadEntries() failed\n"); if ( unread != NULL ) { XLALPrintWarning ("The following entries in config-file '%s' have not been parsed:\n", cfgfile ); for ( UINT4 i = 0; i < unread->length; i ++ ) { XLALPrintWarning ("%s\n", cfg->lines->tokens[ unread->data[i] ] ); } XLALDestroyUINT4Vector ( unread ); } XLALDestroyParsedDataFile ( cfg ); return XLAL_SUCCESS; } // XLALUserVarReadCfgfile()