From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Need a way to convert a constant to a variable
Date: Sat, 5 Aug 2017 21:37:41 +0200
Date: 2017-08-05T21:37:41+02:00 [thread overview]
Message-ID: <om56q5$e7p$1@gioia.aioe.org> (raw)
In-Reply-To: om507u$3u3$1@gioia.aioe.org
On 2017-08-05 19:45, Victor Porton wrote:
> Dmitry A. Kazakov wrote:
>
>> On 2017-08-05 17:11, Victor Porton wrote:
>>
>>> I do use char_array for interfacing with C.
>>
>> You should probably reconsider it. It works only for C functions that do
>> not expect null as a value, do not return strings allocated outside Ada,
>> do not deallocate strings passed into.
>
> I use an indefinite holder with char_array inside to represent a C string
> (whose length size_t value ('Length in Ada) I pass separately to a C
> function), which may be either a real string (corresponding to char_array)
> or NULL (corresponding to empty indefinite handler).
>
> Note that the above is NOT related to NUL-terminated strings.
Yes. What you do is not a good idea. Try this instead:
type C_String is new Ada.Finalization.Limited_Controlled with record
Data : chars_ptr := null_ptr;
end record;
procedure Set (X : in out C_String; Text : String) is
begin
Free (X.Data);
X.Data := New_String (Text);
end Set;
procedure Finalize (X : in out C_String) is
begin
Free (X.Data);
end Finalize;
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2017-08-05 19:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-05 13:41 Need a way to convert a constant to a variable Victor Porton
2017-08-05 14:48 ` Dmitry A. Kazakov
2017-08-05 15:11 ` Victor Porton
2017-08-05 16:44 ` Dmitry A. Kazakov
2017-08-05 17:45 ` Victor Porton
2017-08-05 19:37 ` Dmitry A. Kazakov [this message]
2017-08-05 15:41 ` Jeffrey R. Carter
2017-08-05 16:25 ` Victor Porton
2017-08-05 20:12 ` Jeffrey R. Carter
2017-08-05 17:59 ` Per Sandberg
2017-08-15 20:05 ` Eryndlia Mavourneen
2017-08-15 20:07 ` Eryndlia Mavourneen
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox