Message-ID: <3BB5F713.74AFBD@worldnet.att.net> From: Les Cargill X-Mailer: Mozilla 4.72 [en] (Win98; I) X-Accept-Language: en MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: Re: Please add strrev proposal References: <3BB50884 DOT 347A4384 AT yahoo DOT com> <3BB55487 DOT CC4407ED AT worldnet DOT att DOT net> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 144 Date: Sat, 29 Sep 2001 16:27:37 GMT NNTP-Posting-Host: 12.86.209.138 X-Complaints-To: abuse AT worldnet DOT att DOT net X-Trace: bgtnsc04-news.ops.worldnet.att.net 1001780857 12.86.209.138 (Sat, 29 Sep 2001 16:27:37 GMT) NNTP-Posting-Date: Sat, 29 Sep 2001 16:27:37 GMT Organization: AT&T Worldnet To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Radical, NetSurfer wrote: > > OUTCH! you believe this behavior is correct, too? > This is not belief, it is certain knowledge that this is correct. > OMG! > > ...and still no incorporation of strrev(NO_ARGS); > There's no way to determine what this means. I can guess, but I don't know. If there is an implementation of strrev that does this, it is broken. There's no way it's reentrant, and that's a really ugly side effect. The caller of a universal library function is responsible for context, not the called function. > psst: that returns the last static value of a func, in this > case, whatever the last string that was "reversed" > (and no, its not a C++ thingy either; but all this is another story) > No, it's not a C++ thing. The code you posted works as advertised, regardless of 'C' compiler. Look at http://lnrpc2.irb.hr/ebooks/0672310694/ch17/ch17.htm#Heading22 Particularly "Listing 17.4" Again, I don't have the library reference for Borland, but I vaguely remember it working like 17.4. > On Sat, 29 Sep 2001 04:54:12 GMT, Les Cargill > wrote: > > >Radical, let us look at what is meant by the code snippet: > >printf("Original String: %s\nReversed String:%s\n", s, strrev(s)); > > > > > >First*, s is pushed on the stack, then "strrev" is called. > >strrev reversed the original string in place. > > > >Next**, the pointer return from strrev, and s ( which *are the same value* ) > >are both pushed on the stack > > > >Radical, NetSurfer wrote: > >> > >> On Sat, 29 Sep 2001 00:28:28 GMT, CBFalconer > >> wrote: > >> > >> >"A. Sinan Unur" wrote: > >> >> > >> >> Radical NetSurfer wrote in > >> >> news:lcq8rtk1nqua2hc6rqfhmqisbd587n8t2n AT 4ax DOT com: > >> >> > >> >> > I would like to encourage everyone who has a need for > >> >> > strrev to come forward and encourage the maintainers of > >> >> > LIBC used with GCC to kindly add strrev. > >> >> > >> >> Count me against this if for no other reason that the fact that I do not > >> >> like extra nonstandard function which solve tiny problems. If you need the > >> >> functionality, you can write one for your own situation. If it is going to > >> >> be added to a library, the solution needs to be useful to more than just > >> >> one person in a particular situation. > >> >> > >> >> Anyway, the main point of my post, however, is to point out just one of the > >> >> gotchas with these kinds of functions. > >> >> > >> >> You give the following usage example: > >> >> > >> >> > Example > >> >> > printf("The reverse of %s is %s\n", str, strrev(str) ); > >> >> > >> >> Hmmmmm ..... let us see using the code you suggested: > >> >> > >> >> /* +++Date last modified: 05-Jul-1997 */ > >> >> /* > >> >> ** STRREV.C - reverse a string in place > >> >> ** > >> >> ** public domain by Bob Stout > >> >> */ > >> >> > >> >> #include > >> >> #include > >> >> #include > >> >> > >> >> char *strrev(char *str) { > >> >> char *p1, *p2; > >> >> > >> >> if (! str || ! *str) return str; > >> >> for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) > >> >> { > >> >> *p1 ^= *p2; > >> >> *p2 ^= *p1; > >> >> *p1 ^= *p2; > >> >> } > >> >> return str; > >> >> } > >> >> > >> >> int main(void) > >> >> { > >> >> char s[] = "This is a test."; > >> >> printf("Original String: %s\nReversed String:%s\n", s, strrev(s)); > >> >> return 0; > >> >> } > >> >> > >> >> C:\var>gcc djstrrev.c -o djstrrev.exe -O2 -Wall > >> >> > >> >> C:\var>djstrrev > >> >> Original String: .tset a si sihT > >> >> Reversed String: .tset a si sihT > >> > >> If your compiler actually outputs both strings as reversed, > >> THEN I am very scared your compiler is quite BROKEN. > >> > >> printf("format specifier1, format_specififer2", var1, func1); > >> > >> does: > >> display __current__ value of var1 FIRST using format_specifier1, > >> __THEN__ > >> display __output__ of funct1 using format_specifier2, > >> > >> If DJGPP is not doing even this trivial behavior correctly, > >> Borland programs would never port correctly, > >> neither would anything else for that matter. > >> > >> Left to right, in the order AND STATE ENCOUNTERED! > >> > >> ....however... __AFTER__ the call to printf(), __THEN__ > >> 'str' will contain the result of the function call; > >> but __NEVER__ from __WITHIN__ the printf as > >> you implied. Your post is VERY MISLEADING. > >> > >> >> Now, think about that. > >> > > >> >Thank you. I knew there was a reason I made my equivalent > >> >(revstring) a void function. I just didn't know what it was :-) -- http://home.att.net/~lcargill