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=-0.8 required=5.0 tests=BAYES_00,INVALID_DATE autolearn=no autolearn_force=no version=3.4.4 Path: utzoo!utgpu!news-server.csri.toronto.edu!mailrus!cs.utexas.edu!usc!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!sdd.hp.com!hplabs!hpda!hpcuhb!hpcllla!hpclisp!defaria@hpclapd.HP.COM From: defaria@hpclapd.HP.COM (Andy DeFaria) Newsgroups: comp.lang.ada Subject: Re: C Strings in Ada? Message-ID: <920025@hpclapd.HP.COM> Date: 8 Jun 90 16:00:22 GMT References: <920024@hpclapd.HP.COM> Organization: Hewlett-Packard Calif. Language Lab List-Id: >/ hpclapd:comp.lang.ada / emery@D74SUN.MITRE.ORG (David Emery) / 10:21 am Jun 6, 1990 / >>What is the best way to represent C_Strings in Ada? > >The right solution is to keep all strings in the Ada program as Ada >strings, and change them to/from C strings at the point of interface >to C. (i.e. within the body of Ada_routine_calling_c). This >preserves the Ada abstractions, and makes all the Ada things work just >fine (e.g. 'IMAGE, which returns an Ada string). The only other >alternative (that makes sense to me) is to make C_STRING a private >type derived from System.address, but you won't be able to do anything >useful in the debugger with this. > >How you do this conversion is very machine dependent, but here's my >tricks that work on Verdix (Sun 3) and Meridian (IBM PC): > > 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; > >Hopefully what's going here is obvious, if not let me know and I'll >send more information. > > dave emery > emery@aries.mitre.org >---------- 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 properly. I anticipate that this overhead will have an severe impact on performance and Ada already has a bad rap for being a dog. I don't want to add to that reputation. Another, problem that you haven't addressed is that of the representation of a string in a record. Should it be and Ada access to string or should it be the string itself. Or should it be a C string (char *)?