octave-maintainers
[Top][All Lists]
Advanced

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

Re: merging functions from octave-forge


From: David Bateman
Subject: Re: merging functions from octave-forge
Date: Wed, 08 Jun 2005 09:47:03 +0200
User-agent: Mozilla Thunderbird 0.8 (X11/20040923)

Bill Denney wrote:

On Tue, 7 Jun 2005, Bill Denney wrote:

On Tue, 7 Jun 2005, Keith Goodman wrote:

When I do a savepath and exit and start Octave again, they appear on
top and bottom of my path (and appear in my ~/.octaverc as
addpath("blah")).

What's the best way to deal with that?


OK, here is the fix promised. It's a diff from current octave-forge cvs sources.

Changelog:
  Bill Denney 6/7/2005

  addpath.m - it now makes sure that a directory is only in the LOADPATH
  once.

Bill

------------------------------------------------------------------------

Index: addpath.m
===================================================================
RCS file: /cvsroot/octave/octave-forge/main/path/addpath.m,v
retrieving revision 1.6
diff -u -r1.6 addpath.m
--- addpath.m   25 May 2005 03:43:41 -0000      1.6
+++ addpath.m   8 Jun 2005 03:11:12 -0000
@@ -1,4 +1,4 @@
-## Copyright (C) 2000  Etienne Grossmann
+## Copyright (C) 2000 Etienne Grossmann, 2005 Bill Denney
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -16,8 +16,9 @@

## -*- texinfo -*-
## @deftypefn {Function File} {} addpath(dir1, ...)
-##
## Prepends @code{dir1}, @code{...} to the current @code{LOADPATH}.
+## If the directory is already in the path, it will place it where you
+## specify in the path (defaulting to prepending it).
## ## @example
## addpath(dir1,'-end',dir2,'-begin',dir3,'-END',dir4,'-BEGIN',dir5)
@@ -27,43 +28,87 @@
## An error will be returned if the string is not a directory, the
## directory doesn't exist or you don't have read access to it.
##
-## BUG : Can't add directories called @code{-end} or @code{-begin} (case
-## insensitively)
-##
+## BUG: This function can't add directories called @code{-end} or
+## @code{-begin} (case insensitively).
## @end deftypefn

## Author:        Etienne Grossmann <address@hidden>
## Modified-By:   Bill Denney <address@hidden>
-## Last modified: March 2005
+## Last modified: June 2005

function addpath(varargin)

  app = 0 ;                     # Append? Default is 'no'.
  for arg=1:length(varargin)
-    p = nth (varargin, arg) ;
-    if strcmpi(p,"-end"),
-      app = 1 ;
-    elseif strcmpi(p,"-begin"),
-      app = 0 ;
+    p = nth (varargin, arg);
+    if strcmpi(p,"-end")
+      app = 1;
+    elseif strcmpi(p,"-begin")
+      app = 0;
    else
-      pp = p ;
-      ## Not needed
-      ## while rindex(pp,"/") == size(pp,2), pp = pp(1:size(pp,2)-1) ; end
-      [s,err,m] = stat(pp) ;           # Check for existence
-      if err,
+      pp = p;
+      [s,err,m] = stat(pp);    # Check for existence
+      if (err ~= 0)
        error("addpath %s : %s\n",pp,m);
-      elseif index(s.modestr,"d")!=1,
+      elseif (index(s.modestr,"d") != 1)
        error("addpath %s : not a directory (mode=%s)\n",pp, s.modestr);

      elseif !((s.modestr(8) == 'r') || ...
               ((getgid == s.gid) && (s.modestr(5) == 'r')) || ...
               ((getuid == s.uid) && (s.modestr(2) == 'r')))
        error("addpath %s : not readable (mode=%s)\n", pp,s.modestr);
-      elseif ! app,
+      elseif (~ app)
+       LOADPATH = uniquepath(LOADPATH, p);
        LOADPATH = [p,':',LOADPATH] ;
      else
+       LOADPATH = uniquepath(LOADPATH, p);
        LOADPATH = [LOADPATH,':',p] ;
      end
    end
  end
- +
+
+  function [pathstr] = uniquepath(pathstr, varargin)
+
+  ## go through the pathstr and remove any duplicates
+
+  paths = split(pathstr, ":");
+  for i = 1:size(paths,1)
+    pathscell{i} = deblank(paths(i,:));
+  end
+
+  if (~ isempty(varargin))
+    i = 0;
+  else
+    i = 1;
+  end
+
+  while (i < length(pathscell) - 1)
+    j = i + 1;
+    while (j <= length(pathscell))
+      if (i == 0)
+       thisstr = varargin{1};
+      else
+       thisstr = pathscell{i};
+      end
+
+      if (strcmpi(thisstr, pathscell{j}))
+       if (j == 1)
+         pathscell = pathscell(2:length(pathscell));
+       elseif (j == length(pathscell))
+         pathscell = pathscell(1:j-1);
+       else
+         pathscell = [pathscell(1:j-1) pathscell(j+1:length(pathscell))];
+       end
+      else
+       j = j + 1;
+      end
+    end
+    i = i + 1;
+  end
+
+  tmploadpath = pathscell{1};
+  for i = 2:length(pathscell)
+    tmploadpath = [tmploadpath ":" pathscell{i}];
+  end
+  pathstr = tmploadpath;
\ No newline at end of file
Could you add some tests at the end of the code to prove the functionality. This is now the doen thing in octave-forge and there are plenty of examples in a comment block at the end of the octave-forge functions.. This will also act as a regression test for your change in the future...

Cheers
David

--
David Bateman                                address@hidden
Motorola Labs - Paris +33 1 69 35 48 04 (Ph) Parc Les Algorithmes, Commune de St Aubin +33 1 69 35 77 01 (Fax) 91193 Gif-Sur-Yvette FRANCE

The information contained in this communication has been classified as: [x] General Business Information [ ] Motorola Internal Use Only [ ] Motorola Confidential Proprietary



reply via email to

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