Add ND_Library_Open() and ND_Library_Close() calls,
Code clean up.
This commit is contained in:
parent
126de83bc9
commit
3c40fadbff
287
demo/nddemo0.c
287
demo/nddemo0.c
@ -1,9 +1,9 @@
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $RCSfile: nddemo0.c,v $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $Revision: 2.6 $ */
|
||||
/* $Revision: 2.7 $ */
|
||||
/* $Name: $ */
|
||||
/* $Date: 2004/06/17 22:28:52 $ */
|
||||
/* $Date: 2004/08/01 23:35:39 $ */
|
||||
/* $Author: agibert $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
@ -31,8 +31,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <node.h>
|
||||
//#include <windows.h>
|
||||
|
||||
|
||||
|
||||
@ -52,10 +52,10 @@
|
||||
|
||||
typedef struct Demo_Value
|
||||
{
|
||||
char Val0[VAL_SIZE];
|
||||
char Val1[VAL_SIZE];
|
||||
char Val2[VAL_SIZE];
|
||||
char Val3[VAL_SIZE];
|
||||
char Val0[VAL_SIZE];
|
||||
char Val1[VAL_SIZE];
|
||||
char Val2[VAL_SIZE];
|
||||
char Val3[VAL_SIZE];
|
||||
} Demo_Value;
|
||||
|
||||
|
||||
@ -94,7 +94,7 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
|
||||
Command_Name = "NDD_CMD_MANAGER_VERSION";
|
||||
|
||||
*Version_Name_Ptr = "$Revision: 2.6 $ $Name: $ $Date: 2004/06/17 22:28:52 $ $Author: agibert $";
|
||||
*Version_Name_Ptr = "$Revision: 2.7 $ $Name: $ $Date: 2004/08/01 23:35:39 $ $Author: agibert $";
|
||||
|
||||
return( NDS_OK);
|
||||
}
|
||||
@ -102,10 +102,10 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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);
|
||||
void *Value_ptr = (void *)va_arg( Args, void *);
|
||||
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);
|
||||
void *Value_ptr = (void *)va_arg( Args, void *);
|
||||
*/
|
||||
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 *);
|
||||
@ -159,10 +159,10 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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, ...);
|
||||
*/
|
||||
Demo_Value **Value_Ptr_Ptr = va_arg( Args, Demo_Value **);
|
||||
|
||||
@ -187,10 +187,10 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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, ...);
|
||||
*/
|
||||
Demo_Value *Value_Ptr = (Demo_Value *)va_arg( Args, Demo_Value *);
|
||||
|
||||
@ -205,11 +205,11 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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, ...);
|
||||
*/
|
||||
Demo_Value *Value1_Ptr = va_arg( Args, Demo_Value *);
|
||||
Demo_Value *Value2_Ptr = va_arg( Args, Demo_Value *);
|
||||
@ -302,10 +302,10 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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_ADD";
|
||||
@ -316,10 +316,10 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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";
|
||||
@ -329,16 +329,16 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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;
|
||||
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);
|
||||
@ -352,7 +352,7 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
Command_Name = "NDD_CMD_VALUE_PRINT";
|
||||
|
||||
fprintf( Out, "Val0: (%s) Val1: (%s) Val2: (%s) Val3: (%s)\n",
|
||||
Value_Ptr->Val0, Value_Ptr->Val1, Value_Ptr->Val2, Value_Ptr->Val3);
|
||||
Value_Ptr->Val0, Value_Ptr->Val1, Value_Ptr->Val2, Value_Ptr->Val3);
|
||||
|
||||
return( NDS_OK);
|
||||
}
|
||||
@ -360,16 +360,16 @@ NDT_Status Manager_Demo_DS( NDT_Root *Root_Ptr, NDT_Index_Id Index_Id, NDT_No
|
||||
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, ...);
|
||||
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;
|
||||
void *Value_Ptr = Node_Ptr->Value;
|
||||
*/
|
||||
|
||||
Command_Name = "NDD_CMD_INFO_PRINT";
|
||||
@ -433,7 +433,7 @@ void DataStruct_Load( NDT_Root *ds_ptr, FILE *demo_file)
|
||||
else
|
||||
{
|
||||
printf( "Input line read: \t(%s)\t(%s)\t(%s)\t(%s)\n", val0, val1, val2, val3);
|
||||
printf( "Allocate Vallue: ");
|
||||
printf( "Allocate Vallue: ");
|
||||
|
||||
if( ( status = ND_Value_Alloc( ds_ptr, (void **)&value_ptr)) != NDS_OK)
|
||||
{
|
||||
@ -546,107 +546,126 @@ void Demo( char *Demo_File_Name, short Optimized_Mode)
|
||||
NDT_Status status;
|
||||
NDT_Root *demo_ds_ptr;
|
||||
NDT_Index_Type index_type_initial_tab[INDEX_NB] =
|
||||
{
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO)
|
||||
};
|
||||
{
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO)
|
||||
};
|
||||
NDT_Index_Type index_type_final_tab[INDEX_NB] =
|
||||
{
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO)
|
||||
};
|
||||
{
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
|
||||
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_FIFO)
|
||||
};
|
||||
NDT_Index_Type *index_type_ptr;
|
||||
FILE *demo_file;
|
||||
|
||||
|
||||
printf( "Create demo DataStructure: ");
|
||||
printf( "Open library: ");
|
||||
|
||||
if( Optimized_Mode)
|
||||
if( ( status = ND_Library_Open( NDD_TRUE)) != NDS_OK)
|
||||
{
|
||||
index_type_ptr = index_type_initial_tab;
|
||||
}
|
||||
else
|
||||
{
|
||||
index_type_ptr = index_type_final_tab;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if( ( status = ND_DataStruct_Open( &demo_ds_ptr, INDEX_NB, index_type_ptr, "Manager_Demo_DS", Manager_Demo_DS, NULL, NULL, NULL, NULL,0, NULL)) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Open() failed (%d) !\n", status);
|
||||
printf( "ND_Library_Open() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
|
||||
printf( "Open demo datafile: ");
|
||||
printf( "Create demo DataStructure: ");
|
||||
|
||||
if( ( demo_file = fopen( Demo_File_Name, "r")) == NULL)
|
||||
{
|
||||
printf( "fopen() failed (%d/%s) !\n", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
if( Optimized_Mode)
|
||||
{
|
||||
index_type_ptr = index_type_initial_tab;
|
||||
}
|
||||
else
|
||||
{
|
||||
index_type_ptr = index_type_final_tab;
|
||||
}
|
||||
|
||||
if( ( status = ND_DataStruct_Open( &demo_ds_ptr, INDEX_NB, index_type_ptr, "Manager_Demo_DS", Manager_Demo_DS, NULL, NULL, NULL, NULL,0, NULL)) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Open() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
|
||||
printf( "Open demo datafile: ");
|
||||
|
||||
if( ( demo_file = fopen( Demo_File_Name, "r")) == NULL)
|
||||
{
|
||||
printf( "fopen() failed (%d/%s) !\n", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
|
||||
|
||||
|
||||
printf( "\n\n\nLaod Data File:\n\n");
|
||||
DataStruct_Load( demo_ds_ptr, demo_file);
|
||||
printf( "\n\n\nLaod Data File:\n\n");
|
||||
DataStruct_Load( demo_ds_ptr, demo_file);
|
||||
|
||||
|
||||
|
||||
if( Optimized_Mode)
|
||||
{
|
||||
if( Optimized_Mode)
|
||||
{
|
||||
|
||||
printf( "\n\n\nInitial Structure Dump:\n\n");
|
||||
DataStruct_Dump( demo_ds_ptr);
|
||||
printf( "\n\n\nInitial Structure Dump:\n\n");
|
||||
DataStruct_Dump( demo_ds_ptr);
|
||||
|
||||
|
||||
|
||||
printf( "Convert data structure: ");
|
||||
printf( "Convert data structure: ");
|
||||
|
||||
if( ( status = ND_DataStruct_Convert( demo_ds_ptr, index_type_final_tab)) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Convert() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
}
|
||||
}
|
||||
if( ( status = ND_DataStruct_Convert( demo_ds_ptr, index_type_final_tab)) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Convert() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
printf( "\n\n\nFinal Structure Dump:\n\n");
|
||||
DataStruct_Dump( demo_ds_ptr);
|
||||
printf( "\n\n\nFinal Structure Dump:\n\n");
|
||||
DataStruct_Dump( demo_ds_ptr);
|
||||
|
||||
|
||||
|
||||
printf( "Close demo datafile: ");
|
||||
printf( "Close demo datafile: ");
|
||||
|
||||
if( fclose( demo_file) != 0)
|
||||
{
|
||||
printf( "fclose() failed (%d/%s) !\n", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
}
|
||||
}
|
||||
if( fclose( demo_file) != 0)
|
||||
{
|
||||
printf( "fclose() failed (%d/%s) !\n", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
printf( "Close demo DataStructure: ");
|
||||
printf( "Close demo DataStructure: ");
|
||||
|
||||
if( ( status = ND_DataStruct_Close( demo_ds_ptr)) != NDS_OK)
|
||||
if( ( status = ND_DataStruct_Close( demo_ds_ptr)) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Close() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "Ok !\n");
|
||||
}
|
||||
}
|
||||
|
||||
printf( "Close library: ");
|
||||
|
||||
if( ( status = ND_Library_Close()) != NDS_OK)
|
||||
{
|
||||
printf( "ND_DataStruct_Close() failed (%d) !\n", status);
|
||||
printf( "ND_Library_Close() failed (%d) !\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -670,34 +689,4 @@ int main( int argc, char **argv)
|
||||
|
||||
printf( "\n\n\n\n\nOptimized Demo\n--------------\n\n\n");
|
||||
Demo( DEMO_FILE_NAME, 1);
|
||||
|
||||
{
|
||||
/*
|
||||
HMODULE my_module;
|
||||
char buf[256];
|
||||
FARPROC my_function;
|
||||
|
||||
my_module = GetModuleHandle( NULL);
|
||||
printf( "Module_Handle: (%p)\n", my_module);
|
||||
|
||||
buf[0] = '\0';
|
||||
GetModuleFileName( my_module, buf, 255);
|
||||
printf( "Module_Name: (%s)\n", buf);
|
||||
|
||||
my_function = GetProcAddress( my_module, "zob");
|
||||
printf( "Function_Addr: (%p)\n", my_function);
|
||||
|
||||
my_function();
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
__declspec(dllexport) void zob(void)
|
||||
{
|
||||
printf( "Zoby la mouche qui pête...!!!\n");
|
||||
}
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user