| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ --> |
| <head> |
| <title>The GNU C Preprocessor Internals: Files</title> |
| |
| <meta name="description" content="The GNU C Preprocessor Internals: Files"> |
| <meta name="keywords" content="The GNU C Preprocessor Internals: Files"> |
| <meta name="resource-type" content="document"> |
| <meta name="distribution" content="global"> |
| <meta name="Generator" content="makeinfo"> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| <link href="index.html#Top" rel="start" title="Top"> |
| <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index"> |
| <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents"> |
| <link href="index.html#Top" rel="up" title="Top"> |
| <link href="Concept-Index.html#Concept-Index" rel="next" title="Concept Index"> |
| <link href="Guard-Macros.html#Guard-Macros" rel="prev" title="Guard Macros"> |
| <style type="text/css"> |
| <!-- |
| a.summary-letter {text-decoration: none} |
| blockquote.smallquotation {font-size: smaller} |
| div.display {margin-left: 3.2em} |
| div.example {margin-left: 3.2em} |
| div.indentedblock {margin-left: 3.2em} |
| div.lisp {margin-left: 3.2em} |
| div.smalldisplay {margin-left: 3.2em} |
| div.smallexample {margin-left: 3.2em} |
| div.smallindentedblock {margin-left: 3.2em; font-size: smaller} |
| div.smalllisp {margin-left: 3.2em} |
| kbd {font-style:oblique} |
| pre.display {font-family: inherit} |
| pre.format {font-family: inherit} |
| pre.menu-comment {font-family: serif} |
| pre.menu-preformatted {font-family: serif} |
| pre.smalldisplay {font-family: inherit; font-size: smaller} |
| pre.smallexample {font-size: smaller} |
| pre.smallformat {font-family: inherit; font-size: smaller} |
| pre.smalllisp {font-size: smaller} |
| span.nocodebreak {white-space:nowrap} |
| span.nolinebreak {white-space:nowrap} |
| span.roman {font-family:serif; font-weight:normal} |
| span.sansserif {font-family:sans-serif; font-weight:normal} |
| ul.no-bullet {list-style: none} |
| --> |
| </style> |
| |
| |
| </head> |
| |
| <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> |
| <a name="Files"></a> |
| <div class="header"> |
| <p> |
| Next: <a href="Concept-Index.html#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="Guard-Macros.html#Guard-Macros" accesskey="p" rel="prev">Guard Macros</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p> |
| </div> |
| <hr> |
| <a name="File-Handling"></a> |
| <h2 class="unnumbered">File Handling</h2> |
| <a name="index-files"></a> |
| |
| <p>Fairly obviously, the file handling code of cpplib resides in the file |
| <samp>files.c</samp>. It takes care of the details of file searching, |
| opening, reading and caching, for both the main source file and all the |
| headers it recursively includes. |
| </p> |
| <p>The basic strategy is to minimize the number of system calls. On many |
| systems, the basic <code>open ()</code> and <code>fstat ()</code> system calls can |
| be quite expensive. For every <code>#include</code>-d file, we need to try |
| all the directories in the search path until we find a match. Some |
| projects, such as glibc, pass twenty or thirty include paths on the |
| command line, so this can rapidly become time consuming. |
| </p> |
| <p>For a header file we have not encountered before we have little choice |
| but to do this. However, it is often the case that the same headers are |
| repeatedly included, and in these cases we try to avoid repeating the |
| filesystem queries whilst searching for the correct file. |
| </p> |
| <p>For each file we try to open, we store the constructed path in a splay |
| tree. This path first undergoes simplification by the function |
| <code>_cpp_simplify_pathname</code>. For example, |
| <samp>/usr/include/bits/../foo.h</samp> is simplified to |
| <samp>/usr/include/foo.h</samp> before we enter it in the splay tree and try |
| to <code>open ()</code> the file. CPP will then find subsequent uses of |
| <samp>foo.h</samp>, even as <samp>/usr/include/foo.h</samp>, in the splay tree and |
| save system calls. |
| </p> |
| <p>Further, it is likely the file contents have also been cached, saving a |
| <code>read ()</code> system call. We don’t bother caching the contents of |
| header files that are re-inclusion protected, and whose re-inclusion |
| macro is defined when we leave the header file for the first time. If |
| the host supports it, we try to map suitably large files into memory, |
| rather than reading them in directly. |
| </p> |
| <p>The include paths are internally stored on a null-terminated |
| singly-linked list, starting with the <code>"header.h"</code> directory search |
| chain, which then links into the <code><header.h></code> directory chain. |
| </p> |
| <p>Files included with the <code><foo.h></code> syntax start the lookup directly |
| in the second half of this chain. However, files included with the |
| <code>"foo.h"</code> syntax start at the beginning of the chain, but with one |
| extra directory prepended. This is the directory of the current file; |
| the one containing the <code>#include</code> directive. Prepending this |
| directory on a per-file basis is handled by the function |
| <code>search_from</code>. |
| </p> |
| <p>Note that a header included with a directory component, such as |
| <code>#include "mydir/foo.h"</code> and opened as |
| <samp>/usr/local/include/mydir/foo.h</samp>, will have the complete path minus |
| the basename ‘<samp>foo.h</samp>’ as the current directory. |
| </p> |
| <p>Enough information is stored in the splay tree that CPP can immediately |
| tell whether it can skip the header file because of the multiple include |
| optimization, whether the file didn’t exist or couldn’t be opened for |
| some reason, or whether the header was flagged not to be re-used, as it |
| is with the obsolete <code>#import</code> directive. |
| </p> |
| <p>For the benefit of MS-DOS filesystems with an 8.3 filename limitation, |
| CPP offers the ability to treat various include file names as aliases |
| for the real header files with shorter names. The map from one to the |
| other is found in a special file called ‘<samp>header.gcc</samp>’, stored in the |
| command line (or system) include directories to which the mapping |
| applies. This may be higher up the directory tree than the full path to |
| the file minus the base name. |
| </p> |
| <hr> |
| <div class="header"> |
| <p> |
| Next: <a href="Concept-Index.html#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="Guard-Macros.html#Guard-Macros" accesskey="p" rel="prev">Guard Macros</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p> |
| </div> |
| |
| |
| |
| </body> |
| </html> |