[Coco] basename() source

Bob Devries devries.bob at gmail.com
Sat Dec 31 17:55:13 EST 2005


Robert, the problem is, you must make allowances in basename() for a 
filename with NO delimeters. That's why I wrote it the way I did.

--
Regards, Bob Devries, Dalby, Queensland, Australia

Isaiah 50:4 The sovereign Lord has given me
the capacity to be his spokesman,
so that I know how to help the weary.

website: http://www.home.gil.com.au/~bdevasl
my blog: http://bdevries.invigorated.org/

----- Original Message ----- 
From: "Robert Gault" <robert.gault at worldnet.att.net>
To: "CoCoList for Color Computer Enthusiasts" <coco at maltedmedia.com>
Sent: Sunday, January 01, 2006 5:20 AM
Subject: Re: [Coco] basename() source


> After about 15 years of not using C and trying to relearn it in about one 
> week, I am remembering why I detest the language. :)
>
> Bob, your program works and seems simple but after digging into this 
> further I've come up with some interesting finds and thoughts.
>
> Clearly there is a problem with the Microware compiler but I have found 
> what triggers the lead mmnn,pcr syntax.
>
>  strrchr(file,"/" || "\\")
> gives the lead opcode but
>  strrchr(file,'/' || '\\')
> does not. Both of them give the ldd #1, which does not make any sense but 
> that's another story. The trigger was the double vs single quote.
>
> A short test program (below)displays some information on how strrchr works 
> in the OS-9 software. It also suggests how your program (below) could be 
> trimmed of excess code. Here is the program and the relevant part of the 
> resulting assembly code.
>
> /* test for strrchr() */
>
> #include <string.h>
> #include <stdio.h>
>
> main()
> {
>   char *file = "/dd/src/test";
>   char *name;
>
>   name = strrchr(file,'/');
>   name = strrchr(file,'\\');
>   printf ("%s\n",name+1);
>   printf ("%s",file);
> }
>
> The above as it stands does not give the desired result but does show that 
> strrchr does not change the string file. Here is the relevant assembly 
> code.
>
>  ldd #'\             this was #92
>  pshs d
>  ldd 4,s
>  lbsr strrchr
>  leas 4,s
>  std 0,s             save the result of strrchr
>  ldd #'/              this was #47
>  pshs d
>  ldd 4,s
>  lbsr strrchr
>  leas 4,s
>  std 0,s          if this line and the next are replaced with addd 0,s
>  ldd 0,s          then the second result won't trash the first
>  addd #1
>  pshs d
>  leax _3,pcr
>  pshs x
>  lbsr printf
>
> Note above where the result of one strrchr is trashed by the second. Since 
> strrchr returns either $0000 or the address of the right-most character, 
> all we need is to add the result of the second strrchr to the first to 
> duplicate your code in a smaller package.
>   I can't remember or find any C syntax that will result in the above 
> code. Hand trimming of the assembly code is not the most desirable thing 
> in the world even if it produces better code than the optimizer can.
>
> Anyone see a way to get this result from the C code alone?
>
> Bob Devries wrote:
>
>> Here's my source for basename() :
>>
>> char *basename(pathname)
>> char *pathname;
>> {
>>       char *name;
>>       char *strrchr();
>>
>>       if ((name = strrchr(pathname, '/')) == NULL)
>>               {
>>               if ((name = strrchr(pathname, '\\')) == NULL)
>>                       {
>>                       return(pathname);
>>                       }
>>               }
>>       return(name + 1);
>> }
>>
>> It works on both windows(DOS Box) and OS9 (MESS).
>> -- 
>> Regards, Bob Devries, Dalby, Queensland, Australia
>>
>> Isaiah 50:4 The sovereign Lord has given me
>> the capacity to be his spokesman,
>> so that I know how to help the weary.
>>
>> website: http://www.home.gil.com.au/~bdevasl
>> my blog: http://bdevries.invigorated.org/
>>
>>
>
> -- 
> Coco mailing list
> Coco at maltedmedia.com
> http://five.pairlist.net/mailman/listinfo/coco 




More information about the Coco mailing list