2017-05-31 3 views
0

Récemment, j'ai rencontré un système critique de sécurité qui utilise uniquement Ada. Le système fournit environ 3 paquets avec environ 200-300 fonctions dans chaque paquet comme source.Expose l'API ADA en C/C++ (la méthode évolutive)

J'ai besoin d'accéder à presque toutes ces fonctions dans un autre système logiciel (très sympa et soigné) qui est complètement écrit en C/C++.

Objectif: J'ai besoin d'exposer ces fonctions Ada en C/C++. Je comprends que je peux utiliser pragma Export() construire pour exporter les fonctions et interfaces.C package pour convertir les paramètres entre C et Ada. Mais, je me demandais s'il y avait une manière plus facile ou plus évolutive de faire ceci?

  1. Peut-être exposer le paquet complet en quelque sorte?
  2. Ou développer une architecture RPC?
  3. Ou utilisez un outil qui crée les déclarations C/C++ et les conversions de type?

Il serait vraiment utile si quelqu'un avec une expérience similaire pourrait me diriger dans la bonne direction.

Rappelez-vous que je suis pas la recherche d'un Ada to C translator

+1

pragma Export, ou les aspects connexes si vous travaillez avec Ada 2012, sont ce que vous cherchez, au moins par ma compréhension de votre objectif. Vous pouvez écrire un script pour générer ces exportations pour vous; c'est ce que je ferais. –

+0

Désolé pour la confusion, je veux dire soit C ou C++ fera l'affaire. De préférence C++. – Tony

+0

@PatrickKelly: Pouvez-vous préciser comment vous utilisez le script? Je n'ai jamais utilisé un script auparavant pour exposer les fonctions ADA à C. Ou peut-être partager un script simple. Merci – Tony

Répondre

0

Vous pouvez essayer d'ajouter les Export et Convention => X aspects du package si vous utilisez un compilateur Ada 2012; exemple:

Package K with Export, Convention => C_Plus_Plus is 

    Function A(Input_1, Input_2 : Integer) return Integer; 

End K; 

Cette compile en fait, bien que je n'ai pas C++ ou de projets de sources mixtes C pour essayer ceci sur je ne peux pas vous dire si les résultats sont strictement parler utilisable du côté C .

Si cela ne fonctionne pas, peut-être une meilleure méthode serait de créer un package spécialement pour l'exportation des fonctions (et types) qui seront utilisés sur le côté C.

With 
System, 
Interfaces.C.Strings, 
Interfaces.C.Pointers; 

Package K with Convention => C_Plus_Plus is 

    ------------- 
    -- TYPES -- 
    ------------- 

    Type CPP_Window_Handle is Private; 
    Subtype CPP_String is Interfaces.C.Strings.chars_ptr; 

    -------------- 
    -- MODULES -- 
    -------------- 

    Package UI_Module is 
     Procedure Set_Title(Window : CPP_Window_Handle; Text : CPP_String) 
     with Export; 
    End UI_Module; 

Private 
    Package STUB_TYPES is 
     Type Window is tagged null record; 
    End STUB_TYPES; 
    Use STUB_TYPES; 

    Type CPP_Window_Handle is not null access Window'Class 
    with Convention => C_Plus_Plus, Size => Interfaces.C.int'Size; 

End K; 

Mis en œuvre comme:

Package Body K is 

    Package STUB_FUNCTIONS is 
     Procedure Set_Window(Object : in out STUB_TYPES.Window'Class; Text : String) is null; 
     --' 
    End STUB_FUNCTIONS; 

    Package Ada_Dependencies renames STUB_FUNCTIONS; 

    Package Body UI_Module is 
     Procedure Set_Title(Window : CPP_Window_Handle; Text : CPP_String) is 
      function Value (Item : CPP_String) return Interfaces.C.char_array 
       renames Interfaces.C.Strings.Value; 
      function Convert(Item  : Interfaces.C.char_array; 
          Trim_Nul : Boolean := True) return String 
       renames Interfaces.C.To_Ada; 
     Begin 
      Ada_Dependencies.Set_Window(
       Object => Window.all, 
       Text => Convert(Value(Text)) 
     ); 
     End Set_Title; 

    End UI_Module; 

End K; 
+0

Ceci est similaire à ceci: https://stackoverflow.com/questions/42938883/interface-ada-dynamic-library-with-java-using-jna-and-adas-interface-c-packages/42938971#42938971. Comme l'a indiqué @ Shark8, vous pouvez soit ajouter 'l'export pragma' sur les méthodes que vous voulez exposer, soit ajouter un calque de routage écrit avec' pragma export' qui fait l'appel effectif aux procédures/fonctions Ada. La couche additionnelle peut être utile si vous avez des transformations de types à faire: pour isntance, si vous avez des types avec des discriminants dans les entrées de vos services ada. Puisque les structures Ada ne peuvent pas toujours être mappées facilement avec C/C++ – LoneWanderer