home *** CD-ROM | disk | FTP | other *** search
/ Dream 48 / Amiga_Dream_48.iso / Atari / c / cpp.zoo / src / include.c < prev    next >
C/C++ Source or Header  |  1993-06-03  |  2KB  |  73 lines

  1.  
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include "global.h"
  6.  
  7. unsigned long include_level = 0;
  8.  
  9. /*
  10.    find_include_file() -- look for the include file |fnam| in the list of
  11.    include paths.  If |relative==1|, also check the current directory.  Note:
  12.    |fnam| must be a pointer to malloc()'ed space, which is freed by the
  13.    function.
  14. */
  15. static char *find_include_file(fnam, relative)
  16.   char *fnam;
  17.   int relative;
  18. {
  19.   char **I = I_list, *buf;
  20.   static size_t buf_len = 20;
  21.   int len;
  22.   register char *s, *t;
  23.  
  24.   if (!relative)
  25.     I++;
  26.   buf = mallok(buf_len);
  27.   for (; *I; I++) {
  28.     len = strlen(*I) + strlen(fnam) + 2;
  29.     if (len > buf_len) {
  30.       buf_len = len;
  31.       buf = reallok(buf, buf_len);
  32.     }
  33.     s = buf;
  34.     t = *I;
  35.     while (*s++ = *t++) ;
  36.     s[-1] = PATH_SEP;
  37.     t = fnam;
  38.     while (*s++ = *t++) ;
  39.     if (access(buf, R_OK) == 0)
  40.       break;
  41.   }
  42.   free(fnam);
  43.   return (I ? reallok(buf, len) : NULL);
  44. }
  45.  
  46. /* do_include() -- handle an #include directive */
  47. void do_include()
  48. {
  49.   char *u;
  50.   TokenP T;
  51.  
  52.   change_mode(INCLUDE_LINE, 0);
  53.   _tokenize_line();
  54.   T = exp_token();
  55.   change_mode(0, INCLUDE_LINE);
  56.   if (T->type != INC_NAM && T->type != STR_CON)
  57.     fatal("argument %s to #include not a valid filespec", T->txt);
  58.   u = copy_filename(T->txt + 1, strlen(T->txt) - 2);
  59.   u = find_include_file(u, (T->type == STR_CON));
  60.   if (!u)
  61.     fatal("cannot find include file %s", T->txt);
  62.   free_token(T);
  63.   T = exp_token();
  64.   if (T->type != EOL)
  65.     warning("garbage after #include");
  66.   free_token(T);
  67.   include_level++;
  68.   process_file(u);
  69.   free(u);
  70.   include_level--;
  71.   sync_line(2);
  72. }
  73.