home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / testzp13.zip / which2.c < prev    next >
C/C++ Source or Header  |  1997-02-28  |  2KB  |  112 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <io.h>
  5. #include <errno.h>
  6. #include <sys/param.h>
  7. #define INCL_DOSMODULEMGR
  8. #define INCL_DOSERRORS
  9. #include <os2.h>
  10. #include "which2.h"
  11.  
  12. static const char * const ext_list[] =
  13. {
  14.   ".com", ".exe", ".cmd", NULL
  15. };
  16.  
  17. static int try_dir (const char *dir, const char *name)
  18. {
  19.   char path[MAXPATHLEN];
  20.   const char *p, *q;
  21.   size_t len;
  22.   int ok, i;
  23.  
  24.   ok = FALSE;
  25.   if (strlen (dir) >= sizeof (path))
  26.     return ok;
  27.   strcpy (path, dir);
  28.   len = strlen (path);
  29.   if (len > 0 && !IS_DELIM (path[len-1]))
  30.     {
  31.       if (len + 1 >= sizeof (path))
  32.         return ok;
  33.       path[len++] = (strchr (path, '/') != NULL ? '/' : '\\');
  34.       path[len] = 0;
  35.     }
  36.   if (strlen (path) + strlen (name) >= sizeof (path))
  37.     return ok;
  38.   strcat (path, name);
  39.   q = path;
  40.   for (p = path; *p != 0; ++p)
  41.     if (IS_DELIM (*p))
  42.       q = p + 1;
  43.   if (strchr (q, '.') != NULL)
  44.     {
  45.       if (access (path, 4) == 0)
  46.         {
  47.           printf ("%s\n", path);
  48.           ok = TRUE;
  49.         }
  50.     }
  51.   len = strlen (path);
  52.   if (!((len > 0 && path[len-1] == '.') || len + 4 >= sizeof (path)))
  53.     {
  54.       for (i = 0; ext_list[i] != NULL; ++i)
  55.         {
  56.           strcpy (path+len, ext_list[i]);
  57.           if (access (path, 4) == 0)
  58.             {
  59.               printf ("%s\n", path);
  60.               ok = TRUE;
  61.             }
  62.         }
  63.     }
  64.   return ok;
  65. }
  66.  
  67. static int find_prog (const char *name, const char *path)
  68. {
  69.   int ok;
  70.   size_t len;
  71.   char dir[MAXPATHLEN];
  72.   const char *list, *end;
  73.  
  74.   ok = try_dir ("", name);
  75.   if (path != NULL && strpbrk (name, "/\\:") == NULL)
  76.     {
  77.       list = path;
  78.       for (;;)
  79.         {
  80.           while (*list == ' ' || *list == '\t') ++list;
  81.           if (*list == 0) break;
  82.           end = list;
  83.           while (*end != 0 && *end != ';') ++end;
  84.           len = end - list;
  85.           while (len != 0 && (list[len-1] == ' ' || list[len-1] == '\t'))
  86.             --len;
  87.           if (len != 0 && len < sizeof (dir))
  88.             {
  89.               memcpy (dir, list, len);
  90.               dir[len] = 0;
  91.               ok |= try_dir (dir, name);
  92.             }
  93.           if (*end == 0) break;
  94.           list = end + 1;
  95.         }
  96.     }
  97.   if (!ok)
  98.     fprintf (stderr, "%s not found\n", name);
  99.   return ok;
  100. }
  101.  
  102. int which (char *filename)
  103. {
  104.   int i;
  105.   const char *path;
  106.  
  107.   path = getenv ("PATH");
  108.   if (!find_prog (filename, path))
  109.      return 2;
  110.   return 0;
  111. }
  112.