TEAM-ADA Archives

Team Ada: Ada Programming Language Advocacy

TEAM-ADA@LISTSERV.ACM.ORG

Options: Use Classic View

Use Proportional Font
Show Text Part by Default
Show All Mail Headers

Topic: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
"Robert C. Leif, Ph.D." <[log in to unmask]>
Sat, 4 Dec 1999 14:58:27 -0800
text/plain (199 lines)
From: Bob Leif
To: Readers of Comp.Lang.Ada and Team-Ada

Disclaimer: Although, I had this problem with an ObjectAda compiler, it is
neither a bug or a design error. It is an Ada problem and therefore relevant
to these forums.

There is now obvious interest in XML-HTML. In fact, concerning the presently
popular subject, "What the competition looks like". There will and probably
are now more individuals conversant with HTML-XML than any of the present
programming languages. The tools to build web-pages will have a very large
market compared to any programming language development system.

One major impediment to interfacing with HTML is in the package
Ada.Command_Line. The HTML statement,
<FORM method="Get" action="file:///C:\Ada_Work/com_line.exe"> is a
reasonable key to this problem. It produces a Command_Line string and does
invoke the com_line program shown below. Unfortunately,
Command_Line.Argument_Count does not work with the Command_Line string.
The Get method concatenates a '?' directly after the program name.
----------------------------------------------------------------
HTML 4.01 Specification
W3C Proposed Recommendation
This version:
http://www.w3.org/TR/1999/PR-html40-19990824
(plain text [786Kb], gzip’ed tar archive of HTML files [367Kb], a .zip
archive of
HTML files [400Kb], gzip’ed Postscript file [740Kb, 387 pages], a PDF file
[3Mb])
17.13.3 Processing form data, Page 247

"However, HTML 4.01 user agents must support
the established conventions in the following cases:
If the method is "get" and the action is an HTTP URI, the user agent takes
the value of action, appends a ‘?’ to it, then appends the form data set
[p.246] ,encoded using the "application/x-www-form-urlencoded" content type
[p.247] .The user agent then traverses the link to this URI. In this
scenario, form data are restricted to ASCII codes."
--------------------------------------------------------------
I have included a very simple HTML Form (Com_Line_Small) below. It produces
the equivalent of "C:\Ada_Work\com_line.exe?TEST=Hello".
I proved under Windows that this did not work with a Com_line.Bat batch
program with the line above as its only text. However, the simple insertion
of a space between the program and the '?' works.
C:\Ada_Work\com_line.exe ?TEST=Hello

The output of my com_line_small.Bat is as follows:

C:\Ada_Work\com_line_Small.exe?TEST=Hello
The DOS Window shows: Bad command or file name

However, the program does run when actuated through the HTML form; with the
number of arguments equal to 0.
C:\Ada_Work\com_line.exe equals the Command_Line
This Program is Com_Line

The number of arguments =  0
-----------------------------------------------

C:\Ada_Work>C:\Ada_Work\com_line.exe ?TEST=Hello
The DOS Window shows that the program has executed

C:\ADA_WORK\COM_LINE.EXE equals the Command_Line
The number of arguments =  1
Argument  1 is ?TEST=Hello

I do not believe this is the fault of the ObjectAda compiler.
The Ada 95 LRM really does not define what a command line is. The Rationale
on page A-32 states:
A:5 Command Line
"The package Ada.Command_Line provides an Ada program with a simple means of
accessing any arguments of the command which invoked it. The package also
enables the program to set a return status. Clearly the interpretation of
these facilities depends very much on the underlying operating system."

The question is which operating system, Windows or HTTP? The above problem
is neither a bug nor a design mistake. It is correct for its intended use,
Windows. However, it does not work with HTTP. I do believe in hindsight that
a function that returns the entire command_line including the program name
should be added. In view of the significance of HTML-XML, I believe that it
would be worthwhile to modify the Aonix Command_Line or any other Ada
compiler to work with the output of HTML Get.

