comp.lang.ada
 help / color / mirror / Atom feed
From: do_while@ridgecrest.ca.us (Do-While Jones)
Subject: Re: Program (not task) Activation
Date: 1998/04/21
Date: 1998-04-21T00:00:00+00:00	[thread overview]
Message-ID: <6hjtju$kiq$1@owens.ridgecrest.ca.us> (raw)
In-Reply-To: EACHUS.98Apr21125549@spectre.mitre.org


>In article <#CDmPrma9GA.300@ntawwabp.compuserve.com> Jeremy T Smith <75534.2075@CompuServe.COM> writes:
>
>                        Can anyone suggest a way to kick these 
>   off as a series of independant executables, not tasks, from 
>   within Ada95?  They must be launched as if from the command line, 
>   with certain setup options passed as command line parameters.  
>   The rest of the simulation environment is now running correctly, 
>   but we're stuck on this one.  Thanks.
>

An easy way to do this is to make a UNIX shell command from inside your
Ada program.  I've included the code I use below. 

There are two package bodies.  One is for Telesoft (Ada 83) on the SUN. 
The other is for GNAT on the SGI.  I've also included two demo programs.
The first demo program calls the "ls" command.  The second demo program
calls a bogus command to test the error detection logic. 

Just for fun, I tried compiling and running these UNIX Interface
components on my brand-new Windows 95 machine.  (I used the ui02kb02.ada
body.)  The first demo program ran correctly.  Windows 95 responded by
displaying a correct directory listing.  The second demo program made
Windows display "bad command or filename", but it didn't raise the
expected exception. 

Does anyone know why Windows 95 did not return an error code?

