libopt/lib/libopt.c
2001-12-17 01:07:47 +00:00

1445 lines
38 KiB
C

/*---------------------------------------------------------------------------------*/
/* $RCSfile: libopt.c,v $ */
/*---------------------------------------------------------------------------------*/
/* $Revision: 1.1 $ */
/* $Name: $ */
/* $Date: 2001/12/17 01:12:41 $ */
/* $Author: agibert $ */
/*---------------------------------------------------------------------------------*/
#define _OPTION_C_
#include "tima.h"
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
NDT_Status Manager_OptionValueStruct( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_Node *Node_Ptr, NDT_Command Command, va_list Args)
{
NDT_Command_Name Command_Name;
switch( Command)
{
case NDD_CMD_MANAGER_VERSION:
{
NDT_Version_Name *Version_Name_Ptr = (NDT_Version_Name *)va_arg( Args, NDT_Version_Name *);
Command_Name = "NDD_CMD_MANAGER_VERSION";
*Version_Name_Ptr = "$Revision: 1.1 $ $Name: $ $Date: 2001/12/17 01:12:41 $ $Author: agibert $";
return( NDS_OK);
}
case NDD_CMD_INDEX_GET:
{
/*
NDT_Index_Id *Reply_Index_Id_Ptr = (NDT_Index_Id *)va_arg( Args, NDT_Index_Id *);
NDT_Command *Reply_Command_Ptr = (NDT_Command *)va_arg( Args, NDT_Command *);
NDT_Command Cmd = (NDT_Command)va_arg( Args, NDT_Command);
*/
NDT_Index_Id *Reply_Index_Id_Ptr = (NDT_Index_Id *)va_arg( Args, NDT_Index_Id *);
NDT_Command *Reply_Command_Ptr = (NDT_Command *)va_arg( Args, NDT_Command *);
NDT_Command Cmd = (NDT_Command)va_arg( Args, NDT_Command);
Command_Name = "NDD_CMD_IDX_GET";
switch(Cmd)
{
/*
case NDT_CMD_SOME_USER_CMD:
{
*Reply_Index_Id_Ptr = 0;
*Reply_Command_Ptr = NDD_CMD_SOME_OTHER_CMD;
break;
}
...
*/
default:
{
*Reply_Index_Id_Ptr = Index_Id;
*Reply_Command_Ptr = Cmd;
break;
}
}
return( NDS_OK);
}
case NDD_CMD_VALUE_ALLOC:
{
/*
void **Value_Ptr_Ptr = (void **)va_arg( Args, void **);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
*/
TIMAT_OptionValue **OptionValue_Ptr_Ptr = (TIMAT_OptionValue **)va_arg( Args, TIMAT_OptionValue **);
Command_Name = "NDD_CMD_VALUE_ALLOC";
if( ( *OptionValue_Ptr_Ptr = (void *)malloc( sizeof(TIMAT_OptionValue))) == NULL)
{
return(NDS_ERRMEM);
}
else
{
(*OptionValue_Ptr_Ptr)->Node = NULL;
(*OptionValue_Ptr_Ptr)->Data[0] = '\0';
return( NDS_OK);
}
}
case NDD_CMD_VALUE_FREE:
{
/*
void *Value_Ptr = (void *)va_arg( Args, void *);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
*/
TIMAT_OptionValue *OptionValue_Ptr = (TIMAT_OptionValue *)va_arg( Args, TIMAT_OptionValue *);
Command_Name = "NDD_CMD_VALUE_FREE";
free( OptionValue_Ptr);
return( NDS_OK);
}
case NDD_CMD_VALUE_COMP:
{
/*
void *Value1_Ptr = (void *)va_arg( Args, void *);
void *Value2_Ptr = (void *)va_arg( Args, void *);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
*/
Command_Name = "NDD_CMD_VALUE_COMP";
/*
switch( Index_Id)
{
case 0:
{
int rc;
rc = strcmp( Value1_Ptr->..., Value2_Ptr->...);
if( rc < 0)
{
return(NDS_LOWER);
}
else
{
if( rc > 0)
{
return(NDS_GREATER);
}
else
{
return(NDS_EQUAL);
}
}
}
case 1:
{
int val1 = atoi(Value1_Ptr->...);
int val2 = atoi(Value2_Ptr->...);
if( val1 < val2)
{
return(NDS_LOWER);
}
else
{
if( val1 > val2)
{
return(NDS_GREATER);
}
else
{
return(NDS_EQUAL);
}
}
}
case 2:
{
...
}
default:
{
printf( "Unknown COMP idx (%d) !\n", Index_Id);
return( NDS_KO);
}
}
return( NDS_OK);
*/
}
case NDD_CMD_VALUE_ADD:
{
/*
void *Value_Ptr = (void *)va_arg( Args, void *);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
*/
TIMAT_OptionValue *OptionValue_Ptr = (TIMAT_OptionValue *)va_arg( Args, TIMAT_OptionValue *);
Command_Name = "NDD_CMD_VALUE_ADD";
OptionValue_Ptr->Node = Node_Ptr;
return( NDS_OK);
}
case NDD_CMD_VALUE_REMOVE:
{
/*
void *Value_Ptr = (void *)va_arg( Args, void *);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
*/
Command_Name = "NDD_CMD_VALUE_REMOVE";
return( NDS_OK);
}
case NDD_CMD_VALUE_PRINT:
{
/*
NDT_Node *Next_Node_Ptr = (NDT_Node *)va_arg( Args, NDT_Node *);
va_list lib_args = (va_list)va_arg( Args, va_list);
FILE *Out = (FILE *)va_arg( lib_args, FILE *);
NDT_Recursive_Mode Recursive_Mode = (NDT_Recursive_Mode)va_arg( lib_args, NDT_Recursive_Mode);
NDT_Recursive_Depth Recursive_Depth = (NDT_Recursive_Depth)va_arg( lib_args, NDT_Recursive_Depth);
va_list user_args = (va_list)va_arg( lib_args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
void *Value_Ptr = Node_Ptr->Value;
*/
NDT_Node *Next_Node_Ptr = (NDT_Node *)va_arg( Args, NDT_Node *);
va_list lib_args = (va_list)va_arg( Args, va_list);
FILE *Out = (FILE *)va_arg( lib_args, FILE *);
NDT_Recursive_Mode Recursive_Mode = (NDT_Recursive_Mode)va_arg( lib_args, NDT_Recursive_Mode);
NDT_Recursive_Depth Recursive_Depth = (NDT_Recursive_Depth)va_arg( lib_args, NDT_Recursive_Depth);
TIMAT_OptionValue *OptionValue_Ptr = Node_Ptr->Value;
Command_Name = "NDD_CMD_VALUE_PRINT";
fprintf( Out, "[");
TIMA_Opt_OptionValue_Print( Out, OptionValue_Ptr);
fprintf( Out, "] ");
return( NDS_OK);
}
case NDD_CMD_INFO_PRINT:
{
/*
NDT_Node *Next_Node_Ptr = (NDT_Node *)va_arg( Args, NDT_Node *);
va_list lib_args = (va_list)va_arg( Args, va_list);
FILE *Out = (FILE *)va_arg( lib_args, FILE *);
NDT_Recursive_Mode Recursive_Mode = (NDT_Recursive_Mode)va_arg( lib_args, NDT_Recursive_Mode);
NDT_Recursive_Depth Recursive_Depth = (NDT_Recursive_Depth)va_arg( lib_args, NDT_Recursive_Depth);
va_list user_args = (va_list)va_arg( lib_args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
void *Value_Ptr = Node_Ptr->Value;
*/
Command_Name = "NDD_CMD_INFO_PRINT";
return( NDS_OK);
}
case NDD_CMD_USER_TRAVERSE:
{
/*
NDT_Node *Next_Node_Ptr = (NDT_Node *)va_arg( Args, NDT_Node *);
va_list user_args = (va_list)va_arg( Args, va_list);
user_type user_data = (user_type)va_arg( user_args, user_type);
... = (...)va_arg( user_args, ...);
void *Value_Ptr = Node_Ptr->Value;
*/
Command_Name = "NDD_CMD_USER_TRAVERSE";
/*
return( NDS_OK);
*/
}
default:
{
printf( "Default_Manager() called with an undefined command %d\n", Command);
return(NDS_ERRAPI);
}
}
printf( "Default_Manager() called with command %d (%s)\n", Command, Command_Name);
return(NDS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Eval( char *Output_Str, int Output_Size, char *Input_Str)
{
char *cmd_prefix = "echo ";
char *command_ptr;
int old_stdout, pipe[2];
if( ( command_ptr = malloc( strlen( cmd_prefix) + strlen( Input_Str) + 1)) == NULL)
{
printf( "TIMA_Opt_Eval: malloc() failed !\n");
return(TIMAS_OK);
}
sprintf( command_ptr, "%s%s", cmd_prefix, Input_Str);
if( ( old_stdout = _dup( _fileno( stdout))) == -1)
{
printf( "TIMA_Opt_Eval: _dup2() failed !\n");
return(TIMAS_OK);
}
if( _pipe( pipe, 1024, _O_BINARY) == -1)
{
printf( "TIMA_Opt_Eval: _pipe() failed !\n");
return(TIMAS_OK);
}
if( _dup2( pipe[1], _fileno( stdout)) == -1)
{
printf( "TIMA_Opt_Eval: _dup2() failed !\n");
return(TIMAS_OK);
}
if( system( command_ptr) == -1)
{
printf( "TIMA_Opt_Eval: system() failed !\n");
return(TIMAS_OK);
}
if( fflush( stdout) != 0)
{
printf( "TIMA_Opt_Eval: fflush() failed !\n");
return(TIMAS_OK);
}
Output_Str[ _read( pipe[0], Output_Str, Output_Size) - 2] = '\0';
if( _dup2( old_stdout, _fileno( stdout)) == -1)
{
printf( "TIMA_Opt_Eval: _dup2() failed !\n");
return(TIMAS_OK);
}
if( _close( pipe[0]) == -1)
{
printf( "TIMA_Opt_Eval: _close() failed !\n");
return(TIMAS_OK);
}
if( _close( pipe[1]) == -1)
{
printf( "TIMA_Opt_Eval: _close() failed !\n");
return(TIMAS_OK);
}
free( command_ptr);
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_String_Parse( int *argc, char **argv, char *Input_String)
{
short i, j;
short new_arg;
for( i = 0, j = 0, new_arg = 1; ( i < 1024) && ( Input_String[i] != '\0'); i++)
{
if( ( Input_String[i] == ' ') || ( Input_String[i] == '\t') || ( Input_String[i] == '\r') || ( Input_String[i] == '\n'))
{
Input_String[i] = '\0';
new_arg = 1;
}
else
{
if( Input_String[i] == '#')
{
Input_String[i--] = '\0';
}
else
{
if( new_arg)
{
new_arg = 0;
argv[j++] = &Input_String[i];
}
}
}
}
*argc = j;
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_Value_Copy( TIMAT_Option *Option_Tab, short Opt, short Env, int *ArgNb_Ptr, int ArgC, char **ArgV, short Switch)
{
NDT_Status nd_status;
short arg;
TIMAT_OptionValue *optionvalue_ptr;
TIMAT_OptionValue value;
if( Option_Tab[Opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO)
{
if( Option_Tab[Opt].Arg_Number > 2)
{
if( Option_Tab[Opt].OptionValueStruct_Tab[Env] != NULL)
{
if( ( nd_status = ND_DataStruct_Flush( Option_Tab[Opt].OptionValueStruct_Tab[Env])) != NDS_OK)
{
printf( "Opt_Option_Value_Copy: ND_DataStructure_Flush() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
}
}
}
if( ( Option_Tab[Opt].Arg_Number - 1) > ArgC)
{
printf( "Opt_Option_Value_Copy: Missing option value for [%s] !\n", Option_Tab[Opt].Switch_Long);
return( TIMAS_KO);
}
arg = 0;
do
{
if( Option_Tab[Opt].Arg_Number == 1)
{
value.Type = Option_Tab[Opt].Value_Type_Tab[0];
value.Data[0] = (char)Switch;
value.Node = NULL;
}
else
{
value.Type = Option_Tab[Opt].Value_Type_Tab[ arg % ( Option_Tab[Opt].Arg_Number - 1)];
value.Node = NULL;
if( *(char *)( ArgV[arg]) == TIMAD_UNKNOWN)
{
*((char *)value.Data) = TIMAD_UNKNOWN;
}
else
{
switch( value.Type)
{
case TIMAD_OPTION_VALUE_TYPE_UNKNOWN:
{
*((char *)value.Data) = TIMAD_UNKNOWN;
break;
}
case TIMAD_OPTION_VALUE_TYPE_FLAG:
{
*((char *)value.Data) = ArgV[arg][0];
break;
}
case TIMAD_OPTION_VALUE_TYPE_LONG:
{
*((long *)value.Data) = atoi( ArgV[arg]);
break;
}
case TIMAD_OPTION_VALUE_TYPE_STRING:
{
strcpy( value.Data, ArgV[arg]);
break;
}
default:
{
printf( "Opt_Option_Value_Copy: Unknown option value type (%d) !\n", value.Type);
return( TIMAS_KO);
}
}
}
}
if( Option_Tab[Opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO)
{
Option_Tab[Opt].OptionValueData_Tab[Env].Type = value.Type;
strncpy( Option_Tab[Opt].OptionValueData_Tab[Env].Data, value.Data, TIMAD_OPTION_VALUE_LEN);
Option_Tab[Opt].OptionValueData_Tab[Env].Node = NULL;
}
else
{
if( ( nd_status = ND_Value_Alloc( Option_Tab[Opt].OptionValueStruct_Tab[Env], (void **)&optionvalue_ptr)) != NDS_OK)
{
printf( "Opt_Option_Value_Copy: ND_Value_Alloc() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
optionvalue_ptr->Type = value.Type;
strncpy( optionvalue_ptr->Data, value.Data, TIMAD_OPTION_VALUE_LEN);
if( ( nd_status = ND_DataStruct_Value_Add( Option_Tab[Opt].OptionValueStruct_Tab[Env], optionvalue_ptr)) != NDS_OK)
{
printf( "Opt_Option_Value_Copy: ND_DataStruct_Value_Add() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
}
arg++;
}
while( arg < ArgC);
if( Option_Tab[Opt].Arg_Number == 1)
{
*ArgNb_Ptr = 0;
}
else
{
*ArgNb_Ptr = arg;
}
return(TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_Init( TIMAT_Option *Option_Tab)
{
NDT_Status nd_status;
TIMAT_Status status;
short opt,env;
char val_def[TIMAD_OPTION_ARG_NUMBER_MAX * ( TIMAD_OPTION_VALUE_SIZE + 1)];
TIMAT_OptionValueData val_tmp;
int argc, argnb;
char *argv[255];
for( opt = 1; Option_Tab[opt].Arg_Number != 0; opt++)
{
for( env = 0; env < TIMAD_OPTION_ENV_NUMBER; env++)
{
if( Option_Tab[opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MULTI)
{
if( ( nd_status = ND_DataStruct_Open( &( Option_Tab[opt].OptionValueStruct_Tab[env]), 1, TIMAG_OptionValue_Type_Initial_Tab, \
"Manager_OptionValueStruct", Manager_OptionValueStruct, NULL, NULL, NULL, NULL, \
0, NULL)) != NDS_OK)
{
printf( "Opt_Option_Init: ND_DataStruct_Open() OptionStruct failed: (%d)...\n", nd_status);
return( TIMAS_KO);
}
}
if( env == TIMAD_OPTION_ENV_DEFAULT)
{
if( *((char *)Option_Tab[opt].OptionValueData_Flat_Default) != TIMAD_UNKNOWN)
{
strcpy( val_def, Option_Tab[opt].OptionValueData_Flat_Default);
if( ( status = Opt_Option_String_Parse( &argc, argv, val_def)) != TIMAS_OK)
{
printf( "Opt_Option_Init: Opt_Option_String_Parse() failed: (%d)...\n", status);
return( TIMAS_KO);
}
}
else
{
argc = 1;
val_tmp[0] = (char)TIMAD_UNKNOWN;
argv[0] = val_tmp;
}
}
else
{
argc = 1;
val_tmp[0] = (char)TIMAD_UNKNOWN;
argv[0] = val_tmp;
}
if( ( *((char *)argv[0]) != TIMAD_UNKNOWN) || ( Option_Tab[opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO))
{
if( ( status = Opt_Option_Value_Copy( Option_Tab, opt, env, &argnb, argc, argv, Option_Tab[opt].OptionValueData_Flat_Default[0])) != TIMAS_OK)
{
printf( "Opt_Option_Init: Opt_Option_Value_Copy() failed: (%d)...\n", status);
return( TIMAS_KO);
}
}
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_DeInit( TIMAT_Option *Option_Tab)
{
NDT_Status nd_status;
short i, j;
for( i = 1; Option_Tab[i].Arg_Number != 0; i++)
{
if( Option_Tab[i].Arg_Type == TIMAD_OPTION_ARG_TYPE_MULTI)
{
for( j = 1; j < TIMAD_OPTION_ENV_NUMBER; j++)
{
if( Option_Tab[i].OptionValueStruct_Tab[j] != NULL)
{
if( ( nd_status = ND_DataStruct_Close( Option_Tab[i].OptionValueStruct_Tab[j])) != NDS_OK)
{
printf( "Opt_Option_DeInit: ND_DataStruct_Close OptionStruct failled: (%d)...\n", nd_status);
}
}
}
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Init( void)
{
TIMAT_Status status;
if( ( status = Opt_Option_Init( TIMAG_Option_Tab)) != TIMAS_OK)
{
printf( "TIMA_Opt_Init: Opt_Option_Init() failed: (%d)...\n", status);
return( TIMAS_KO);
}
printf( "TIMA_Opt_Init Ok !\n");
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_DeInit( void)
{
TIMAT_Status status;
if( ( status = Opt_Option_DeInit( TIMAG_Option_Tab)) != TIMAS_OK)
{
printf( "TIMA_Opt_DeInit: Opt_Option_Init() failed: (%d)...\n", status);
return( TIMAS_KO);
}
printf( "TIMA_Opt_DeInit Ok !\n");
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_Value_Load( TIMAT_Option *Option_Tab, short Env, int *ArgNb_Ptr, int ArgC, char **ArgV)
{
NDT_Status nd_status;
TIMAT_Status status;
char *option_name;
short name_type;
short swtch;
short i;
if( *(ArgV[0]) == '-')
{
if( *(ArgV[0] + 1) == '-')
{
option_name = ArgV[0] + 2;
name_type = TIMAD_OPTION_NAME_TYPE_LONG;
}
else
{
option_name = ArgV[0] + 1;
name_type = TIMAD_OPTION_NAME_TYPE_SHORT;
}
}
else
{
printf( "TIMA_Opt_Option_Value_Load: Invalid command line string [%s]...\n", ArgV[0]);
return( TIMAS_KO);
}
for( i = 1; Option_Tab[i].Arg_Number != 0; i++)
{
if( Option_Tab[i].Arg_Number == 1)
{
if( name_type == TIMAD_OPTION_NAME_TYPE_LONG)
{
if( !strcmp( Option_Tab[i].Switch_On_Long, option_name))
{
swtch = TIMAD_TRUE;
break;
}
if( !strcmp( Option_Tab[i].Switch_Off_Long, option_name))
{
swtch = TIMAD_FALSE;
break;
}
}
else
{
if( !strcmp( Option_Tab[i].Switch_On_Short, option_name))
{
swtch = TIMAD_TRUE;
break;
}
if( !strcmp( Option_Tab[i].Switch_Off_Short, option_name))
{
swtch = TIMAD_FALSE;
break;
}
}
}
else
{
if( name_type == TIMAD_OPTION_NAME_TYPE_LONG)
{
if( !strcmp( Option_Tab[i].Switch_Long, option_name)) break;
}
else
{
if( !strcmp( Option_Tab[i].Switch_Short, option_name)) break;
}
}
}
if( Option_Tab[i].Arg_Number == 0)
{
printf( "TIMA_Opt_Option_Value_Load: Unknown option [%s]...\n", ArgV[0]);
return( TIMAS_KO);
}
if( Option_Tab[i].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO)
{
if( Option_Tab[i].Arg_Number > 2)
{
if( Option_Tab[i].OptionValueStruct_Tab[Env] != NULL)
{
if( ( nd_status = ND_DataStruct_Flush( Option_Tab[i].OptionValueStruct_Tab[Env])) != NDS_OK)
{
printf( "Opt_Option_Value_Load: ND_DataStructure_Flush() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
}
}
}
if( Option_Tab[i].Arg_Number > ArgC)
{
printf( "TIMA_Opt_Option_Value_Load: Missing option value for [%s] !\n", ArgV[0]);
return( TIMAS_KO);
}
if( ( status = Opt_Option_Value_Copy( Option_Tab, i, Env, ArgNb_Ptr, (Option_Tab[i].Arg_Number - 1), (ArgV + 1), swtch)) != TIMAS_OK)
{
printf( "Opt_Option_Init: Opt_Option_Value_Copy() failed: (%d)...\n", status);
return( TIMAS_KO);
}
(*ArgNb_Ptr)++;
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_Arg_Parse( TIMAT_Option *Option_Tab, short Env, int ArgC, char **ArgV)
{
TIMAT_Status status;
int argnb;
short i;
for( i = 1; i < ArgC; i += argnb)
{
if( ( status = Opt_Option_Value_Load( Option_Tab, Env, &argnb, ( ArgC - i), &(ArgV[i]))) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Arg_Parse: Can't load value (%d)...\n", status);
return( TIMAS_KO);
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_File_Parse( TIMAT_Option *Option_Tab, short Env, char *Config_File_Name)
{
TIMAT_Status status;
FILE *config_file;
char buf[1025] = "--";
int argc;
char *argv[255];
int argnb;
if( ( config_file = fopen( Config_File_Name, "r")) == NULL)
{
fprintf( stderr, "Opt_Option_File_Parse: can't open config file [%s] !\n", Config_File_Name);
return( TIMAS_OK);
}
while( ( !feof( config_file)) && ( fgets( (buf + 2), 1022, config_file) != NULL))
{
if( ( status = Opt_Option_String_Parse( &argc, argv, buf)) != TIMAS_OK)
{
printf( "Opt_Option_File_Parse: Opt_Option_String_Parse() failed (%d)...\n", status);
return( TIMAS_KO);
}
if( argc > 0)
{
if( ( status = Opt_Option_Value_Load( Option_Tab, Env, &argnb, argc, argv)) != TIMAS_OK)
{
printf( "Opt_Option_File_Parse: Can't load value (%d)...\n", status);
return( TIMAS_KO);
}
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status Opt_Option_Env_Copy( TIMAT_Option *Option_Tab, short Dst_Env, short Src_Env)
{
TIMAT_Status status;
NDT_Status nd_status;
short opt;
TIMAT_OptionValue *value_next_ptr, *value_new_ptr;
for( opt = 1; Option_Tab[opt].Arg_Number != 0 ; opt++)
{
if( ( Option_Tab[opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO) && ( Option_Tab[opt].Arg_Number <= 2))
{
if( Option_Tab[opt].OptionValueData_Tab[Src_Env].Data[0] != TIMAD_UNKNOWN)
{
Option_Tab[opt].OptionValueData_Tab[Dst_Env].Type = Option_Tab[opt].OptionValueData_Tab[Src_Env].Type;
strncpy( Option_Tab[opt].OptionValueData_Tab[Dst_Env].Data, Option_Tab[opt].OptionValueData_Tab[Src_Env].Data, TIMAD_OPTION_VALUE_SIZE);
Option_Tab[opt].OptionValueData_Tab[Dst_Env].Node = Option_Tab[opt].OptionValueData_Tab[Src_Env].Node;
}
}
else
{
if( Option_Tab[opt].OptionValueStruct_Tab[Src_Env]->Index_Tab[NDD_INDEX_PRIMARY].Node_Number > 0)
{
if( Option_Tab[opt].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO)
{
if( Option_Tab[opt].OptionValueStruct_Tab[Dst_Env] != NULL)
{
if( ( nd_status = ND_DataStruct_Flush( Option_Tab[opt].OptionValueStruct_Tab[Dst_Env])) != NDS_OK)
{
printf( "Opt_Option_Env_Copy: ND_DataStructure_Flush() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
}
}
value_next_ptr = NULL;
do
{
if( ( status = TIMA_Opt_OptionValue_Next( &value_next_ptr, value_next_ptr, &Option_Tab[opt], Src_Env)) != TIMAS_OK)
{
printf( "Opt_Option_Value_Load: TIMA_OptionValue_Next() failed (%d) !\n", status);
return( TIMAS_KO);
}
if( value_next_ptr != NULL)
{
if( ( nd_status = ND_Value_Alloc( Option_Tab[opt].OptionValueStruct_Tab[Dst_Env], (void **)&value_new_ptr)) != NDS_OK)
{
printf( "Opt_Option_Value_Load: ND_Value_Alloc() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
value_new_ptr->Type = value_next_ptr->Type;
strncpy( value_new_ptr->Data, value_next_ptr->Data, TIMAD_OPTION_VALUE_LEN);
if( ( nd_status = ND_DataStruct_Value_Add( Option_Tab[opt].OptionValueStruct_Tab[Dst_Env], value_new_ptr)) != NDS_OK)
{
printf( "Opt_Option_Value_Load: ND_DataStruct_Value_Add() failed (%d) !\n", nd_status);
return( TIMAS_KO);
}
}
}
while( value_next_ptr != NULL);
}
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Option_Load( int ArgC, char **ArgV)
{
TIMAT_Status status;
char cscs_path[TIMAD_OPTION_VALUE_SIZE];
char *config_file_name;
char config_file_path[TIMAD_OPTION_VALUE_SIZE];
/* Initial command line loading */
if( ( status = Opt_Option_Arg_Parse( TIMAG_Option_Tab, TIMAD_OPTION_ENV_COMMAND, ArgC, ArgV)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: Opt_Option_Arg_Parse() Command Env failed (%d) !\n", status);
return( TIMAS_KO);
}
/* CSCS dir handling */
if( TIMAG_Option_Tab[TIMAD_OPTION_ID_CSCS_DIR].OptionValueData_Tab[TIMAD_OPTION_ENV_COMMAND].Data[0] != TIMAD_UNKNOWN)
{
strcpy( cscs_path, TIMAG_Option_Tab[TIMAD_OPTION_ID_CSCS_DIR].OptionValueData_Tab[TIMAD_OPTION_ENV_COMMAND].Data);
}
else
{
if( TIMAG_Option_Tab[TIMAD_OPTION_ID_CSCS_DIR].OptionValueData_Tab[TIMAD_OPTION_ENV_DEFAULT].Data[0] != TIMAD_UNKNOWN)
{
strcpy( cscs_path, TIMAG_Option_Tab[TIMAD_OPTION_ID_CSCS_DIR].OptionValueData_Tab[TIMAD_OPTION_ENV_DEFAULT].Data);
}
else
{
printf( "CSCSPATH not found !\n");
exit( -1);
}
}
if( ( status = TIMA_Opt_Eval( cscs_path, TIMAD_OPTION_VALUE_SIZE, cscs_path)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: TIMA_Opt_Eval() failed (%d) !\n", status);
return( TIMAS_KO);
}
/* Config file handling */
if( TIMAG_Option_Tab[TIMAD_OPTION_ID_CONFIG_FILE].OptionValueData_Tab[TIMAD_OPTION_ENV_COMMAND].Data[0] != TIMAD_UNKNOWN)
{
config_file_name = TIMAG_Option_Tab[TIMAD_OPTION_ID_CONFIG_FILE].OptionValueData_Tab[TIMAD_OPTION_ENV_COMMAND].Data;
}
else
{
if( TIMAG_Option_Tab[TIMAD_OPTION_ID_CONFIG_FILE].OptionValueData_Tab[TIMAD_OPTION_ENV_DEFAULT].Data[0] != TIMAD_UNKNOWN)
{
config_file_name = TIMAG_Option_Tab[TIMAD_OPTION_ID_CONFIG_FILE].OptionValueData_Tab[TIMAD_OPTION_ENV_DEFAULT].Data;
}
else
{
config_file_name = NULL;
}
}
if( config_file_name != NULL)
{
sprintf( config_file_path, "%s\\%s", cscs_path, config_file_name);
if( ( status = Opt_Option_File_Parse( TIMAG_Option_Tab, TIMAD_OPTION_ENV_CONFIG, config_file_path)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: Opt_Option_File_Load() failed (%d) !\n", status);
return( TIMAS_KO);
}
}
/* Final command line loading */
if( ( status = Opt_Option_Env_Copy( TIMAG_Option_Tab, TIMAD_OPTION_ENV_CURRENT, TIMAD_OPTION_ENV_DEFAULT)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: Opt_Option_Env_Copy() DEFAULT to CURRENT failed (%d) !\n", status);
return( TIMAS_KO);
}
if( ( status = Opt_Option_Env_Copy( TIMAG_Option_Tab, TIMAD_OPTION_ENV_CURRENT, TIMAD_OPTION_ENV_CONFIG)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: Opt_Option_Env_Copy() CONFIG to CURRENT failed (%d) !\n", status);
return( TIMAS_KO);
}
if( ( status = Opt_Option_Env_Copy( TIMAG_Option_Tab, TIMAD_OPTION_ENV_CURRENT, TIMAD_OPTION_ENV_COMMAND)) != TIMAS_OK)
{
printf( "TIMA_Opt_Option_Load: Opt_Option_Env_Copy() COMMAND to CURRENT failed (%d) !\n", status);
return( TIMAS_KO);
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_OptionValue_Print( FILE *Out, TIMAT_OptionValue *OptionValue_Ptr)
{
switch( OptionValue_Ptr->Type)
{
case TIMAD_OPTION_VALUE_TYPE_UNKNOWN:
{
fprintf( Out, "Unknown Type");
break;
}
case TIMAD_OPTION_VALUE_TYPE_FLAG:
{
fprintf( Out, "%s", ( *OptionValue_Ptr->Data == TIMAD_UNKNOWN) ? "Unknown" : ( ( *OptionValue_Ptr->Data == TIMAD_TRUE) ? "ON" : ( ( *OptionValue_Ptr->Data == TIMAD_FALSE) ? "OFF" : "???")));
break;
}
case TIMAD_OPTION_VALUE_TYPE_LONG:
{
if( *(char *)OptionValue_Ptr->Data == TIMAD_UNKNOWN)
{
fprintf( Out, "%s", "Unknown");
}
else
{
fprintf( Out, "%d", *(long *)OptionValue_Ptr->Data);
}
break;
}
case TIMAD_OPTION_VALUE_TYPE_STRING:
{
fprintf( Out, "%s", ( *OptionValue_Ptr->Data == TIMAD_UNKNOWN) ? "Unknown" : OptionValue_Ptr->Data);
break;
}
default:
{
fprintf( Out, "???");
break;
}
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Option_Print( FILE *Out, TIMAT_Option *OptionStruct_Ptr)
{
NDT_Status nd_status;
short i;
for( i = 1; TIMAG_Option_Tab[i].Arg_Number != 0; i++)
{
if( TIMAG_Option_Tab[i].Switch_Off_Long[0] != '\0')
{
fprintf( Out, "-%s%*s--%s%*sSwitch On %s\n",
TIMAG_Option_Tab[i].Switch_On_Short, ( 3 + TIMAD_OPTION_SWITCH_SHORT_SIZE - strlen( TIMAG_Option_Tab[i].Switch_On_Short)), " ",
TIMAG_Option_Tab[i].Switch_On_Long, ( 3 + TIMAD_OPTION_SWITCH_LONG_SIZE - strlen( TIMAG_Option_Tab[i].Switch_On_Long) + 3 + TIMAD_OPTION_ARG_LABEL_SIZE), " ",
TIMAG_Option_Tab[i].Label);
fprintf( Out, "-%s%*s--%s%*sSwitch Off %s%*s",
TIMAG_Option_Tab[i].Switch_Off_Short, ( 3 + TIMAD_OPTION_SWITCH_SHORT_SIZE - strlen( TIMAG_Option_Tab[i].Switch_Off_Short)), " ",
TIMAG_Option_Tab[i].Switch_Off_Long, ( 3 + TIMAD_OPTION_SWITCH_LONG_SIZE - strlen( TIMAG_Option_Tab[i].Switch_Off_Long) + 3 + TIMAD_OPTION_ARG_LABEL_SIZE), " ",
TIMAG_Option_Tab[i].Label, ( 3 + TIMAD_OPTION_LABEL_SIZE - strlen( TIMAG_Option_Tab[i].Label) - 11), " ");
}
else
{
fprintf( Out, "-%s%*s--%s%*s%s%*s%s%*s",
TIMAG_Option_Tab[i].Switch_Short, ( 3 + TIMAD_OPTION_SWITCH_SHORT_SIZE - strlen( TIMAG_Option_Tab[i].Switch_Short)), " ",
TIMAG_Option_Tab[i].Switch_Long, ( 3 + TIMAD_OPTION_SWITCH_LONG_SIZE - strlen( TIMAG_Option_Tab[i].Switch_Long)), " ",
TIMAG_Option_Tab[i].Arg_Label, ( 3 + TIMAD_OPTION_ARG_LABEL_SIZE - strlen( TIMAG_Option_Tab[i].Arg_Label)), " ",
TIMAG_Option_Tab[i].Label, ( 3 + TIMAD_OPTION_LABEL_SIZE - strlen( TIMAG_Option_Tab[i].Label)), " ");
}
fprintf( Out, "Default: ");
if( ( TIMAG_Option_Tab[i].Arg_Number <= 2) && ( TIMAG_Option_Tab[i].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO))
{
fprintf( Out, "[");
TIMA_Opt_OptionValue_Print( Out, &TIMAG_Option_Tab[i].OptionValueData_Tab[TIMAD_OPTION_ENV_DEFAULT]);
fprintf( Out, "]\n");
}
else
{
if( TIMAG_Option_Tab[i].OptionValueStruct_Tab[TIMAD_OPTION_ENV_DEFAULT]->Index_Tab[NDD_INDEX_PRIMARY].Node_Number >0)
{
if( ( nd_status = ND_DataStruct_Value_Print( Out, TIMAG_Option_Tab[i].OptionValueStruct_Tab[TIMAD_OPTION_ENV_DEFAULT], NDD_RECURSIVE_MODE_PARENT_CHILD, 2, 0)) != NDS_OK)
{
printf( "TIMA_Opt_Option_Print: ND_DataStruct_Value_Print() failed: (%d)...\n", nd_status);
return( TIMAS_KO);
}
fprintf( Out, "\n");
}
else
{
fprintf( Out, "[]\n");
}
}
}
fprintf( Out, "\n");
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Option_Dump( FILE *Out, TIMAT_Option *OptionStruct_Ptr)
{
NDT_Status nd_status;
short i, j;
for( i = 1; TIMAG_Option_Tab[i].Arg_Number != 0; i++)
{
if( TIMAG_Option_Tab[i].Switch_Off_Long[0] != '\0')
{
fprintf( Out, "Long On Switch: [--%s] Short On Switch: [-%s] Long Off Switch: [--%s] Short Off Switch: [-%s] ",
TIMAG_Option_Tab[i].Switch_On_Long, TIMAG_Option_Tab[i].Switch_On_Short,
TIMAG_Option_Tab[i].Switch_Off_Long, TIMAG_Option_Tab[i].Switch_Off_Short);
}
else
{
fprintf( Out, "Long Switch: [--%s] Short Switch: [-%s] ",
TIMAG_Option_Tab[i].Switch_Long, TIMAG_Option_Tab[i].Switch_Short);
}
fprintf( Out, "Label: [%s] Arg Number: (%d) Arg Type: (%d) [%s]\nValue Type: ",
TIMAG_Option_Tab[i].Label, TIMAG_Option_Tab[i].Arg_Number, TIMAG_Option_Tab[i].Arg_Type, TIMA_OPTION_ARG_TYPE_ASCII_GET( TIMAG_Option_Tab[i].Arg_Type));
for( j = 0; j < TIMAG_Option_Tab[i].Arg_Number; j++)
{
fprintf( Out, "(%d) [%s] ", TIMAG_Option_Tab[i].Value_Type_Tab[j], TIMA_OPTION_VALUE_TYPE_ASCII_GET(TIMAG_Option_Tab[i].Value_Type_Tab[j]));
}
fprintf( Out, "OptionValueData Flat Default: [%s]\n", ( TIMAG_Option_Tab[i].OptionValueData_Flat_Default[0] == (char)TIMAD_UNKNOWN) ? "Unknown" : TIMAG_Option_Tab[i].OptionValueData_Flat_Default);
fprintf( Out, "Value:");
if( TIMAG_Option_Tab[i].Arg_Type == TIMAD_OPTION_ARG_TYPE_MONO)
{
for( j = 0; j < TIMAD_OPTION_ENV_NUMBER; j++)
{
if( j != TIMAD_OPTION_ENV_UNKNOWN)
{
fprintf( Out, " %s: [", TIMA_OPTION_ENV_ASCII_GET( j));
TIMA_Opt_OptionValue_Print( Out, &TIMAG_Option_Tab[i].OptionValueData_Tab[j]);
fprintf( Out, "]");
}
}
fprintf( Out, "\n");
}
else
{
if( TIMAG_Option_Tab[i].Arg_Type == TIMAD_OPTION_ARG_TYPE_MULTI)
{
for( j = 0; j < TIMAD_OPTION_ENV_NUMBER; j++)
{
if( j != TIMAD_OPTION_ENV_UNKNOWN)
{
fprintf( Out, "\n %s:%*s", TIMA_OPTION_ENV_ASCII_GET( j), ( 10 - strlen(TIMA_OPTION_ENV_ASCII_GET( j))), " ");
if( ( nd_status = ND_DataStruct_Value_Print( Out, TIMAG_Option_Tab[i].OptionValueStruct_Tab[j], NDD_RECURSIVE_MODE_PARENT_CHILD, 2, 0)) != NDS_OK)
{
printf( "TIMA_Opt_Option_Dump: ND_DataStruct_Value_Print() failed: (%d)...\n", nd_status);
return( TIMAS_KO);
}
}
}
}
}
fprintf( Out, "\n");
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_OptionValue_Next( TIMAT_OptionValue **OptionValue_Next_Ptr_Ptr, TIMAT_OptionValue *OptionValue_Cur_Ptr, TIMAT_Option *Option_Ptr, short Env)
{
NDT_Status nd_status;
NDT_Node *node_ptr;
if( OptionValue_Cur_Ptr == NULL)
{
if( ( nd_status = ND_Index_Node_First_Get( &node_ptr, Option_Ptr->OptionValueStruct_Tab[Env], NDD_INDEX_PRIMARY)) != NDS_OK)
{
node_ptr = NULL;
// return( TIMAS_KO);
}
}
else
{
if( ( nd_status = ND_Index_Node_Next_Get( &node_ptr, OptionValue_Cur_Ptr->Node)) != NDS_OK)
{
node_ptr = NULL;
// return( TIMAS_KO);
}
}
if( node_ptr != NULL)
{
*OptionValue_Next_Ptr_Ptr = node_ptr->Value;
}
else
{
*OptionValue_Next_Ptr_Ptr = NULL;
}
return( TIMAS_OK);
}
/*---------------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------------*/
TIMAT_Status TIMA_Opt_Obj_Status_Get( short *Status, short Option_Id_Enabled, short Option_Id_Disabled, short Env, short OptionValueData_Nb, TIMAT_OptionValueData *Data_Tab)
{
TIMAT_Status status;
TIMAT_OptionValue *optionvalue_ptr = NULL;
short match, i;
do
{
for( i = 0, match = TIMAD_TRUE; i < OptionValueData_Nb; i++)
{
if( ( status = TIMA_Opt_OptionValue_Next( &optionvalue_ptr, optionvalue_ptr, &TIMAG_Option_Tab[Option_Id_Enabled], Env)) != TIMAS_OK)
{
printf( "TIMA_Opt_Obj_Status_Get: TIMA_Opt_OptionValue_Next() failed (%d)...\n", status);
return( TIMAS_KO);
}
if( optionvalue_ptr == NULL)
{
i = OptionValueData_Nb;
}
else
{
if( ( match == TIMAD_TRUE) && ( strcmp( optionvalue_ptr->Data, Data_Tab[i])))
{
match = TIMAD_FALSE;
}
}
}
}
while( ( optionvalue_ptr != NULL) && ( match != TIMAD_TRUE));
if( optionvalue_ptr == NULL)
{
do
{
for( i = 0, match = TIMAD_TRUE; i < OptionValueData_Nb; i++)
{
if( ( status = TIMA_Opt_OptionValue_Next( &optionvalue_ptr, optionvalue_ptr, &TIMAG_Option_Tab[Option_Id_Disabled], Env)) != TIMAS_OK)
{
printf( "TIMA_Opt_Obj_Status_Get: TIMA_Opt_OptionValue_Next() failed (%d)...\n", status);
return( TIMAS_KO);
}
if( optionvalue_ptr == NULL)
{
i = OptionValueData_Nb;
}
else
{
if( ( match == TIMAD_TRUE) && ( strcmp( optionvalue_ptr->Data, Data_Tab[i])))
{
match = TIMAD_FALSE;
}
}
}
}
while( ( optionvalue_ptr != NULL) && ( match != TIMAD_TRUE));
if( optionvalue_ptr == NULL)
{
*Status = TIMAD_TRUE;
}
else
{
*Status = TIMAD_FALSE;
}
}
else
{
*Status = TIMAD_TRUE;
}
return(TIMAS_OK);
}