Can any of the Ada compilers read and process a command_line that does NOT
have a space after the name of the executable? If you wish to test this,
please feel fee to use the Ada program and HTML page below.

----------------------------------------------------------
--Robert C. Leif, Ph.D & Ada_Med

--2 Dec. 1999
--Last update 3 Dec. 1999

--File name Com_Line_Small.Adb

--e-mail [log in to unmask]

with Ada.Text_Io;
with Ada.Exceptions;
with Ada.Command_Line;
with Interfaces.C.Strings;
procedure Com_Line_Small is
  Prog_Location : constant String := "Com_Line_Small";
  package T_Io renames Ada.Text_Io;
  package Command_Line renames Ada.Command_Line;
  Num_Args : Natural := 1;
  --Com_Line_Var : String    := Command_Line.Command_Name;
  Exit_Char : Character := 'x';
  ------------------------------------------------------------------
  --sugested by Randy Brukardt
  function Get_Command_Line return Interfaces.C.Strings.Chars_Ptr;
  pragma Import (
    Convention    => Win32,
    Entity        => Get_Command_Line,
    External_Name => "GetCommandLineA");
  ----------------------------------------------------------------
begin --Com_Line_Small
  --then Call:
  T_Io.Put_Line("Windows way (Randy Brukardt) to get the Command_Line:");
  T_Io.Put_Line(Interfaces.C.Strings.Value(Get_Command_Line));
  --returns a string

  Num_Args := Command_Line.Argument_Count;
  T_Io.Put_Line("");
  T_Io.Put_Line("Ada way to get the Command_Line:");
  T_Io.Put_Line(Command_Line.Command_Name);
  T_Io.Put_Line("This Program is " & Prog_Location);
  T_Io.Put_Line("");
  T_Io.Put_Line("The number of arguments = "
    & Natural'Image(Num_Args));

  if Num_Args >= 1 then
    for I in 1..Num_Args loop
      T_Io.Put_Line("Argument "  & Natural'Image(I) & " is "
        & Command_Line.Argument (Number => I));
    end loop;
  end if;
  T_Io.Put_Line("Ending Com_Line_Small Test program");
  T_Io.Put_Line("Ending " & Prog_Location);
  T_Io.Get(Exit_Char);
exception
  when O: others  =>
    T_Io.Put_Line(Ada.Exceptions.Exception_Information (O));
    T_Io.Put_Line(Ada.Exceptions.Exception_Message (O));

end Com_Line_Small;
----------------------------------------------------------------
Output:

Windows way (Randy Brukardt) to get the Command_Line:
"C:\Ada_Work\com_line_small.exe"

Ada way to get the Command_Line:
C:\Ada_Work\com_line_small.exe
This Program is Com_Line_Small

The number of arguments =  0
Ending Com_Line_Small Test program
Ending Com_Line_Small
---------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
        <HEAD>
                <TITLE>
                        Com_Line_Small Test
                </TITLE>
                <meta http-equiv="Content-Type" content="text/html;
                charset=Latin1">

                <meta http-equiv="Content-Language" content="en-us">

                <base  href="C:\Ada_Work">
        </HEAD>
        <BODY aLink=#ff0000 background="" bgColor=#ffffff link=#0000ff
                text=#000000 vLink=#800080>

                <!--How do I get the string named test into the-->
                <!--command line of HTML_Ada?-->
                <OBJECT classid="File:///C:\Ada_Work\com_line_Small.exe"
                        height=40 width=40 title=Com_Line>
                        <PARAM NAME="TEST" VALUE="Hello">
                </OBJECT>

                <FORM method="Get"
                        action="file:///C:\Ada_Work/com_line_Small.exe">

                        <p>
                        <input TYPE="text" NAME="TEST" SIZE="10" MAXLENGTH="15"
                        VALUE="Hello">
                        </p>


                        <INPUT type=submit value="Submit Form">
                        <INPUT name=Reset type=reset value="Reset Form">

                </FORM>
        </BODY>
</HTML>

ATOM RSS1 RSS2