Do-While Jones

            +--------------------------------+
            |    Know                 Ada    |
            |        [Ada's Portrait]        |
            |    Will              Travel    |
            | wire do_while@ridgecrest.ca.us |
            +--------------------------------+

-------------------------------------------------------------
--                      ui02ks01.ada
--                      24 January 1995

--                      Do-While Jones
--                      324 Traci Lane
--                      Ridgecrest, CA 93555
--                      (760) 375-4607

package SHELL is

  procedure Command(ARGUMENT : string);
    -- Executes the shell command with the given string
    -- ARGUMENT.  For example, the statement below lists
    -- all the files beginning with ui02.

    --    SHELL.Command("ls ui02*");

    -- Raises SHELL.COMMAND_ERROR if it fails.

  COMMAND_ERROR : exception;

  -- The following functions are useful diagnostics if
  -- COMMAND_ERROR is raised.  They are intended only
  -- for debugging.

  function Error_Code return integer;
    -- Tells you the result code returned by the system call.

  function Invalid_Command return string;
    -- Tells you what string was rejected by the system call.

end SHELL;


-------------------------------------------------------------
--                      ui02kb01.ada
--                      24 January 1995

--                      Do-While Jones
--                      324 Traci Lane
--                      Ridgecrest, CA 93555
--                      (760) 375-4607

-- This body works for the Telesoft Ada compiler on
-- the Sun.

with SYSTEM,
     STANDARD_INTEGERS,  -- part AA01
     ASCII_UTILITIES;    -- part AA02

package body SHELL is

  type UNIX_results is
    new STANDARD_INTEGERS.Integer_32;

  RESULT : UNIX_results;

  BAD_COMMAND_STRING : string(1..70);
  BAD_STRING_LENGTH  : natural := 0;

  function unix_call(addr : SYSTEM.Address)
    return UNIX_results;
  pragma Interface(C, unix_call);
  pragma Interface_Information
    (unix_call, "_system");
  
  procedure Command(ARGUMENT : string) is
    C_STRING : constant string :=
      ARGUMENT & ASCII.NUL;
  begin
    RESULT := unix_call(C_STRING(1)'ADDRESS);
    if RESULT /= 0 then
      ASCII_UTILITIES.String_Copy(
        FROM => ARGUMENT,
        TO   => BAD_COMMAND_STRING);
      BAD_STRING_LENGTH := ARGUMENT'LENGTH;
      raise COMMAND_ERROR;
    end if;
  end Command;

  function Error_Code return integer is
  begin
    return integer(RESULT);
  end Error_Code;

  function Invalid_Command return string is
  begin
    return BAD_COMMAND_STRING(1..BAD_STRING_LENGTH);
  end Invalid_Command;

end SHELL;


-------------------------------------------------------------
--                      ui02kb02.ada
--                      10 April 1997

--                      Do-While Jones
--                      324 Traci Lane
--                      Ridgecrest, CA 93555
--                      (760) 375-4607

-- This body works for the Gnat (Ada 95) compiler on Silicon
-- Graphics.

with SYSTEM,
     STANDARD_INTEGERS,  -- part AA01
     ASCII_UTILITIES;    -- part AA02

package body SHELL is

  type UNIX_results is
    new STANDARD_INTEGERS.Integer_32;

  RESULT : UNIX_results;

  BAD_COMMAND_STRING : string(1..70);
  BAD_STRING_LENGTH  : natural := 0;

  function unix_call(addr : SYSTEM.Address)
    return UNIX_results;
  pragma IMPORT(C, unix_call, "system");
  
  procedure Command(ARGUMENT : string) is
    C_STRING : constant string :=
      ARGUMENT & ASCII.NUL;
  begin
    RESULT := unix_call(C_STRING(1)'ADDRESS);
    if RESULT /= 0 then
      ASCII_UTILITIES.String_Copy(
        FROM => ARGUMENT,
        TO   => BAD_COMMAND_STRING);
      BAD_STRING_LENGTH := ARGUMENT'LENGTH;
      raise COMMAND_ERROR;
    end if;
  end Command;

  function Error_Code return integer is
  begin
    return integer(RESULT);
  end Error_Code;

  function Invalid_Command return string is
  begin
    return BAD_COMMAND_STRING(1..BAD_STRING_LENGTH);
  end Invalid_Command;

end SHELL;
-------------------------------------------------------------
--                      ui02td01.ada
--                      24 January 1995

--                      Do-While Jones
--                      324 Traci Lane
--                      Ridgecrest, CA 93555
--                      (760) 375-4607

with TEXT_IO,
     SHELL;  -- part UI02

procedure UI02TD01 is
begin
  TEXT_IO.New_Line;
  TEXT_IO.Put_Line("The files beginning with ""ui02"" are:");

  SHELL.Command("ls ui02*");

  TEXT_IO.New_Line;

end UI02TD01;

-------------------------------------------------------------
--                      ui02td02.ada
--                      24 January 1995

--                      Do-While Jones
--                      324 Traci Lane
--                      Ridgecrest, CA 93555
--                      (760) 375-4607

with TEXT_IO,
     SHELL;  -- part UI02

procedure UI02TD02 is
begin
  TEXT_IO.New_Line;
  TEXT_IO.Put_Line("Trying ""nonesuch with arguments"" "
    & "which should raise an exception.");
  TEXT_IO.New_Line;

  SHELL.Command("nonesuch with arguments");

  -- Should never get here.
  TEXT_IO.Put_Line("FAILED to raise the exception.");

exception
  when SHELL.COMMAND_ERROR =>
    -- Should jump to here.
    TEXT_IO.New_Line;
    TEXT_IO.Put_Line("SHELL.COMMAND_ERROR was raised.");
    TEXT_IO.Put_Line("The offending command is "
      & SHELL.Invalid_Command & ".");
    TEXT_IO.Put_Line("Error number is"
      & integer'IMAGE(SHELL.Error_Code)
      & ".");
end UI02TD02;






  reply	other threads:[~1998-04-21  0:00 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-04-17  0:00 Program (not task) Activation Jeremy T Smith
1998-04-21  0:00 ` Robert I. Eachus
1998-04-21  0:00   ` Do-While Jones [this message]
1998-04-22  0:00     ` Jerry van Dijk
1998-04-24  0:00       ` Michael F Brenner
1998-04-27  0:00       ` Do-While Jones
1998-04-28  0:00         ` Jerry van Dijk
1998-04-29  0:00           ` Do-While Jones
1998-04-29  0:00             ` Do-While Jones
replies disabled

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