diff kpathsea/path-elt.c @ 2999:faa5d0421460

[project @ 1997-05-23 03:02:09 by jwe]
author jwe
date Fri, 23 May 1997 03:02:36 +0000
parents
children 1f0b06020e36
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kpathsea/path-elt.c	Fri May 23 03:02:36 1997 +0000
@@ -0,0 +1,146 @@
+/* path-elt.c: Return the stuff between colons.
+
+Copyright (C) 1993, 96 Karl Berry.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include <kpathsea/config.h>
+
+#include <kpathsea/c-pathch.h>
+#include <kpathsea/pathsearch.h>
+
+
+/* The static (but dynamically allocated) area we return the answer in,
+   and how much we've currently allocated for it.  */
+static string elt = NULL;
+static unsigned elt_alloc = 0;
+
+/* The path we're currently working on.  */
+static const_string path = NULL;
+
+
+/* Upon entry, the static `path' is at the first (and perhaps last)
+   character of the return value, or else NULL if we're at the end (or
+   haven't been called).  I make no provision for caching the results;
+   thus, we parse the same path over and over, on every lookup.  If that
+   turns out to be a significant lose, it can be fixed, but I'm guessing
+   disk accesses overwhelm everything else.  If ENV_P is true, use
+   IS_ENV_SEP; else use IS_DIR_SEP.  */
+
+static string
+element P2C(const_string, passed_path,  boolean, env_p)
+{
+  const_string p;
+  string ret;
+  
+  if (passed_path)
+    path = passed_path;
+  
+  /* Check if called with NULL, and no previous path (perhaps we reached
+     the end).  */
+  else if (!path)
+    return NULL;
+  
+  /* OK, we have a non-null `path' if we get here.  */
+  assert (path);
+  p = path;
+  
+  /* Find the next colon (or the end of the path).  */
+  while (*p != 0 && (env_p ? !IS_ENV_SEP (*p) : !IS_DIR_SEP (*p)))
+    p++;
+  
+  /* If there were no separators, return the whole thing this time, and
+     return NULL next time.  */
+  if (*p == 0)
+    {
+      ret = (string) path;
+      path = NULL;
+    }
+  
+  /* Otherwise, return the substring starting at `path'.  */
+  else
+    {
+      unsigned len = p - path;
+      
+      /* Make sure we have enough space (including the null byte).  */
+      if (len + 1 > elt_alloc)
+        {
+          elt_alloc = len + 1;
+          elt = xrealloc (elt, elt_alloc);
+        }
+
+      strncpy (elt, path, len);
+      elt[len] = 0;
+      ret = elt;
+      
+      path += len + 1;
+    }
+
+  return ret;
+}
+
+string
+kpse_path_element P1C(const_string, p)
+{
+  return element (p, true);
+}
+
+string
+kpse_filename_component P1C(const_string, p)
+{
+  return element (p, false);
+}
+
+#ifdef TEST
+
+void
+print_path_elements (const_string path)
+{
+  string elt;
+  printf ("Elements of `%s':", path ? path : "(null)");
+  
+  for (elt = kpse_path_element (path); elt != NULL;
+       elt = kpse_path_element (NULL))
+    {
+      printf (" %s", *elt ? elt : "`'");
+    }
+  
+  puts (".");
+}
+
+int
+main ()
+{
+  /* All lists end with NULL.  */
+  print_path_elements (NULL);	/* */
+  print_path_elements ("");	/* "" */
+  print_path_elements ("a");	/* a */
+  print_path_elements (":");	/* "", "" */
+  print_path_elements ("::");	/* "", "", "" */
+  print_path_elements ("a:");	/* a, "" */ 
+  print_path_elements (":b");	/* "", b */ 
+  print_path_elements ("a:b");	/* a, b */ 
+  
+  return 0;
+}
+
+#endif /* TEST */
+
+
+/*
+Local variables:
+standalone-compile-command: "gcc -g -I. -I.. -DTEST path-elt.c kpathsea.a"
+End:
+*/