Mercurial > octave-nkf
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: +*/