package Machina is
-- Les mots sources sont représentés par des tableaux de positifs.
type T_Positive_String is array (Positive range <> ) of Positive;
-- Pour le nommage des systèmes linguistiques.
subtype T_System_Name is String(1..16);
-- L'unité de traitement parallèle pour chaque utilisateur;
type T_Machina is limited private;
task Life_Cycle is
-- Démmarer et redémmarer le service après une suspension.
entry Start;
-- Suspendre le service.
entry Suspend;
-- Terminer le processus.
entry Halt;
-- Création de système linguistique --
-- 'Length' est la taille de l'alphabet ;
-- 'System_Name' est le nom du système.
entry Create_System(Length : in Positive; System_Name : in T_System_Name);
-- Création d'un mot d'un système --
-- 'Word' est la représentation du mot ;
-- 'System_Name' est le système auquel appartient le mot.
entry Create_Word(Word : in T_Positive_string; System_Name : in T_System_Name);
-- Création d'un utilisateur --
-- 'User_name' est un nom unique.
-- System_Name est le système utilisé par l'utilisateur.
entry Create_User(User_Name : in String; System_name : in T_System_Name);
-- Obtenir une connection --
-- 'User_Name' est le nom de l'utilisateur demandeur de la connection.
-- 'System_Name' est le système linguistique utilisé par le demandeur.
-- 'Recipient' est l'utilisateur cible de la connection.
-- 'Cross_Name' est le système linguistique d'lutilisateur cible.
entry Connect_User(User_Name : in String; System_Name : in T_System_Name;
Recipient : in String; Cross_Name : in T_System_Name;
Treatment_Unit : out T_machina);
end Life_Cycle;
-- Si l'alphabet utilisé dans word à la création d'un mot est en dehors
-- de la borne supérieur de l'alphabet, on lève une exception ;
Out_Of_Range : exception;
-- Si un système porte déjà le nom donné à la création d'un système,
-- on lève une exception ;
System_Exist : exception;
-- Si un utilisateur porte déjà le nom donné à la création d'un utilisateur,
-- on lève une excpetion ;
User_Exist : exception;
-- Si un des deux utilisateurs donnés à la demande de connection est inconnu
-- du système,on lève une exception ;
No_User : exception;
-- Si un des deux systèmes linguistiques donnée à la connection est inconnu
-- du système,on lève une exception ;
No_Systeme : exception;
-- Un support d'information est une liste de mots d'un système linguistique.
type T_Word_List is private;
-- Pour construire une liste de mots.
procedure Constructor(Word_List : in out T_Word_List;
Word : in T_Positive_String);
-- Pour connaitre la taille d'un liste.
function Length(Word_List : in T_Word_List) return Natural;
-- Pour extraire les mots d'une liste de mots.
function Extract_Word(Word_List : in T_Word_List;
Index : in Positive) return T_Positive_String;
-- Si index est supérieur à la longueur de la liste, on lève une exception ;
Index_Error : exception;
-- Procéder au traitement de l'information.
-- Substrat est modifier pour contenir le résulat.
procedure Proceed(Machina : in out T_Machina; Substrat : in out T_Word_List);
-- Pour la conversion Ascii à T_Positive_String.
function To_Positive(Source : in String) return T_Positive_String;
-- Pour la convertsion de Positive_String à ascii.
function To_String(Source : in T_Positive_String) return String;
private
type T_Positive_Word(Length : Positive) is
record
Positive_String : T_Positive_String(1..Length);
end record;
type T_Word_Node(Length : Positive);
type Word_Node_Access is access T_Word_Node;
type T_Word_Node(Length : Positive) is
record
Word : T_Positive_Word(Length);
Prev, Next : Word_Node_Access;
end record;
type T_Word_List is
record
Root : Word_Node_Access;
Count : Natural;
end record;
type T_System;
type System_Access is access T_System;
-- on va d'abord essayer des discours dans un système.
-- Puis on vera une architecture de deux systèmes.
type T_Machina is limited
record
Source : System_Access ;
Destination : System_Access ;
end record;
-- Note : Pour les système à plus de deux couches, il faudra modifier
-- le type T_Machina en une liste de système.
end Machina;