octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: filesep extension


From: Jaroslav Hajek
Subject: Re: filesep extension
Date: Tue, 11 Nov 2008 19:28:44 +0100

On Tue, Nov 11, 2008 at 7:04 PM, Jaroslav Hajek <address@hidden> wrote:
> On Tue, Nov 11, 2008 at 6:42 PM, Jaroslav Hajek <address@hidden> wrote:
>> On Tue, Nov 11, 2008 at 5:31 PM, John W. Eaton <address@hidden> wrote:
>>> On 11-Nov-2008, Michael Goffioul wrote:
>>>
>>> | I noticed a problem in fileparts tests: some tests uses forward slash,
>>> | while fileparts uses filesep, which is the backward slash under Windows.
>>> | This makes most tests to fail.
>>> |
>>> | To solve that, I thought about extending filesep behavior and make it
>>> | return all file separators when 'all' is given as argument. See the 
>>> attached
>>> | changeset (OK to apply?). However, now I'd like to modify fileparts.m,
>>> | but I'm not sure about the most efficient way to implement find_last_of
>>> | functionality in ocave. Any idea?
>>>
>>> See also this thread:
>>>
>>>  
>>> https://www-old.cae.wisc.edu/pipermail/octave-maintainers/2008-October/009169.html
>>>
>>> I think your patch is also OK.
>>>
>>> I'm not sure what to suggest for the best scripting language
>>> equivalent for find_last_of.  A regular expression?  That doesn't seem
>>> like a great solution and would be a bit messy in the current case
>>> because \ is special in a regular expression.  For example, you need
>>> something like
>>>
>>>  regexp ('/foo/bar\baz', '[\\/][^\\/]*$')
>>>
>>> Do we need a new function, or can someone think of a good way to do
>>> this with functions we currently have?
>>>
>>
>> What about implementing this using find (), with similar input &
>> output arguments?
>>
>> Say, like this:
>>
>> function varargout = strchr (str, chars, varargin)
>>  if (nargin < 2 || ! ischar (str) || ! ischar (chars))
>>    print_usage ();
>>  endif
>>  f = false (1, 256);
>>  f(chars) = true;
>>  varargout = cell (1, nargout);
>>  [varargout{:}] = find (reshape (f(str), size (str)), varargin{:});
>> endfunction
>>
>> Two notes:
>> 1. I think the function name should start with "str"
>> 2. Note that this currently doesn't work with nargout = 0 due to a
>> strange indexing bug.
>>
>
> Okay so 2 doesn't matter since we always need to call find with at
> least one output argument. Also, indexing by char should be shifted by
> 1, because char is 0..255. The attached version should work:
>
> function varargout = strchr (str, chars, varargin)
>  if (nargin < 2 || ! ischar (str) || ! ischar (chars))
>    print_usage ();
>  endif
>  f = false (1, 256);
>  f(chars+1) = true;
>  varargout = cell (1, nargout){1} = [];
>  [varargout{:}] = find (reshape (f(str+1), size (str)), varargin{:});
> endfunction
>
>
> --
> RNDr. Jaroslav Hajek
> computing expert
> Aeronautical Research and Test Institute (VZLU)
> Prague, Czech Republic
> url: www.highegg.matfyz.cz
>

It seems I tried an ugly trick that wouldn't work. So here's a
hopefully working version:

 function varargout = strchr (str, chars, varargin)
 if (nargin < 2 || ! ischar (str) || ! ischar (chars))
   print_usage ();
 endif
 f = false (1, 256);
 f(chars+1) = true;
 varargout = cell (1, nargout);
 varagout{1} = [];
 [varargout{:}] = find (reshape (f(str+1), size (str)), varargin{:});
endfunction

-- 
RNDr. Jaroslav Hajek
computing expert
Aeronautical Research and Test Institute (VZLU)
Prague, Czech Republic
url: www.highegg.matfyz.cz


reply via email to

[Prev in Thread] Current Thread [Next in Thread]