*** old/gcc-2.2.2/cccp.c Sun Jun 7 00:46:01 1992 --- gcc-2.2.2/cccp.c Thu Jul 9 04:21:18 1992 *************** *** 179,190 **** static int do_unassert (); static int do_warning (); static void add_import (); static void deps_output (); static void make_undef (); static void make_definition (); static void make_assertion (); - static void path_include (); static void initialize_builtins (); static void initialize_char_syntax (); static void dump_arg_n (); --- 179,199 ---- static int do_unassert (); static int do_warning (); + void idir_initialize (); + void idir_do_defaults (); + void idir_do_standard_includes (); + void dump_include_dirs (); + void idir_add_to_end (); + void idir_add_path (); + void idir_add_to_cwd (); + void idir_add_to_cwd_path (); + void idir_reset_cwd_path (); + static void add_import (); static void deps_output (); static void make_undef (); static void make_definition (); static void make_assertion (); static void initialize_builtins (); static void initialize_char_syntax (); static void dump_arg_n (); *************** *** 322,328 **** dump_definitions means pass the whole definition (plus #define) through */ ! static enum {dump_none, dump_only, dump_names, dump_definitions} dump_macros = dump_none; /* Nonzero means pass all #define and #undef directives which we actually --- 331,337 ---- dump_definitions means pass the whole definition (plus #define) through */ ! static enum {dump_none, dump_only, dump_names, dump_definitions, dump_paths} dump_macros = dump_none; /* Nonzero means pass all #define and #undef directives which we actually *************** *** 466,529 **** (((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \ ? grow_outbuf ((OBUF), (NEEDED)) : 0) - struct file_name_list - { - struct file_name_list *next; - char *fname; - /* If the following is nonzero, it is a macro name. - Don't include the file again if that macro is defined. */ - U_CHAR *control_macro; - }; - - /* #include "file" looks in source file dir, then stack. */ - /* #include just looks in the stack. */ - /* -I directories are added to the end, then the defaults are added. */ - static struct default_include { char *fname; int cplusplus; } include_defaults_array[] - #ifdef INCLUDE_DEFAULTS - = INCLUDE_DEFAULTS; - #else - = { - /* Pick up GNU C++ specific include files. */ - { GPLUSPLUS_INCLUDE_DIR, 1}, - { GCC_INCLUDE_DIR, 0}, - #ifdef CROSS_COMPILE - /* For cross-compilation, this dir name is generated - automatically in Makefile.in. */ - { CROSS_INCLUDE_DIR, 0 }, - #else /* not CROSS_COMPILE */ - { LOCAL_INCLUDE_DIR, 0}, - /* Some systems have an extra dir of include files. */ - #ifdef SYSTEM_INCLUDE_DIR - { SYSTEM_INCLUDE_DIR, 0}, - #endif - { STANDARD_INCLUDE_DIR, 0}, - #endif /* not CROSS_COMPILE */ - { 0, 0} - }; - #endif /* no INCLUDE_DEFAULTS */ - - /* The code looks at the defaults through this pointer, rather than through - the constant structure above. This pointer gets changed if an environment - variable specifies other defaults. */ - static struct default_include *include_defaults = include_defaults_array; - - static struct file_name_list *include = 0; /* First dir to search */ - /* First dir to search for */ - static struct file_name_list *first_bracket_include = 0; - static struct file_name_list *last_include = 0; /* Last in chain */ - - /* Chain of include directories to put at the end of the other chain. */ - static struct file_name_list *after_include = 0; - static struct file_name_list *last_after_include = 0; /* Last in chain */ - - /* List of included files that contained #pragma once. */ - static struct file_name_list *dont_repeat_files = 0; - - /* List of other included files. - If ->control_macro if nonzero, the file had a #ifndef - around the entire contents, and ->control_macro gives the macro name. */ - static struct file_name_list *all_include_files = 0; - /* Directory prefix that should replace `/usr' in the standard include file directories. */ static char *include_prefix; --- 475,480 ---- *************** *** 966,978 **** signal (SIGPIPE, pipe_closed); #endif ! for (i = 0; include_defaults[i].fname; i++) ! max_include_len = MAX (max_include_len, ! strlen (include_defaults[i].fname)); ! /* Leave room for making file name longer when converting to VMS syntax. */ ! #ifdef VMS ! max_include_len += 10; ! #endif bzero (pend_files, argc * sizeof (char *)); bzero (pend_defs, argc * sizeof (char *)); --- 917,923 ---- signal (SIGPIPE, pipe_closed); #endif ! idir_initialize(); bzero (pend_files, argc * sizeof (char *)); bzero (pend_defs, argc * sizeof (char *)); *************** *** 1014,1039 **** } /* Add directory to end of path for includes. */ if (!strcmp (argv[i], "-idirafter")) { - struct file_name_list *dirtmp; - - dirtmp = (struct file_name_list *) - xmalloc (sizeof (struct file_name_list)); - dirtmp->next = 0; /* New one goes on the end */ - dirtmp->control_macro = 0; - if (after_include == 0) - after_include = dirtmp; - else - last_after_include->next = dirtmp; - last_after_include = dirtmp; /* Tail follows the last one */ - if (i + 1 == argc) fatal ("Directory name missing after -idirafter option"); else ! dirtmp->fname = argv[++i]; ! ! if (strlen (dirtmp->fname) > max_include_len) ! max_include_len = strlen (dirtmp->fname); } break; case 'o': --- 959,977 ---- } /* Add directory to end of path for includes. */ if (!strcmp (argv[i], "-idirafter")) { if (i + 1 == argc) fatal ("Directory name missing after -idirafter option"); else ! idir_add_to_end(argv[++i]); } + /* Add directory to end of current source directory path. */ + /* The directory may be a colon separated list of directories */ + if (!strcmp (argv[i], "-isource")) { + if (i + 1 == argc) + fatal ("Directory name missing after -isource option"); + else + idir_add_to_cwd_path(argv[++i]); + } break; case 'o': *************** *** 1171,1176 **** --- 1109,1118 ---- case 'D': dump_macros = dump_definitions; break; + case 'P': + dump_macros = dump_paths; + no_output = 1; + break; } } } *************** *** 1261,1300 **** case 'I': /* Add directory to path for includes. */ { - struct file_name_list *dirtmp; - if (! ignore_srcdir && !strcmp (argv[i] + 2, "-")) ignore_srcdir = 1; else { - dirtmp = (struct file_name_list *) - xmalloc (sizeof (struct file_name_list)); - dirtmp->next = 0; /* New one goes on the end */ - dirtmp->control_macro = 0; - if (include == 0) - include = dirtmp; - else - last_include->next = dirtmp; - last_include = dirtmp; /* Tail follows the last one */ if (argv[i][2] != 0) ! dirtmp->fname = argv[i] + 2; else if (i + 1 == argc) fatal ("Directory name missing after -I option"); else ! dirtmp->fname = argv[++i]; ! if (strlen (dirtmp->fname) > max_include_len) ! max_include_len = strlen (dirtmp->fname); ! if (ignore_srcdir && first_bracket_include == 0) ! first_bracket_include = dirtmp; } } break; case 'n': ! if (!strcmp (argv[i], "-nostdinc")) /* -nostdinc causes no default include directories. You must specify all include-file directories with -I. */ no_standard_includes = 1; ! else if (!strcmp (argv[i], "-nostdinc++")) /* -nostdinc++ causes no default C++-specific include directories. */ no_standard_cplusplus_includes = 1; else if (!strcmp (argv[i], "-noprecomp")) --- 1203,1228 ---- case 'I': /* Add directory to path for includes. */ { if (! ignore_srcdir && !strcmp (argv[i] + 2, "-")) ignore_srcdir = 1; else { if (argv[i][2] != 0) ! idir_add (argv[i] + 2); else if (i + 1 == argc) fatal ("Directory name missing after -I option"); else ! idir_add (argv[++i]); } } break; case 'n': ! if (!strcmp (argv[i], "-nostdinc")) { /* -nostdinc causes no default include directories. You must specify all include-file directories with -I. */ no_standard_includes = 1; ! idir_reset_cwd_path(); ! } else if (!strcmp (argv[i], "-nostdinc++")) /* -nostdinc++ causes no default C++-specific include directories. */ no_standard_cplusplus_includes = 1; else if (!strcmp (argv[i], "-noprecomp")) *************** *** 1322,1337 **** } } - /* Add dirs from CPATH after dirs from -I. */ - /* There seems to be confusion about what CPATH should do, - so for the moment it is not documented. */ - /* Some people say that CPATH should replace the standard include dirs, - but that seems pointless: it comes before them, so it overrides them - anyway. */ - p = (char *) getenv ("CPATH"); - if (p != 0 && ! no_standard_includes) - path_include (p); - /* Now that dollars_in_ident is known, initialize is_idchar. */ initialize_char_syntax (); --- 1250,1255 ---- *************** *** 1451,1602 **** done_initializing = 1; ! { /* read the appropriate environment variable and if it exists ! replace include_defaults with the listed path. */ ! char *epath = 0; ! switch ((objc << 1) + cplusplus) ! { ! case 0: ! epath = getenv ("C_INCLUDE_PATH"); ! break; ! case 1: ! epath = getenv ("CPLUS_INCLUDE_PATH"); ! break; ! case 2: ! epath = getenv ("OBJC_INCLUDE_PATH"); ! break; ! case 3: ! epath = getenv ("OBJCPLUS_INCLUDE_PATH"); ! break; ! } ! /* If the environment var for this language is set, ! add to the default list of include directories. */ ! if (epath) { ! char *nstore = (char *) alloca (strlen (epath) + 2); ! int num_dirs; ! char *startp, *endp; - for (num_dirs = 1, startp = epath; *startp; startp++) - if (*startp == PATH_SEPARATOR) - num_dirs++; - include_defaults - = (struct default_include *) xmalloc ((num_dirs - * sizeof (struct default_include)) - + sizeof (include_defaults_array)); - startp = endp = epath; - num_dirs = 0; - while (1) { - /* Handle cases like c:/usr/lib:d:/gcc/lib */ - if ((*endp == PATH_SEPARATOR - #if 0 /* Obsolete, now that we use semicolons as the path separator. */ - #ifdef __MSDOS__ - && (endp-startp != 1 || !isalpha (*startp))) - #endif - #endif - ) - || *endp == 0) { - strncpy (nstore, startp, endp-startp); - if (endp == startp) - strcpy (nstore, "."); - else - nstore[endp-startp] = '\0'; - - max_include_len = MAX (max_include_len, endp-startp+2); - include_defaults[num_dirs].fname = savestring (nstore); - include_defaults[num_dirs].cplusplus = cplusplus; - num_dirs++; - if (*endp == '\0') - break; - endp = startp = endp + 1; - } else - endp++; - } - /* Put the usual defaults back in at the end. */ - bcopy (include_defaults_array, &include_defaults[num_dirs], - sizeof (include_defaults_array)); - } - } - - /* Unless -fnostdinc, - tack on the standard include file dirs to the specified list */ - if (!no_standard_includes) { - struct default_include *p = include_defaults; - char *specd_prefix = include_prefix; - char *default_prefix = savestring (GCC_INCLUDE_DIR); - int default_len = 0; - /* Remove the `include' from /usr/local/lib/gcc.../include. */ - if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) { - default_len = strlen (default_prefix) - 7; - default_prefix[default_len] = 0; - } - /* Search "translated" versions of GNU directories. - These have /usr/local/lib/gcc... replaced by specd_prefix. */ - if (specd_prefix != 0 && default_len != 0) - for (p = include_defaults; p->fname; p++) { - /* Some standard dirs are only for C++. */ - if (!p->cplusplus || (cplusplus && !no_standard_cplusplus_includes)) { - /* Does this dir start with the prefix? */ - if (!strncmp (p->fname, default_prefix, default_len)) { - /* Yes; change prefix and add to search list. */ - struct file_name_list *new - = (struct file_name_list *) xmalloc (sizeof (struct file_name_list)); - int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len; - char *str = (char *) xmalloc (this_len + 1); - strcpy (str, specd_prefix); - strcat (str, p->fname + default_len); - new->fname = str; - new->control_macro = 0; - - /* Add elt to tail of list. */ - if (include == 0) - include = new; - else - last_include->next = new; - /* Make sure list for #include <...> also has the standard dirs. */ - if (ignore_srcdir && first_bracket_include == 0) - first_bracket_include = new; - /* Record new tail. */ - last_include = new; - /* Update max_include_len if necessary. */ - if (this_len > max_include_len) - max_include_len = this_len; - } - } - } - /* Search ordinary names for GNU include directories. */ - for (p = include_defaults; p->fname; p++) { - /* Some standard dirs are only for C++. */ - if (!p->cplusplus || (cplusplus && !no_standard_cplusplus_includes)) { - struct file_name_list *new - = (struct file_name_list *) xmalloc (sizeof (struct file_name_list)); - new->control_macro = 0; - /* Add elt to tail of list. */ - if (include == 0) - include = new; - else - last_include->next = new; - /* Make sure list for #include <...> also has the standard dirs. */ - if (ignore_srcdir && first_bracket_include == 0) - first_bracket_include = new; - /* Record new tail. */ - last_include = new; - new->fname = p->fname; - } - } - } - - /* Tack the after_include chain at the end of the include chain. */ - if (last_include) - last_include->next = after_include; - else - include = after_include; - if (ignore_srcdir && first_bracket_include == 0) - first_bracket_include = after_include; - - /* Terminate the after_include chain. */ - if (last_after_include) - last_after_include->next = 0; - /* Scan the -imacros files before the main input. Much like #including them, but with no_output set so that only their macro definitions matter. */ --- 1369,1377 ---- done_initializing = 1; ! /* default include directoreies */ ! idir_do_defaults (no_standard_includes); /* Scan the -imacros files before the main input. Much like #including them, but with no_output set so that only their macro definitions matter. */ *************** *** 1809,1815 **** /* Now we have processed the entire input Write whichever kind of output has been requested. */ ! if (dump_macros == dump_only) dump_all_macros (); else if (! inhibit_output) { write_output (); --- 1584,1592 ---- /* Now we have processed the entire input Write whichever kind of output has been requested. */ ! if (dump_macros == dump_paths) ! dump_include_dirs (); ! else if (dump_macros == dump_only) dump_all_macros (); else if (! inhibit_output) { write_output (); *************** *** 1843,1860 **** return 0; } ! /* Given a colon-separated list of file names PATH, ! add all the names to the search path for include files. */ ! static void ! path_include (path) ! char *path; { char *p; ! p = path; ! if (*p) while (1) { char *q = p; char *name; --- 1620,1755 ---- return 0; } ! /***** Include path processing ****************/ ! struct file_name_list ! { ! struct file_name_list *next; ! char *fname; ! /* If the following is nonzero, it is a macro name. ! Don't include the file again if that macro is defined. */ ! U_CHAR *control_macro; ! }; ! ! /* #include "file" looks in source file dir, then stack. */ ! /* #include just looks in the stack. */ ! /* -I directories are added to the end, then the defaults are added. */ ! static struct default_include { char *fname; int cplusplus; } include_defaults_array[] ! #ifdef INCLUDE_DEFAULTS ! = INCLUDE_DEFAULTS; ! #else ! = { ! /* Pick up GNU C++ specific include files. */ ! { GPLUSPLUS_INCLUDE_DIR, 1}, ! { GCC_INCLUDE_DIR, 0}, ! #ifdef CROSS_COMPILE ! /* For cross-compilation, this dir name is generated ! automatically in Makefile.in. */ ! { CROSS_INCLUDE_DIR, 0 }, ! #else /* not CROSS_COMPILE */ ! { LOCAL_INCLUDE_DIR, 0}, ! /* Some systems have an extra dir of include files. */ ! #ifdef SYSTEM_INCLUDE_DIR ! { SYSTEM_INCLUDE_DIR, 0}, ! #endif ! { STANDARD_INCLUDE_DIR, 0}, ! #endif /* not CROSS_COMPILE */ ! { 0, 0} ! }; ! #endif /* no INCLUDE_DEFAULTS */ ! ! /* The current source directories as specified by MAKECPP and/or -isource */ ! static struct file_name_list *cwd_list = 0; ! static struct file_name_list *last_cwd = 0; ! ! /* The code looks at the defaults through this pointer, rather than through ! the constant structure above. This pointer gets changed if an environment ! variable specifies other defaults. */ ! static struct default_include *include_defaults = include_defaults_array; ! ! static struct file_name_list *include = 0; /* First dir to search */ ! /* First dir to search for */ ! static struct file_name_list *first_bracket_include = 0; ! static struct file_name_list *last_include = 0; /* Last in chain */ ! ! /* Chain of include directories to put at the end of the other chain. */ ! static struct file_name_list *after_include = 0; ! static struct file_name_list *last_after_include = 0; /* Last in chain */ ! ! /* List of included files that contained #pragma once. */ ! static struct file_name_list *dont_repeat_files = 0; ! ! /* List of other included files. ! If ->control_macro if nonzero, the file had a #ifndef ! around the entire contents, and ->control_macro gives the macro name. */ ! static struct file_name_list *all_include_files = 0; ! ! ! void ! dump_include_dirs() { + struct file_name_list *fl; + + printf ("#\n# Files included using \"\" are searched "); + if (ignore_srcdir) + printf ("only using path.\n"); + else + printf ("primarily from the directory where\n%s\n", + "# the including file is found from."); + if (cwd_list) + printf ("#\n# Current directory (cwd path):\n"); + for (fl = cwd_list; fl; fl = fl->next) { + if (fl == first_bracket_include) + break; + printf ("%s\n", fl->fname); + } + if (first_bracket_include) + printf ("#\n# Include path (\"\" only):\n"); + else + printf ("#\n# Include path:\n"); + for (fl = include; fl; fl = fl->next) { + if (first_bracket_include == fl) + printf("# Bracket <> includes:\n"); + printf ("%s\n", fl->fname); + } + printf ("#\n"); + } + + void + idir_initialize() + { + int i; char *p; ! for (i = 0; include_defaults[i].fname; i++) ! max_include_len = MAX (max_include_len, ! strlen (include_defaults[i].fname)); ! /* Leave room for making file name longer when converting to VMS syntax. */ ! #ifdef VMS ! max_include_len += 10; ! #endif ! p = getenv ("MAKECPP"); ! if (p) ! idir_add_to_cwd_path (p); ! } ! ! /* Called when -nostdinc is seen to reset the effect of MAKECPP and previous ! * -isource options ! */ ! void ! idir_reset_cwd_path () ! { ! /* Leaks some memory. So what? */ ! cwd_list = last_cwd = 0; ! } ! ! void ! idir_add_to_cwd_path (p) ! char *p; ! { ! ! if (p && *p) { while (1) { char *q = p; char *name; *************** *** 1874,1893 **** --- 1769,2045 ---- name[q - p] = 0; } + idir_add_to_cwd(name); + + /* Advance past this name. */ + p = q; + if (*p == 0) + break; + /* Skip the colon. */ + p++; + } + } + } + + void + idir_add_to_cwd(directory) + char *directory; + { + struct file_name_list *dirtmp; + dirtmp = (struct file_name_list *) xmalloc (sizeof (struct file_name_list)); dirtmp->next = 0; /* New one goes on the end */ dirtmp->control_macro = 0; + if (cwd_list == 0) + cwd_list = dirtmp; + else + last_cwd->next = dirtmp; + last_cwd = dirtmp; /* Tail follows the last one */ + + dirtmp->fname = directory; + + if (strlen (dirtmp->fname) > max_include_len) + max_include_len = strlen (dirtmp->fname); + } + + void + idir_do_defaults(no_standard_includes) + int no_standard_includes; + { + if (!no_standard_includes) { + /* read the appropriate environment variable and if it exists + replace include_defaults with the listed path. */ + char *p = 0; + char *path_name = 0; + + switch ((objc << 1) + cplusplus) + { + case 0: + path_name = "C_INCLUDE_PATH"; + break; + case 1: + path_name = "C++_INCLUDE_PATH"; + break; + case 2: + path_name = "OBJC_INCLUDE_PATH"; + break; + case 3: + path_name = "OBJC++_INCLUDE_PATH"; + break; + } + if (path_name) + p = getenv (path_name); + /* If the environment var for this language is set, + add to the default list of include directories. */ + if (p) { + idir_add_path (p); + } + + p = (char *) getenv ("CPATH"); + if (p) { + idir_add_path (p); + } else { + /* Add the usual defaults to the end. */ + /* CPATH overrides these defaults */ + idir_do_standard_includes(); + } + + } + + /* Tack the after_include chain at the end of the include chain. */ + if (last_include) + last_include->next = after_include; + else + include = after_include; + if (ignore_srcdir && first_bracket_include == 0) + first_bracket_include = after_include; + + /* Terminate the after_include chain. */ + if (last_after_include) + last_after_include->next = 0; + + /* Add current source directory path to "" path if no -I- option given and + * there is a current directory path (MAKECPP or -isource) + */ + if (!ignore_srcdir /* -I- seen */ + && cwd_list) { + ignore_srcdir = 1; + last_cwd->next = include; + first_bracket_include = include; + include = cwd_list; + } + } + + void + idir_do_standard_includes() + { + struct default_include *p = include_defaults; + char *specd_prefix = getenv ("GCC_EXEC_PREFIX"); + char *default_prefix = savestring (GCC_INCLUDE_DIR); + int default_len = 0; + /* Remove the `include' from /usr/local/lib/gcc.../include. */ + if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) { + default_len = strlen (default_prefix) - 7; + default_prefix[default_len] = 0; + } + /* Search "translated" versions of GNU directories. + These have /usr/local/lib/gcc... replaced by specd_prefix. */ + if (specd_prefix != 0 && default_len != 0) + for (p = include_defaults; p->fname; p++) { + /* Some standard dirs are only for C++. */ + if (!p->cplusplus || cplusplus) { + /* Does this dir start with the prefix? */ + if (!strncmp (p->fname, default_prefix, default_len)) { + /* Yes; change prefix and add to search list. */ + int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len; + char *str = (char *) xmalloc (this_len + 1); + strcpy (str, specd_prefix); + strcat (str, p->fname + default_len); + + idir_add (str); + + } + } + } + /* Search ordinary names for GNU include directories. */ + for (p = include_defaults; p->fname; p++) { + /* Some standard dirs are only for C++. */ + if (!p->cplusplus || cplusplus) { + idir_add (p->fname); + } + } + } + + /* add directory to end of path for includes */ + void + idir_add_to_end (directory) + char *directory; + { + struct file_name_list *dirtmp, *p; + + if (directory[0] == '/' || !cwd_list) { + dirtmp = (struct file_name_list *) + xmalloc (sizeof (struct file_name_list)); + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; + if (after_include == 0) + after_include = dirtmp; + else + last_after_include->next = dirtmp; + last_after_include = dirtmp; /* Tail follows the last one */ + + dirtmp->fname = directory; + + if (strlen (dirtmp->fname) > max_include_len) + max_include_len = strlen (dirtmp->fname); + } else for (p = cwd_list; p; p = p->next) { + char *name; + name = xmalloc (strlen (directory) + strlen (p->fname) + 2); + sprintf (name, "%s/%s", p->fname, directory); + + dirtmp = (struct file_name_list *) + xmalloc (sizeof (struct file_name_list)); + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; + if (after_include == 0) + after_include = dirtmp; + else + last_after_include->next = dirtmp; + last_after_include = dirtmp; /* Tail follows the last one */ + + dirtmp->fname = name; + + if (strlen (dirtmp->fname) > max_include_len) + max_include_len = strlen (dirtmp->fname); + } + } + + /* add directory to tail of head of path for includes */ + idir_add(directory) + char *directory; + { + struct file_name_list *dirtmp, *p; + + if (directory[0] == '/' || !cwd_list) { + + dirtmp = (struct file_name_list *) + xmalloc (sizeof (struct file_name_list)); + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; if (include == 0) include = dirtmp; else last_include->next = dirtmp; last_include = dirtmp; /* Tail follows the last one */ + + dirtmp->fname = directory; + + if (strlen (dirtmp->fname) > max_include_len) + max_include_len = strlen (dirtmp->fname); + if (ignore_srcdir && first_bracket_include == 0) + first_bracket_include = dirtmp; + } else for (p = cwd_list; p; p = p->next) { + char *name; + name = xmalloc (strlen (directory) + strlen (p->fname) + 2); + sprintf (name, "%s/%s", p->fname, directory); + + dirtmp = (struct file_name_list *) + xmalloc (sizeof (struct file_name_list)); + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; + if (include == 0) + include = dirtmp; + else + last_include->next = dirtmp; + last_include = dirtmp; /* Tail follows the last one */ + dirtmp->fname = name; + if (strlen (dirtmp->fname) > max_include_len) max_include_len = strlen (dirtmp->fname); if (ignore_srcdir && first_bracket_include == 0) first_bracket_include = dirtmp; + } + } + + /* Given a colon-separated list of file names PATH, + add all the names to the search path for include files. */ + + void + idir_add_path (path) + char *path; + { + char *p; + + p = path; + + if (*p) + while (1) { + char *q = p; + char *name; + struct file_name_list *dirtmp; + + /* Find the end of this name. */ + #ifdef __MSDOS__ + /* Handle cases like c:/usr/lib:d:/gcc/lib */ + while (*q != 0 && (*q != ':' || (q - p == 1 && isalpha (*p)))) q++; + #else + while (*q != 0 && *q != ':') q++; + #endif + if (p == q) { + /* An empty name in the path stands for the current directory. */ + name = (char *) xmalloc (2); + name[0] = '.'; + name[1] = 0; + } else { + /* Otherwise use the directory that is named. */ + name = (char *) xmalloc (q - p + 1); + bcopy (p, name, q - p); + name[q - p] = 0; + } + + idir_add(name); /* Advance past this name. */ p = q;