changeset 1786:b9e8c73e154e

[project @ 1996-01-24 20:36:22 by jwe] Initial revision
author jwe
date Wed, 24 Jan 1996 20:36:22 +0000
parents 6109184b054f
children ebc1a0b2e854
files liboctave/pathsearch.cc liboctave/pathsearch.h
diffstat 2 files changed, 274 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/liboctave/pathsearch.cc
@@ -0,0 +1,180 @@
+// pathsearch.cc                                           -*- C++ -*-
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#include <cstdlib>
+
+#include <string>
+
+#include "pathsearch.h"
+#include "str-vec.h"
+
+extern "C"
+{
+// Have to redefine these because they conflict with new C++ keywords
+// or otherwise cause trouble...
+#define boolean kpse_boolean
+#define true kpse_true
+#define false kpse_false
+#define string kpse_string
+
+#include <kpathsea/pathsearch.h>
+
+extern unsigned int kpathsea_debug;
+
+#undef true
+#undef false
+#undef boolean
+#undef string
+}
+
+bool dir_path::kpathsea_debug_initialized = false;
+
+string_vector
+dir_path::elements (void)
+{
+  return initialized ? pv : string_vector ();
+}
+
+string_vector
+dir_path::all_directories (void)
+{
+  int count = 0;
+  string_vector retval;
+
+  if (initialized)
+    {
+      int len = pv.length ();
+
+      int nmax = len > 32 ? len : 32;
+
+      retval.resize (len);
+
+      for (int i = 0; i < len; i++)
+	{
+	  str_llist_type *elt_dirs = kpse_element_dirs (pv[i].c_str ());
+
+	  str_llist_elt_type *dir;
+	  for (dir = *elt_dirs; dir; dir = STR_LLIST_NEXT (*dir))
+	    {
+	      char *elt_dir = STR_LLIST (*dir);
+
+	      if (elt_dir)
+		{
+		  if (count == nmax)
+		    nmax *= 2;
+
+		  retval.resize (nmax);
+
+		  retval[count++] = elt_dir;
+		}
+	    }
+	}
+
+      retval.resize (count);
+    }
+
+  return retval;
+}
+
+string
+dir_path::find_first (const string& nm)
+{
+  string retval;
+
+  if (initialized)
+    {
+      char *tmp = kpse_path_search (p.c_str (), nm.c_str (),
+				    kpse_true);
+      if (tmp)
+	{
+	  retval = tmp;
+	  free (tmp);
+	}
+    }
+
+  return retval;
+}
+
+string_vector
+dir_path::find_all (const string& nm)
+{
+  string_vector retval;
+
+  kpse_string *tmp = kpse_all_path_search (p.c_str (), nm.c_str ());
+
+  if (tmp)
+    {
+      int count = 0;
+      kpse_string *ptr = tmp;
+      while (*ptr++)
+	count++;
+
+      retval.resize (count);
+
+      for (int i = 0; i < count; i++)
+	retval[i] = *tmp[i];
+    }
+
+  return retval;
+}
+
+void
+dir_path::init (void)
+{
+  initialized = false;
+
+  if (! kpathsea_debug_initialized)
+    {
+      char *s = getenv ("KPATHSEA_DEBUG");
+
+      if (s)
+	kpathsea_debug |= atoi (s);
+    }
+
+  int count = 0;
+  char *path_elt = kpse_path_element (p.c_str ());
+  while (path_elt)
+    {
+      path_elt = kpse_path_element (0);
+      count++;
+    }
+
+  pv.resize (count);
+
+  path_elt = kpse_path_element (p.c_str ());
+
+  for (int i = 0; i < count; i++)
+    {
+      pv[i] = path_elt;
+      path_elt = kpse_path_element (0);
+    }
+
+  initialized = true;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; page-delimiter: "^/\\*" ***
+;;; End: ***
+*/
new file mode 100644
--- /dev/null
+++ b/liboctave/pathsearch.h
@@ -0,0 +1,94 @@
+// pathsearch.h                                           -*- C++ -*-
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_pathsearch_h)
+#define octave_pathsearch_h 1
+
+#include <string>
+
+#include "str-vec.h"
+
+class
+dir_path
+{
+public:
+
+  dir_path (const string& s = string ()) : p (s), initialized (false)
+    {
+      if (! p.empty ())
+	init ();
+    }
+
+  dir_path (const dir_path& dp)
+    : p (dp.p), initialized (dp.initialized), pv (dp.pv) { }
+
+  dir_path& operator = (const dir_path& dp)
+    {
+      p = dp.p;
+      initialized = dp.initialized;
+      pv = dp.pv;
+      return *this;
+    }
+
+  ~dir_path (void) { }
+
+  void set (const string& s)
+    {
+      initialized = false;
+      p = s;
+      init ();
+    }
+
+  string_vector elements (void);
+  string_vector all_directories (void);
+
+  string find_first (const string&);
+  string find (const string& nm) { return find_first (nm); }
+
+  string_vector find_all (const string&);
+
+private:
+
+  // The colon separated list.
+  string p;
+
+  // TRUE means we've unpacked p.
+  bool initialized;
+
+  // The elements of the list.
+  string_vector pv;
+
+  // TRUE means we've set the global value of kpathsea_debug.
+  static bool kpathsea_debug_initialized;
+
+  void init (void);
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; page-delimiter: "^/\\*" ***
+;;; End: ***
+*/