/*----------------------------------------------------------------------------*/
/* datastr.h                                                                  */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* This file is part of LibDataStr.                                           */
/*                                                                            */
/*    LibDataStr is free software: you can redistribute it and/or modify it   */
/*    under the terms of the GNU Lesser General Public License as published   */
/*    by the Free Software Foundation, either version 3 of the License, or    */
/*    (at your option) any later version.                                     */
/*                                                                            */
/*    LibDataStr is distributed in the hope that it will be useful,           */
/*    but WITHOUT ANY WARRANTY; without even the implied warranty of          */
/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the            */
/*    GNU Lesser General Public License for more details.                     */
/*                                                                            */
/*    You should have received a copy of the GNU Lesser General Public        */
/*    License along with LibDataStr. If not, see                              */
/*    .                                        */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* Includes                                                                   */
/*----------------------------------------------------------------------------*/
#ifndef _LIBDATASTR
#define _LIBDATASTR
#ifdef __cplusplus
//extern "C" {
#endif
#include 
/* Code retour des fonctions constituant l'API */
typedef long DST_Status;
#define DSS_OK          SMS_OK      /* La fonction s'est correctement exécutée et a produit un résultat */
#define DSS_KO          SMS_KO      /* La fonction s'est correctement exécutée mais n'a pas produit de résultat */
#define DSS_YES         SMS_OK      /* Résultat booléen positif */
#define DSS_NO          SMS_KO      /* Résultat booléen négatif */
#define DSS_ERRMEM      SMS_ERRMEM  /* Problème d'allocation mémoire */
#define DSS_ERRAPI      SMS_ERRAPI  /* Utilisation incorrecte des API */
#define DSS_ERRSHM      SMS_ERRSHM  /* Problème relatif aux segments de mémoire partagée */
#define DSS_ERRSEM      SMS_ERRSEM  /* Problème relatif à l'utilisation des sémaphores */
#define DSS_ERRSIG      SMS_ERRSIG  /* Opération sur sémaphore interrompue par un signal */
#define DSS_ERRDLL      -6          /* Problème de chargement dynamique de librairie */
#define DS_ERROR(s)     ((s) < 0)     /* Tous les codes retour négatifs correspondent à des erreurs */
/* Indicateurs */
typedef int DST_Flags;
#define DSD_UNDEF   0
/* Flags d'ouverture d'une data structure */
#define DSD_OPEN        SMD_OPEN                /* autorise l'ouverture d'une structure existante */
#define DSD_CREATE      SMD_CREATE              /* autorise la création de la structure */
#define DSD_NEW         ~(DSD_OPEN|DSD_CREATE)  /* crée une autre structure dans un heap existant */
/* Flags de debug sur l'ouverture de la librairie */
#define DSD_DEBUG_NONE  0    /* pour n'afficher aucun message généré par les diverses librairies */
#define DSD_DEBUG       1    /* pour afficher les messages générés par la librairie */
#define DSD_DEBUG_ALL   2    /* pour afficher les messages générés par toutes les librairies sous-jacentes */
/*----------------------------------------------------------------------------*/
/* Utilisations possibles des flags d'ouverture                               */
/*----------------------------------------------------------------------------*/
/*                                                                            */
/* DSD_OPEN                                                                   */
/*      -> ouvrir une structure existante                                     */
/*      -> ne pas la créer si elle n'existe pas                               */
/*                                                                            */
/* DSD_OPEN | DSD_CREATE                                                      */
/*      -> ouvrir une structure si elle existe                                */
/*      -> la créer si elle n'existe pas                                      */
/*                                                                            */
/* DSD_CREATE                                                                 */
/*      -> créer une structure                                                */
/*      -> ne pas l'ouvrir si elle existe déjà                                */
/*                                                                            */
/* DSD_CREATE | DSD_NEW                                                       */
/*      -> créer la structure si elle n'existe pas                            */
/*      -> créer une autre structure dans le même heap si elle existe déjà    */
/*                                                                            */
/* DSD_NEW                                                                    */
/*      -> créer une autre structure dans le même heap si elle existe déjà    */
/*      -> ne pas la créer si elle n'existe pas                               */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* Flags de verrouillage d'une data structure */
#define DSD_READ    SMD_READ    /* verrou partagé */
#define DSD_WRITE   SMD_WRITE   /* verrou exclusif */
/* Flags de fermeture d'une data structure */
#define DSD_CLOSE   SMD_CLOSE       /* pour fermer simplement la structure */
#define DSD_DESTROY SMD_DESTROY     /* pour détruire la structure */
/* Masques pour récupérer des valeurs combinées */
#define DSD_MSK_OPEN(a)               ( DSD_OPEN & (a))
#define DSD_MSK_CREATE(a)             ( DSD_CREATE & (a))
#define DSD_MSK_NEW(a)                ( DSD_NEW & (a))
#define DSD_MSK_READ(a)               ( DSD_READ & (a))
#define DSD_MSK_WRITE(a)              ( DSD_WRITE & (a))
#define DSD_MSK_RW(a)                 ( ( DSD_READ | DSD_WRITE) & (a))
#define DSD_BOOL_VALUE_ASCII_GET( v)  ( ( (v) == true) ? "TRUE" : "FALSE")
#define DSD_NAME_LEN                  ( short)SMD_NAME_LEN
#define DSD_NAME_SIZE                 ( DSD_NAME_LEN + 1)
/*
    On utilise le pointeur 'User' de la racine de la struture pour y
    rattacher des données sur le heap sous-jacent.
*/
typedef struct DST_RootDesc
{
    char  *Heap_Name;
    char  *Manager_Name;
    int    OpenSemId;       /* Indique le nombre de processus ayant ouvert la struture */
    short  Heap_Owner;      /* Indique si la structure est propriétaire du heap sous-jacent */
    short  Valid;           /* Indique si la structure est valide ou non */
} DST_RootDesc;
//char DS_Error_Msg [512];
/* Définition des alias de l'API */
#ifndef DS_MODE
#define DS_MODE     0
#endif
#if DS_MODE == 2
/*
    Utilisation des API sans vérification des arguments et sans verrouillage de
    des data structures utilisées.
    Cette configuration correspond à une utilisation optimisée mais non sécurisée
    des API de la librairie.
    Puisque les verrouillages ne sont pas faits systématiquement par les fonctions,
    l'utilisateur veillera à verrouiller lui-même les data structures qu'il utilise.
*/
#   define DS_Library_Open              DS_Library_Open_I
#   define DS_Library_Close             DS_Library_Close_I
#   define DS_Library_Stderr_Set        DS_Library_Stderr_Set_I
#   define DS_DataStruct_Open           DS_DataStruct_Open_I
#   define DS_DataStruct_Close          DS_DataStruct_Close_I
#   define DS_DataStruct_Reorg          DS_DataStruct_Reorg_I
#   define DS_DataStruct_Traverse       DS_DataStruct_Traverse_I
#   define DS_DataStruct_Convert        DS_DataStruct_Convert_I
#   define DS_DataStruct_Info_Print     DS_DataStruct_Info_Print_I
#   define DS_DataStruct_Print          DS_DataStruct_Print_I
#   define DS_DataStruct_Check          DS_DataStruct_Check_I
#   define DS_DataStruct_Dump           DS_DataStruct_Dump_I
#   define DS_DataStruct_Lock           DS_DataStruct_Lock_I
#   define DS_DataStruct_Unlock         DS_DataStruct_Unlock_I
#   define DS_Node_Root_Get             DS_Node_Root_Get_I
#   define DS_Node_First_Get            DS_Node_First_Get_I
#   define DS_Node_Last_Get             DS_Node_Last_Get_I
#   define DS_Node_Next_Get             DS_Node_Next_Get_I
#   define DS_Node_Previous_Get         DS_Node_Previous_Get_I
#   define DS_Node_Add                  DS_Node_Add_I
#   define DS_Node_Remove               DS_Node_Remove_I
#   define DS_Node_Find                 DS_Node_Find_I
#   define DS_Value_Alloc               DS_Value_Alloc_I
#   define DS_Value_Add                 DS_Value_Add_I
#   define DS_Value_Remove              DS_Value_Remove_I
#   define DS_Value_Free                DS_Value_Free_I
#   define DS_Alloc                     DS_Alloc_I
#   define DS_Free                      DS_Free_I
#elif DS_MODE == 1
/*
    Utilisation des API sans vérification des arguments mais avec
    verrouillage systématique des data structures utilisées.
*/
#   define DS_Library_Open              DS_Library_Open_L
#   define DS_Library_Close             DS_Library_Close_L
#   define DS_Library_Stderr_Set        DS_Library_Stderr_Set_L
#   define DS_DataStruct_Open           DS_DataStruct_Open_L
#   define DS_DataStruct_Close          DS_DataStruct_Close_L
#   define DS_DataStruct_Reorg          DS_DataStruct_Reorg_L
#   define DS_DataStruct_Traverse       DS_DataStruct_Traverse_L
#   define DS_DataStruct_Convert        DS_DataStruct_Convert_L
#   define DS_DataStruct_Info_Print     DS_DataStruct_Info_Print_L
#   define DS_DataStruct_Print          DS_DataStruct_Print_L
#   define DS_DataStruct_Check          DS_DataStruct_Check_L
#   define DS_DataStruct_Dump           DS_DataStruct_Dump_L
#   define DS_DataStruct_Lock           DS_DataStruct_Lock_L
#   define DS_DataStruct_Unlock         DS_DataStruct_Unlock_L
#   define DS_Node_Root_Get             DS_Node_Root_Get_L
#   define DS_Node_First_Get            DS_Node_First_Get_L
#   define DS_Node_Last_Get             DS_Node_Last_Get_L
#   define DS_Node_Next_Get             DS_Node_Next_Get_L
#   define DS_Node_Previous_Get         DS_Node_Previous_Get_L
#   define DS_Node_Add                  DS_Node_Add_L
#   define DS_Node_Remove               DS_Node_Remove_L
#   define DS_Node_Find                 DS_Node_Find_L
#   define DS_Value_Alloc               DS_Value_Alloc_L
#   define DS_Value_Add                 DS_Value_Add_L
#   define DS_Value_Remove              DS_Value_Remove_L
#   define DS_Value_Free                DS_Value_Free_L
#   define DS_Alloc                     DS_Alloc_L
#   define DS_Free                      DS_Free_L
#else
/*
    Utilisation des API avec vérification des arguments
    et avec verrouillage des data structures utilisées.
*/
#   define DS_Library_Open              DS_Library_Open_CL
#   define DS_Library_Close             DS_Library_Close_CL
#   define DS_Library_Stderr_Set        DS_Library_Stderr_Set_CL
#   define DS_DataStruct_Open           DS_DataStruct_Open_CL
#   define DS_DataStruct_Close          DS_DataStruct_Close_CL
#   define DS_DataStruct_Reorg          DS_DataStruct_Reorg_CL
#   define DS_DataStruct_Traverse       DS_DataStruct_Traverse_CL
#   define DS_DataStruct_Convert        DS_DataStruct_Convert_CL
#   define DS_DataStruct_Info_Print     DS_DataStruct_Info_Print_CL
#   define DS_DataStruct_Print          DS_DataStruct_Print_CL
#   define DS_DataStruct_Check          DS_DataStruct_Check_CL
#   define DS_DataStruct_Dump           DS_DataStruct_Dump_CL
#   define DS_DataStruct_Lock           DS_DataStruct_Lock_CL
#   define DS_DataStruct_Unlock         DS_DataStruct_Unlock_CL
#   define DS_Node_Root_Get             DS_Node_Root_Get_CL
#   define DS_Node_First_Get            DS_Node_First_Get_CL
#   define DS_Node_Last_Get             DS_Node_Last_Get_CL
#   define DS_Node_Next_Get             DS_Node_Next_Get_CL
#   define DS_Node_Previous_Get         DS_Node_Previous_Get_CL
#   define DS_Node_Add                  DS_Node_Add_CL
#   define DS_Node_Remove               DS_Node_Remove_CL
#   define DS_Node_Find                 DS_Node_Find_CL
#   define DS_Value_Alloc               DS_Value_Alloc_CL
#   define DS_Value_Add                 DS_Value_Add_CL
#   define DS_Value_Remove              DS_Value_Remove_CL
#   define DS_Value_Free                DS_Value_Free_CL
#   define DS_Alloc                     DS_Alloc_CL
#   define DS_Free                      DS_Free_CL
#endif
/*----------------------------------------------------------------------------*/
/* DSD_API definition                                                         */
/*----------------------------------------------------------------------------*/
#   ifdef _LIBDATASTR_C_
#       define DSD_API  
#   else
#       define DSD_API  extern
#   endif
/*----------------------------------------------------------------------------*/
/* Ouverture d'une instance de la librairie                                   */
/*----------------------------------------------------------------------------*/
/* (I) Instance : numéro de l'instance de la librairie                        */
/* (I) Context  : nom du contexte                                             */
/* (I) Debug_Mode : mode d'affichage des messages d'erreur                    */
/*----------------------------------------------------------------------------*/
DSD_API DST_Status  DS_Library_Open_I(  int  Instance, const char  *Context, DST_Flags  Debug_Mode);
DSD_API DST_Status  DS_Library_Open_L(  int  Instance, const char  *Context, DST_Flags  Debug_Mode);
DSD_API DST_Status  DS_Library_Open_CL( int  Instance, const char  *Context, DST_Flags  Debug_Mode);
/*----------------------------------------------------------------------------*/
/* Fermeture de l'instance de la librairie                                    */
/*----------------------------------------------------------------------------*/
DSD_API DST_Status  DS_Library_Close_I(  void);
DSD_API DST_Status  DS_Library_Close_L(  void);
DSD_API DST_Status  DS_Library_Close_CL( void);
/*----------------------------------------------------------------------------*/
/* Définition de la sortie standard des messages d'erreur de la librairie     */
/*----------------------------------------------------------------------------*/
/* (I) Out : flux de sortie des messages d'erreur                             */
/*----------------------------------------------------------------------------*/
DSD_API DST_Status  DS_Library_Stderr_Set_I(  FILE  *Out);
DSD_API DST_Status  DS_Library_Stderr_Set_L(  FILE  *Out);
DSD_API DST_Status  DS_Library_Stderr_Set_CL( FILE  *Out);
/*----------------------------------------------------------------------------*/
/* Création / ouverture d'une structure de données                            */
/*----------------------------------------------------------------------------*/
/* (O) Root_Ptr_Ptr:     Pointer adress of the new data structure             */
/* (I) DS_Name:          Data structure name                                  */
/* (I) Index_Nb:         Number of index                                      */
/* (I) Index_Type_Ptr:   Array of Index type (List, tree, ...)                */
/* (I) Manager_Name:     Manager function name                                */
/* (I) Segment_Size     : taille ds segments du heap sous-jacent              */
/* (I) Open_Mode        : mode d'ouverture de la structure                    */
/* (I) Own_Value:        Flag indicating if the structure is the node owner   */
/* (I) Manager_FileName : nom du fichier qui définit les fonctions manager    */
/*----------------------------------------------------------------------------*/
DSD_API DST_Status  DS_DataStruct_Open_I( NDT_Root  **Root,  char  *DS_Name, NDT_Index_Nb, NDT_Index_Type  *, char  *Manager_FileName, size_t  Segment_Size, DST_Flags  Open_Mode, short  Own_Value);
/*
DSD_API DST_Status  DS_DataStruct_Open_I(  const char  *DS_Name, NDT_Root  **Root, NDT_DataStruct_Type Type, const char * Manager_FileName, size_t Segment_Size, DST_Flags Open_Mode, int Own_Value);
DSD_API DST_Status  DS_DataStruct_Open_L(  const char  *DS_Name, NDT_Root  **Root, NDT_DataStruct_Type Type, const char * Manager_FileName, size_t Segment_Size, DST_Flags Open_Mode, int Own_Value);
DSD_API DST_Status  DS_DataStruct_Open_CL( const char  *DS_Name, NDT_Root  **Root, NDT_DataStruct_Type Type, const char * Manager_FileName, size_t Segment_Size, DST_Flags Open_Mode, int Own_Value);
/*----------------------------------------------------------------------------*/
/* Verrouillage d'une structure de données                                    */
/*----------------------------------------------------------------------------*/
/* (I) Root         : pointeur sur la racine de la structure                  */
/* (I) Lock_Mode    : type de verrou à poser sur la structure                 */
/* (O) Locked       : verrou effectif (TRUE ou FALSE)                         */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Lock_I(  NDT_Root * Root, DST_Flags Lock_Mode, int * Locked);
DSD_API DST_Status  DS_DataStruct_Lock_L(  NDT_Root * Root, DST_Flags Lock_Mode, int * Locked);
DSD_API DST_Status  DS_DataStruct_Lock_CL( NDT_Root * Root, DST_Flags Lock_Mode, int * Locked);
/*----------------------------------------------------------------------------*/
/* Déverrouillage d'une structure de données                                  */
/*----------------------------------------------------------------------------*/
/* (I) Root             : pointeur sur la racine de la structure              */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Unlock_I( NDT_Root * Root);
DSD_API DST_Status  DS_DataStruct_Unlock_L( NDT_Root * Root);
DSD_API DST_Status  DS_DataStruct_Unlock_CL( NDT_Root * Root);
/*----------------------------------------------------------------------------*/
/* Fermeture d'une structure de données                                       */
/*----------------------------------------------------------------------------*/
/* (I) Root         : pointeur sur la racine de la structure de données       */
/* (I) Close_Mode   : mode de fermeture de la structure (destruction ou non)  */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Close_I( NDT_Root * Root, DST_Flags Close_Mode);
DSD_API DST_Status  DS_DataStruct_Close_L( NDT_Root * Root, DST_Flags Close_Mode);
DSD_API DST_Status  DS_DataStruct_Close_CL( NDT_Root * Root, DST_Flags Close_Mode);
/*----------------------------------------------------------------------------*/
/* Print data structure information                                           */
/*----------------------------------------------------------------------------*/
/* (I) Stream:           Output stream                                        */
/* (I) Root_Ptr:         Data structure pointer                               */
/*----------------------------------------------------------------------------*/
DSD_API DST_Status DS_DataStruct_Info_Print_I(  FILE  *Out, NDT_Root  *Root_Ptr);
DSD_API DST_Status DS_DataStruct_Info_Print_L(  FILE  *Out, NDT_Root  *Root_Ptr);
DSD_API DST_Status DS_DataStruct_Info_Print_CL( FILE  *Out, NDT_Root  *Root_Ptr);
/*----------------------------------------------------------------------------*/
/* Réorganisation d'une structure de données :                                */
/*      - ordonnancement d'une liste non ordonnée                             */
/*      - réquilibrage d'un arbre non auto-équilibré                          */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine de la structure de données               */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Reorg_I( NDT_Root * Root);
DSD_API DST_Status  DS_DataStruct_Reorg_L( NDT_Root * Root);
DSD_API DST_Status  DS_DataStruct_Reorg_CL( NDT_Root * Root);
/*----------------------------------------------------------------------------*/
/* Parcours de tous les noeuds d'une structure de données et exécution d'une  */
/* commande sur chacun d'eux                                                  */
/*----------------------------------------------------------------------------*/
/* (I) Root     : pointeur sur la racine de la structure de données           */
/* (I) Command  : Commande à exécuter sur chaque noeud traversé               */
/* (I) Data     : pointeur de données utilisateur                             */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Traverse_I(  NDT_Root * Root, NDT_Command Command, void * Data);
DSD_API DST_Status  DS_DataStruct_Traverse_L(  NDT_Root * Root, NDT_Command Command, void * Data);
DSD_API DST_Status  DS_DataStruct_Traverse_CL( NDT_Root * Root, NDT_Command Command, void * Data);
/*----------------------------------------------------------------------------*/
/* Conversion d'une structure de données d'un type en un autre                */
/*----------------------------------------------------------------------------*/
/* (I) Root         : pointeur sur la racine de la structure de données       */
/* (I) Target_Type  : type de structure cible                                 */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Convert_I(  NDT_Root * Root, NDT_DataStruct_Type Target_Type);
DSD_API DST_Status  DS_DataStruct_Convert_L(  NDT_Root * Root, NDT_DataStruct_Type Target_Type);
DSD_API DST_Status  DS_DataStruct_Convert_CL( NDT_Root * Root, NDT_DataStruct_Type Target_Type);
/*----------------------------------------------------------------------------*/
/* Affichage de la valeur de tous les noeuds d'une structure de données       */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine de la structure de données               */
/* (I) Out  : flux de sortie                                                  */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Print_I(  NDT_Root * Root, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Print_L(  NDT_Root * Root, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Print_CL( NDT_Root * Root, FILE * Out);
/*----------------------------------------------------------------------------*/
/* Fonction de vérification / réparation d'une structure de données           */
/*----------------------------------------------------------------------------*/
/* (I) Root         : pointeur sur la racine de la structure                  */
/* (O) Nb_Detected  : pointeur sur le nombre d'erreurs détectées              */
/* (O) Nb_Corrected : pointeur sur le nombre d'erreurs corrigées              */
/* (I) Out          : flux de sortie du rapport                               */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Check_I(  NDT_Root * Root, int * Nb_Detected, int * Nb_Corrected, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Check_L(  NDT_Root * Root, int * Nb_Detected, int * Nb_Corrected, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Check_CL( NDT_Root * Root, int * Nb_Detected, int * Nb_Corrected, FILE * Out);
/*----------------------------------------------------------------------------*/
/* Affichage de la structure de données                                       */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine de la structure                          */
/* (I) Out  : flux de sortie                                                  */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_DataStruct_Dump_I(  NDT_Root * Root, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Dump_L(  NDT_Root * Root, FILE * Out);
DSD_API DST_Status  DS_DataStruct_Dump_CL( NDT_Root * Root, FILE * Out);
/*----------------------------------------------------------------------------*/
/* Récupération du premier noeud d'une structure                              */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine dont on cherche le premier noeud         */
/* (O) Node : pointeur sur le noeud à récupérer                               */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_First_Get_I(  NDT_Root * Root, NDT_Node ** Node);
DSD_API DST_Status  DS_Node_First_Get_L(  NDT_Root * Root, NDT_Node ** Node);
DSD_API DST_Status  DS_Node_First_Get_CL( NDT_Root * Root, NDT_Node ** Node);
/*----------------------------------------------------------------------------*/
/* Récupération du dernier noeud d'une structure                              */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine dont on cherche le dernier noeud         */
/* (O) Node : pointeur sur le noeud à récupérer                               */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Last_Get_I(  NDT_Root * Root, NDT_Node ** Node);
DSD_API DST_Status  DS_Node_Last_Get_L(  NDT_Root * Root, NDT_Node ** Node);
DSD_API DST_Status  DS_Node_Last_Get_CL( NDT_Root * Root, NDT_Node ** Node);
/*----------------------------------------------------------------------------*/
/* Récupération du noeud suivant                                              */
/*----------------------------------------------------------------------------*/
/* (I) Node      : pointeur sur le noeud dont on cherche le suivant           */
/* (O) Next_Node : pointeur sur le noeud suivant                              */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Next_Get_I(  NDT_Node * Node, NDT_Node ** Next_Node);
DSD_API DST_Status  DS_Node_Next_Get_L(  NDT_Node * Node, NDT_Node ** Next_Node);
DSD_API DST_Status  DS_Node_Next_Get_CL( NDT_Node * Node, NDT_Node ** Next_Node);
/*----------------------------------------------------------------------------*/
/* Récupération du noeud précédant                                            */
/*----------------------------------------------------------------------------*/
/* (I) Node      : pointeur sur le noeud dont on cherche le précédant         */
/* (O) Prev_Node : pointeur sur le noeud précédant                            */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Previous_Get_I(  NDT_Node * Node, NDT_Node ** Prev_Node);
DSD_API DST_Status  DS_Node_Previous_Get_L(  NDT_Node * Node, NDT_Node ** Prev_Node);
DSD_API DST_Status  DS_Node_Previous_Get_CL( NDT_Node * Node, NDT_Node ** Prev_Node);
/*----------------------------------------------------------------------------*/
/* Ajout d'un noeud à une structure de données                                */
/*----------------------------------------------------------------------------*/
/* (I) Root : pointeur sur la racine de la structure de données               */
/* (I) Node : pointeur sur le noeud à ajouter                                 */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Add_I(  NDT_Root * Root, NDT_Node * Node);
DSD_API DST_Status  DS_Node_Add_L(  NDT_Root * Root, NDT_Node * Node);
DSD_API DST_Status  DS_Node_Add_CL( NDT_Root * Root, NDT_Node * Node);
/*----------------------------------------------------------------------------*/
/* Suppression d'un noeud dans une structure de données                       */
/*----------------------------------------------------------------------------*/
/* (I) Node: pointeur sur le noeud à supprimer de la structure de données     */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Remove_I(  NDT_Node * Node);
DSD_API DST_Status  DS_Node_Remove_L(  NDT_Node * Node);
DSD_API DST_Status  DS_Node_Remove_CL( NDT_Node * Node);
/*----------------------------------------------------------------------------*/
/* Recherche un noeud dans un arbre et retourne le pointeur sur le noeud      */
/*----------------------------------------------------------------------------*/
/* (I) Root     : pointeur sur la racine de l'abre                            */
/* (O) Node     : adresse du pointeur sur le noeud à récuperer                */
/* (I) Value    : pointeur sur la valeur à rechercher                         */
/* (I) Data     : pointeur de données                                         */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Node_Find_I(  NDT_Root * Root, NDT_Node ** Node, void * Value, void * Data);
DSD_API DST_Status  DS_Node_Find_L(  NDT_Root * Root, NDT_Node ** Node, void * Value, void * Data);
DSD_API DST_Status  DS_Node_Find_CL( NDT_Root * Root, NDT_Node ** Node, void * Value, void * Data);
/*----------------------------------------------------------------------------*/
/* Allocation d'une valeur d'une structure de données                         */
/*----------------------------------------------------------------------------*/
/* (I) Root  : pointeur sur la racine de la structure de données              */
/* (O) Value : adresse d'un pointeur sur la valeur à allouer                  */
/* (I) ...   : arguments relatifs à l'allocation de la valeur                 */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Value_Alloc_I(  NDT_Root * Root, void ** Value, ...);
DSD_API DST_Status  DS_Value_Alloc_L(  NDT_Root * Root, void ** Value, ...);
DSD_API DST_Status  DS_Value_Alloc_CL( NDT_Root * Root, void ** Value, ...);
/*----------------------------------------------------------------------------*/
/* Ajout d'une valeur à une structure de données                              */
/*----------------------------------------------------------------------------*/
/* (I) Root  : pointeur sur la racine de la structure de données              */
/* (I) Value : pointeur sur la valeur à ajouter                               */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Value_Add_I(  NDT_Root * Root, void * Value);
DSD_API DST_Status  DS_Value_Add_L(  NDT_Root * Root, void * Value);
DSD_API DST_Status  DS_Value_Add_CL( NDT_Root * Root, void * Value);
/*----------------------------------------------------------------------------*/
/* Suppression du premier noeud correspondant à une valeur donnée             */
/*----------------------------------------------------------------------------*/
/* (I) Root            : pointeur sur la racine de la structure de données    */
/* (I) Reference_Value : pointeur sur la valeur de référence                  */
/* (I) Removed_Value   : adresse d'un pointeur sur la valeur supprimée        */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Value_Remove_I(  NDT_Root * Root, void * Reference_Value, void ** Removed_Value);
DSD_API DST_Status  DS_Value_Remove_L(  NDT_Root * Root, void * Reference_Value, void ** Removed_Value);
DSD_API DST_Status  DS_Value_Remove_CL( NDT_Root * Root, void * Reference_Value, void ** Removed_Value);
/*----------------------------------------------------------------------------*/
/* Désallocation d'une valeur d'une structure de données                      */
/*----------------------------------------------------------------------------*/
/* (I) Root     : pointeur sur la racine de la structure de données           */
/* (I) Value    : pointeur sur la valeur à désallouer                         */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Value_Free_I(  NDT_Root * Root, void * Value);
DSD_API DST_Status  DS_Value_Free_L(  NDT_Root * Root, void * Value);
DSD_API DST_Status  DS_Value_Free_CL( NDT_Root * Root, void * Value);
/*----------------------------------------------------------------------------*/
/* Allocation de mémoire pour une structure de données :                      */
/*----------------------------------------------------------------------------*/
/* (I) Root     : pointeur sur la racine de la structure de données           */
/* (I) Size     : taille mémoire à allouer                                    */
/* (O) Ptr      : adresse du pointeur sur la zone de données allouée          */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Alloc_I(  NDT_Root * Root, size_t Size, void ** Ptr);
DSD_API DST_Status  DS_Alloc_L(  NDT_Root * Root, size_t Size, void ** Ptr);
DSD_API DST_Status  DS_Alloc_CL( NDT_Root * Root, size_t Size, void ** Ptr);
/*----------------------------------------------------------------------------*/
/* Désallocation d'une ressource pour une structure de données :              */
/*----------------------------------------------------------------------------*/
/* (I) Root  : pointeur sur la racine de la structure de données              */
/* (I) Ptr   : pointeur sur la zone à désallouer                              */
/*----------------------------------------------------------------------------*/
/*
DSD_API DST_Status  DS_Free_I(  NDT_Root * Root, void * Ptr);
DSD_API DST_Status  DS_Free_L(  NDT_Root * Root, void * Ptr);
DSD_API DST_Status  DS_Free_CL( NDT_Root * Root, void * Ptr);
*/
#ifdef __cplusplus
//}
#endif
#endif