hac_0.26.0_19beb1f4/src/execute/hac_sys-interfacing.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
with HAC_Sys.Co_Defs,
     HAC_Sys.Defs;

with HAT;

with Ada.Characters.Handling,
     Ada.Unchecked_Conversion;

package body HAC_Sys.Interfacing is

  use HAT, Defs;

  function To_HAC (Data : Integer) return HAC_Element is
    new_element : HAC_Element;
  begin
    new_element.I := HAC_Integer (Data);
    return new_element;
  end To_HAC;

  function To_HAC (Data : Long_Float) return HAC_Element is
  begin
    return GR_Real (HAT.Real (Data));
  end To_HAC;

  function To_HAC (Data : String) return HAC_Element is
  begin
    return GR_VString (Data);
  end To_HAC;

  function To_HAC_Any_Integer (Data : Any_Integer) return HAC_Element is
    new_element : HAC_Element;
  begin
    new_element.I := HAC_Integer (Data);
    return new_element;
  end To_HAC_Any_Integer;

  function To_HAC_Any_Enum (Data : Any_Enum) return HAC_Element is
    new_element : HAC_Element;
  begin
    new_element.I := Any_Enum'Pos (Data);
    return new_element;
  end To_HAC_Any_Enum;

  function To_HAC_Any_Float (Data : Any_Float) return HAC_Element is
  begin
    return GR_Real (HAT.Real (Data));
  end To_HAC_Any_Float;

  function To_Native (Data : HAC_Element) return Integer is
  begin
    return Integer (Data.I);
  end To_Native;

  function To_Native (Data : HAC_Element) return Long_Float is
  begin
    if Data.Special = Floats then
      return Long_Float (Data.R);
    end if;
    raise HAC_Type_Error with "Expected a HAT.Real, found Integer or " & Typen'Image (Data.Special);
  end To_Native;

  function To_Native (Data : HAC_Element) return String is
  begin
    if Data.Special = VStrings then
      return To_String (Data.V);
    end if;
    raise HAC_Type_Error with "Expected a VString, found Integer or " & Typen'Image (Data.Special);
  end To_Native;

  function To_Native_Any_Integer (Data : HAC_Element) return Any_Integer is
  begin
    return Any_Integer (Data.I);
  end To_Native_Any_Integer;

  function To_Native_Any_Enum (Data : HAC_Element) return Any_Enum is
  begin
    return Any_Enum'Val (Data.I);
  end To_Native_Any_Enum;

  function To_Native_Any_Float (Data : HAC_Element) return Any_Float is
  begin
    if Data.Special = Floats then
      return Any_Float (Data.R);
    end if;
    raise HAC_Type_Error with "Expected a HAT.Real, found Integer or " & Typen'Image (Data.Special);
  end To_Native_Any_Float;

  function Get_VM_Variable (BD : Builder.Build_Data; Name : String) return String is
    cur : constant Builder.String_Maps.Cursor := BD.global_VM_variables.Find (HAT.To_VString (Name));
    use Builder.String_Maps;
  begin
    return
      (if cur = Builder.String_Maps.No_Element then
         ""
       else
         HAT.To_String (Builder.String_Maps.Element (cur)));
  end Get_VM_Variable;

  procedure Set_VM_Variable (BD : in out Builder.Build_Data; Name : String; Value : String) is
  begin
    BD.global_VM_variables.Include (HAT.To_VString (Name), HAT.To_VString (Value));
  end Set_VM_Variable;

  procedure Register
    (BD : Builder.Build_Data; Callback : Exported_Procedure; Name : String)
  is
    function Convert is
      new Ada.Unchecked_Conversion
        (Exported_Procedure, Co_Defs.Dummy_Procedure_Access);
    use Ada.Characters.Handling;
  begin
    if Callback /= null then
      BD.CD.Exported_Procedures.Include (To_Upper (Name), Convert (Callback));
    end if;
  end Register;

  procedure Deregister (BD : Builder.Build_Data; Name : String)
  is
    use Ada.Characters.Handling;
  begin
    BD.CD.Exported_Procedures.Exclude (To_Upper (Name));
  end Deregister;

end HAC_Sys.Interfacing;