Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!gem.mps.ohio-state.edu!samsung!ginosko!uunet!gistdev!joe From: joe@gistdev.UUCP (Joe Brownlee) Newsgroups: comp.lang.c Subject: Re: Strings in C (Re: ambiguous ?) Message-ID: <824@gistdev.UUCP> Date: 28 Oct 89 20:16:27 GMT References: <11398@smoke.BRL.MIL> <14115@lanl.gov> <2522@munnari.oz.au> <6676@ficc.uu.net> <2421@convex.UUCP> <2742@hub.UUCP> <6706@ficc.uu.net> <2767@hub.UUCP> Reply-To: joe@gistdev.UUCP (Joe Brownlee) Organization: Global Information Systems Technology Inc., Savoy, IL Lines: 69 In lots of articles, lots of people say lots of things about how Macintosh C compilers handle counted (or Pascal-style, if you will) strings. In an article someone says (sorry, lost the attribution): >Until we get a real Mac C type with the balls to post in this group... Well, judge for yourself :-). I just hack a bit as well, but I happen to have the THINK C 4.0 Manual handy, so here goes. By the way, THINK C 4.0 is advertised as being very ANSI conformant, and for the most part, it is. The libraries seem to be the most conformant feature. However, this version does not support "const", "volatile", or "signed", for example. First, string literals which begin with a "\p" are considered type "Str255", the type of string used by Pascal and the Macintosh ROM toolbox. Type Str255 is defined in the header file "MacTypes.h" like so: typedef unsigned char Str255[256]; The count is kept in the first byte. Routines are provided to convert between the two formats of strings. However, in my experience, it is better to write parallel versions of the standard "str" routines which operate on counted strings, since all toolbox calls operate on them. Thus you would say: Str255 s; [...] (void)Pstrcpy( s, "\pThis is how to set a counted string." ); Appendix A of the "Standard Libraries Reference" Manual (which deals with printf() and scanf()) says the following in its table of format characters: Character Argument Type Output p void * An eight-digit hexadecimal number. s char * A string. [...] Prints a C-style string (an object of type char *). It prints the string until one of the following happens: . It encounters a NULL character, which it will not print. . It prints the maximum number of characters allowed by the precision directive. With the # flag, this specifier prints a Pascal- style string (an object of type Str255). In other words: Str255 s; [...] (void)printf( "This is a Pascal string: %#s\n", s ); ...would be used to display the contents of a counted string. As stated earlier, I have never taken a Mac program to UNIX or DOS, but I have taken UNIX and DOS programs to the Mac, so I do not find the above to be a problem. Disclaimer: I am not associated with Symantec/THINK C in any other way than as a user. I do necessarily endorse the above as being ANSI conformant or even as an allowed extension. Others in this group can speak to this issue (please, do). I am simply posting this information so that any futher discussion can be informed rather than "hear-say". Joe Brownlee | The best diplomat I know is a fully activated Global Information Systems | phaser bank. -- Montgomery Scott 1800 Woodfield Drive | Savoy, Illinois 61874 | Pay attention to what I say. Start a trend. (217) 352-1165 | UUCP: {uunet,pur-ee,convex}!gistdev!joe