comp.lang.ada
 help / color / mirror / Atom feed
* Making EXECL Unix call from Ada
@ 1990-12-09 19:38 Clifford Stein
  1990-12-10 15:51 ` David Emery
  0 siblings, 1 reply; 2+ messages in thread
From: Clifford Stein @ 1990-12-09 19:38 UTC (permalink / raw)


I'm trying to laser print a file from an ada program by calling the program
enscript with the execl function.  I've been having problems, though.
Sometimes I can print a file, other times I cannot (if it doesn't
print, it [enscript] will give me a file not found message).

When enscript does print, however, it prints garbage which doesn't resemble
my file at all, and it [enscript] won't even print a filename at the top of
the printout like it usually does.

I've included the source code here, does anyone have any suggestions?
(I'm using VADS serial on a Sequent running Dynix)

If I compile this program the way it is right now I will get a 

"/hmc2/guest/lsdada/cliffie/hello4: file not found"

even though hello does exist.

Please respond via email.

			Thank you for any help.

				Clifford Stein


with c_strings; use c_strings;
with a_strings;use a_strings;
with unix_prcs; use unix_prcs;
with text_io; use text_io;
procedure print is
status:integer;
name:string(1..23);
argv:string(1..33);
a_name:c_string;
the_name:a_string;
nll:character;
begin

	argv(1..33):="/hmc2/guests/lsdada/cliffie/hello";
	nll:=ascii.nul;
	name:="/usr/local/bin/enscript";
	status:=execl(name'address,argv'address,nll'address);
	if status/=0 then
		put_line("True.");
	else
		put_line("False");
	end if;
end print;

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Making EXECL Unix call from Ada
  1990-12-09 19:38 Making EXECL Unix call from Ada Clifford Stein
@ 1990-12-10 15:51 ` David Emery
  0 siblings, 0 replies; 2+ messages in thread
From: David Emery @ 1990-12-10 15:51 UTC (permalink / raw)


I suspect the problem is that Unix is running off the end of your
string and/or your parameter list.  Try the following:

	with system;
	  -- assumed to provide the object "null_address"
	  -- (also known as "address_zero" or "no_addr" on some compilers)
	with text_io;
	procedure print
	    function execl (name : system.address;
			    arg0 : system.address;
			    arg1 : system.address)	-- all we need
	    return integer;	-- assumed to be the same size as C "int"
	    pragma interface (C, execl);
	    
	    program_name : constant string
			 := "/usr/local/bin/enscript" & Ascii.nul;
	    file_name    : constant string
		         := "/hmc2/guests/lsdada/cliffie/hello" & Ascii.nul;
	    status : integer;
	begin
	    status := execl (name => program_name(program_name'first)'address,
			     arg0 => file_name(file_name'first)'address,
			     arg1 => system.null_address);
	    if status/=0 then
		put_line("True.");
  	    else
		put_line("False");
	    end if;
	end print;

Remember, that in C strings are null-terminated, and represented by
the address of the first element.  Also, from the C definition of the
parameters for execl, the last parameter is of type "address", with
value 0, not the address of an object with value 0.  There's a subtle
difference, in that the former is "0", and the latter is not "0", but
some (non-zero) address.  

Here are the changes to print a user-supplied file.  Append a null to
the end of the user-supplied string, and pass this to C:

	procedure print (file_to_print : string) is
	    ...
	    file_name : constant string
		      := file_to_print & Ascii.nul;
	    ...
	end print;

				dave emery
				emery@aries.mitre.org

<for more tricks like this, see my paper in Tri-Ada on the POSIX Ada
binding prototype.>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1990-12-10 15:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1990-12-09 19:38 Making EXECL Unix call from Ada Clifford Stein
1990-12-10 15:51 ` David Emery

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