/*
 
uf_eplib_types.h
File description:

    User function support for the  Library
**********************************************************************/

#ifndef UF_EPLIB_TYPES_INCLUDED
#define UF_EPLIB_TYPES_INCLUDED

/**************
** Includes **
**************/

#include <uf_defs.h>
#include <uf_attr.h>



/************
** Macros **
************/


/***************
** Constants **
***************/


#define UF_EPLIB_TABLE_LOADED_NONE    0
#define UF_EPLIB_TABLE_LOADED_HEADER  1
#define UF_EPLIB_TABLE_LOADED_ALL     2

#define UF_EPLIB_TYPE_FILE_SELECT     0
#define UF_EPLIB_TYPE_VIEW            1
#define UF_EPLIB_TYPE_EXTERNAL        2

/**************************
** Structures and Types **
**************************/


/*
*/


enum UF_ELIB_type_e
{
  UF_EPLIB_CHARX_TYPE_UNKNOWN   = -1 ,
  UF_EPLIB_CHARX_TYPE_INT       =  0 , /*  */
  UF_EPLIB_CHARX_TYPE_REAL      =  1 , /*  */
  UF_EPLIB_CHARX_TYPE_STR       =  4 , /*  */
  UF_EPLIB_CHARX_TYPE_ANY       =  6 , /*  */
  UF_EPLIB_CHARX_TYPE_REF       = 10 ,
  UF_EPLIB_CHARX_TYPE_ANY_REF   = 11 ,
  UF_EPLIB_CHARX_TYPE_INT_EXPR  = 12 , /* integer expresions for characteristic */
  UF_EPLIB_CHARX_TYPE_REAL_EXPR = 13 , /* real    expresions for characteristic */
  UF_EPLIB_CHARX_TYPE_STR_EXPR  = 14 , /* string  expresions for characteristic */
  UF_EPLIB_CHARX_TYPE_LAST      = 15   /* The last in the list. It is not a real type */
};

/* Characteristic Value Structure*/
struct UF_EPLIB_charx_value_u
{
   int            i_value;   /* UF_EPLIB_CHARX_TYPE_INT  - Integer charx value */
   double         r_value;   /* UF_EPLIB_CHARX_TYPE_REAL - Real charx value    */
   char           *s_value;  /* UF_EPLIB_CHARX_TYPE_STR  - String charx value
                                UF_EPLIB_CHARX_TYPE_INT_EXPR  - Expression integer charx value
                                UF_EPLIB_CHARX_TYPE_REAL_EXPR - Expression real   charx value
                                UF_EPLIB_CHARX_TYPE_STR_EXPR  - Expression string charx value  */

};
typedef struct UF_EPLIB_charx_value_u UF_EPLIB_charx_value_u_t,
                   *UF_EPLIB_charx_value_u_p_t;

/* Characteristic description */
struct UF_EPLIB_charx_s
{
   int                         type;    /* see UF_ELIB_type_e */
   char                        title[ UF_ATTR_MAX_TITLE_BUFSIZE ];    /* Charx title */
   UF_EPLIB_charx_value_u_t    value;
};
typedef struct UF_EPLIB_charx_s UF_EPLIB_charx_t, *UF_EPLIB_charx_p_t;

/* Multi valued characteristic definition.  Typically used for Specification
* characteristics in an application view.
*/

struct UF_EPLIB_multi_val_charx_s
{
   UF_ELIB_type_e              type;
   char                        title[ UF_ATTR_MAX_TITLE_BUFSIZE ];    /* Charx title */
   int                         num_values; /* Number of possible characteristic values */
   UF_EPLIB_charx_value_u_t    *values;    /* len:num_values */
};
typedef struct UF_EPLIB_multi_val_charx_s UF_EPLIB_multi_val_charx_t, *UF_EPLIB_multi_val_charx_p_t;

struct UF_EPLIB_part_lib_part_s
{
   int                 num_charx;
   UF_EPLIB_charx_p_t  charx; /*  */
};
typedef struct UF_EPLIB_part_lib_part_s UF_EPLIB_part_lib_part_t,
       *UF_EPLIB_part_lib_part_p_t;

struct UF_EPLIB_part_table_column_s
{
   int      type;
   char    *name;
   logical  hidden;
   logical  variable;
};
typedef struct UF_EPLIB_part_table_column_s UF_EPLIB_part_table_column_t,
       *UF_EPLIB_part_table_column_p_t;

struct UF_EPLIB_part_table_applcx_s
{
   char  *name;
   char  *format;
   char **appl_columns; /*  */
   int    num_appl_col;
};
typedef struct UF_EPLIB_part_table_applcx_s UF_EPLIB_part_table_applcx_t,
       *UF_EPLIB_part_table_applcx_p_t;

union UF_EPLIB_part_table_datum_u
{
   char  *string_data;
   int    integer_data;
   double real_data;
};
typedef union UF_EPLIB_part_table_datum_u UF_EPLIB_part_table_datum_t,
       *UF_EPLIB_part_table_datum_p_t;

struct UF_EPLIB_part_table_index_s
{
   int   row;
   char *part_number;
};
typedef struct UF_EPLIB_part_table_index_s UF_EPLIB_part_table_index_t,
              *UF_EPLIB_part_table_index_p_t;

struct UF_EPLIB_part_table_s
{
   char                          *name;
   char                          *description;
   char                          *image;
   UF_EPLIB_part_table_column_t **columns;/*  */
   int                            num_columns;
   int                            num_rows;
   UF_EPLIB_part_table_datum_t   *data;
   UF_EPLIB_part_table_applcx_t **applied;/*  */
   int                            num_applied;
   int                            load_status;
   UF_EPLIB_part_table_index_t   *pn_index;
};
typedef struct UF_EPLIB_part_table_s UF_EPLIB_part_table_t,
              *UF_EPLIB_part_table_p_t;

struct UF_EPLIB_part_library_view_node_s
{
   char               *identifier;
   char               *name;
   char               *bitmap;
   char               *filter;
   UF_EPLIB_part_table_t *table;
   int                 num_subnodes;
   struct UF_EPLIB_part_library_view_node_s **subnodes; /*  */
};
typedef struct UF_EPLIB_part_library_view_node_s UF_EPLIB_part_lib_view_node_t,
              *UF_EPLIB_part_lib_view_node_p_t;

struct UF_EPLIB_part_library_view_s
{
   char                           *name;
   UF_EPLIB_part_lib_view_node_t *top;
};
typedef struct UF_EPLIB_part_library_view_s UF_EPLIB_part_library_view_t,
              *UF_EPLIB_part_library_view_p_t;

struct UF_EPLIB_part_lib_s
{
   char                      *part_number;
   char                      *part_file_name;
   char                      *family_member_name;
   UF_EPLIB_part_library_view_t  *part_library_view;
   char                      *external_library;
   int                       part_library_type;
   char                         *entry_point;
};
typedef struct UF_EPLIB_part_lib_s UF_EPLIB_part_lib_t,
              *UF_EPLIB_part_lib_p_t;



#endif /* UF_EPLIB_TYPES_INCLUDED */