home *** CD-ROM | disk | FTP | other *** search
/ Mega CD-ROM 1 / megacd_rom_1.zip / megacd_rom_1 / GNUISH / SWALIB0.ZIP / SW_PATH.C < prev    next >
C/C++ Source or Header  |  1990-09-10  |  3KB  |  131 lines

  1. /* sw_pathe.c - path search for swaplib
  2.    Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3.  
  4.    This file is part of SWAPLIB (the library), a library for efficient
  5.    execution of child processes under MS-DOS.
  6.  
  7.    The library is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 1, or (at your option)
  10.    any later version.
  11.  
  12.    The library is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with the library; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.    $Header: e:/gnu/swaplib/RCS/sw_path.c'v 0.9 90/09/09 21:44:05 tho Stable $
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include <io.h>
  29. #include <malloc.h>
  30.  
  31. #include "swaplib.h"
  32.  
  33. extern void *xmalloc (size_t size);
  34. extern void *xrealloc (void *ptr, size_t size);
  35.  
  36. #define PATH_SEP    ';'
  37. #define FSLASH        '/'
  38. #define BSLASH        '\\'
  39.  
  40. /* The suffixes recognized by executable_p (). */
  41.  
  42. static char *suffixes[] =
  43. {
  44.   ".sh",            /* executed by $SHELL */
  45.   ".bat",            /* executed by $COMSPEC */
  46.   ".exe",
  47.   ".com",
  48.   NULL,
  49. };
  50.  
  51.  
  52. /* Look for NAME in the directories from $ENV ($PATH, if ENV is NULL),
  53.    satisfying SELECT.  */
  54.  
  55. char *
  56. swap_expand_path (char *name, char *env, char *(*select) (char *))
  57. {
  58.   size_t name_len = strlen (name) + 6;    /*  SELECT may append 4 chars! */
  59.   char *exp = (char *) xmalloc (name_len);
  60.  
  61.   strcpy (exp, name);
  62.  
  63.   if ((*select) (exp))        /* first look in current directory. */
  64.     return exp;
  65.  
  66.   /* If not an absolute path, scan $PATH  */
  67.  
  68.   if (exp[1] != ':' && *exp != BSLASH && *exp != FSLASH)
  69.     {
  70.       char *ptr = getenv ((env == NULL) ? "PATH" : env);
  71.       if (ptr != NULL)
  72.     {
  73.       char *path = (char *) alloca (strlen (ptr) + 1);
  74.       strcpy (path, ptr);    /* get a copy strtok() can butcher. */
  75.  
  76.       ptr = strtok (path, ";");
  77.  
  78.       while (ptr != NULL)
  79.         {
  80.           exp = (char *) xrealloc (exp, strlen (ptr) + name_len);
  81.           if ((*select) (strcat (strcat (strcpy (exp, ptr), "/"), name)))
  82.         return exp;
  83.           ptr = strtok (NULL, ";");
  84.         }
  85.     }
  86.     }
  87.  
  88.   free (exp);
  89.   return NULL;            /* We've failed!  */
  90. }
  91.  
  92.  
  93. /* Return the expanded path with extension iff PATH is an executable MS-DOS
  94.    program, NULL otherwise. 
  95.    Caution:  PATH *must* be able to hold 4 more characters.  */
  96.  
  97. char *
  98. swap_executable_p (char *path)
  99. {
  100.   char *base = swap_basename (path);
  101.   const char **suf = suffixes;
  102.  
  103.   if (strchr (base, '.'))    /* explicit suffix? */
  104.     {
  105.       if (!access (path, 0))
  106.     return path;
  107.     }
  108.   else
  109.     {
  110.       while (*base)        /* point to the end */
  111.     *base++;
  112.  
  113.       while (*suf)        /* try all suffixes */
  114.     {
  115.       strcpy (base, *suf++);
  116.       if (!access (path, 0))
  117.         return path;
  118.     }
  119.     }
  120.  
  121.   return NULL;            /* failed */
  122. }
  123.  
  124. /* 
  125.  * Local Variables:
  126.  * mode:C
  127.  * ChangeLog:ChangeLog
  128.  * compile-command:make
  129.  * End:
  130.  */
  131.