home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / m4-1.1-src.lha / src / amiga / m4-1.1 / path.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-02  |  3.4 KB  |  153 lines

  1. /* GNU m4 -- A simple macro processor
  2.    Copyright (C) 1989, 90, 91, 92, 93 Free Software Foundation, Inc.
  3.   
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.   
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.   
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. /* Handling of path search of included files via the builtins "include"
  19.    and "sinclude".  */
  20.  
  21. #include "m4.h"
  22.  
  23. struct includes
  24. {
  25.   struct includes *next;    /* next directory to search */
  26.   char *dir;            /* directory */
  27.   int len;
  28. };
  29.  
  30. typedef struct includes includes;
  31.  
  32. static includes *dir_list;        /* the list of path directories */
  33. static includes *dir_list_end;        /* the end of same */
  34. static int dir_max_length;        /* length of longest directory name */
  35.  
  36.  
  37. void
  38. include_init (void)
  39. {
  40.   dir_list = NULL;
  41.   dir_list_end = NULL;
  42.   dir_max_length = 0;
  43. }
  44.  
  45. void
  46. include_env_init (void)
  47. {
  48.   char *path;
  49.   char *path_end;
  50.  
  51.   if (no_gnu_extensions)
  52.     return;
  53.  
  54.   path = getenv ("M4PATH");
  55.   if (path == NULL)
  56.     return;
  57.  
  58.   do
  59.     {
  60.       path_end = index (path, ':');
  61.       if (path_end != NULL)
  62.     *path_end = '\0';
  63.       add_include_directory (path);
  64.       path = path_end + 1;
  65.     }
  66.   while (path_end != NULL);
  67. }
  68.  
  69. void
  70. add_include_directory (char *dir)
  71. {
  72.   includes *incl;
  73.  
  74.   if (no_gnu_extensions)
  75.     return;
  76.  
  77.   if (*dir == '\0')
  78.     dir = ".";
  79.  
  80.   incl = (includes *) xmalloc (sizeof (struct includes));
  81.   incl->next = NULL;
  82.   incl->len = strlen (dir);
  83.   incl->dir = (char *) xmalloc (incl->len + 1);
  84.   strcpy (incl->dir, dir);
  85.  
  86.   if (incl->len > dir_max_length) /* remember len of longest directory */
  87.     dir_max_length = incl->len;
  88.  
  89.   if (dir_list_end == NULL)
  90.     dir_list = incl;
  91.   else
  92.     dir_list_end->next = incl;
  93.   dir_list_end = incl;
  94.  
  95. #ifdef DEBUG_INCL
  96.   fprintf (stderr, "add_include_directory (%s);\n", dir);
  97. #endif
  98. }
  99.  
  100. FILE *
  101. path_search (const char *dir)
  102. {
  103.   FILE *fp;
  104.   includes *incl;
  105.   char *name;            /* buffer for constructed name */
  106.  
  107.   /* Look in current working directory first.  */
  108.   fp = fopen (dir, "r");
  109.   if (fp != NULL)
  110.     return fp;
  111.  
  112.   /* If file not found, and filename absolute, fail.  */
  113.   if (*dir == '/' || no_gnu_extensions)
  114.     return NULL;
  115.  
  116.   name = (char *) xmalloc (dir_max_length + 1 + strlen (dir) + 1);
  117.  
  118.   for (incl = dir_list; incl != NULL; incl = incl->next)
  119.     {
  120.       strncpy (name, incl->dir, incl->len);
  121.       name[incl->len] = '/';
  122.       strcpy (name + incl->len + 1, dir);
  123.  
  124. #ifdef DEBUG_INCL
  125.       fprintf (stderr, "path_search (%s) -- trying %s\n", dir, name);
  126. #endif
  127.  
  128.       fp = fopen (name, "r");
  129.       if (fp != NULL)
  130.     {
  131.       if (debug_level & DEBUG_TRACE_PATH)
  132.         debug_message ("path search for `%s' found `%s'", dir, name);
  133.       break;
  134.     }
  135.     }
  136.   xfree (name);
  137.   return fp;
  138. }
  139.  
  140. #ifdef DEBUG_INCL
  141.  
  142. static int
  143. include_dump (void)
  144. {
  145.   includes *incl;
  146.  
  147.   fprintf (stderr, "include_dump:\n");
  148.   for (incl = dir_list; incl != NULL; incl = incl->next)
  149.     fprintf (stderr, "\t%s\n", incl->dir);
  150. }
  151.  
  152. #endif /* DEBUG_INCL */
  153.