From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,6c7be346cfa17c37 X-Google-Attributes: gid103376,public From: husseinp@logica.com (Paul Hussein) Subject: Re: Ada/Motif problem... Date: 1996/08/29 Message-ID: <503hsp$be2@romeo.logica.co.uk>#1/1 X-Deja-AN: 177064198 references: <4vupg6$ljf@goanna.cs.rmit.edu.au> <4vvrfg$800@goanna.cs.rmit.edu.au> <3223B293.15C831D5@ix.netcom.com> <1996Aug28.110744.1@eisner> organization: Logica UK Ltd. newsgroups: comp.lang.ada Date: 1996-08-29T00:00:00+00:00 List-Id: kilgallen@eisner.decus.org (Larry Kilgallen) wrote: > Dale Stanbrough wrote: >> >> Larry Kilgallen writes: >> >> "Understanding that you have asked us how to lie to an Ada compiler... >> >> > Any inspiration on how to pass Ada strings as callback data in Motif? >> >> Depending on compiler specifics, you may be able to get away with >> an access to a single character (the first in the string). >> >> Larry Kilgallen" >> >> But that doesn't really help at the other end, that is the routine that >> gets called and gets passed a pointer to a character. It may know that >> it points to the first character of a string, but how should it know how >> long the string is? We lose the bounds of the string if we do this. >In my experience calling DECwindows from Ada, it wanted a lot of >null-terminated strings. Thus the called subsystem, being written >in C, cannot tell the difference between a pointer to null-terminated >string and a pointer to the first character thereof. Spot on! When passing strings from Ada to C one needs to null-terminate them. The best Idea is to write yourself a little package the does C conversions and declaraarions much like the ones that come with DEC Ada or VADS Ada. package C_Types is type Long is ... type Int is ... type etc end C_Types; package C_Strings is type Null_Terminated_String is new STRING; type Char_Pointer is new SYSTEM.ADDRESS; Null_Char_Pointer : constant Char_Pointer := SYSTEM.NULL_ADDRESS; function To_String ( String : in STRING ) return Null_Terminated_String; function To_String ( String : in Null_Terminated_String ) return Null_Terminated_String; etc. end C_Strings. Where what you pass to C would go something like this. Null_String : constant C_Strings.Null_Terminated_String := C_Strings.To_String ("Hello Baby"); String_Pointer : C_Strings.Char_Pointer := Null_String'FIRST'ADDRESS; Calback ( ...... String => String_Pointer .... ) I think this is corrrect.