comp.lang.ada
 help / color / mirror / Atom feed
From: blakemor@software.org (Alex Blakemore)
Subject: Re: C Strings in Ada?
Date: 10 Jun 90 20:38:41 GMT	[thread overview]
Message-ID: <1304@software.software.org> (raw)
In-Reply-To: 920025@hpclapd.HP.COM

In article <920025@hpclapd.HP.COM> defaria@hpclapd.HP.COM (Andy DeFaria) writes:
>What is the best way to represent C_Strings in Ada?  

Dave Emery presented the following solution for some compilers.

$$	procedure to_c (str : string) 
$$	is
$$	  procedure c_routine (addr : system.address);
$$          pragma interface (C, c_routine);	-- (void) c_routine(s)
$$						-- char * s;
$$	  c_string : constant string := str & Ascii.NUL;
$$	begin
$$	  c_routine(c_string(c_string'first)'address);
$$	end to_c;
$$
$$	function from_c  
$$	    return string
$$	is
$$	    function c_function			
$$		return System.address;		
$$	    pragma interface (C, c_function);	-- char * c_function
$$	    function strlen (addr : System.address)
$$		return integer;
$$	    pragma interface (C, strlen);	-- the C function of
$$						-- the same name
$$	    addr_from_c : System.address;
$$	 begin
$$	    addr_from_c := c_function;
$$	    declare
$$	      answer : string(1..strlen(addr_from_c);
$$	      for answer'address use at addr_from_c;
$$	    begin
$$	      return answer;
$$	    end;
$$  	 end from_c;

Mr. DeFaria replied
> I kinda agree with you that the "right" way to do this would be to keep Ada
> strings as  Ada strings and do the  conversion  in package but you have not
> addressed one of my critical concerns: What about  the overhead incurred by
> having  to call the  heap manager to allocate a  new string just  to append
> ASCII.NUL so  that the C routine I'm   calling  will be  able to handle  it

I dont think this solution *requires* heap allocation.  A good compiler would 
be free to use stack space for the C strings in these cases, both for
the local constant c_string and for the return value.  Of course, there is 
the overhead of copying the strings but the allocation can be relatively
cheap.

-----------------------------------------------------------------------
Alex Blakemore                       Internet: blakemore@software.org
Software Productivity Consortium     UUNET:    ...!uunet!software!blakemore
2214 Rock Hill Rd, Herndon VA 22070  Bellnet:  (703) 742-7125

  reply	other threads:[~1990-06-10 20:38 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1990-06-04 22:45 C Strings in Ada? Andy DeFaria
1990-06-07 17:41 ` stt
1990-06-08 16:00 ` Andy DeFaria
1990-06-10 20:38   ` Alex Blakemore [this message]
1990-06-11 12:57     ` Allan Doyle
1990-06-11 14:59       ` David Kassover
1990-06-11 19:48         ` Allan Doyle
1990-06-11 21:01           ` David Kassover
1990-06-11 22:30           ` Mike Murphy
1990-06-13 21:20           ` Edward Falis
1990-06-11 17:53       ` David Emery
1990-06-11 19:59         ` Allan Doyle
1990-06-15  7:53   ` Jeff Bartlett
1990-06-11 22:39 ` Andy DeFaria
1990-06-12 14:04   ` David Emery
1990-06-12 18:11   ` Mike Murphy
1990-06-13 13:43 ` stt
replies disabled

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