comp.lang.ada
 help / color / mirror / Atom feed
From: "bob" <bklungle@junque.com>
Subject: Re: Linking FORTRAN77 to Ada83
Date: 1999/06/10
Date: 1999-06-10T08:50:32-05:00	[thread overview]
Message-ID: <7jofr8$qjt@dfw-ixnews5.ix.netcom.com> (raw)
In-Reply-To: 375ECA88.CF7CFF7E@sll.northrop.com

Here is an Ada spec for currently running code. Compiles and runs on GNAT
for IRIX(SGI) and Linux (Intel)

___________________________

-- %@(#)fortran_interface_s.a 1.3% %02 Mar 1998% - SCCS Control Line
--  1.2 09-Feb-98 dab Added Stereo to Mono feedback
with Global_Defs;
with Interfaces.Fortran;
with Los_Vectors;
with OSM_Defs;
with Vectors;
with Unchecked_Deallocation;


package Fortran_Interface is
  package Fortran renames Interfaces.Fortran;
  package GD  renames Global_Defs;
  package vec renames vectors;
  package LV  renames Los_Vectors;
  package OD  renames OSM_Defs;

  type Fortran_Truth_Type is
      record
         Time         : GD.Epoch_Time_Type := 0.0;
         State        : LV.State_ECI_Type;
         Unit_LOS     : VEC.Vector(1..3)   := (others => 0.0);
         Intensity    : GD.Real     := 0.0;
         Tgtid        : GD.Int             := 0;
         Class_Id     : GD.Int             := 1;
         Phase_Id     : GD.Int             := 1;
      end record;

  for Fortran_Truth_Type use
      record
         Time         at 0 range 0..63;
         State        at 0 range 64..639;
         Unit_LOS     at 0 range 640..831;
         Intensity    at 0 range 832..895;
         Tgtid        at 0 range 896..927;
         Class_Id     at 0 range 928..959;
         Phase_Id     at 0 range 960..991;
      end record;


  type Fortran_Scan_Execution_type is
    record
         TFirst_Scan   : GD.Epoch_Time_type  := 0.0;
         TLast_Scan    : GD.Epoch_Time_type  := 0.0;
         Scan_Pointer  : vec.vector(1..3)    := (others => 0.0);
         Platform_State : LV.State_Eci_Type     := (others => (others =>
0.0));
         Azfirst       : GD.Real             := 0.0;
         Azlast        : GD.Real             := 0.0;
         Sweep_Rate    : GD.Real             := 0.0;
         Sensor_ID     : GD.Int              := 0;
         Scan_ID       : GD.Int              := 0;
         Platform_Id   : GD.Int              := 0;
         Execute       : GD.Boolean_Type     := False;
    end record;

  for Fortran_Scan_Execution_type use
    record
         TFirst_Scan     at 0 range 0..63;
         TLast_Scan      at 0 range 64..127;
         Scan_Pointer    at 0 range 128..319;
         Platform_State  at 0 range 320..895;
         Azfirst         at 0 range 896..959;
         Azlast          at 0 range 960..1023;
         Sweep_Rate      at 0 range 1024..1087;
         Sensor_ID       at 0 range 1088..1119;
         Scan_ID         at 0 range 1120..1151;
         Platform_Id     at 0 range 1152..1183;
         Execute         at 0 range 1208..1215;
    end record;

  type Fortran_Scan_Execution_Access_type is access
Fortran_Scan_Execution_type;

  type Fortran_Sensor_Header_type is
    record
         NLOS           : GD.Int := 0;
         Scan_Execution : Fortran_Scan_Execution_type;
    end record;

  for Fortran_Sensor_Header_type use
    record
         NLOS           at 0 range  0..31;
         Scan_Execution at 0 range 64..1279;
    end record;

  type Fortran_Sensor_Header_Access_type is access
Fortran_Sensor_Header_type;

   type Fortran_LOS_Vector_type;
   type Fortran_LOS_Vector_Access_type is access Fortran_LOS_Vector_type;
   type Fortran_LOS_Vector_type is
      record
         Epoch              : GD.Epoch_Time_type := 0.0;
         platstate          : LV.State_Eci_Type;
         Boresight          : VEC.Vector(1..3) := (others => 0.0);
         Unit_LOS           : VEC.Vector(1..3)    := (others => 0.0);
         Unit_LOS_Rate      : vec.vector(1..3) := (others => 0.0); -- Udot
vec
         Unit_LOS_Accel     : vec.vector(1..3) := (others => 0.0); --
Udotdot
         Intensity          : GD.Real   := 0.0;
         Second_Moments_ECI : VEC.Vector(1..3) := (others => 0.0);
         AMA_ECI            : VEC.Vector(1..3) := (others => 0.0);
         RMA                : GD.Real := 0.0;
         Position_UV        : vec.vector(1..2) := (others => 0.0);
         Velocity_UV        : vec.vector(1..2) := (others => 0.0);
         Acceleration_UV    : vec.vector(1..2) := (others => 0.0); --
06/12/95
         Second_Moments_UV  : VEC.Vector(1..3) := (others => 0.0);
         AMA_UV             : VEC.Vector(1..3) := (others => 0.0);    -- uv
coordinates
         truth              : Fortran_Truth_Type;
         Platform_ID        : GD.Platform_ID_type :=
GD.Platform_ID_Type'First;
         Detection_ID       : GD.Int      := 0;
         Sensor_ID          : GD.Int      := 0;
         Sensor_Band        : GD.Int      := 0;
         Scan_ID            : GD.Int      := 0;
         LOS_ID             : GD.Int      := 0;
         Score_Type_Obj     : GD.Int      := 0;
         osm_type           : GD.Int      := 0;
         Num_Asso_Mono      : GD.Int   := 0;   -- # of mono tracks using
this
         Associated         : Boolean  := False;
      end record;

   for Fortran_LOS_Vector_type use
      record
         Epoch              at 0 range 0..63;
         platstate          at 0 range 64..639;
         Boresight          at 0 range 640..831;
         Unit_LOS           at 0 range 832..1023;
         Unit_LOS_Rate      at 0 range 1024..1215;
         Unit_LOS_Accel     at 0 range 1216..1407;
         Intensity          at 0 range 1408..1471;
         Second_Moments_ECI at 0 range 1472..1663;
         AMA_ECI            at 0 range 1664..1855;
         RMA                at 0 range 1856..1919;
         Position_UV        at 0 range 1920..2047;
         Velocity_UV        at 0 range 2048..2175;
         Acceleration_UV    at 0 range 2176..2303;
         Second_Moments_UV  at 0 range 2304..2495;
         AMA_UV             at 0 range 2496..2687;
         truth              at 0 range 2688..3679;
--   Fortran seems to allign this next field on an 8 byte boundary
         Platform_ID        at 0 range 3712..3743;
         Detection_ID       at 0 range 3744..3775;
         Sensor_ID          at 0 range 3776..3807;
         Sensor_Band        at 0 range 3808..3839;
         Scan_ID            at 0 range 3840..3871;
         LOS_ID             at 0 range 3872..3903;
         Score_Type_Obj     at 0 range 3904..3935;
         osm_type           at 0 range 3936..3967;
         Num_Asso_Mono      at 0 range 3968..3999;
         Associated         at 0 range 4024..4031;
      end record;

   type Fortran_LOS_Array_type is array ( GD.Int range <> ) of
  Fortran_LOS_Vector_Access_type;
   type Fortran_LOS_Array_Access_type is access Fortran_LOS_Array_type;

   type Fortran_MDP_OSM_Type;
   type Fortran_MDP_OSM_Access_Type is access Fortran_MDP_OSM_Type;
   type Fortran_MDP_OSM_Type is
      record
         Epoch              : GD.Epoch_Time_Type  := 0.0;
         Platform_State     : OD.State_ECI_Type := (others => (others =>
0.0));
         Boresight          : VEC.Vector(1..3) := (others => 0.0);
         Unit_LOS           : OD.Unit_LOS_Type  := (others => 0.0);
         Unit_LOS_Rate      : OD.Unit_LOS_Type  := (others => 0.0);
         Unit_LOS_Accel     : OD.Unit_LOS_Type  := (others => 0.0);
         Intensity          : GD.Real := 0.0;
         Second_Moments_ECI : VEC.Vector(1..3) := (others => 0.0);
         AMA_ECI            : VEC.Vector(1..3);
         RMA                : GD.Real;
         Truth              : Fortran_Truth_Type;
         Platform_ID        : GD.Platform_ID_Type := 1;
         Mono_ID            : GD.Mono_ID_Type     := 0;
         Parent_ID          : GD.Mono_ID_Type     := 0;
         Stereo_ID          : GD.Stereo_ID_Type   := 0;
         Sensor             : GD.Int              := 0;
         Sensor_Band        : GD.Int              := 0;
         Detection_ID       : GD.Int         := 0;
         OSM_Type           : GD.Int         := 0;
         Object             : GD.Int         := 0;
         Phase              : GD.Int         := 0;
         Track_Status       : GD.Int         := 0;
         Mono_Status        : GD.Int := 0;
         Mono_Type          : GD.Int := 0;
      end record;

   for Fortran_MDP_OSM_Type use
      record
         Epoch              at 0 range 0..63;
         Platform_State     at 0 range 64..639;
         Boresight          at 0 range 640..831;
         Unit_LOS           at 0 range 832..1023;
         Unit_LOS_Rate      at 0 range 1024..1215;
         Unit_LOS_Accel     at 0 range 1216..1407;
         Intensity          at 0 range 1408..1471;
         Second_Moments_ECI at 0 range 1472..1663;
         AMA_ECI            at 0 range 1664..1855;
         RMA                at 0 range 1856..1919;
         Truth              at 0 range 1920..2911;
--   Fortran seems to allign this next field on an 8 byte boundary
         Platform_ID        at 0 range 2944..2975;
         Mono_ID            at 0 range 2976..3007;
         Parent_ID          at 0 range 3008..3039;
         Stereo_ID          at 0 range 3040..3071;
         Sensor             at 0 range 3072..3103;
         Sensor_Band        at 0 range 3104..3135;
         Detection_ID       at 0 range 3136..3167;
         OSM_Type           at 0 range 3168..3199;
         Object             at 0 range 3200..3231;
         Phase              at 0 range 3232..3263;
         Track_Status       at 0 range 3264..3295;
         Mono_Status        at 0 range 3296..3327;
         Mono_Type          at 0 range 3328..3359;
      end record;



  type Mono_State_Type is     --Doug
     record       --Doug
       Epoch                    : GD.Real;   --Doug
       initialization_epoch     : GD.Real;   --Doug
       u_state                  : VEC.Vector(1..3);  --Doug
       v_state                  : VEC.Vector(1..3);  --Doug
       Mono_ID                  : GD.Int;   --Doug
       Parent_ID                : GD.Int;   --Doug
       num_misses               : GD.Int;   --Doug
    end record;       --Doug

  for Mono_State_Type use
     record       --Doug
       Epoch                    at 0 range 0..63;  --Doug
       initialization_epoch     at 0 range 64..127;  --Doug
       u_state                  at 0 range 128..319;  --Doug
       v_state                  at 0 range 320..511;  --Doug
       Mono_ID                  at 0 range 512..543;  --Doug
       Parent_ID                at 0 range 544..575;  --Doug
       num_misses               at 0 range 576..607;  --Doug
    end record;       --Doug


--  types needed for the stereo to mono feed back

    subtype MAX_STEREO_PTR is GD.Int range 1..1000;      --We are limited to
1000 stereo tracks for now

    type STEREO_LIST_TYPE is array (MAX_STEREO_PTR) of GD.Int;

    type Fortran_Stereo_IDs is
      record
         NUM_STEREO_TRACKS      : GD.Int;
         STEREO_ID              : STEREO_LIST_TYPE;
      end record;

    for Fortran_Stereo_IDs use
      record
        NUM_STEREO_TRACKS       at 0 range 0..31;
        STEREO_ID               at 0 range 32..32031;
      end record;



    type MONO_TAG_STRUCT is
      record
        PLATFORM_ID             : GD.Int;
        MONO_ID                 : GD.Int;
      end record;

    for MONO_TAG_STRUCT use
      record
        PLATFORM_ID             at 0 range 0..31;
        MONO_ID                 at 0 range 32..63;
      end record;

    subtype MAX_VIEWS  is GD.Int range 1..40;

    type MONO_LIST_TYPE is array (MAX_VIEWS) of MONO_TAG_STRUCT;

    type STEREO_COMPONENTS_STRUCT is
      record
        STEREO_ID               : GD.Int;
        NUM_MONOS               : GD.Int;
        MONO_TAG                : MONO_LIST_TYPE;
      end record;

    for STEREO_COMPONENTS_STRUCT use
      record
        STEREO_ID               at 0 range 0..31;
        NUM_MONOS               at 0 range 32..63;
        MONO_TAG                at 0 range 64..2623;
      end record;

    type   STEREO_STATE_COV_STRUCT is
      record
        POSITION                : VEC.Vector(1..3);
        VELOCITY                : VEC.Vector(1..3);
        ACCELERATION            : VEC.Vector(1..3);
        COV                     : VEC.Vector(1..45);   --triangular form of
9 by 9
        LAST_UPDATE_TIME        : GD.Real;
        Stereo_ChiSq            : GD.Real;
        IMM_Filter_Used         : GD.Int;
        STEREO_ID               : GD.Int;
      end record;

    for STEREO_STATE_COV_STRUCT use
      record
        POSITION                at 0 range 0..191;
        VELOCITY                at 0 range 192..383;
        ACCELERATION            at 0 range 384..575;
        COV                     at 0 range 576..3455;         --triangular
form of 9 by 9
        LAST_UPDATE_TIME        at 0 range 3456..3519;
        Stereo_ChiSq            at 0 range 3520..3583;
        IMM_Filter_Used         at 0 range 3584..3615;
        STEREO_ID               at 0 range 3616..3647;
      end record;

    type Max_Establish_Track is range 1 .. 1200;
    type Mono_State_Array_type is     --Doug
       array (Max_Establish_Track) of Mono_State_Type;  --Doug


  --  Binding code for calling Fortran routines

  procedure TREX_READ_INIT_PARS;

  pragma INTERFACE (FORTRAN, TREX_READ_INIT_PARS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TREX_READ_INIT_PARS,
         EXTERNAL => "trex_read_init_pars_"
         );

  procedure TRTT_SGEN(SR_DX :GD.Int);

  pragma INTERFACE (FORTRAN, TRTT_SGEN);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRTT_SGEN,
         EXTERNAL => "trtt_sgen_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure TRCA_SETUP_CAND_TRKS;

  pragma INTERFACE (FORTRAN, TRCA_SETUP_CAND_TRKS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRCA_SETUP_CAND_TRKS,
         EXTERNAL => "trca_setup_cand_trks_"
         );

  procedure TRET_SETUP_ESTAB_TRKS;

  pragma INTERFACE (FORTRAN, TRET_SETUP_ESTAB_TRKS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRET_SETUP_ESTAB_TRKS,
         EXTERNAL => "tret_setup_estab_trks_"
         );

  procedure TRET_ESTAB_TRKR(SR_DX :GD.Int;
                            NUM_ACTIVE :in out GD.Int);

  pragma INTERFACE (FORTRAN, TRET_ESTAB_TRKR);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRET_ESTAB_TRKR,
         EXTERNAL => "tret_estab_trkr_",
         PARAMETER_TYPES =>
           (GD.Int,GD.Int),
         MECHANISM => (REFERENCE,REFERENCE)
         );

  procedure TRCA_CAND_TRKR(SR_DX :GD.Int);

  pragma INTERFACE (FORTRAN, TRCA_CAND_TRKR);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRCA_CAND_TRKR,
         EXTERNAL => "trca_cand_trkr_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure TRCA_CAND_INIT(SR_DX :GD.Int);

  pragma INTERFACE (FORTRAN, TRCA_CAND_INIT);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRCA_CAND_INIT,
         EXTERNAL => "trca_cand_init_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure TRWD_WEED_CAND(SR_DX :GD.Int;
                           NUM_NEW_OSMS :in out GD.Int;
                           NUM_CURRENT  :in out GD.Int  );

  pragma INTERFACE (FORTRAN, TRWD_WEED_CAND);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TRWD_WEED_CAND,
         EXTERNAL => "trwd_weed_cand_",
         PARAMETER_TYPES =>
           (GD.Int, GD.Int, GD.Int),
         MECHANISM => (REFERENCE,REFERENCE,REFERENCE)
         );

  procedure CLEANUP(SR_DX :GD.Int);

  pragma INTERFACE (FORTRAN, CLEANUP);

  pragma IMPORT_PROCEDURE (
         INTERNAL => CLEANUP,
         EXTERNAL => "cleanup_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure StoreScanHeader (SR_DX:in out GD.Int;
             HEADER    : LOS_Vectors.Sensor_Header_type);

  procedure Fortran_StoreScanHeader (SR_DX:in out GD.Int;
             HEADER    : Fortran_Sensor_Header_type);

  pragma INTERFACE (FORTRAN, Fortran_StoreScanHeader);

  pragma IMPORT_PROCEDURE (
         INTERNAL => Fortran_StoreScanHeader,
         EXTERNAL => "store_scan_header_",
         PARAMETER_TYPES =>
           (GD.Int,Fortran_Sensor_Header_type),
         MECHANISM => (REFERENCE,REFERENCE)
         );

  procedure StoreOneLOS (LOS   : LOS_Vectors.LOS_Vector_type);

  procedure Fortran_StoreOneLOS (LOS   : Fortran_LOS_Vector_type);

  pragma INTERFACE (FORTRAN, Fortran_StoreOneLOS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => Fortran_StoreOneLOS,
         EXTERNAL => "store_one_los_",
         PARAMETER_TYPES =>
           (Fortran_LOS_Vector_type),
         MECHANISM => (REFERENCE)
         );

  procedure SortScanData(SR_DX : GD.Int);

  pragma INTERFACE (FORTRAN, SortScanData);

  pragma IMPORT_PROCEDURE (
         INTERNAL => SortScanData,
         EXTERNAL => "sort_scan_data_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure LoadOSM(I :GD.Int; osm : out OD.MDP_OSM_Type);

  procedure Fortran_LoadOSM(I :GD.Int; osm :out Fortran_MDP_OSM_Type);

  pragma INTERFACE (FORTRAN, Fortran_LoadOSM);

  pragma IMPORT_PROCEDURE (
         INTERNAL => Fortran_LoadOSM,
         EXTERNAL => "load_osm_",
         PARAMETER_TYPES =>
           (GD.Int, Fortran_MDP_OSM_Type),
         MECHANISM => (REFERENCE,REFERENCE)
         );

  procedure LoadMonoStates(SR_DX : in GD.Int;
              num_current : in GD.Int;
              mono_states :out Mono_State_Array_type
              );

  pragma INTERFACE (FORTRAN, LoadMonoStates);

  pragma IMPORT_PROCEDURE (
         INTERNAL => LoadMonoStates,
         EXTERNAL => "load_mono_states_",
         PARAMETER_TYPES =>
           ( GD.Int, GD.Int, Mono_State_Array_type),
         MECHANISM => (REFERENCE,REFERENCE,REFERENCE)
         );

  procedure RELEASE_TRACK_POINTS(SR_DX : GD.Int);

  pragma INTERFACE (FORTRAN, RELEASE_TRACK_POINTS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => RELEASE_TRACK_POINTS,
         EXTERNAL => "release_track_points_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );

  procedure TERMINATE_TRACKS(SR_DX : GD.Int);

  pragma INTERFACE (FORTRAN, TERMINATE_TRACKS);

  pragma IMPORT_PROCEDURE (
         INTERNAL => TERMINATE_TRACKS,
         EXTERNAL => "terminate_tracks_",
         PARAMETER_TYPES =>
           (GD.Int),
         MECHANISM => (REFERENCE)
         );


--   Routines to implement the Stereo to Mono feedback
  procedure SetActiveStereoTracks(SR_DX:GD.Int; STEREO_IDS : in
Fortran_Stereo_IDs);

  pragma INTERFACE (FORTRAN, SetActiveStereoTracks);

  pragma IMPORT_PROCEDURE (
         INTERNAL => SetActiveStereoTracks,
         EXTERNAL => "setactivestereotracks_",
         PARAMETER_TYPES =>
          (GD.Int,Fortran_Stereo_IDs),
         MECHANISM => (REFERENCE,REFERENCE)
         );

  procedure UpdateStereoComponents(STEREO_COMPONENTS : in
STEREO_COMPONENTS_STRUCT);

  pragma INTERFACE (FORTRAN, UpdateStereoComponents);

  pragma IMPORT_PROCEDURE (
         INTERNAL => UpdateStereoComponents,
         EXTERNAL => "updatestereocomponents_",
         PARAMETER_TYPES =>
          (STEREO_COMPONENTS_STRUCT),
         MECHANISM => (REFERENCE)
         );

  procedure SetStereoState(STEREO_STATE : in STEREO_STATE_COV_STRUCT);

  pragma INTERFACE (FORTRAN, SetStereoState);

  pragma IMPORT_PROCEDURE (
         INTERNAL => SetStereoState,
         EXTERNAL => "setstereostate_",
         PARAMETER_TYPES =>
          (STEREO_STATE_COV_STRUCT),
         MECHANISM => (REFERENCE)
         );

  procedure INIT_STEREO_FB_INC;

  pragma INTERFACE (FORTRAN, INIT_STEREO_FB_INC);

  pragma IMPORT_PROCEDURE (
         INTERNAL => INIT_STEREO_FB_INC,
         EXTERNAL => "init_stereo_fb_inc_"
         );

end Fortran_Interface;

_______________________________________________

cheers..bob
Guy Calinsky <calinsky@sll.northrop.com> wrote in message
news:375ECA88.CF7CFF7E@sll.northrop.com...
> I have a subroutine written in FORTRAN that I need to link with my Ada
> 83 code, but I am getting an Undefined Symbol error on that subroutine.
> I followed the pragma example in the LRM (13.9).
> Here is a small app I created to test the concept:
> ----------------------
>
> with Text_io;  use Text_io;
> with Long_Float_io; use Long_Float_io;
>
> procedure Ada_Main  is
>
>    procedure root(A : Long_Float; B : Long_Float; C : Long_Float; Result
> : out Long_Float);
>    pragma Interface(Fortran, root);
>
>    result : Long_Float;
>
> begin
>
>    root(1.0, 2.0, 1.0, result);
>    put("result = "); put(result); new_line;
>
> end Ada_Main;
> ----------------------
>
> My FORTRAN subroutine :
>         subroutine root(a, b, c, x)
>         implicit none
>         real a, b, c, x
>         x = SQRT(b**2 - 4.0 * a * c) / (2.0 * a)
>         return
>         end
> ----------------------
>
> My Make script :
> f77 -Xlist -g -C  root.for
> ada ada_main.a
> a.ld -o ada_fortran_test ada_main root.o
> ----------------------
>
> Everything compiles ok and root.o does exist, yet I get this result :
> Undefined                       first referenced
>  symbol                             in file
> root
> /home/calinsky/Fortran_Ada_Test/.objects/ada_main01
> ld: fatal: Symbol referencing errors. No output written to
> ada_fortran_test
>
>
> Any thoughts or ideas?
> Thanks,
> Guy
>






      parent reply	other threads:[~1999-06-10  0:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-06-09  0:00 Linking FORTRAN77 to Ada83 Guy Calinsky
1999-06-09  0:00 ` David C. Hoos, Sr.
1999-06-10  0:00   ` Robert Dewar
1999-06-10  0:00 ` bob [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox