home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / m4-1.4-src.tgz / tar.out / fsf / m4 / src / path.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  152 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.   const 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 = strchr (path, ':');
  61.       if (path_end)
  62.     *path_end = '\0';
  63.       add_include_directory (path);
  64.       path = path_end + 1;
  65.     }
  66.   while (path_end);
  67. }
  68.  
  69. void
  70. add_include_directory (const 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 = xstrdup (dir);
  84.  
  85.   if (incl->len > dir_max_length) /* remember len of longest directory */
  86.     dir_max_length = incl->len;
  87.  
  88.   if (dir_list_end == NULL)
  89.     dir_list = incl;
  90.   else
  91.     dir_list_end->next = incl;
  92.   dir_list_end = incl;
  93.  
  94. #ifdef DEBUG_INCL
  95.   fprintf (stderr, "add_include_directory (%s);\n", dir);
  96. #endif
  97. }
  98.  
  99. FILE *
  100. path_search (const char *dir)
  101. {
  102.   FILE *fp;
  103.   includes *incl;
  104.   char *name;            /* buffer for constructed name */
  105.  
  106.   /* Look in current working directory first.  */
  107.   fp = fopen (dir, "r");
  108.   if (fp != NULL)
  109.     return fp;
  110.  
  111.   /* If file not found, and filename absolute, fail.  */
  112.   if (*dir == '/' || no_gnu_extensions)
  113.     return NULL;
  114.  
  115.   name = (char *) xmalloc (dir_max_length + 1 + strlen (dir) + 1);
  116.  
  117.   for (incl = dir_list; incl != NULL; incl = incl->next)
  118.     {
  119.       strncpy (name, incl->dir, incl->len);
  120.       name[incl->len] = '/';
  121.       strcpy (name + incl->len + 1, dir);
  122.  
  123. #ifdef DEBUG_INCL
  124.       fprintf (stderr, "path_search (%s) -- trying %s\n", dir, name);
  125. #endif
  126.  
  127.       fp = fopen (name, "r");
  128.       if (fp != NULL)
  129.     {
  130.       if (debug_level & DEBUG_TRACE_PATH)
  131.         DEBUG_MESSAGE (("path search for `%s' found `%s'", dir, name));
  132.       break;
  133.     }
  134.     }
  135.   xfree (name);
  136.   return fp;
  137. }
  138.  
  139. #ifdef DEBUG_INCL
  140.  
  141. static int
  142. include_dump (void)
  143. {
  144.   includes *incl;
  145.  
  146.   fprintf (stderr, "include_dump:\n");
  147.   for (incl = dir_list; incl != NULL; incl = incl->next)
  148.     fprintf (stderr, "\t%s\n", incl->dir);
  149. }
  150.  
  151. #endif /* DEBUG_INCL */
  152.