diff options
Diffstat (limited to 'mdk-stage1/slang/slpath.c')
| -rw-r--r-- | mdk-stage1/slang/slpath.c | 344 | 
1 files changed, 0 insertions, 344 deletions
| diff --git a/mdk-stage1/slang/slpath.c b/mdk-stage1/slang/slpath.c deleted file mode 100644 index 831bd34df..000000000 --- a/mdk-stage1/slang/slpath.c +++ /dev/null @@ -1,344 +0,0 @@ -/* Pathname and filename functions */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#ifdef HAVE_IO_H -# include <io.h> -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <signal.h> -#include <time.h> - -#include <errno.h> -#include <string.h> - -#include "slang.h" -#include "_slang.h" - -/* In this file, all file names are assumed to be specified in the Unix - * format, or in the native format. - * - * Aboout VMS: - * VMS pathnames are a mess.  In general, they look like - * node::device:[dir.dir]file.ext;version - * and I do not know of a well-defined Unix representation for them.  So, - * I am going to punt and encourage users to stick to the native - * representation. - */ - -#if defined(IBMPC_SYSTEM) -# define PATH_SEP		'\\' -# define DRIVE_SPECIFIER	':' -# define SEARCH_PATH_DELIMITER	';' -# define THIS_DIR_STRING	"." -#else -# if defined(VMS) -#  define PATH_SEP		']' -#  define DRIVE_SPECIFIER	':' -#  define SEARCH_PATH_DELIMITER	' ' -#  define THIS_DIR_STRING	"[]"   /* Is this correct?? */ -# else -#  define PATH_SEP		'/' -#  define UNIX_PATHNAMES_OK -#  define SEARCH_PATH_DELIMITER	':' -#  define THIS_DIR_STRING	"." -# endif -#endif - -#ifdef UNIX_PATHNAMES_OK -# define IS_PATH_SEP(x) ((x) == PATH_SEP) -#else -# define IS_PATH_SEP(x)	(((x) == PATH_SEP) || ((x) == '/')) -#endif - -/* If file is /a/b/c/basename, this function returns a pointer to basename */ -char *SLpath_basename (char *file) -{ -   char *b; - -   if (file == NULL) return NULL; -   b = file + strlen (file); - -   while (b != file) -     { -	b--; -	if (IS_PATH_SEP(*b)) -	  return b + 1; -#ifdef DRIVE_SPECIFIER -	if (*b == DRIVE_SPECIFIER) -	  return b + 1; -#endif -     } - -   return b; -} - -/* Returns a malloced string */ -char *SLpath_pathname_sans_extname (char *file) -{ -   char *b; - -   file = SLmake_string (file); -   if (file == NULL) -     return NULL; - -   b = file + strlen (file); - -   while (b != file) -     { -	b--; -	if (*b == '.') -	  { -	     *b = 0; -	     return file; -	  } -     } - -   return file; -} - -/* If path looks like: A/B/C/D/whatever, it returns A/B/C/D as a malloced  - * string. - */ -char *SLpath_dirname (char *file) -{ -   char *b; - -   if (file == NULL) return NULL; -   b = file + strlen (file); - -   while (b != file) -     { -	b--; -	if (IS_PATH_SEP(*b)) -	  { -	     if (b == file) b++; -	     break; -	  } - -#ifdef DRIVE_SPECIFIER -	if (*b == DRIVE_SPECIFIER) -	  { -	     b++; -	     break; -	  } -#endif -     } -    -   if (b == file) -     return SLmake_string (THIS_DIR_STRING); -    -   return SLmake_nstring (file, (unsigned int) (b - file)); -} - -/* Note: VMS filenames also contain version numbers.  The caller will have - * to deal with that. - *  - * The extension includes the '.'.  If no extension is present, "" is returned. - */ -char *SLpath_extname (char *file) -{ -   char *b; - -   if (NULL == (file = SLpath_basename (file))) -     return NULL; - -   b = file + strlen (file); -   while (b != file) -     { -	b--; -	if (*b == '.') -	  return b; -     } -    -   if (*b == '.') -     return b; - -   /* Do not return a literal "" */ -   return file + strlen (file); -} - -#ifdef IBMPC_SYSTEM -static void convert_slashes (char *f) -{ -   while (*f) -     { -	if (*f == '/') *f = PATH_SEP; -	f++; -     } -} -#endif - -int SLpath_is_absolute_path (char *name) -{ -#ifdef UNIX_PATHNAMES_OK -   return (*name == '/'); -#else -   if (IS_PATH_SEP (*name)) -     return 1; - -# ifdef DRIVE_SPECIFIER -   /* Look for a drive specifier */ -   while (*name) -     { -	if (*name == DRIVE_SPECIFIER) -	  return 1; - -	name++; -     } -# endif - -   return 0; -#endif -} - -/* This returns a MALLOCED string */ -char *SLpath_dircat (char *dir, char *name) -{ -   unsigned int len, dirlen; -   char *file; -#ifndef VMS -   int requires_fixup; -#endif - -   if (name == NULL) -     name = ""; - -   if ((dir == NULL) || (SLpath_is_absolute_path (name))) -     dir = ""; - -   /* Both VMS and MSDOS have default directories associated with each drive. -    * That is, the meaning of something like C:X depends upon more than just -    * the syntax of the string.  Since this concept has more power under VMS -    * it will be honored here.  However, I am going to treat C:X as C:\X -    * under MSDOS. -    * -    * Note!!! -    * VMS has problems of its own regarding path names, so I am simply -    * going to strcat.  Hopefully the VMS RTL is smart enough to deal with -    * the result. -    */ -   dirlen = strlen (dir); -#ifndef VMS -   requires_fixup = (dirlen && (0 == IS_PATH_SEP(dir[dirlen - 1]))); -#endif - -   len = dirlen + strlen (name) + 2; -   if (NULL == (file = SLmalloc (len))) -     return NULL; - -   strcpy (file, dir); - -#ifndef VMS -   if (requires_fixup) -     file[dirlen++] = PATH_SEP; -#endif - -   strcpy (file + dirlen, name); - -#if defined(IBMPC_SYSTEM) -   convert_slashes (file); -#endif - -   return file; -} - -int SLpath_file_exists (char *file) -{ -   struct stat st; -   int m; - -#if defined(__os2__) && !defined(S_IFMT) -/* IBM VA3 doesn't declare S_IFMT */ -# define	S_IFMT	(S_IFDIR | S_IFCHR | S_IFREG) -#endif - -#ifdef _S_IFDIR -# ifndef S_IFDIR -#  define S_IFDIR _S_IFDIR -# endif -#endif - -#ifndef S_ISDIR -# ifdef S_IFDIR -#  define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# else -#  define S_ISDIR(m) 0 -# endif -#endif - -   if (file == NULL) -     return -1; - -   if (stat(file, &st) < 0) return 0; -   m = st.st_mode; - -   if (S_ISDIR(m)) return (2); -   return 1; -} - -char *SLpath_find_file_in_path (char *path, char *name) -{ -   unsigned int max_path_len; -   unsigned int this_path_len; -   char *file, *dir; -   char *p; -   unsigned int nth; - -   if ((path == NULL) || (*path == 0) -       || (name == NULL) || (*name == 0)) -     return NULL; - -   max_path_len = 0; -   this_path_len = 0; -   p = path; -   while (*p != 0) -     { -	if (*p++ == SEARCH_PATH_DELIMITER) -	  { -	     if (this_path_len > max_path_len) max_path_len = this_path_len; -	     this_path_len = 0; -	  } -	else this_path_len++; -     } -   if (this_path_len > max_path_len) max_path_len = this_path_len; -   max_path_len++; - -   if (NULL == (dir = SLmalloc (max_path_len))) -     return NULL; - -   nth = 0; -   while (-1 != SLextract_list_element (path, nth, SEARCH_PATH_DELIMITER, -					dir, max_path_len)) -     { -	nth++; -	if (*dir == 0) -	  continue; - -	if (NULL == (file = SLpath_dircat (dir, name))) -	  { -	     SLfree (dir); -	     return NULL; -	  } - -	if (1 == SLpath_file_exists (file)) -	  { -	     SLfree (dir); -	     return file; -	  } - -	SLfree (file); -     } - -   SLfree (dir); -   return NULL; -} - | 
