www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/09/29/12:34:09

Message-ID: <3BB5F713.74AFBD@worldnet.att.net>
From: Les Cargill <lcargill AT worldnet DOT att DOT net>
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: <lcq8rtk1nqua2hc6rqfhmqisbd587n8t2n AT 4ax DOT com> <Xns912A8823C1399ASINANUNUR AT 132 DOT 236 DOT 56 DOT 8> <3BB50884 DOT 347A4384 AT yahoo DOT com> <hmjart4m6h7tt0vddvvg47438dijr428ob AT 4ax DOT com> <3BB55487 DOT CC4407ED AT worldnet DOT att DOT net> <vhpart0gjqnr7u2tf0ih8hdf18mlkj11br AT 4ax DOT com>
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
> <lcargill AT worldnet DOT att DOT net> 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 <cbfalconer AT yahoo DOT com>
> >> 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 <string.h>
> >> >> #include <stdlib.h>
> >> >> #include <stdio.h>
> >> >>
> >> >> 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

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019